tests/test-module-imports.t
branchstable
changeset 28977 740156eedf2c
parent 28665 2d39f987f0ba
parent 28976 9fb2e8c8f320
child 28978 1f277ae29168
equal deleted inserted replaced
28665:2d39f987f0ba 28977:740156eedf2c
     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]