##// END OF EJS Templates
import-checker: use testparseutil.embedded() to centralize detection logic...
FUJIWARA Katsunori -
r40131:7288838b default
parent child Browse files
Show More
@@ -5,7 +5,6 b' from __future__ import absolute_import, '
5 import ast
5 import ast
6 import collections
6 import collections
7 import os
7 import os
8 import re
9 import sys
8 import sys
10
9
11 # Import a minimal set of stdlib modules needed for list_stdlib_modules()
10 # Import a minimal set of stdlib modules needed for list_stdlib_modules()
@@ -18,6 +17,8 b' if True: # disable lexical sorting check'
18 basehttpserver = None
17 basehttpserver = None
19 import zlib
18 import zlib
20
19
20 import testparseutil
21
21 # Whitelist of modules that symbols can be directly imported from.
22 # Whitelist of modules that symbols can be directly imported from.
22 allowsymbolimports = (
23 allowsymbolimports = (
23 '__future__',
24 '__future__',
@@ -659,61 +660,21 b' def embedded(f, modname, src):'
659 ... b' > EOF',
660 ... b' > EOF',
660 ... ]
661 ... ]
661 >>> test(b"example.t", lines)
662 >>> test(b"example.t", lines)
662 example[2] doctest.py 2
663 example[2] doctest.py 1
663 "from __future__ import print_function\\n' multiline\\nstring'\\n"
664 "from __future__ import print_function\\n' multiline\\nstring'\\n\\n"
664 example[7] foo.py 7
665 example[8] foo.py 7
665 'from __future__ import print_function\\n'
666 'from __future__ import print_function\\n'
666 """
667 """
667 inlinepython = 0
668 errors = []
668 shpython = 0
669 for name, starts, ends, code in testparseutil.pyembedded(f, src, errors):
669 script = []
670 if not name:
670 prefix = 6
671 # use 'doctest.py', in order to make already existing
671 t = ''
672 # doctest above pass instantly
672 n = 0
673 name = 'doctest.py'
673 for l in src:
674 # "starts" is "line number" (1-origin), but embedded() is
674 n += 1
675 # expected to return "line offset" (0-origin). Therefore, this
675 if not l.endswith(b'\n'):
676 # yields "starts - 1".
676 l += b'\n'
677 yield code, "%s[%d]" % (modname, starts), name, starts - 1
677 if l.startswith(b' >>> '): # python inlines
678 if shpython:
679 print("%s:%d: Parse Error" % (f, n))
680 if not inlinepython:
681 # We've just entered a Python block.
682 inlinepython = n
683 t = b'doctest.py'
684 script.append(l[prefix:])
685 continue
686 if l.startswith(b' ... '): # python inlines
687 script.append(l[prefix:])
688 continue
689 cat = re.search(br"\$ \s*cat\s*>\s*(\S+\.py)\s*<<\s*EOF", l)
690 if cat:
691 if inlinepython:
692 yield b''.join(script), (b"%s[%d]" %
693 (modname, inlinepython)), t, inlinepython
694 script = []
695 inlinepython = 0
696 shpython = n
697 t = cat.group(1)
698 continue
699 if shpython and l.startswith(b' > '): # sh continuation
700 if l == b' > EOF\n':
701 yield b''.join(script), (b"%s[%d]" %
702 (modname, shpython)), t, shpython
703 script = []
704 shpython = 0
705 else:
706 script.append(l[4:])
707 continue
708 # If we have an empty line or a command for sh, we end the
709 # inline script.
710 if inlinepython and (l == b' \n'
711 or l.startswith(b' $ ')):
712 yield b''.join(script), (b"%s[%d]" %
713 (modname, inlinepython)), t, inlinepython
714 script = []
715 inlinepython = 0
716 continue
717
678
718 def sources(f, modname):
679 def sources(f, modname):
719 """Yields possibly multiple sources from a filepath
680 """Yields possibly multiple sources from a filepath
General Comments 0
You need to be logged in to leave comments. Login now