Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
except exceptions.MalformedDocstr:
print('ERROR PARSING {} GOOGLE BLOCKS IN {} ON line {}'.format(
callname, modpath, lineno))
print('Did you forget to make a docstr with newlines raw?')
raise
example_blocks = []
example_tags = ('Example', 'Doctest', 'Script', 'Benchmark')
for type, block in blocks:
if type.startswith(example_tags):
example_blocks.append((type, block))
for num, (type, (docsrc, offset)) in enumerate(example_blocks):
# Add one because offset indicates the position of the block-label
# and the body of the block always starts on the next line.
label_lineno = lineno + offset
body_lineno = label_lineno + 1
example = doctest_example.DocTest(docsrc, modpath, callname, num,
lineno=body_lineno, fpath=fpath,
block_type=type)
if eager_parse:
# parse on the fly to be consistent with freeform?
example._parse()
yield example
def _gather_zero_arg_examples(modpath):
"""
Find functions in `modpath` args with no args (so we can automatically
make a dummy docstring).
"""
for calldefs, _modpath in core.package_calldefs(modpath):
for callname, calldef in calldefs.items():
if calldef.args is not None:
# The only existing args should have defaults
n_args = len(calldef.args.args) - len(calldef.args.defaults)
if n_args == 0:
# Create a dummy doctest example for a zero-arg function
docsrc = '>>> {}()'.format(callname)
example = doctest_example.DocTest(docsrc=docsrc,
modpath=_modpath,
callname=callname,
block_type='zero-arg')
example.mode = 'native'
yield example
>>> # foobar
>>> # bazbiz
''')
self = doctest_example.DocTest(docsrc=docsrc)
self._parse()
assert len(self._parts) == 1
self.run(verbose=0)
docsrc = utils.codeblock(
'''
>>> # foobar
>>> x = 0
>>> x / 0
>>> # bazbiz
''')
self = doctest_example.DocTest(docsrc=docsrc, lineno=1)
self._parse()
assert len(self._parts) == 1
result = self.run(on_error='return', verbose=0)
assert not result['passed']
assert self.failed_lineno() == 3
def test_failed_assign_want():
"""
pytest testing/test_doctest_example.py::test_exit_test_exception
"""
string = utils.codeblock(
'''
>>> name = 'foo'
'anything'
''')
self = doctest_example.DocTest(docsrc=string)
result = self.run(on_error='return', verbose=0)
assert result['failed']
fail_text = '\n'.join(self.repr_failure())
assert 'Got nothing' in fail_text
def test_want_error_msg_failure():
"""
python testing/test_doctest_example.py test_want_error_msg_failure
pytest testing/test_doctest_example.py::test_want_error_msg_failure
"""
string = utils.codeblock(
'''
>>> raise Exception('everything is NOT fine')
Traceback (most recent call last):
Exception: everything is fine
''')
self = doctest_example.DocTest(docsrc=string)
import pytest
with pytest.raises(checker.GotWantException):
self.run(on_error='raise')
def test_inline_skip_directive():
"""
pytest testing/test_directive.py::test_inline_skip_directive
"""
string = utils.codeblock(
'''
>>> x = 0
>>> assert False, 'should be skipped' # doctest: +SKIP
>>> y = 0
''')
self = doctest_example.DocTest(docsrc=string)
result = self.run(on_error='raise')
# TODO: ensure that lines after the inline are run
assert result['passed']
def test_block_skip_directive():
"""
pytest testing/test_directive.py::test_block_skip_directive
"""
string = utils.codeblock(
'''
>>> x = 0
>>> # doctest: +SKIP
>>> assert False, 'should be skipped'
''')
self = doctest_example.DocTest(docsrc=string)
result = self.run(on_error='raise')
assert result['passed']
def doctest_from_parts(parts, num, curr_offset):
# FIXME: this will cause line numbers to become misaligned
nested = [
p.orig_lines
if p.want is None else
p.orig_lines + p.want.splitlines()
for p in parts
]
docsrc = '\n'.join(list(it.chain.from_iterable(nested)))
docsrc = textwrap.dedent(docsrc)
example = doctest_example.DocTest(docsrc, modpath=modpath,
callname=callname, num=num,
lineno=lineno + curr_offset,
fpath=fpath)
# rebase the offsets relative to the test lineno (ie start at 0)
unoffset = parts[0].line_offset
for p in parts:
p.line_offset -= unoffset
# We've already parsed the parts, so we dont need to do it again
example._parts = parts
return example