OLD | NEW |
(Empty) | |
| 1 u""" |
| 2 Warn about features that are not present in Python 2.5, giving a message that |
| 3 points to the earliest version of Python 2.x (or 3.x, if none) that supports it |
| 4 """ |
| 5 |
| 6 from .feature_base import Feature, Features |
| 7 from lib2to3 import fixer_base |
| 8 |
| 9 FEATURES = [ |
| 10 #(FeatureName, |
| 11 # FeaturePattern, |
| 12 # FeatureMinVersion, |
| 13 #), |
| 14 (u"memoryview", |
| 15 u"power < 'memoryview' trailer < '(' any* ')' > any* >", |
| 16 u"2.7", |
| 17 ), |
| 18 (u"numbers", |
| 19 u"""import_from< 'from' 'numbers' 'import' any* > | |
| 20 import_name< 'import' ('numbers' dotted_as_names< any* 'numbers' any*
>) >""", |
| 21 u"2.6", |
| 22 ), |
| 23 (u"abc", |
| 24 u"""import_name< 'import' ('abc' dotted_as_names< any* 'abc' any* >) > | |
| 25 import_from< 'from' 'abc' 'import' any* >""", |
| 26 u"2.6", |
| 27 ), |
| 28 (u"io", |
| 29 u"""import_name< 'import' ('io' dotted_as_names< any* 'io' any* >) > | |
| 30 import_from< 'from' 'io' 'import' any* >""", |
| 31 u"2.6", |
| 32 ), |
| 33 (u"bin", |
| 34 u"power< 'bin' trailer< '(' any* ')' > any* >", |
| 35 u"2.6", |
| 36 ), |
| 37 (u"formatting", |
| 38 u"power< any trailer< '.' 'format' > trailer< '(' any* ')' > >", |
| 39 u"2.6", |
| 40 ), |
| 41 (u"nonlocal", |
| 42 u"global_stmt< 'nonlocal' any* >", |
| 43 u"3.0", |
| 44 ), |
| 45 (u"with_traceback", |
| 46 u"trailer< '.' 'with_traceback' >", |
| 47 u"3.0", |
| 48 ), |
| 49 ] |
| 50 |
| 51 class FixFeatures(fixer_base.BaseFix): |
| 52 |
| 53 run_order = 9 # Wait until all other fixers have run to check for these |
| 54 |
| 55 # To avoid spamming, we only want to warn for each feature once. |
| 56 features_warned = set() |
| 57 |
| 58 # Build features from the list above |
| 59 features = Features([Feature(name, pattern, version) for \ |
| 60 name, pattern, version in FEATURES]) |
| 61 |
| 62 PATTERN = features.PATTERN |
| 63 |
| 64 def match(self, node): |
| 65 to_ret = super(FixFeatures, self).match(node) |
| 66 # We want the mapping only to tell us the node's specific information. |
| 67 try: |
| 68 del to_ret[u'node'] |
| 69 except Exception: |
| 70 # We want it to delete the 'node' from the results |
| 71 # if it's there, so we don't care if it fails for normal reasons. |
| 72 pass |
| 73 return to_ret |
| 74 |
| 75 def transform(self, node, results): |
| 76 for feature_name in results: |
| 77 if feature_name in self.features_warned: |
| 78 continue |
| 79 else: |
| 80 curr_feature = self.features[feature_name] |
| 81 if curr_feature.version >= u"3": |
| 82 fail = self.cannot_convert |
| 83 else: |
| 84 fail = self.warning |
| 85 fail(node, reason=curr_feature.message_text()) |
| 86 self.features_warned.add(feature_name) |
OLD | NEW |