summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Sassoulas <pierre.sassoulas@gmail.com>2021-09-13 20:19:40 +0200
committerGitHub <noreply@github.com>2021-09-13 20:19:40 +0200
commit9ec8cb9c5deaafbd511898f89eebbe1f817b4e0a (patch)
treec3f6dbe7f6d4f22379c18b26785a8dadb522a2f0
parenta4ee38e2c4afdf42280086ae4b5ad2e622c0d976 (diff)
downloadpylint-git-9ec8cb9c5deaafbd511898f89eebbe1f817b4e0a.tar.gz
Fix bad node given to a message and false positive invalide format for ``__all__`` (#4953)
* Fix bad node being given as context for message See https://github.com/PyCQA/pylint/issues/4711\#issuecomment-910020972 * Add a functional test for issue #4711 * Fix false positive invalid-all-format Closes #4711
-rw-r--r--ChangeLog4
-rw-r--r--pylint/checkers/variables.py9
-rw-r--r--tests/functional/i/invalid/invalid_all_format.txt2
-rw-r--r--tests/functional/i/invalid/invalid_all_format_valid_5.py7
-rw-r--r--tests/functional/i/invalid/invalid_all_format_valid_6.py7
5 files changed, 23 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e3cf47383..6134fca00 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -83,6 +83,10 @@ Release date: TBA
Closes #1375
Closes #330
+* Fix false positives for invalid-all-format that are lists or tuples at runtime
+
+ Closes #4711
+
* Fix ``no-self-use`` and ``docparams extension`` for async functions and methods.
* Add documentation for ``pyreverse`` and ``symilar``
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index 411e016f5..307a05feb 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -2013,15 +2013,14 @@ class VariablesChecker(BaseChecker):
return module
return None
- def _check_all(self, node, not_consumed):
+ def _check_all(self, node: nodes.Module, not_consumed):
assigned = next(node.igetattr("__all__"))
if assigned is astroid.Uninferable:
return
-
- if not isinstance(assigned, (nodes.Tuple, nodes.List, list, tuple)):
- self.add_message("invalid-all-format", node=assigned)
+ if not assigned.pytype() in ["builtins.list", "builtins.tuple"]:
+ line, col = assigned.tolineno, assigned.col_offset
+ self.add_message("invalid-all-format", line=line, col_offset=col, node=node)
return
-
for elt in getattr(assigned, "elts", ()):
try:
elt_name = next(elt.infer())
diff --git a/tests/functional/i/invalid/invalid_all_format.txt b/tests/functional/i/invalid/invalid_all_format.txt
index 75c6fe0a7..f10297d4e 100644
--- a/tests/functional/i/invalid/invalid_all_format.txt
+++ b/tests/functional/i/invalid/invalid_all_format.txt
@@ -1 +1 @@
-invalid-all-format:5:11::Invalid format for __all__, must be tuple or list
+invalid-all-format:5:11::Invalid format for __all__, must be tuple or list:HIGH
diff --git a/tests/functional/i/invalid/invalid_all_format_valid_5.py b/tests/functional/i/invalid/invalid_all_format_valid_5.py
new file mode 100644
index 000000000..aa0e4dbf3
--- /dev/null
+++ b/tests/functional/i/invalid/invalid_all_format_valid_5.py
@@ -0,0 +1,7 @@
+"""Test valid __all__ format."""
+
+# pylint: disable=import-error, unused-import
+
+from foo import bar
+
+__all__ = list(globals().keys())
diff --git a/tests/functional/i/invalid/invalid_all_format_valid_6.py b/tests/functional/i/invalid/invalid_all_format_valid_6.py
new file mode 100644
index 000000000..64ac46bb7
--- /dev/null
+++ b/tests/functional/i/invalid/invalid_all_format_valid_6.py
@@ -0,0 +1,7 @@
+"""Test valid __all__ format."""
+
+# pylint: disable=import-error, unused-import
+
+from foo import bar
+
+__all__ = tuple(globals().keys())