mirror of
https://github.com/python/cpython.git
synced 2025-08-19 00:00:48 +00:00

svn+ssh://pythondev@svn.python.org/python/trunk ................ r67376 | benjamin.peterson | 2008-11-25 05:07:45 +0100 (Tue, 25 Nov 2008) | 17 lines Merged revisions 67183,67191,67371 via svnmerge from svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r67183 | benjamin.peterson | 2008-11-10 21:51:33 -0600 (Mon, 10 Nov 2008) | 1 line handle 'import x as y' in fix_imports; this still needs more work... ........ r67191 | benjamin.peterson | 2008-11-11 17:24:51 -0600 (Tue, 11 Nov 2008) | 1 line super() is good ........ r67371 | benjamin.peterson | 2008-11-24 16:02:00 -0600 (Mon, 24 Nov 2008) | 1 line don't blow up in the metaclass fixer when assignments in the class statement aren't simple ........ ................
67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
"""Fixer for import statements.
|
|
If spam is being imported from the local directory, this import:
|
|
from spam import eggs
|
|
Becomes:
|
|
from .spam import eggs
|
|
|
|
And this import:
|
|
import spam
|
|
Becomes:
|
|
from . import spam
|
|
"""
|
|
|
|
# Local imports
|
|
from .. import fixer_base
|
|
from os.path import dirname, join, exists, pathsep
|
|
from ..fixer_util import FromImport, syms
|
|
|
|
class FixImport(fixer_base.BaseFix):
|
|
|
|
PATTERN = """
|
|
import_from< type='from' imp=any 'import' ['('] any [')'] >
|
|
|
|
|
import_name< type='import' imp=any >
|
|
"""
|
|
|
|
def transform(self, node, results):
|
|
imp = results['imp']
|
|
|
|
mod_name = unicode(imp.children[0] if imp.type == syms.dotted_as_name \
|
|
else imp)
|
|
|
|
if mod_name.startswith('.'):
|
|
# Already a new-style import
|
|
return
|
|
|
|
if not probably_a_local_import(mod_name, self.filename):
|
|
# I guess this is a global import -- skip it!
|
|
return
|
|
|
|
if results['type'].value == 'from':
|
|
# Some imps are top-level (eg: 'import ham')
|
|
# some are first level (eg: 'import ham.eggs')
|
|
# some are third level (eg: 'import ham.eggs as spam')
|
|
# Hence, the loop
|
|
while not hasattr(imp, 'value'):
|
|
imp = imp.children[0]
|
|
imp.value = "." + imp.value
|
|
node.changed()
|
|
else:
|
|
new = FromImport('.', getattr(imp, 'content', None) or [imp])
|
|
new.set_prefix(node.get_prefix())
|
|
node = new
|
|
return node
|
|
|
|
def probably_a_local_import(imp_name, file_path):
|
|
# Must be stripped because the right space is included by the parser
|
|
imp_name = imp_name.split('.', 1)[0].strip()
|
|
base_path = dirname(file_path)
|
|
base_path = join(base_path, imp_name)
|
|
# If there is no __init__.py next to the file its not in a package
|
|
# so can't be a relative import.
|
|
if not exists(join(dirname(base_path), '__init__.py')):
|
|
return False
|
|
for ext in ['.py', pathsep, '.pyc', '.so', '.sl', '.pyd']:
|
|
if exists(base_path + ext):
|
|
return True
|
|
return False
|