From b7dabb0fa92c24c9347ea37b84ea154dd3a2e22e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:36:02 +0000 Subject: [PATCH 1/7] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.5.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v4.6.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02695093..53ee9716 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From 878f79a6b26fe65492f5594c6683864ea8168c64 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 23:29:00 +0000 Subject: [PATCH 2/7] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.9.0 → v1.10.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.9.0...v1.10.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 53ee9716..249c0444 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,6 +36,6 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.9.0 + rev: v1.10.0 hooks: - id: mypy From 49e5374ab7dfcb8c2eb86f2027e6f8e3fff13d3d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 22:54:28 +0000 Subject: [PATCH 3/7] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/hhatto/autopep8: v2.1.0 → v2.1.1](https://github.com/hhatto/autopep8/compare/v2.1.0...v2.1.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 249c0444..ee1ea4e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,7 +28,7 @@ repos: - id: pyupgrade args: [--py38-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.1.0 + rev: v2.1.1 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From 327a5f9fd0e8994953686426365fe4b8df5b13e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 23:11:10 +0000 Subject: [PATCH 4/7] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/reorder-python-imports: v3.12.0 → v3.13.0](https://github.com/asottile/reorder-python-imports/compare/v3.12.0...v3.13.0) - [github.com/hhatto/autopep8: v2.1.1 → v2.2.0](https://github.com/hhatto/autopep8/compare/v2.1.1...v2.2.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ee1ea4e6..6214b7ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.12.0 + rev: v3.13.0 hooks: - id: reorder-python-imports args: [--py38-plus, --add-import, 'from __future__ import annotations'] @@ -28,7 +28,7 @@ repos: - id: pyupgrade args: [--py38-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.1.1 + rev: v2.2.0 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From 7914830fcc359238c9d372c7394bd1cf5eb8c40a Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 7 Jun 2024 19:30:17 +0100 Subject: [PATCH 5/7] Regenerate typing import replacements using latest reorder-python-imports --- pyupgrade/_plugins/imports.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pyupgrade/_plugins/imports.py b/pyupgrade/_plugins/imports.py index ce032f3e..9574da04 100644 --- a/pyupgrade/_plugins/imports.py +++ b/pyupgrade/_plugins/imports.py @@ -21,7 +21,7 @@ from pyupgrade._token_helpers import indented_amount # GENERATED VIA generate-imports -# Using reorder-python-imports==3.12.0 +# Using reorder-python-imports==3.13.0 REMOVALS = { (3,): { '__future__': { @@ -99,12 +99,10 @@ ('typing_extensions', 'ClassVar'): 'typing', ('typing_extensions', 'Collection'): 'typing', ('typing_extensions', 'Container'): 'typing', - ('typing_extensions', 'ContextManager'): 'typing', ('typing_extensions', 'Coroutine'): 'typing', ('typing_extensions', 'DefaultDict'): 'typing', ('typing_extensions', 'Dict'): 'typing', ('typing_extensions', 'FrozenSet'): 'typing', - ('typing_extensions', 'Generator'): 'typing', ('typing_extensions', 'Generic'): 'typing', ('typing_extensions', 'Hashable'): 'typing', ('typing_extensions', 'IO'): 'typing', @@ -138,8 +136,6 @@ }, (3, 7): { ('mypy_extensions', 'NoReturn'): 'typing', - ('typing_extensions', 'AsyncContextManager'): 'typing', - ('typing_extensions', 'AsyncGenerator'): 'typing', ('typing_extensions', 'ChainMap'): 'typing', ('typing_extensions', 'Counter'): 'typing', ('typing_extensions', 'Deque'): 'typing', @@ -150,8 +146,6 @@ ('mypy_extensions', 'TypedDict'): 'typing', ('typing_extensions', 'Final'): 'typing', ('typing_extensions', 'OrderedDict'): 'typing', - ('typing_extensions', 'SupportsIndex'): 'typing', - ('typing_extensions', 'runtime_checkable'): 'typing', }, (3, 9): { ('typing', 'AsyncGenerator'): 'collections.abc', @@ -217,15 +211,14 @@ }, (3, 12): { ('typing_extensions', 'NamedTuple'): 'typing', - ('typing_extensions', 'Protocol'): 'typing', ('typing_extensions', 'SupportsAbs'): 'typing', ('typing_extensions', 'SupportsBytes'): 'typing', ('typing_extensions', 'SupportsComplex'): 'typing', ('typing_extensions', 'SupportsFloat'): 'typing', + ('typing_extensions', 'SupportsIndex'): 'typing', ('typing_extensions', 'SupportsInt'): 'typing', ('typing_extensions', 'SupportsRound'): 'typing', ('typing_extensions', 'TypeAliasType'): 'typing', - ('typing_extensions', 'TypedDict'): 'typing', ('typing_extensions', 'Unpack'): 'typing', ('typing_extensions', 'dataclass_transform'): 'typing', ('typing_extensions', 'override'): 'typing', From 2a996f9d4107887970dec67d74063c9620a320ed Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 30 Jul 2023 22:18:33 -0400 Subject: [PATCH 6/7] rewrite pep 646 Unpack to splat in `*args` --- pyupgrade/_plugins/typing_pep646_unpack.py | 39 +++++++++++++++++++++ tests/features/typing_pep646_unpack_test.py | 17 +++++++++ 2 files changed, 56 insertions(+) diff --git a/pyupgrade/_plugins/typing_pep646_unpack.py b/pyupgrade/_plugins/typing_pep646_unpack.py index 632814a7..4cee0d23 100644 --- a/pyupgrade/_plugins/typing_pep646_unpack.py +++ b/pyupgrade/_plugins/typing_pep646_unpack.py @@ -37,3 +37,42 @@ def visit_Subscript( if is_name_attr(node.value, state.from_imports, ('typing',), ('Unpack',)): if isinstance(parent, (ast.Subscript, ast.Index)): yield ast_to_offset(node.value), _replace_unpack_with_star + + +def _visit_func( + state: State, + node: ast.AsyncFunctionDef | ast.FunctionDef, + parent: ast.AST, +) -> Iterable[tuple[Offset, TokenFunc]]: + if state.settings.min_version < (3, 11): + return + + vararg = node.args.vararg + if ( + vararg is not None and + isinstance(vararg.annotation, ast.Subscript) and + is_name_attr( + vararg.annotation.value, + state.from_imports, + ('typing',), ('Unpack',), + ) + ): + yield ast_to_offset(vararg.annotation.value), _replace_unpack_with_star + + +@register(ast.AsyncFunctionDef) +def visit_AsyncFunctionDef( + state: State, + node: ast.AsyncFunctionDef, + parent: ast.AST, +) -> Iterable[tuple[Offset, TokenFunc]]: + yield from _visit_func(state, node, parent) + + +@register(ast.FunctionDef) +def visit_FunctionDef( + state: State, + node: ast.FunctionDef, + parent: ast.AST, +) -> Iterable[tuple[Offset, TokenFunc]]: + yield from _visit_func(state, node, parent) diff --git a/tests/features/typing_pep646_unpack_test.py b/tests/features/typing_pep646_unpack_test.py index c1d82e85..d63909ad 100644 --- a/tests/features/typing_pep646_unpack_test.py +++ b/tests/features/typing_pep646_unpack_test.py @@ -21,6 +21,14 @@ ' pass', id='Not inside a subscript', ), + pytest.param( + 'from typing import Unpack\n' + 'from typing import TypedDict\n' + 'class D(TypedDict):\n' + ' x: int\n' + 'def f(**kwargs: Unpack[D]) -> None: pass\n', + id='3.12 TypedDict for kwargs', + ), ), ) def test_fix_pep646_noop(s): @@ -53,6 +61,15 @@ def test_fix_pep646_noop(s): 'class C(Generic[*Shape]):\n' ' pass', ), + pytest.param( + 'from typing import Unpack\n' + 'def f(*args: Unpack[tuple[int, ...]]): pass\n', + + 'from typing import Unpack\n' + 'def f(*args: *tuple[int, ...]): pass\n', + + id='Unpack for *args', + ), ), ) def test_typing_unpack(s, expected): From 32151ac97cbfd7f9dcd22e49516fb32266db45b4 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 8 Jun 2024 14:28:08 -0400 Subject: [PATCH 7/7] v3.16.0 --- .pre-commit-config.yaml | 2 +- README.md | 2 +- setup.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6214b7ae..23c957b9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.15.2 + rev: v3.16.0 hooks: - id: pyupgrade args: [--py38-plus] diff --git a/README.md b/README.md index 047e51b7..623a20b1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Sample `.pre-commit-config.yaml`: ```yaml - repo: https://github.com/asottile/pyupgrade - rev: v3.15.2 + rev: v3.16.0 hooks: - id: pyupgrade ``` diff --git a/setup.cfg b/setup.cfg index c68fe32a..6d2bc052 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pyupgrade -version = 3.15.2 +version = 3.16.0 description = A tool to automatically upgrade syntax for newer versions. long_description = file: README.md long_description_content_type = text/markdown