ctx: click.Context,
param: click.Parameter,
value: Optional[str],
-) -> Optional[Pattern]:
+) -> Optional[Pattern[str]]:
try:
return re_compile_maybe_verbose(value) if value is not None else None
except re.error:
quiet: bool,
verbose: bool,
required_version: str,
- include: Pattern,
- exclude: Optional[Pattern],
- extend_exclude: Optional[Pattern],
- force_exclude: Optional[Pattern],
+ include: Pattern[str],
+ exclude: Optional[Pattern[str]],
+ extend_exclude: Optional[Pattern[str]],
+ force_exclude: Optional[Pattern[str]],
stdin_filename: Optional[str],
workers: int,
src: Tuple[str, ...],
sources_to_cache.append(src)
report.done(src, changed)
if cancelled:
- await asyncio.gather(*cancelled, loop=loop, return_exceptions=True)
+ if sys.version_info >= (3, 7):
+ await asyncio.gather(*cancelled, return_exceptions=True)
+ else:
+ await asyncio.gather(*cancelled, loop=loop, return_exceptions=True)
if sources_to_cache:
write_cache(cache, sources_to_cache, mode)
versions = mode.target_versions
else:
versions = detect_target_versions(src_node)
+
+ # TODO: fully drop support and this code hopefully in January 2022 :D
+ if TargetVersion.PY27 in mode.target_versions or versions == {TargetVersion.PY27}:
+ msg = (
+ "DEPRECATION: Python 2 support will be removed in the first stable release "
+ "expected in January 2022."
+ )
+ err(msg, fg="yellow", bold=True)
+
normalize_fmt_off(src_node)
lines = LineGenerator(
mode=mode,
return tiow.read(), encoding, newline
-def get_features_used(node: Node) -> Set[Feature]:
+def get_features_used(node: Node) -> Set[Feature]: # noqa: C901
"""Return a set of (relatively) new Python features used in this file.
Currently looking for:
- positional only arguments in function signatures and lambdas;
- assignment expression;
- relaxed decorator syntax;
+ - print / exec statements;
"""
features: Set[Feature] = set()
for n in node.pre_order():
features.add(Feature.F_STRINGS)
elif n.type == token.NUMBER:
- if "_" in n.value: # type: ignore
+ assert isinstance(n, Leaf)
+ if "_" in n.value:
features.add(Feature.NUMERIC_UNDERSCORES)
+ elif n.value.endswith(("L", "l")):
+ # Python 2: 10L
+ features.add(Feature.LONG_INT_LITERAL)
+ elif len(n.value) >= 2 and n.value[0] == "0" and n.value[1].isdigit():
+ # Python 2: 0123; 00123; ...
+ if not all(char == "0" for char in n.value):
+ # although we don't want to match 0000 or similar
+ features.add(Feature.OCTAL_INT_LITERAL)
elif n.type == token.SLASH:
if n.parent and n.parent.type in {
if argch.type in STARS:
features.add(feature)
+ # Python 2 only features (for its deprecation) except for integers, see above
+ elif n.type == syms.print_stmt:
+ features.add(Feature.PRINT_STMT)
+ elif n.type == syms.exec_stmt:
+ features.add(Feature.EXEC_STMT)
+ elif n.type == syms.tfpdef:
+ # def set_position((x, y), value):
+ # ...
+ features.add(Feature.AUTOMATIC_PARAMETER_UNPACKING)
+ elif n.type == syms.except_clause:
+ # try:
+ # ...
+ # except Exception, err:
+ # ...
+ if len(n.children) >= 4:
+ if n.children[-2].type == token.COMMA:
+ features.add(Feature.COMMA_STYLE_EXCEPT)
+ elif n.type == syms.raise_stmt:
+ # raise Exception, "msg"
+ if len(n.children) >= 4:
+ if n.children[-2].type == token.COMMA:
+ features.add(Feature.COMMA_STYLE_RAISE)
+ elif n.type == token.BACKQUOTE:
+ # `i'm surprised this ever existed`
+ features.add(Feature.BACKQUOTE_REPR)
+
return features
"""
try:
from click import core
- from click import _unicodefun # type: ignore
+ from click import _unicodefun
except ModuleNotFoundError:
return