comparison tests/test-check-module-imports.t @ 28275:d4cced5885f8

tests: rename 'test-module-import.t' into 'test-check-module-import.t' This test is checking our source code to ensure style and correct behavior (eg: no cycle). Current convention is that such tests starts with 'test-check-' so we flock this on back with the others.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Sat, 27 Feb 2016 17:31:23 +0100
parents tests/test-module-imports.t@5d5b98346fc2
children f3fb24e36d61
comparison
equal deleted inserted replaced
28274:5d9578d9ad1a 28275:d4cced5885f8
1 #require test-repo
2
3 $ import_checker="$TESTDIR"/../contrib/import-checker.py
4
5 Run the doctests from the import checker, and make sure
6 it's working correctly.
7 $ TERM=dumb
8 $ export TERM
9 $ python -m doctest $import_checker
10
11 Run additional tests for the import checker
12
13 $ mkdir testpackage
14
15 $ cat > testpackage/multiple.py << EOF
16 > from __future__ import absolute_import
17 > import os, sys
18 > EOF
19
20 $ cat > testpackage/unsorted.py << EOF
21 > from __future__ import absolute_import
22 > import sys
23 > import os
24 > EOF
25
26 $ cat > testpackage/stdafterlocal.py << EOF
27 > from __future__ import absolute_import
28 > from . import unsorted
29 > import os
30 > EOF
31
32 $ cat > testpackage/requirerelative.py << EOF
33 > from __future__ import absolute_import
34 > import testpackage.unsorted
35 > EOF
36
37 $ cat > testpackage/importalias.py << EOF
38 > from __future__ import absolute_import
39 > import ui
40 > EOF
41
42 $ cat > testpackage/relativestdlib.py << EOF
43 > from __future__ import absolute_import
44 > from .. import os
45 > EOF
46
47 $ cat > testpackage/symbolimport.py << EOF
48 > from __future__ import absolute_import
49 > from .unsorted import foo
50 > EOF
51
52 $ cat > testpackage/latesymbolimport.py << EOF
53 > from __future__ import absolute_import
54 > from . import unsorted
55 > from mercurial.node import hex
56 > EOF
57
58 $ cat > testpackage/multiplegroups.py << EOF
59 > from __future__ import absolute_import
60 > from . import unsorted
61 > from . import more
62 > EOF
63
64 $ mkdir testpackage/subpackage
65 $ cat > testpackage/subpackage/levelpriority.py << EOF
66 > from __future__ import absolute_import
67 > from . import foo
68 > from .. import parent
69 > EOF
70
71 $ touch testpackage/subpackage/foo.py
72 $ cat > testpackage/subpackage/__init__.py << EOF
73 > from __future__ import absolute_import
74 > from . import levelpriority # should not cause cycle
75 > EOF
76
77 $ cat > testpackage/subpackage/localimport.py << EOF
78 > from __future__ import absolute_import
79 > from . import foo
80 > def bar():
81 > # should not cause "higher-level import should come first"
82 > from .. import unsorted
83 > # but other errors should be detected
84 > from .. import more
85 > import testpackage.subpackage.levelpriority
86 > EOF
87
88 $ cat > testpackage/importmodulefromsub.py << EOF
89 > from __future__ import absolute_import
90 > from .subpackage import foo # not a "direct symbol import"
91 > EOF
92
93 $ cat > testpackage/importsymbolfromsub.py << EOF
94 > from __future__ import absolute_import
95 > from .subpackage import foo, nonmodule
96 > EOF
97
98 $ cat > testpackage/sortedentries.py << EOF
99 > from __future__ import absolute_import
100 > from . import (
101 > foo,
102 > bar,
103 > )
104 > EOF
105
106 $ cat > testpackage/importfromalias.py << EOF
107 > from __future__ import absolute_import
108 > from . import ui
109 > EOF
110
111 $ cat > testpackage/importfromrelative.py << EOF
112 > from __future__ import absolute_import
113 > from testpackage.unsorted import foo
114 > EOF
115
116 $ python "$import_checker" testpackage/*.py testpackage/subpackage/*.py
117 testpackage/importalias.py:2: ui module must be "as" aliased to uimod
118 testpackage/importfromalias.py:2: ui from testpackage must be "as" aliased to uimod
119 testpackage/importfromrelative.py:2: import should be relative: testpackage.unsorted
120 testpackage/importfromrelative.py:2: direct symbol import foo from testpackage.unsorted
121 testpackage/importsymbolfromsub.py:2: direct symbol import nonmodule from testpackage.subpackage
122 testpackage/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node
123 testpackage/multiple.py:2: multiple imported names: os, sys
124 testpackage/multiplegroups.py:3: multiple "from . import" statements
125 testpackage/relativestdlib.py:2: relative import of stdlib module
126 testpackage/requirerelative.py:2: import should be relative: testpackage.unsorted
127 testpackage/sortedentries.py:2: imports from testpackage not lexically sorted: bar < foo
128 testpackage/stdafterlocal.py:3: stdlib import follows local import: os
129 testpackage/subpackage/levelpriority.py:3: higher-level import should come first: testpackage
130 testpackage/subpackage/localimport.py:7: multiple "from .. import" statements
131 testpackage/subpackage/localimport.py:8: import should be relative: testpackage.subpackage.levelpriority
132 testpackage/symbolimport.py:2: direct symbol import foo from testpackage.unsorted
133 testpackage/unsorted.py:3: imports not lexically sorted: os < sys
134 [1]
135
136 $ cd "$TESTDIR"/..
137
138 There are a handful of cases here that require renaming a module so it
139 doesn't overlap with a stdlib module name. There are also some cycles
140 here that we should still endeavor to fix, and some cycles will be
141 hidden by deduplication algorithm in the cycle detector, so fixing
142 these may expose other cycles.
143
144 $ hg locate 'mercurial/**.py' 'hgext/**.py' | sed 's-\\-/-g' | python "$import_checker" -
145 Import cycle: hgext.largefiles.basestore -> hgext.largefiles.localstore -> hgext.largefiles.basestore
146 [1]