Staging
v0.5.1
swh:1:snp:635f4099902912592851108bcac178ff574f7c5f
Raw File
Tip revision: 43baef41fdf4b448d74fbd88ca738b1f4ddc6670 authored by Barry Warsaw on 21 November 2008, 01:18:21 UTC
Bump to 3.0rc3
Tip revision: 43baef4
fix_import.py
"""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

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']

        if str(imp).startswith('.'):
            # Already a new-style import
            return

        if not probably_a_local_import(str(imp), 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
back to top