Home | History | Annotate | Download | only in fixes
      1 """Fix incompatible renames
      2 
      3 Fixes:
      4   * sys.maxint -> sys.maxsize
      5 """
      6 # Author: Christian Heimes
      7 # based on Collin Winter's fix_import
      8 
      9 # Local imports
     10 from .. import fixer_base
     11 from ..fixer_util import Name, attr_chain
     12 
     13 MAPPING = {"sys":  {"maxint" : "maxsize"},
     14           }
     15 LOOKUP = {}
     16 
     17 def alternates(members):
     18     return "(" + "|".join(map(repr, members)) + ")"
     19 
     20 
     21 def build_pattern():
     22     #bare = set()
     23     for module, replace in MAPPING.items():
     24         for old_attr, new_attr in replace.items():
     25             LOOKUP[(module, old_attr)] = new_attr
     26             #bare.add(module)
     27             #bare.add(old_attr)
     28             #yield """
     29             #      import_name< 'import' (module=%r
     30             #          | dotted_as_names< any* module=%r any* >) >
     31             #      """ % (module, module)
     32             yield """
     33                   import_from< 'from' module_name=%r 'import'
     34                       ( attr_name=%r | import_as_name< attr_name=%r 'as' any >) >
     35                   """ % (module, old_attr, old_attr)
     36             yield """
     37                   power< module_name=%r trailer< '.' attr_name=%r > any* >
     38                   """ % (module, old_attr)
     39     #yield """bare_name=%s""" % alternates(bare)
     40 
     41 
     42 class FixRenames(fixer_base.BaseFix):
     43     BM_compatible = True
     44     PATTERN = "|".join(build_pattern())
     45 
     46     order = "pre" # Pre-order tree traversal
     47 
     48     # Don't match the node if it's within another match
     49     def match(self, node):
     50         match = super(FixRenames, self).match
     51         results = match(node)
     52         if results:
     53             if any(match(obj) for obj in attr_chain(node, "parent")):
     54                 return False
     55             return results
     56         return False
     57 
     58     #def start_tree(self, tree, filename):
     59     #    super(FixRenames, self).start_tree(tree, filename)
     60     #    self.replace = {}
     61 
     62     def transform(self, node, results):
     63         mod_name = results.get("module_name")
     64         attr_name = results.get("attr_name")
     65         #bare_name = results.get("bare_name")
     66         #import_mod = results.get("module")
     67 
     68         if mod_name and attr_name:
     69             new_attr = unicode(LOOKUP[(mod_name.value, attr_name.value)])
     70             attr_name.replace(Name(new_attr, prefix=attr_name.prefix))
     71