Before this patch, we didn't allow imports like
from importlib import resources
(That's the reason I used import importlib.resources in D7629.)
I think that form is still an absolute import, so I don't think we
forbade on purpose.
( )
| indygreg |
| hg-reviewers |
Before this patch, we didn't allow imports like
from importlib import resources
(That's the reason I used import importlib.resources in D7629.)
I think that form is still an absolute import, so I don't think we
forbade on purpose.
| No Linters Available |
| No Unit Test Coverage |
| Path | Packages | |||
|---|---|---|---|---|
| M | contrib/import-checker.py (2 lines) | |||
| M | tests/test-imports-checker.t (6 lines) |
| Commit | Parents | Author | Summary | Date |
|---|---|---|---|---|
| 7dcc8ed562d8 | 699d6be3820a | Martin von Zweigbergk | Dec 18 2019, 4:39 PM |
| Status | Author | Revision | |
|---|---|---|---|
| Abandoned | martinvonz | ||
| Abandoned | martinvonz | ||
| Abandoned | martinvonz | ||
| Closed | martinvonz | ||
| Closed | martinvonz |
| yield msg('import should be relative: %s', fullname) | yield msg('import should be relative: %s', fullname) | ||||
| # __future__ is special since it needs to come first and use | # __future__ is special since it needs to come first and use | ||||
| # symbol import. | # symbol import. | ||||
| if fullname != '__future__': | if fullname != '__future__': | ||||
| if not fullname or ( | if not fullname or ( | ||||
| fullname in stdlib_modules | fullname in stdlib_modules | ||||
| # allow standard 'from typing import ...' style | # allow standard 'from typing import ...' style | ||||
| and fullname != 'typing' | and fullname.startswith('.') | ||||
| and fullname not in localmods | and fullname not in localmods | ||||
| and fullname + '.__init__' not in localmods | and fullname + '.__init__' not in localmods | ||||
| ): | ): | ||||
| yield msg('relative import of stdlib module') | yield msg('relative import of stdlib module') | ||||
| else: | else: | ||||
| seenlocal = fullname | seenlocal = fullname | ||||
| # Direct symbol import is only allowed from certain modules and | # Direct symbol import is only allowed from certain modules and | ||||
| > import ui | > import ui | ||||
| > EOF | > EOF | ||||
| $ cat > testpackage/relativestdlib.py << EOF | $ cat > testpackage/relativestdlib.py << EOF | ||||
| > from __future__ import absolute_import | > from __future__ import absolute_import | ||||
| > from .. import os | > from .. import os | ||||
| > EOF | > EOF | ||||
| $ cat > testpackage/stdlibfrom.py << EOF | |||||
| > from __future__ import absolute_import | |||||
| > from collections import abc | |||||
| > EOF | |||||
| $ cat > testpackage/symbolimport.py << EOF | $ cat > testpackage/symbolimport.py << EOF | ||||
| > from __future__ import absolute_import | > from __future__ import absolute_import | ||||
| > from .unsorted import foo | > from .unsorted import foo | ||||
| > EOF | > EOF | ||||
| $ cat > testpackage/latesymbolimport.py << EOF | $ cat > testpackage/latesymbolimport.py << EOF | ||||
| > from __future__ import absolute_import | > from __future__ import absolute_import | ||||
| > from . import unsorted | > from . import unsorted | ||||
| testpackage/importsymbolfromsub.py:2: direct symbol import nonmodule from testpackage.subpackage | testpackage/importsymbolfromsub.py:2: direct symbol import nonmodule from testpackage.subpackage | ||||
| testpackage/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node | testpackage/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node | ||||
| testpackage/multiple.py:2: multiple imported names: os, sys | testpackage/multiple.py:2: multiple imported names: os, sys | ||||
| testpackage/multiplegroups.py:3: multiple "from . import" statements | testpackage/multiplegroups.py:3: multiple "from . import" statements | ||||
| testpackage/relativestdlib.py:2: relative import of stdlib module | testpackage/relativestdlib.py:2: relative import of stdlib module | ||||
| testpackage/requirerelative.py:2: import should be relative: testpackage.unsorted | testpackage/requirerelative.py:2: import should be relative: testpackage.unsorted | ||||
| testpackage/sortedentries.py:2: imports from testpackage not lexically sorted: bar < foo | testpackage/sortedentries.py:2: imports from testpackage not lexically sorted: bar < foo | ||||
| testpackage/stdafterlocal.py:3: stdlib import "os" follows local import: testpackage | testpackage/stdafterlocal.py:3: stdlib import "os" follows local import: testpackage | ||||
| testpackage/stdlibfrom.py:2: direct symbol import abc from collections | |||||
| testpackage/subpackage/levelpriority.py:3: higher-level import should come first: testpackage | testpackage/subpackage/levelpriority.py:3: higher-level import should come first: testpackage | ||||
| testpackage/subpackage/localimport.py:7: multiple "from .. import" statements | testpackage/subpackage/localimport.py:7: multiple "from .. import" statements | ||||
| testpackage/subpackage/localimport.py:8: import should be relative: testpackage.subpackage.levelpriority | testpackage/subpackage/localimport.py:8: import should be relative: testpackage.subpackage.levelpriority | ||||
| testpackage/symbolimport.py:2: direct symbol import foo from testpackage.unsorted | testpackage/symbolimport.py:2: direct symbol import foo from testpackage.unsorted | ||||
| testpackage/unsorted.py:3: imports not lexically sorted: os < sys | testpackage/unsorted.py:3: imports not lexically sorted: os < sys | ||||
| testpackage2/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node | testpackage2/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node | ||||
| [1] | [1] | ||||