From 157091a014fb9a160682d250ef68c1114a505d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Mon, 25 Oct 2021 23:30:29 +0200 Subject: Add tests for assignment expressions in function defaults (#5188) * Add tests for assignment expressions in function defaults Ref #3688 * Upgrade astroid to 2.8.4 Co-authored-by: Pierre Sassoulas --- ChangeLog | 5 ++++ doc/whatsnew/2.12.rst | 5 ++++ requirements_test_min.txt | 2 +- setup.cfg | 2 +- .../access/access_to_protected_members_typing.txt | 0 .../u/undefined/undefined_variable_py38.py | 33 ++++++++++++++++++++++ .../u/undefined/undefined_variable_py38.txt | 4 ++- tests/functional/u/unused/unused_variable_py38.py | 32 +++++++++++++++++++++ tests/functional/u/unused/unused_variable_py38.rc | 5 ++++ tests/functional/u/unused/unused_variable_py38.txt | 6 ++++ 10 files changed, 91 insertions(+), 3 deletions(-) delete mode 100644 tests/functional/a/access/access_to_protected_members_typing.txt create mode 100644 tests/functional/u/unused/unused_variable_py38.py create mode 100644 tests/functional/u/unused/unused_variable_py38.rc create mode 100644 tests/functional/u/unused/unused_variable_py38.txt diff --git a/ChangeLog b/ChangeLog index 732a62f35..541e6543f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -42,6 +42,11 @@ Release date: TBA Closes #3771 +* ``undefined-variable`` and ``unused-variable`` now correctly trigger for assignment expressions + in functions defaults + + Fixes part of #3688 + * Fix bug with importing namespace packages with relative imports Closes #2967 and #5131 diff --git a/doc/whatsnew/2.12.rst b/doc/whatsnew/2.12.rst index af5b33a43..0573ddc50 100644 --- a/doc/whatsnew/2.12.rst +++ b/doc/whatsnew/2.12.rst @@ -86,6 +86,11 @@ Other Changes Closes #3771 +* ``undefined-variable`` and ``unused-variable`` now correctly trigger for assignment expressions + in functions defaults + + Fixes part of #3688 + * Fix double emitting of ``not-callable`` on inferrable ``properties`` Closes #4426 diff --git a/requirements_test_min.txt b/requirements_test_min.txt index 568d78b68..80c4e382f 100644 --- a/requirements_test_min.txt +++ b/requirements_test_min.txt @@ -1,5 +1,5 @@ -e . # astroid dependency is also defined in setup.cfg -astroid==2.8.3 # Pinned to a specific version for tests +astroid==2.8.4 # Pinned to a specific version for tests pytest~=6.2 pytest-benchmark~=3.4 diff --git a/setup.cfg b/setup.cfg index 89071924a..bcbcbab55 100644 --- a/setup.cfg +++ b/setup.cfg @@ -44,7 +44,7 @@ project_urls = packages = find: install_requires = platformdirs>=2.2.0 - astroid>=2.8.3,<2.9 # (You should also upgrade requirements_test_min.txt) + astroid>=2.8.4,<2.9 # (You should also upgrade requirements_test_min.txt) isort>=4.2.5,<6 mccabe>=0.6,<0.7 toml>=0.9.2 diff --git a/tests/functional/a/access/access_to_protected_members_typing.txt b/tests/functional/a/access/access_to_protected_members_typing.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/functional/u/undefined/undefined_variable_py38.py b/tests/functional/u/undefined/undefined_variable_py38.py index 818423c8e..950d17fb4 100644 --- a/tests/functional/u/undefined/undefined_variable_py38.py +++ b/tests/functional/u/undefined/undefined_variable_py38.py @@ -3,6 +3,7 @@ # Tests for annotation of variables and potentially undefinition + def typing_and_assignment_expression(): """The variable gets assigned in an assignment expression""" var: int @@ -15,3 +16,35 @@ def typing_and_self_referncing_assignment_expression(): var: int if (var := var ** 2): # [undefined-variable] print(var) + + +def typed_assignment_in_function_default(param: str = (typed_default := "walrus")) -> None: + """An annotated assignment expression in a default parameter should not emit""" + return param + + +print(typed_default) + + +def assignment_in_function_default(param = (default := "walrus")) -> None: + """An assignment expression in a default parameter should not emit""" + return param + + +print(default) + + +def no_assignment_in_function_default(param: str = "walrus") -> None: + """No annotated assignment expression should emit""" + return param + + +print(no_default) # [undefined-variable] + + +def no_parameters_in_function_default() -> None: + """Regression tests for functions without any parameters""" + return + + +print(again_no_default) # [undefined-variable] diff --git a/tests/functional/u/undefined/undefined_variable_py38.txt b/tests/functional/u/undefined/undefined_variable_py38.txt index 96731db52..50a4944ac 100644 --- a/tests/functional/u/undefined/undefined_variable_py38.txt +++ b/tests/functional/u/undefined/undefined_variable_py38.txt @@ -1 +1,3 @@ -undefined-variable:16:15:typing_and_self_referncing_assignment_expression:Undefined variable 'var':HIGH +undefined-variable:17:15:typing_and_self_referncing_assignment_expression:Undefined variable 'var':HIGH +undefined-variable:42:6::Undefined variable 'no_default':HIGH +undefined-variable:50:6::Undefined variable 'again_no_default':HIGH diff --git a/tests/functional/u/unused/unused_variable_py38.py b/tests/functional/u/unused/unused_variable_py38.py new file mode 100644 index 000000000..7151bb9a8 --- /dev/null +++ b/tests/functional/u/unused/unused_variable_py38.py @@ -0,0 +1,32 @@ +"""Tests for the unused-variable message in assignment expressions""" + + +def typed_assignment_in_function_default( # [unused-variable] + param: str = (typed_default := "walrus"), # [unused-variable] +) -> None: + """An unused annotated assignment expression in a default parameter should emit""" + return param + + +def assignment_in_function_default( # [unused-variable] + param=(default := "walrus"), # [unused-variable] +) -> None: + """An unused assignment expression in a default parameter should emit""" + return param + + +def assignment_used_in_function_scope( # [unused-variable] + param=(function_default := "walrus"), +) -> None: + """An used assignment expression in a default parameter should not emit""" + print(function_default) + return param + + +def assignment_used_in_global_scope( # [unused-variable] + param=(global_default := "walrus"), +) -> None: + """An used assignment expression in a default parameter should not emit""" + return param + +print(global_default) diff --git a/tests/functional/u/unused/unused_variable_py38.rc b/tests/functional/u/unused/unused_variable_py38.rc new file mode 100644 index 000000000..25a81a70f --- /dev/null +++ b/tests/functional/u/unused/unused_variable_py38.rc @@ -0,0 +1,5 @@ +[testoptions] +min_pyver=3.8 + +[variables] +allow-global-unused-variables=no diff --git a/tests/functional/u/unused/unused_variable_py38.txt b/tests/functional/u/unused/unused_variable_py38.txt new file mode 100644 index 000000000..40d4e80a5 --- /dev/null +++ b/tests/functional/u/unused/unused_variable_py38.txt @@ -0,0 +1,6 @@ +unused-variable:4:0:typed_assignment_in_function_default:Unused variable 'typed_assignment_in_function_default':HIGH +unused-variable:5:18::Unused variable 'typed_default':HIGH +unused-variable:11:0:assignment_in_function_default:Unused variable 'assignment_in_function_default':HIGH +unused-variable:12:11::Unused variable 'default':HIGH +unused-variable:18:0:assignment_used_in_function_scope:Unused variable 'assignment_used_in_function_scope':HIGH +unused-variable:26:0:assignment_used_in_global_scope:Unused variable 'assignment_used_in_global_scope':HIGH -- cgit v1.2.1