chosen by the user.
"""
+from hashlib import sha256
import sys
from dataclasses import dataclass, field
-from enum import Enum
+from enum import Enum, auto
from operator import attrgetter
from typing import Dict, Set
+from warnings import warn
if sys.version_info < (3, 8):
from typing_extensions import Final
PY38 = 8
PY39 = 9
PY310 = 10
+ PY311 = 11
class Feature(Enum):
PATTERN_MATCHING = 11
UNPACKING_ON_FLOW = 12
ANN_ASSIGN_EXTENDED_RHS = 13
+ EXCEPT_STAR = 14
+ VARIADIC_GENERICS = 15
FORCE_OPTIONAL_PARENTHESES = 50
# __future__ flags
Feature.ANN_ASSIGN_EXTENDED_RHS,
Feature.PATTERN_MATCHING,
},
+ TargetVersion.PY311: {
+ 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,
+ Feature.EXCEPT_STAR,
+ Feature.VARIADIC_GENERICS,
+ },
}
class Preview(Enum):
"""Individual preview style features."""
+ string_processing = auto()
+ remove_redundant_parens = auto()
+ one_element_subscript = auto()
+ annotation_parens = auto()
+ long_docstring_quotes_on_newline = auto()
+ remove_block_trailing_newline = auto()
+
+
+class Deprecated(UserWarning):
+ """Visible deprecation warning."""
+
@dataclass
class Mode:
is_ipynb: bool = False
magic_trailing_comma: bool = True
experimental_string_processing: bool = False
+ python_cell_magics: Set[str] = field(default_factory=set)
preview: bool = False
+ def __post_init__(self) -> None:
+ if self.experimental_string_processing:
+ warn(
+ "`experimental string processing` has been included in `preview`"
+ " and deprecated. Use `preview` instead.",
+ Deprecated,
+ )
+
def __contains__(self, feature: Preview) -> bool:
"""
Provide `Preview.FEATURE in Mode` syntax that mirrors the ``preview`` flag.
The argument is not checked and features are not differentiated.
They only exist to make development easier by clarifying intent.
"""
+ if feature is Preview.string_processing:
+ return self.preview or self.experimental_string_processing
return self.preview
def get_cache_key(self) -> str:
str(int(self.magic_trailing_comma)),
str(int(self.experimental_string_processing)),
str(int(self.preview)),
+ sha256((",".join(sorted(self.python_cell_magics))).encode()).hexdigest(),
]
return ".".join(parts)