Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pyupgrade for
openSUSE:Factory checked in at 2021-08-11 11:47:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyupgrade (Old)
and /work/SRC/openSUSE:Factory/.python-pyupgrade.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyupgrade"
Wed Aug 11 11:47:15 2021 rev:14 rq:911250 version:2.23.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pyupgrade/python-pyupgrade.changes
2021-07-21 19:07:55.527452627 +0200
+++
/work/SRC/openSUSE:Factory/.python-pyupgrade.new.1899/python-pyupgrade.changes
2021-08-11 11:47:53.441697892 +0200
@@ -1,0 +2,27 @@
+Sun Aug 8 19:23:58 UTC 2021 - Sebastian Wagner <[email protected]>
+
+- update to version 2.23.3:
+ - can't splat async generators
+ - cannot unpack async generators
+ - add extra test for pep584
+- update to version 2.23.2:
+ - correctly compute indent for typeddict after dedent
+- update to version 2.23.1:
+ - fix bug in merge dicts: look for comma backwards
+- update to version 2.23.0:
+ - rewrite type of primitive
+- update to version 2.22.0:
+ - rewrite six.moves.range
+ - rewrite lru_cache with maxsize=None and typed=False
+ Co-authored-by: Max Rozentsveyg <[email protected]>
+- update to version 2.21.2:
+ - dont do generator rewrite if list comp contains await
+- update to version 2.21.1:
+ - fix breakage from async generator
+ - Fix etree heading, non-breaking space to space
+- update to version 2.21.0:
+ - remove redunant encoding even for f-strings
+- update to version 2.20.1:
+ - dont rewrite fstring if await in py3
+
+-------------------------------------------------------------------
Old:
----
python-pyupgrade-2.20.0.tar.gz
New:
----
python-pyupgrade-2.23.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pyupgrade.spec ++++++
--- /var/tmp/diff_new_pack.9ff5nE/_old 2021-08-11 11:47:53.901697338 +0200
+++ /var/tmp/diff_new_pack.9ff5nE/_new 2021-08-11 11:47:53.901697338 +0200
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-pyupgrade
-Version: 2.20.0
+Version: 2.23.3
Release: 0
Summary: A tool to automatically upgrade syntax for newer versions
License: MIT
++++++ python-pyupgrade-2.20.0.tar.gz -> python-pyupgrade-2.23.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/.pre-commit-config.yaml
new/pyupgrade-2.23.3/.pre-commit-config.yaml
--- old/pyupgrade-2.20.0/.pre-commit-config.yaml 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/.pre-commit-config.yaml 2021-08-04
19:50:42.000000000 +0200
@@ -24,7 +24,7 @@
hooks:
- id: autopep8
- repo: https://github.com/asottile/reorder_python_imports
- rev: v2.5.0
+ rev: v2.6.0
hooks:
- id: reorder-python-imports
args: [--py3-plus]
@@ -34,7 +34,7 @@
- id: add-trailing-comma
args: [--py36-plus]
- repo: https://github.com/asottile/pyupgrade
- rev: v2.20.0
+ rev: v2.23.3
hooks:
- id: pyupgrade
args: [--py36-plus]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/README.md
new/pyupgrade-2.23.3/README.md
--- old/pyupgrade-2.20.0/README.md 2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/README.md 2021-08-04 19:50:42.000000000 +0200
@@ -20,7 +20,7 @@
```yaml
- repo: https://github.com/asottile/pyupgrade
- rev: v2.20.0
+ rev: v2.23.3
hooks:
- id: pyupgrade
```
@@ -308,6 +308,8 @@
six.advance_iterator(it) # next(it)
six.next(it) # next(it)
six.callable(x) # callable(x)
+six.moves.range(x) # range(x)
+six.moves.xrange(x) # range(x)
from six import text_type
text_type # str
@@ -451,7 +453,7 @@
```
-###??Rewrite `xml.etree.cElementTree` to `xml.etree.ElementTree`
+### Rewrite `xml.etree.cElementTree` to `xml.etree.ElementTree`
Availability:
- `--py3-plus` is passed on the commandline.
@@ -464,6 +466,23 @@
```
+### Rewrite `type` of primitive
+
+Availability:
+- `--py3-plus` is passed on the commandline.
+
+```diff
+-type('')
++str
+-type(b'')
++bytes
+-type(0)
++int
+-type(0.)
++float
+```
+
+
### `typing.NamedTuple` / `typing.TypedDict` py36+ syntax
Availability:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_ast_helpers.py
new/pyupgrade-2.23.3/pyupgrade/_ast_helpers.py
--- old/pyupgrade-2.20.0/pyupgrade/_ast_helpers.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_ast_helpers.py 2021-08-04
19:50:42.000000000 +0200
@@ -42,3 +42,18 @@
any(k.arg is None for k in call.keywords) or
any(isinstance(a, ast.Starred) for a in call.args)
)
+
+
+def contains_await(node: ast.AST) -> bool:
+ for node_ in ast.walk(node):
+ if isinstance(node_, ast.Await):
+ return True
+ else:
+ return False
+
+
+def is_async_listcomp(node: ast.ListComp) -> bool:
+ return (
+ any(gen.is_async for gen in node.generators) or
+ contains_await(node)
+ )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_data.py
new/pyupgrade-2.23.3/pyupgrade/_data.py
--- old/pyupgrade-2.20.0/pyupgrade/_data.py 2021-07-03 21:01:26.000000000
+0200
+++ new/pyupgrade-2.23.3/pyupgrade/_data.py 2021-08-04 19:50:42.000000000
+0200
@@ -48,6 +48,7 @@
'mmap',
'select',
'six',
+ 'six.moves',
'socket',
'subprocess',
'sys',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_main.py
new/pyupgrade-2.23.3/pyupgrade/_main.py
--- old/pyupgrade-2.20.0/pyupgrade/_main.py 2021-07-03 21:01:26.000000000
+0200
+++ new/pyupgrade-2.23.3/pyupgrade/_main.py 2021-08-04 19:50:42.000000000
+0200
@@ -25,6 +25,7 @@
from pyupgrade._ast_helpers import ast_parse
from pyupgrade._ast_helpers import ast_to_offset
+from pyupgrade._ast_helpers import contains_await
from pyupgrade._ast_helpers import has_starargs
from pyupgrade._data import FUNCS
from pyupgrade._data import Settings
@@ -521,12 +522,13 @@
class FindPy36Plus(ast.NodeVisitor):
- def __init__(self) -> None:
+ def __init__(self, *, min_version: Version) -> None:
self.fstrings: Dict[Offset, ast.Call] = {}
self.named_tuples: Dict[Offset, ast.Call] = {}
self.dict_typed_dicts: Dict[Offset, ast.Call] = {}
self.kw_typed_dicts: Dict[Offset, ast.Call] = {}
self._from_imports: Dict[str, Set[str]] = collections.defaultdict(set)
+ self.min_version = min_version
def visit_ImportFrom(self, node: ast.ImportFrom) -> None:
if node.level == 0 and node.module in {'typing', 'typing_extensions'}:
@@ -591,7 +593,8 @@
if not candidate:
i += 1
else:
- self.fstrings[ast_to_offset(node)] = node
+ if self.min_version >= (3, 7) or not contains_await(node):
+ self.fstrings[ast_to_offset(node)] = node
self.generic_visit(node)
@@ -743,6 +746,8 @@
call: ast.Call,
types: Dict[str, ast.expr],
) -> Tuple[int, str]:
+ while i > 0 and tokens[i - 1].name == 'DEDENT':
+ i -= 1
if i > 0 and tokens[i - 1].name in {'INDENT', UNIMPORTANT_WS}:
indent = f'{tokens[i - 1].src}{" " * 4}'
else:
@@ -758,13 +763,13 @@
return end, attrs
-def _fix_py36_plus(contents_text: str) -> str:
+def _fix_py36_plus(contents_text: str, *, min_version: Version) -> str:
try:
ast_obj = ast_parse(contents_text)
except SyntaxError:
return contents_text
- visitor = FindPy36Plus()
+ visitor = FindPy36Plus(min_version=min_version)
visitor.visit(ast_obj)
if not any((
@@ -871,7 +876,9 @@
)
contents_text = _fix_tokens(contents_text, min_version=args.min_version)
if args.min_version >= (3, 6):
- contents_text = _fix_py36_plus(contents_text)
+ contents_text = _fix_py36_plus(
+ contents_text, min_version=args.min_version,
+ )
if filename == '-':
print(contents_text, end='')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/pyupgrade/_plugins/default_encoding.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/default_encoding.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/default_encoding.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/default_encoding.py 2021-08-04
19:50:42.000000000 +0200
@@ -31,7 +31,7 @@
if (
state.settings.min_version >= (3,) and
isinstance(node.func, ast.Attribute) and
- isinstance(node.func.value, ast.Str) and
+ isinstance(node.func.value, (ast.Str, ast.JoinedStr)) and
node.func.attr == 'encode' and
not has_starargs(node) and
len(node.args) == 1 and
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/pyupgrade/_plugins/generator_expressions_pep289.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/generator_expressions_pep289.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/generator_expressions_pep289.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/generator_expressions_pep289.py
2021-08-04 19:50:42.000000000 +0200
@@ -8,6 +8,7 @@
from tokenize_rt import Token
from pyupgrade._ast_helpers import ast_to_offset
+from pyupgrade._ast_helpers import is_async_listcomp
from pyupgrade._data import register
from pyupgrade._data import State
from pyupgrade._data import TokenFunc
@@ -51,7 +52,8 @@
isinstance(node.func, ast.Name) and
node.func.id in ALLOWED_FUNCS and
node.args and
- isinstance(node.args[0], ast.ListComp)
+ isinstance(node.args[0], ast.ListComp) and
+ not is_async_listcomp(node.args[0])
):
if len(node.args) == 1 and not node.keywords:
yield ast_to_offset(node.args[0]), _delete_list_comp_brackets
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_plugins/lru_cache.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/lru_cache.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/lru_cache.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/lru_cache.py 2021-08-04
19:50:42.000000000 +0200
@@ -2,6 +2,7 @@
import functools
from typing import Iterable
from typing import List
+from typing import Optional
from typing import Tuple
from tokenize_rt import Offset
@@ -23,6 +24,34 @@
del tokens[i:j + 1]
+def _is_literal_kwarg(
+ keyword: ast.keyword, name: str, value: Optional[bool],
+) -> bool:
+ return (
+ keyword.arg == name and
+ isinstance(keyword.value, ast.NameConstant) and
+ keyword.value.value is value
+ )
+
+
+def _eligible(keywords: List[ast.keyword]) -> bool:
+ if len(keywords) == 1:
+ return _is_literal_kwarg(keywords[0], 'maxsize', None)
+ elif len(keywords) == 2:
+ return (
+ (
+ _is_literal_kwarg(keywords[0], 'maxsize', None) and
+ _is_literal_kwarg(keywords[1], 'typed', False)
+ ) or
+ (
+ _is_literal_kwarg(keywords[1], 'maxsize', None) and
+ _is_literal_kwarg(keywords[0], 'typed', False)
+ )
+ )
+ else:
+ return False
+
+
@register(ast.Call)
def visit_Call(
state: State,
@@ -48,10 +77,7 @@
isinstance(node.func.value, ast.Name) and
node.func.value.id == 'functools' and
not node.args and
- len(node.keywords) == 1 and
- node.keywords[0].arg == 'maxsize' and
- isinstance(node.keywords[0].value, ast.NameConstant) and
- node.keywords[0].value.value is None
+ _eligible(node.keywords)
):
func = functools.partial(
find_and_replace_call, template='functools.cache',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_plugins/pep584.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/pep584.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/pep584.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/pep584.py 2021-08-04
19:50:42.000000000 +0200
@@ -12,7 +12,6 @@
from pyupgrade._data import State
from pyupgrade._data import TokenFunc
from pyupgrade._token_helpers import find_closing_bracket
-from pyupgrade._token_helpers import find_token
def _replace_dict_brackets(i: int, tokens: List[Token]) -> None:
@@ -39,8 +38,10 @@
def _replace_comma_with_pipe(i: int, tokens: List[Token]) -> None:
- comma = find_token(tokens, i, ',')
- tokens[comma] = Token('CODE', ' |')
+ j = i - 1
+ while not (tokens[j].name == 'OP' and tokens[j].src == ','):
+ j -= 1
+ tokens[j] = Token('CODE', ' |')
@register(ast.Dict)
@@ -54,8 +55,7 @@
if all(key is None for key in node.keys) and len(node.values) > 1:
yield ast_to_offset(node), _replace_dict_brackets
- arg_count = len(node.values)
for idx, arg in enumerate(node.values):
yield ast_to_offset(arg), _remove_double_star
- if idx < arg_count - 1:
+ if idx > 0:
yield ast_to_offset(arg), _replace_comma_with_pipe
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/pyupgrade/_plugins/six_simple.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/six_simple.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/six_simple.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/six_simple.py 2021-08-04
19:50:42.000000000 +0200
@@ -68,6 +68,16 @@
func = functools.partial(replace_name, name=node.attr, new=new)
yield ast_to_offset(node), func
+ elif (
+ state.settings.min_version >= (3,) and
+ isinstance(node.value, ast.Attribute) and
+ isinstance(node.value.value, ast.Name) and
+ node.value.value.id == 'six' and
+ node.value.attr == 'moves' and
+ node.attr in {'xrange', 'range'}
+ ):
+ func = functools.partial(replace_name, name=node.attr, new='range')
+ yield ast_to_offset(node), func
@register(ast.Name)
@@ -95,3 +105,10 @@
func = functools.partial(replace_name, name=node.id, new=new)
yield ast_to_offset(node), func
+ elif (
+ state.settings.min_version >= (3,) and
+ node.id in state.from_imports['six.moves'] and
+ node.id in {'xrange', 'range'}
+ ):
+ func = functools.partial(replace_name, name=node.id, new='range')
+ yield ast_to_offset(node), func
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/pyupgrade/_plugins/type_of_primitive.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/type_of_primitive.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/type_of_primitive.py
1970-01-01 01:00:00.000000000 +0100
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/type_of_primitive.py
2021-08-04 19:50:42.000000000 +0200
@@ -0,0 +1,65 @@
+import ast
+import functools
+from typing import Iterable
+from typing import List
+from typing import Tuple
+
+from tokenize_rt import Offset
+from tokenize_rt import Token
+
+from pyupgrade._ast_helpers import ast_to_offset
+from pyupgrade._data import register
+from pyupgrade._data import State
+from pyupgrade._data import TokenFunc
+from pyupgrade._token_helpers import find_closing_bracket
+from pyupgrade._token_helpers import find_open_paren
+
+NUM_TYPES = {
+ int: 'int',
+ float: 'float',
+ complex: 'complex',
+}
+
+
+def _rewrite_type_of_primitive(
+ i: int,
+ tokens: List[Token],
+ *,
+ src: str,
+) -> None:
+ open_paren = find_open_paren(tokens, i + 1)
+ j = find_closing_bracket(tokens, open_paren)
+ tokens[i] = tokens[i]._replace(src=src)
+ del tokens[i + 1:j + 1]
+
+
+@register(ast.Call)
+def visit_Call(
+ state: State,
+ node: ast.Call,
+ parent: ast.AST,
+) -> Iterable[Tuple[Offset, TokenFunc]]:
+ if (
+ state.settings.min_version >= (3,) and
+ isinstance(node.func, ast.Name) and
+ node.func.id == 'type' and
+ len(node.args) == 1
+ ):
+ if isinstance(node.args[0], ast.Str):
+ func = functools.partial(
+ _rewrite_type_of_primitive,
+ src='str',
+ )
+ yield ast_to_offset(node), func
+ elif isinstance(node.args[0], ast.Bytes):
+ func = functools.partial(
+ _rewrite_type_of_primitive,
+ src='bytes',
+ )
+ yield ast_to_offset(node), func
+ elif isinstance(node.args[0], ast.Num):
+ func = functools.partial(
+ _rewrite_type_of_primitive,
+ src=NUM_TYPES[type(node.args[0].n)],
+ )
+ yield ast_to_offset(node), func
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/pyupgrade/_plugins/unpack_list_comprehension.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/unpack_list_comprehension.py
--- old/pyupgrade-2.20.0/pyupgrade/_plugins/unpack_list_comprehension.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/pyupgrade/_plugins/unpack_list_comprehension.py
2021-08-04 19:50:42.000000000 +0200
@@ -7,6 +7,7 @@
from tokenize_rt import Token
from pyupgrade._ast_helpers import ast_to_offset
+from pyupgrade._ast_helpers import is_async_listcomp
from pyupgrade._data import register
from pyupgrade._data import State
from pyupgrade._data import TokenFunc
@@ -31,6 +32,7 @@
state.settings.min_version >= (3,) and
len(node.targets) == 1 and
isinstance(node.targets[0], ast.Tuple) and
- isinstance(node.value, ast.ListComp)
+ isinstance(node.value, ast.ListComp) and
+ not is_async_listcomp(node.value)
):
yield ast_to_offset(node.value), _replace_list_comprehension
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/pyupgrade/_plugins/unpacking_argument_list_comprehensions.py
new/pyupgrade-2.23.3/pyupgrade/_plugins/unpacking_argument_list_comprehensions.py
---
old/pyupgrade-2.20.0/pyupgrade/_plugins/unpacking_argument_list_comprehensions.py
2021-07-03 21:01:26.000000000 +0200
+++
new/pyupgrade-2.23.3/pyupgrade/_plugins/unpacking_argument_list_comprehensions.py
2021-08-04 19:50:42.000000000 +0200
@@ -5,6 +5,7 @@
from tokenize_rt import Offset
from pyupgrade._ast_helpers import ast_to_offset
+from pyupgrade._ast_helpers import is_async_listcomp
from pyupgrade._data import register
from pyupgrade._data import State
from pyupgrade._data import TokenFunc
@@ -19,6 +20,7 @@
) -> Iterable[Tuple[Offset, TokenFunc]]:
if (
state.settings.min_version >= (3,) and
- isinstance(node.value, ast.ListComp)
+ isinstance(node.value, ast.ListComp) and
+ not is_async_listcomp(node.value)
):
yield ast_to_offset(node.value), replace_list_comp_brackets
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/setup.cfg
new/pyupgrade-2.23.3/setup.cfg
--- old/pyupgrade-2.20.0/setup.cfg 2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/setup.cfg 2021-08-04 19:50:42.000000000 +0200
@@ -1,6 +1,6 @@
[metadata]
name = pyupgrade
-version = 2.20.0
+version = 2.23.3
description = A tool to automatically upgrade syntax for newer versions.
long_description = file: README.md
long_description_content_type = text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/default_encoding_test.py
new/pyupgrade-2.23.3/tests/features/default_encoding_test.py
--- old/pyupgrade-2.20.0/tests/features/default_encoding_test.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/default_encoding_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -8,6 +8,10 @@
('s', 'expected'),
(
('"asd".encode("utf-8")', '"asd".encode()'),
+ ('f"asd".encode("utf-8")', 'f"asd".encode()'),
+ ('f"{3}asd".encode("utf-8")', 'f"{3}asd".encode()'),
+ ('fr"asd".encode("utf-8")', 'fr"asd".encode()'),
+ ('r"asd".encode("utf-8")', 'r"asd".encode()'),
('"asd".encode("utf8")', '"asd".encode()'),
('"asd".encode("UTF-8")', '"asd".encode()'),
pytest.param(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/tests/features/fstrings_test.py
new/pyupgrade-2.23.3/tests/features/fstrings_test.py
--- old/pyupgrade-2.20.0/tests/features/fstrings_test.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/fstrings_test.py 2021-08-04
19:50:42.000000000 +0200
@@ -34,10 +34,13 @@
r'''"{}".format(a['\\'])''',
'"{}".format(a["b"])',
"'{}'.format(a['b'])",
+ # await only becomes keyword in Python 3.7+
+ "async def c(): return '{}'.format(await 3)",
+ "async def c(): return '{}'.format(1 + await 3)",
),
)
def test_fix_fstrings_noop(s):
- assert _fix_py36_plus(s) == s
+ assert _fix_py36_plus(s, min_version=(3, 6)) == s
@pytest.mark.parametrize(
@@ -60,4 +63,10 @@
),
)
def test_fix_fstrings(s, expected):
- assert _fix_py36_plus(s) == expected
+ assert _fix_py36_plus(s, min_version=(3, 6)) == expected
+
+
+def test_fix_fstrings_await_py37():
+ s = "async def c(): return '{}'.format(await 1+foo())"
+ expected = "async def c(): return f'{await 1+foo()}'"
+ assert _fix_py36_plus(s, min_version=(3, 7)) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/generator_expressions_pep289_test.py
new/pyupgrade-2.23.3/tests/features/generator_expressions_pep289_test.py
--- old/pyupgrade-2.20.0/tests/features/generator_expressions_pep289_test.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/generator_expressions_pep289_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -20,6 +20,21 @@
'"".join([[i for _ in range(2)] for i in range(3)])\n',
id='string join (left alone for perf reasons)',
),
+ pytest.param(
+ 'async def foo():\n'
+ ' for i in range(3):\n'
+ ' yield i\n'
+ 'async def bar():\n'
+ ' sum([i async for i in foo()])\n',
+ id='Contains async',
+ ),
+ pytest.param(
+ 'tuple([\n'
+ ' await self._configure_component(hass, controller_config)\n'
+ ' for controller_config in configs\n'
+ '])\n',
+ id='Contains await',
+ ),
),
)
def test_fix_generator_expressions_noop(s):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/tests/features/lru_cache_test.py
new/pyupgrade-2.23.3/tests/features/lru_cache_test.py
--- old/pyupgrade-2.20.0/tests/features/lru_cache_test.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/lru_cache_test.py 2021-08-04
19:50:42.000000000 +0200
@@ -101,6 +101,22 @@
(3, 9),
id='unrelated parameter',
),
+ pytest.param(
+ 'import functools\n\n'
+ '@functools.lru_cache(maxsize=None, typed=True)\n'
+ 'def foo():\n'
+ ' pass\n',
+ (3, 9),
+ id='typed=True',
+ ),
+ pytest.param(
+ 'import functools\n\n'
+ '@functools.lru_cache(maxsize=None, typed=False, foo=False)\n'
+ 'def foo():\n'
+ ' pass\n',
+ (3, 9),
+ id='invalid keyword',
+ ),
),
)
def test_fix_maxsize_none_decorators_noop(s, min_version):
@@ -121,6 +137,28 @@
' pass\n',
id='call with attr',
),
+ pytest.param(
+ 'import functools\n\n'
+ '@functools.lru_cache(maxsize=None, typed=False)\n'
+ 'def foo():\n'
+ ' pass\n',
+ 'import functools\n\n'
+ '@functools.cache\n'
+ 'def foo():\n'
+ ' pass\n',
+ id='call with attr, maxsize=None then typed=False',
+ ),
+ pytest.param(
+ 'import functools\n\n'
+ '@functools.lru_cache(typed=False, maxsize=None)\n'
+ 'def foo():\n'
+ ' pass\n',
+ 'import functools\n\n'
+ '@functools.cache\n'
+ 'def foo():\n'
+ ' pass\n',
+ id='call with attr, typed=False then maxsize=None',
+ ),
),
)
def test_fix_maxsize_none_decorators(s, expected):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/tests/features/pep584_test.py
new/pyupgrade-2.23.3/tests/features/pep584_test.py
--- old/pyupgrade-2.20.0/tests/features/pep584_test.py 1970-01-01
01:00:00.000000000 +0100
+++ new/pyupgrade-2.23.3/tests/features/pep584_test.py 2021-08-04
19:50:42.000000000 +0200
@@ -0,0 +1,123 @@
+import pytest
+
+from pyupgrade._data import Settings
+from pyupgrade._main import _fix_plugins
+
+
[email protected](
+ ('s', 'version'),
+ (
+ pytest.param(
+ '{**a, **b}\n',
+ (3, 8),
+ id='<3.9',
+ ),
+ pytest.param(
+ '{"a": 0}\n',
+ (3, 9),
+ id='Dict without merge',
+ ),
+ pytest.param(
+ 'x = {**a}\n',
+ (3, 9),
+ id='Merge of only one dict',
+ ),
+ ),
+)
+def test_fix_pep584_noop(s, version):
+ assert _fix_plugins(s, settings=Settings(min_version=version)) == s
+
+
[email protected](
+ ('s', 'expected'),
+ (
+ pytest.param(
+ 'x = {**a, **b}\n',
+
+ 'x = a | b\n',
+
+ id='Simple dict rewrite',
+ ),
+ pytest.param(
+ 'x = {**{**a, **b}, **c}\n',
+
+ 'x = a | b | c\n',
+
+ id='Nested merge of dicts',
+ ),
+ pytest.param(
+ 'x = {**a, **b,}\n',
+
+ 'x = a | b\n',
+
+ id='Trailing comma',
+ ),
+ pytest.param(
+ 'x = {\n'
+ ' **a, # foo\n'
+ ' **b # bar\n'
+ '}\n',
+
+ 'x = (\n'
+ ' a | # foo\n'
+ ' b # bar\n'
+ ')\n',
+
+ id='Multiple lines with comment',
+ ),
+ pytest.param(
+ 'x = {\n'
+ ' **a,\n'
+ ' **b\n'
+ '}\n',
+
+ 'x = (\n'
+ ' a |\n'
+ ' b\n'
+ ')\n',
+
+ id='Multiple lines',
+ ),
+ pytest.param(
+ 'x = {\n'
+ ' **a,\n'
+ ' **b,\n'
+ '}\n',
+
+ 'x = (\n'
+ ' a |\n'
+ ' b\n'
+ ')\n',
+
+ id='Multiple lines, trailing comma',
+ ),
+ pytest.param(
+ 'x = {\n'
+ ' **{a: a for a in range(3)},\n'
+ ' **b,\n'
+ '}\n',
+
+ 'x = (\n'
+ ' {a: a for a in range(3)} |\n'
+ ' b\n'
+ ')\n',
+
+ id='Dict comprehension within merge of dicts',
+ ),
+ pytest.param(
+ 'x = {\n'
+ ' **{a: b for a, b in zip(range(3), range(3))},\n'
+ ' **b,\n'
+ '}\n',
+
+ 'x = (\n'
+ ' {a: b for a, b in zip(range(3), range(3))} |\n'
+ ' b\n'
+ ')\n',
+
+ id='Dict with comma inside it',
+ ),
+ ),
+)
+def test_fix_pep584(s, expected):
+ assert _fix_plugins(s, settings=Settings(min_version=(3, 9))) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/tests/features/six_simple_test.py
new/pyupgrade-2.23.3/tests/features/six_simple_test.py
--- old/pyupgrade-2.20.0/tests/features/six_simple_test.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/six_simple_test.py 2021-08-04
19:50:42.000000000 +0200
@@ -19,6 +19,10 @@
'isinstance("foo", text_type)\n',
id='relative import might not be six',
),
+ pytest.param(
+ 'foo.range(3)',
+ id='Range, but not from six.moves',
+ ),
),
)
def test_six_simple_noop(s):
@@ -63,6 +67,29 @@
'from six import string_types\n'
'STRING_TYPES = (str,)\n',
),
+ pytest.param(
+ 'six.moves.range(3)\n',
+
+ 'range(3)\n',
+
+ id='six.moves.range',
+ ),
+ pytest.param(
+ 'six.moves.xrange(3)\n',
+
+ 'range(3)\n',
+
+ id='six.moves.xrange',
+ ),
+ pytest.param(
+ 'from six.moves import xrange\n'
+ 'xrange(3)\n',
+
+ 'from six.moves import xrange\n'
+ 'range(3)\n',
+
+ id='six.moves.xrange, from import',
+ ),
),
)
def test_fix_six_simple(s, expected):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/type_of_primitive_test.py
new/pyupgrade-2.23.3/tests/features/type_of_primitive_test.py
--- old/pyupgrade-2.20.0/tests/features/type_of_primitive_test.py
1970-01-01 01:00:00.000000000 +0100
+++ new/pyupgrade-2.23.3/tests/features/type_of_primitive_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -0,0 +1,74 @@
+import pytest
+
+from pyupgrade._data import Settings
+from pyupgrade._main import _fix_plugins
+
+
[email protected](
+ ('s', 'version'),
+ (
+ pytest.param(
+ 'type("")\n',
+ (2, 7),
+ id='not python 3+',
+ ),
+ pytest.param(
+ 'type(None)\n',
+ (3,),
+ id='NoneType',
+ ),
+ pytest.param(
+ 'foo = "foo"\n'
+ 'type(foo)\n',
+ (3,),
+ id='String assigned to variable',
+ ),
+ ),
+)
+def test_fix_type_of_primitive_noop(s, version):
+ assert _fix_plugins(s, settings=Settings(min_version=version)) == s
+
+
[email protected](
+ ('s', 'expected'),
+ (
+ pytest.param(
+ 'type("")\n',
+
+ 'str\n',
+
+ id='Empty string -> str',
+ ),
+ pytest.param(
+ 'type(0)\n',
+
+ 'int\n',
+
+ id='zero -> int',
+ ),
+ pytest.param(
+ 'type(0.)\n',
+
+ 'float\n',
+
+ id='decimal zero -> float',
+ ),
+ pytest.param(
+ 'type(0j)\n',
+
+ 'complex\n',
+
+ id='0j -> complex',
+ ),
+ pytest.param(
+ 'type(b"")\n',
+
+ 'bytes\n',
+
+ id='Empty bytes string -> bytes',
+ ),
+ ),
+)
+def test_fix_type_of_primitive(s, expected):
+ ret = _fix_plugins(s, settings=Settings(min_version=(3,)))
+ assert ret == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyupgrade-2.20.0/tests/features/typing_584_test.py
new/pyupgrade-2.23.3/tests/features/typing_584_test.py
--- old/pyupgrade-2.20.0/tests/features/typing_584_test.py 2021-07-03
21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/typing_584_test.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,97 +0,0 @@
-import pytest
-
-from pyupgrade._data import Settings
-from pyupgrade._main import _fix_plugins
-
-
[email protected](
- ('s', 'version'),
- (
- pytest.param(
- '{**a, **b}\n',
- (3, 8),
- id='<3.9',
- ),
- pytest.param(
- '{"a": 0}\n',
- (3, 9),
- id='Dict without merge',
- ),
- pytest.param(
- 'x = {**a}\n',
- (3, 9),
- id='Merge of only one dict',
- ),
- ),
-)
-def test_fix_pep584_noop(s, version):
- assert _fix_plugins(s, settings=Settings(min_version=version)) == s
-
-
[email protected](
- ('s', 'expected'),
- (
- pytest.param(
- 'x = {**a, **b}\n',
-
- 'x = a | b\n',
-
- id='Simple dict rewrite',
- ),
- pytest.param(
- 'x = {**{**a, **b}, **c}\n',
-
- 'x = a | b | c\n',
-
- id='Nested merge of dicts',
- ),
- pytest.param(
- 'x = {**a, **b,}\n',
-
- 'x = a | b\n',
-
- id='Trailing comma',
- ),
- pytest.param(
- 'x = {\n'
- ' **a, # foo\n'
- ' **b # bar\n'
- '}\n',
-
- 'x = (\n'
- ' a | # foo\n'
- ' b # bar\n'
- ')\n',
-
- id='Multiple lines with comment',
- ),
- pytest.param(
- 'x = {\n'
- ' **a,\n'
- ' **b\n'
- '}\n',
-
- 'x = (\n'
- ' a |\n'
- ' b\n'
- ')\n',
-
- id='Multiple lines',
- ),
- pytest.param(
- 'x = {\n'
- ' **a,\n'
- ' **b,\n'
- '}\n',
-
- 'x = (\n'
- ' a |\n'
- ' b\n'
- ')\n',
-
- id='Multiple lines, trailing comma',
- ),
- ),
-)
-def test_fix_pep584(s, expected):
- assert _fix_plugins(s, settings=Settings(min_version=(3, 9))) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/typing_named_tuple_test.py
new/pyupgrade-2.23.3/tests/features/typing_named_tuple_test.py
--- old/pyupgrade-2.20.0/tests/features/typing_named_tuple_test.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/typing_named_tuple_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -57,7 +57,7 @@
),
)
def test_typing_named_tuple_noop(s):
- assert _fix_py36_plus(s) == s
+ assert _fix_py36_plus(s, min_version=(3, 6)) == s
@pytest.mark.parametrize(
@@ -171,4 +171,4 @@
),
)
def test_fix_typing_named_tuple(s, expected):
- assert _fix_py36_plus(s) == expected
+ assert _fix_py36_plus(s, min_version=(3, 6)) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/typing_typed_dict_test.py
new/pyupgrade-2.23.3/tests/features/typing_typed_dict_test.py
--- old/pyupgrade-2.20.0/tests/features/typing_typed_dict_test.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/typing_typed_dict_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -46,7 +46,7 @@
),
)
def test_typing_typed_dict_noop(s):
- assert _fix_py36_plus(s) == s
+ assert _fix_py36_plus(s, min_version=(3, 6)) == s
@pytest.mark.parametrize(
@@ -134,7 +134,23 @@
id='index unparse error',
),
+ pytest.param(
+ 'import typing\n'
+ 'if True:\n'
+ ' if False:\n'
+ ' pass\n'
+ ' D = typing.TypedDict("D", a=int)\n',
+
+ 'import typing\n'
+ 'if True:\n'
+ ' if False:\n'
+ ' pass\n'
+ ' class D(typing.TypedDict):\n'
+ ' a: int\n',
+
+ id='right after a dedent',
+ ),
),
)
def test_typing_typed_dict(s, expected):
- assert _fix_py36_plus(s) == expected
+ assert _fix_py36_plus(s, min_version=(3, 6)) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/unpack_list_comprehension_test.py
new/pyupgrade-2.23.3/tests/features/unpack_list_comprehension_test.py
--- old/pyupgrade-2.20.0/tests/features/unpack_list_comprehension_test.py
2021-07-03 21:01:26.000000000 +0200
+++ new/pyupgrade-2.23.3/tests/features/unpack_list_comprehension_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -17,6 +17,11 @@
(3,),
id='assignment to single variable',
),
+ pytest.param(
+ 'x, = [await foo for foo in bar]',
+ (3,),
+ id='async comprehension',
+ ),
),
)
def test_fix_typing_text_noop(s, version):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyupgrade-2.20.0/tests/features/unpacking_argument_list_comprehensions_test.py
new/pyupgrade-2.23.3/tests/features/unpacking_argument_list_comprehensions_test.py
---
old/pyupgrade-2.20.0/tests/features/unpacking_argument_list_comprehensions_test.py
2021-07-03 21:01:26.000000000 +0200
+++
new/pyupgrade-2.23.3/tests/features/unpacking_argument_list_comprehensions_test.py
2021-08-04 19:50:42.000000000 +0200
@@ -32,6 +32,11 @@
(3,),
id='Starred, no list comp',
),
+ pytest.param(
+ 'foo(*[x async for x in bar])',
+ (3,),
+ id='async listcomp',
+ ),
),
)
def test_fix_unpack_argument_list_comp_noop(s, version):