Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if DEBUG:
print('Caught an error when parsing')
msg = ('Cannot scrape callname={} in modpath={} line={}.\n'
'Caused by: {}\n')
# raise
msg = msg.format(callname, modpath, lineno, repr(ex))
if isinstance(ex, exceptions.DoctestParseError):
# TODO: Can we print a nicer syntax error here?
msg += '{}\n'.format(ex.string)
msg += 'Original Error: {}\n'.format(repr(ex.orig_ex))
if isinstance(ex.orig_ex, SyntaxError):
extra_help = ''
if ex.orig_ex.text:
extra_help += utils.ensure_unicode(ex.orig_ex.text)
if ex.orig_ex.offset is not None:
extra_help += ' ' * (ex.orig_ex.offset - 1) + '^'
if extra_help:
msg += '\n' + extra_help
# Always warn when something bad is happening.
# However, dont error if the docstr simply has bad syntax
print('msg = {}'.format(msg))
warnings.warn(msg)
if isinstance(ex, exceptions.MalformedDocstr):
pass
elif isinstance(ex, exceptions.DoctestParseError):
pass
else:
raise
if DEBUG:
def _docnode_line_workaround(self, docnode):
# lineno points to the last line of a string
endpos = docnode.lineno - 1
docstr = utils.ensure_unicode(docnode.value.s)
sourcelines = self.sourcelines
start, stop = self._docstr_line_workaround(docstr, sourcelines, endpos)
# Convert 0-based line positions to 1-based line numbers
doclineno = start + 1
doclineno_end = stop
# print('docnode = {!r}'.format(docnode))
return doclineno, doclineno_end
>>> from xdoctest.docstr import docscrape_google
>>> from xdoctest import core
>>> self = parser.DoctestParser()
>>> docstr = self.parse.__doc__
>>> blocks = docscrape_google.split_google_docblocks(docstr)
>>> doclineno = self.parse.__func__.__code__.co_firstlineno
>>> key, (string, offset) = blocks[-2]
>>> self._label_docsrc_lines(string)
>>> doctest_parts = self.parse(string)
>>> # each part with a want-string needs to be broken in two
>>> assert len(doctest_parts) == 6
"""
if DEBUG > 1:
print('\n===== PARSE ====')
if sys.version_info.major == 2: # nocover
string = utils.ensure_unicode(string)
if not isinstance(string, six.string_types):
raise TypeError('Expected string but got {!r}'.format(string))
string = string.expandtabs()
# If all lines begin with the same indentation, then strip it.
min_indent = min_indentation(string)
if min_indent > 0:
string = '\n'.join([l[min_indent:] for l in string.splitlines()])
labeled_lines = None
grouped_lines = None
all_parts = None
try:
labeled_lines = self._label_docsrc_lines(string)
grouped_lines = self._group_labeled_lines(labeled_lines)
>>> from xdoctest import core
>>> self = parser.DoctestParser()
>>> docstr = self.parse.__doc__
>>> blocks = docscrape_google.split_google_docblocks(docstr)
>>> doclineno = self.parse.__func__.__code__.co_firstlineno
>>> key, (string, offset) = blocks[-2]
>>> self._label_docsrc_lines(string)
>>> doctest_parts = self.parse(string)
>>> # each part with a want-string needs to be broken in two
>>> assert len(doctest_parts) == 6
"""
if DEBUG > 1:
print('\n===== PARSE ====')
# if sys.version_info.major == 2: # nocover
if six.PY2:
string = utils.ensure_unicode(string)
if not isinstance(string, six.string_types):
raise TypeError('Expected string but got {!r}'.format(string))
string = string.expandtabs()
# If all lines begin with the same indentation, then strip it.
min_indent = _min_indentation(string)
if min_indent > 0:
string = '\n'.join([l[min_indent:] for l in string.splitlines()])
labeled_lines = None
grouped_lines = None
all_parts = None
try:
labeled_lines = self._label_docsrc_lines(string)
grouped_lines = self._group_labeled_lines(labeled_lines)
runstate = directive.RuntimeState()
# Don't normalize because it usually removes the newlines
runstate_ = runstate.to_dict()
# Don't normalize whitespaces in report for better visibility
runstate_['NORMALIZE_WHITESPACE'] = False
runstate_['IGNORE_WHITESPACE'] = False
got, want = normalize(got, want, runstate_)
# If s are being used, then replace blank lines
# with in the actual output string.
# if not runstate['DONT_ACCEPT_BLANKLINE']:
# got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
got = utils.ensure_unicode(got)
# Check if we should use diff.
if self._do_a_fancy_diff(runstate):
# Split want & got into lines.
want_lines = want.splitlines(True)
got_lines = got.splitlines(True)
# Use difflib to find their differences.
if runstate['REPORT_UDIFF']:
diff = difflib.unified_diff(want_lines, got_lines, n=2)
diff = list(diff)[2:] # strip the diff header
kind = 'unified diff with -expected +actual'
elif runstate['REPORT_CDIFF']:
diff = difflib.context_diff(want_lines, got_lines, n=2)
diff = list(diff)[2:] # strip the diff header
kind = 'context diff with expected followed by actual'
elif runstate['REPORT_NDIFF']:
temp.ensure()
dpath = temp.dpath
modpath = join(dpath, 'demo_runner_syntax_error.py')
with open(modpath, 'w') as file:
file.write(source)
with utils.CaptureStdout() as cap:
runner.doctest_module(modpath, 'all', argv=[''], style='freeform',
verbose=1)
print('CAPTURED [[[[[[[[')
print(utils.indent(cap.text))
print(']]]]]]]] # CAPTURED')
if six.PY2:
captext = utils.ensure_unicode(cap.text)
else:
captext = cap.text
if True or not six.PY2: # Why does this have issues on the dashboards?
assert '1 run-time warnings' in captext
assert '2 parse-time warnings' in captext
# Assert summary line
assert '3 warnings' in captext
assert '2 failed' in captext
assert '1 passed' in captext