[PATCH 3 of 6] import-checker: parse python code from .t files
timeless
timeless at mozdev.org
Tue Apr 12 17:54:01 EDT 2016
# HG changeset patch
# User timeless <timeless at mozdev.org>
# Date 1460497436 0
# Tue Apr 12 21:43:56 2016 +0000
# Node ID 97c7192fed4cb0846a848a05e2f34e7fbea5179e
# Parent 7dd9938d18883e20195853b332945c8b7e9d1a0d
import-checker: parse python code from .t files
diff --git a/contrib/import-checker.py b/contrib/import-checker.py
--- a/contrib/import-checker.py
+++ b/contrib/import-checker.py
@@ -5,6 +5,7 @@
import ast
import collections
import os
+import re
import sys
# Import a minimal set of stdlib modules needed for list_stdlib_modules()
@@ -568,10 +569,88 @@
def _cycle_sortkey(c):
return len(c), c
+def embedded(f, modname, src):
+ """ Extract embedded python code
+
+ >>> def test(fn, lines):
+ ... for s, m, f, l in embedded(fn, "example", lines):
+ ... print("%s %s %s" % (m, f, l))
+ ... print(repr(s))
+ >>> lines = [
+ ... 'comment',
+ ... ' >>> from __future__ import print_function',
+ ... " >>> ' multiline",
+ ... " ... string'",
+ ... ' ',
+ ... 'comment',
+ ... ' $ cat > foo.py <<EOF',
+ ... ' > from __future__ import print_function',
+ ... ' > EOF',
+ ... ]
+ >>> test("example.t", lines)
+ example[2] doctest.py 2
+ "from __future__ import print_function\\n' multiline\\nstring'\\n"
+ example[7] foo.py 7
+ 'from __future__ import print_function\\n'
+ """
+ inlinepython = 0
+ shpython = 0
+ script = []
+ prefix = 6
+ t = ''
+ n = 0
+ for l in src:
+ n += 1
+ if not l.endswith(b'\n'):
+ l += b'\n'
+ if l.startswith(b' >>> '): # python inlines
+ if shpython:
+ print("Parse Error %s:%d\n" % (f, n))
+ if not inlinepython:
+ # We've just entered a Python block.
+ inlinepython = n
+ t = 'doctest.py'
+ script.append(l[prefix:])
+ continue
+ if l.startswith(b' ... '): # python inlines
+ script.append(l[prefix:])
+ continue
+ cat = re.search("\$ \s*cat\s*>\s*(\S+.py)\s*<<\s*EOF", l)
+ if cat:
+ if inlinepython:
+ yield ''.join(script), ("%s[%d]" %
+ (modname, inlinepython)), t, inlinepython
+ script = []
+ inlinepython = 0
+ shpython = n
+ t = cat.group(1)
+ continue
+ if shpython and l.startswith(b' > '): # sh continuation
+ if l == b' > EOF\n':
+ yield ''.join(script), ("%s[%d]" %
+ (modname, shpython)), t, shpython
+ script = []
+ shpython = 0
+ else:
+ script.append(l[4:])
+ continue
+ if inlinepython and l == b' \n':
+ yield ''.join(script), ("%s[%d]" %
+ (modname, inlinepython)), t, inlinepython
+ script = []
+ inlinepython = 0
+ continue
+
def sources(f, modname):
+ py = False
if f.endswith('.py'):
with open(f) as src:
- yield src.read(), modname
+ yield src.read(), modname, f, 0
+ py = True
+ if py or f.endswith('.t'):
+ with open(f) as src:
+ for script, modname, t, line in embedded(f, modname, src):
+ yield script, modname, t, line
def main(argv):
if len(argv) < 2 or (argv[1] == '-' and len(argv) > 2):
More information about the Mercurial-devel
mailing list