| 1 | """Record of phased-in incompatible language changes.
 | 
| 2 | 
 | 
| 3 | Each line is of the form:
 | 
| 4 | 
 | 
| 5 |     FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease ","
 | 
| 6 |                               CompilerFlag ")"
 | 
| 7 | 
 | 
| 8 | where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples
 | 
| 9 | of the same form as sys.version_info:
 | 
| 10 | 
 | 
| 11 |     (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 | 
| 12 |      PY_MINOR_VERSION, # the 1; an int
 | 
| 13 |      PY_MICRO_VERSION, # the 0; an int
 | 
| 14 |      PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 | 
| 15 |      PY_RELEASE_SERIAL # the 3; an int
 | 
| 16 |     )
 | 
| 17 | 
 | 
| 18 | OptionalRelease records the first release in which
 | 
| 19 | 
 | 
| 20 |     from __future__ import FeatureName
 | 
| 21 | 
 | 
| 22 | was accepted.
 | 
| 23 | 
 | 
| 24 | In the case of MandatoryReleases that have not yet occurred,
 | 
| 25 | MandatoryRelease predicts the release in which the feature will become part
 | 
| 26 | of the language.
 | 
| 27 | 
 | 
| 28 | Else MandatoryRelease records when the feature became part of the language;
 | 
| 29 | in releases at or after that, modules no longer need
 | 
| 30 | 
 | 
| 31 |     from __future__ import FeatureName
 | 
| 32 | 
 | 
| 33 | to use the feature in question, but may continue to use such imports.
 | 
| 34 | 
 | 
| 35 | MandatoryRelease may also be None, meaning that a planned feature got
 | 
| 36 | dropped.
 | 
| 37 | 
 | 
| 38 | Instances of class _Feature have two corresponding methods,
 | 
| 39 | .getOptionalRelease() and .getMandatoryRelease().
 | 
| 40 | 
 | 
| 41 | CompilerFlag is the (bitfield) flag that should be passed in the fourth
 | 
| 42 | argument to the builtin function compile() to enable the feature in
 | 
| 43 | dynamically compiled code.  This flag is stored in the .compiler_flag
 | 
| 44 | attribute on _Future instances.  These values must match the appropriate
 | 
| 45 | #defines of CO_xxx flags in Include/compile.h.
 | 
| 46 | 
 | 
| 47 | No feature line is ever to be deleted from this file.
 | 
| 48 | """
 | 
| 49 | 
 | 
| 50 | all_feature_names = [
 | 
| 51 |     "nested_scopes",
 | 
| 52 |     "generators",
 | 
| 53 |     "division",
 | 
| 54 |     "absolute_import",
 | 
| 55 |     "with_statement",
 | 
| 56 |     "print_function",
 | 
| 57 |     "unicode_literals",
 | 
| 58 | ]
 | 
| 59 | 
 | 
| 60 | __all__ = ["all_feature_names"] + all_feature_names
 | 
| 61 | 
 | 
| 62 | # The CO_xxx symbols are defined here under the same names used by
 | 
| 63 | # compile.h, so that an editor search will find them here.  However,
 | 
| 64 | # they're not exported in __all__, because they don't really belong to
 | 
| 65 | # this module.
 | 
| 66 | CO_NESTED            = 0x0010   # nested_scopes
 | 
| 67 | CO_GENERATOR_ALLOWED = 0        # generators (obsolete, was 0x1000)
 | 
| 68 | CO_FUTURE_DIVISION   = 0x2000   # division
 | 
| 69 | CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # perform absolute imports by default
 | 
| 70 | CO_FUTURE_WITH_STATEMENT  = 0x8000   # with statement
 | 
| 71 | CO_FUTURE_PRINT_FUNCTION  = 0x10000   # print function
 | 
| 72 | CO_FUTURE_UNICODE_LITERALS = 0x20000 # unicode string literals
 | 
| 73 | 
 | 
| 74 | class _Feature:
 | 
| 75 |     def __init__(self, optionalRelease, mandatoryRelease, compiler_flag):
 | 
| 76 |         self.optional = optionalRelease
 | 
| 77 |         self.mandatory = mandatoryRelease
 | 
| 78 |         self.compiler_flag = compiler_flag
 | 
| 79 | 
 | 
| 80 |     def getOptionalRelease(self):
 | 
| 81 |         """Return first release in which this feature was recognized.
 | 
| 82 | 
 | 
| 83 |         This is a 5-tuple, of the same form as sys.version_info.
 | 
| 84 |         """
 | 
| 85 | 
 | 
| 86 |         return self.optional
 | 
| 87 | 
 | 
| 88 |     def getMandatoryRelease(self):
 | 
| 89 |         """Return release in which this feature will become mandatory.
 | 
| 90 | 
 | 
| 91 |         This is a 5-tuple, of the same form as sys.version_info, or, if
 | 
| 92 |         the feature was dropped, is None.
 | 
| 93 |         """
 | 
| 94 | 
 | 
| 95 |         return self.mandatory
 | 
| 96 | 
 | 
| 97 |     def __repr__(self):
 | 
| 98 |         return "_Feature" + repr((self.optional,
 | 
| 99 |                                   self.mandatory,
 | 
| 100 |                                   self.compiler_flag))
 | 
| 101 | 
 | 
| 102 | nested_scopes = _Feature((2, 1, 0, "beta",  1),
 | 
| 103 |                          (2, 2, 0, "alpha", 0),
 | 
| 104 |                          CO_NESTED)
 | 
| 105 | 
 | 
| 106 | generators = _Feature((2, 2, 0, "alpha", 1),
 | 
| 107 |                       (2, 3, 0, "final", 0),
 | 
| 108 |                       CO_GENERATOR_ALLOWED)
 | 
| 109 | 
 | 
| 110 | division = _Feature((2, 2, 0, "alpha", 2),
 | 
| 111 |                     (3, 0, 0, "alpha", 0),
 | 
| 112 |                     CO_FUTURE_DIVISION)
 | 
| 113 | 
 | 
| 114 | absolute_import = _Feature((2, 5, 0, "alpha", 1),
 | 
| 115 |                            (3, 0, 0, "alpha", 0),
 | 
| 116 |                            CO_FUTURE_ABSOLUTE_IMPORT)
 | 
| 117 | 
 | 
| 118 | with_statement = _Feature((2, 5, 0, "alpha", 1),
 | 
| 119 |                           (2, 6, 0, "alpha", 0),
 | 
| 120 |                           CO_FUTURE_WITH_STATEMENT)
 | 
| 121 | 
 | 
| 122 | print_function = _Feature((2, 6, 0, "alpha", 2),
 | 
| 123 |                           (3, 0, 0, "alpha", 0),
 | 
| 124 |                           CO_FUTURE_PRINT_FUNCTION)
 | 
| 125 | 
 | 
| 126 | unicode_literals = _Feature((2, 6, 0, "alpha", 2),
 | 
| 127 |                             (3, 0, 0, "alpha", 0),
 | 
| 128 |                             CO_FUTURE_UNICODE_LITERALS)
 |