Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Starting from the end look at consecutive pairs of indices to
inspect the statement it corresponds to. (the first statement goes
from ps1_linenos[-1] to the end of the line list.
Example:
>>> ps1_linenos = [0, 2, 3]
>>> exec_source_lines = ["x = 1", "y = '''foo", " bar'''", "pass"]
>>> DoctestParser._workaround_16806(ps1_linenos, exec_source_lines)
[0, 1, 3]
"""
new_ps1_lines = []
b = len(exec_source_lines)
for a in ps1_linenos[::-1]:
# the position of `b` is correct, but `a` may be wrong
# is_balanced_statement will be False iff `a` is wrong.
while not static.is_balanced_statement(exec_source_lines[a:b], only_tokens=True):
# shift `a` down until it becomes correct
a -= 1
# push the new correct value back into the list
new_ps1_lines.append(a)
# set the end position of the next string to be `a` , note, because
# this `a` is correct, the next `b` is must also be correct.
b = a
return new_ps1_lines[::-1]
helper
remove lines from the iterator if they are needed to complete source
"""
norm_line = line[state_indent:] # Normalize line indentation
prefix = norm_line[:4]
suffix = norm_line[4:]
assert prefix.strip() in ['>>>', '...'], '{a}'.format(a=prefix)
yield line, norm_line
source_parts = [suffix]
# These hacks actually modify the input doctest slighly
HACK_TRIPLE_QUOTE_FIX = True
try:
while not static.is_balanced_statement(source_parts, only_tokens=True):
line_idx, next_line = next(line_iter)
norm_line = next_line[state_indent:]
prefix = norm_line[:4]
suffix = norm_line[4:]
if prefix.strip() not in ['>>>', '...', '']: # nocover
error = True
if HACK_TRIPLE_QUOTE_FIX:
# TODO: make a more robust patch
if any("'''" in s or '"""' in s for s in source_parts):
# print('HACK FIXING TRIPLE QUOTE')
next_line = next_line[:state_indent] + '... ' + norm_line
norm_line = '... ' + norm_line
prefix = ''
suffix = norm_line
error = False
def balanced_intervals(lines):
"""
Finds intervals of balanced nesting syntax
Args:
lines (List[str]): lines of source code
"""
intervals = []
a = len(lines) - 1
b = len(lines)
while b > 0:
# move the head pointer up until we become balanced
while not static.is_balanced_statement(lines[a:b], only_tokens=True):
a -= 1
# we found a balanced interval
intervals.append((a, b))
b = a
a = a - 1
intervals = intervals[::-1]
return intervals
intervals = balanced_intervals(lines)
remove lines from the iterator if they are needed to complete source
"""
norm_line = line[state_indent:] # Normalize line indentation
prefix = norm_line[:4]
suffix = norm_line[4:]
assert prefix.strip() in {'>>>', '...'}, '{}'.format(prefix)
yield line
source_parts = [suffix]
# These hacks actually modify the input doctest slighly
HACK_TRIPLE_QUOTE_FIX = True
try:
while not static.is_balanced_statement(source_parts, only_tokens=True):
line_idx, next_line = next(line_iter)
norm_line = next_line[state_indent:]
prefix = norm_line[:4]
suffix = norm_line[4:]
if prefix.strip() not in {'>>>', '...', ''}: # nocover
error = True
if HACK_TRIPLE_QUOTE_FIX:
# TODO: make a more robust patch
if any("'''" in s or '"""' in s for s in source_parts):
# print('HACK FIXING TRIPLE QUOTE')
next_line = next_line[:state_indent] + '... ' + norm_line
norm_line = '... ' + norm_line
prefix = ''
suffix = norm_line
error = False
Starting from the end look at consecutive pairs of indices to
inspect the statement it corresponds to. (the first statement goes
from ps1_linenos[-1] to the end of the line list.
Example:
>>> ps1_linenos = [0, 2, 3]
>>> exec_source_lines = ["x = 1", "y = '''foo", " bar'''", "pass"]
>>> DoctestParser._workaround_16806(ps1_linenos, exec_source_lines)
[0, 1, 3]
"""
new_ps1_lines = []
b = len(exec_source_lines)
for a in ps1_linenos[::-1]:
# the position of `b` is correct, but `a` may be wrong
# is_balanced_statement will be False iff `a` is wrong.
while not static.is_balanced_statement(exec_source_lines[a:b], only_tokens=True):
# shift `a` down until it becomes correct
a -= 1
# push the new correct value back into the list
new_ps1_lines.append(a)
# set the end position of the next string to be `a` , note, because
# this `a` is correct, the next `b` is must also be correct.
b = a
return new_ps1_lines[::-1]
def balanced_intervals(lines):
"""
Finds intervals of balanced nesting syntax
Args:
lines (List[str]): lines of source code
"""
intervals = []
a = len(lines) - 1
b = len(lines)
while b > 0:
# move the head pointer up until we become balanced
while not static.is_balanced_statement(lines[a:b], only_tokens=True) and a >= 0:
a -= 1
if a < 0:
raise exceptions.IncompleteParseError(
'ill-formed doctest: cannot find balanced ps1 lines.')
# we found a balanced interval
intervals.append((a, b))
b = a
a = a - 1
intervals = intervals[::-1]
return intervals
intervals = balanced_intervals(lines)