1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
"""
Use this to copy some indented code from the coverage.py test suite into a
standalone file for deeper testing, or writing bug reports.
Give it a file name and a line number, and it will find the indentend
multiline string containing that line number, and output the dedented
contents of the string.
If tests/test_arcs.py has this (partial) content::
1630 def test_partial_generators(self):
1631 # https://github.com/nedbat/coveragepy/issues/475
1632 # Line 2 is executed completely.
1633 # Line 3 is started but not finished, because zip ends before it finishes.
1634 # Line 4 is never started.
1635 cov = self.check_coverage('''\
1636 def f(a, b):
1637 c = (i for i in a) # 2
1638 d = (j for j in b) # 3
1639 e = (k for k in b) # 4
1640 return dict(zip(c, d))
1641
1642 f(['a', 'b'], [1, 2, 3])
1643 ''',
1644 arcz=".1 17 7. .2 23 34 45 5. -22 2-2 -33 3-3 -44 4-4",
1645 arcz_missing="3-3 -44 4-4",
1646 )
then you can do::
% python lab/extract_code.py tests/test_arcs.py 1637
def f(a, b):
c = (i for i in a) # 2
d = (j for j in b) # 3
e = (k for k in b) # 4
return dict(zip(c, d))
f(['a', 'b'], [1, 2, 3])
%
"""
import sys
import textwrap
if len(sys.argv) == 2:
fname, lineno = sys.argv[1].split(":")
else:
fname, lineno = sys.argv[1:]
lineno = int(lineno)
with open(fname) as code_file:
lines = ["", *code_file]
# Find opening triple-quote
for start in range(lineno, 0, -1):
line = lines[start]
if "'''" in line or '"""' in line:
break
for end in range(lineno+1, len(lines)):
line = lines[end]
if "'''" in line or '"""' in line:
break
code = "".join(lines[start+1: end])
code = textwrap.dedent(code)
print(code, end="")
|