chosen by the user.
"""
+import sys
+
from dataclasses import dataclass, field
from enum import Enum
+from operator import attrgetter
from typing import Dict, Set
+if sys.version_info < (3, 8):
+ from typing_extensions import Final
+else:
+ from typing import Final
+
from black.const import DEFAULT_LINE_LENGTH
PY37 = 7
PY38 = 8
PY39 = 9
+ PY310 = 10
def is_python2(self) -> bool:
return self is TargetVersion.PY27
ASSIGNMENT_EXPRESSIONS = 8
POS_ONLY_ARGUMENTS = 9
RELAXED_DECORATORS = 10
+ PATTERN_MATCHING = 11
+ UNPACKING_ON_FLOW = 12
+ ANN_ASSIGN_EXTENDED_RHS = 13
FORCE_OPTIONAL_PARENTHESES = 50
+ # __future__ flags
+ FUTURE_ANNOTATIONS = 51
+
# temporary for Python 2 deprecation
PRINT_STMT = 200
EXEC_STMT = 201
+ AUTOMATIC_PARAMETER_UNPACKING = 202
+ COMMA_STYLE_EXCEPT = 203
+ COMMA_STYLE_RAISE = 204
+ LONG_INT_LITERAL = 205
+ OCTAL_INT_LITERAL = 206
+ BACKQUOTE_REPR = 207
+
+
+FUTURE_FLAG_TO_FEATURE: Final = {
+ "annotations": Feature.FUTURE_ANNOTATIONS,
+}
VERSION_TO_FEATURES: Dict[TargetVersion, Set[Feature]] = {
Feature.ASYNC_IDENTIFIERS,
Feature.PRINT_STMT,
Feature.EXEC_STMT,
+ Feature.AUTOMATIC_PARAMETER_UNPACKING,
+ Feature.COMMA_STYLE_EXCEPT,
+ Feature.COMMA_STYLE_RAISE,
+ Feature.LONG_INT_LITERAL,
+ Feature.OCTAL_INT_LITERAL,
+ Feature.BACKQUOTE_REPR,
},
TargetVersion.PY33: {Feature.UNICODE_LITERALS, Feature.ASYNC_IDENTIFIERS},
TargetVersion.PY34: {Feature.UNICODE_LITERALS, Feature.ASYNC_IDENTIFIERS},
Feature.TRAILING_COMMA_IN_CALL,
Feature.TRAILING_COMMA_IN_DEF,
Feature.ASYNC_KEYWORDS,
+ Feature.FUTURE_ANNOTATIONS,
},
TargetVersion.PY38: {
Feature.UNICODE_LITERALS,
Feature.TRAILING_COMMA_IN_CALL,
Feature.TRAILING_COMMA_IN_DEF,
Feature.ASYNC_KEYWORDS,
+ Feature.FUTURE_ANNOTATIONS,
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.POS_ONLY_ARGUMENTS,
+ Feature.UNPACKING_ON_FLOW,
+ Feature.ANN_ASSIGN_EXTENDED_RHS,
},
TargetVersion.PY39: {
Feature.UNICODE_LITERALS,
Feature.TRAILING_COMMA_IN_CALL,
Feature.TRAILING_COMMA_IN_DEF,
Feature.ASYNC_KEYWORDS,
+ Feature.FUTURE_ANNOTATIONS,
+ Feature.ASSIGNMENT_EXPRESSIONS,
+ Feature.RELAXED_DECORATORS,
+ Feature.POS_ONLY_ARGUMENTS,
+ Feature.UNPACKING_ON_FLOW,
+ Feature.ANN_ASSIGN_EXTENDED_RHS,
+ },
+ TargetVersion.PY310: {
+ Feature.UNICODE_LITERALS,
+ Feature.F_STRINGS,
+ Feature.NUMERIC_UNDERSCORES,
+ Feature.TRAILING_COMMA_IN_CALL,
+ Feature.TRAILING_COMMA_IN_DEF,
+ Feature.ASYNC_KEYWORDS,
+ Feature.FUTURE_ANNOTATIONS,
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.RELAXED_DECORATORS,
Feature.POS_ONLY_ARGUMENTS,
+ Feature.UNPACKING_ON_FLOW,
+ Feature.ANN_ASSIGN_EXTENDED_RHS,
+ Feature.PATTERN_MATCHING,
},
}
if self.target_versions:
version_str = ",".join(
str(version.value)
- for version in sorted(self.target_versions, key=lambda v: v.value)
+ for version in sorted(self.target_versions, key=attrgetter("value"))
)
else:
version_str = "-"