summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2022-01-06 05:00:06 -0500
committerGitHub <noreply@github.com>2022-01-06 11:00:06 +0100
commit1e677a7b1f449b935155970a61bd5e4f3e169993 (patch)
tree03e337240950534a91322d08dc310f570cdc1c50
parent374d9de081d24dd04098b9b7da9ee4a2af30e0fe (diff)
downloadpylint-git-1e677a7b1f449b935155970a61bd5e4f3e169993.tar.gz
Fix #5638: Allow for encoding to be supplied as a positional argument (#5641)
-rw-r--r--ChangeLog5
-rw-r--r--doc/whatsnew/2.13.rst5
-rw-r--r--pylint/checkers/stdlib.py19
-rw-r--r--tests/functional/u/unspecified_encoding_py38.py13
-rw-r--r--tests/functional/u/unspecified_encoding_py38.txt4
5 files changed, 41 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 2be3c8c94..95fa39837 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -120,6 +120,11 @@ Release date: TBA
Closes #4434
Closes #5370
+* ``encoding`` can now be supplied as a positional argument to calls that open
+ files without triggering ``unspecified-encoding``.
+
+ Closes #5638
+
* Fatal errors now emit a score of 0.0 regardless of whether the linted module
contained any statements
diff --git a/doc/whatsnew/2.13.rst b/doc/whatsnew/2.13.rst
index 787ae57b3..89796bd5d 100644
--- a/doc/whatsnew/2.13.rst
+++ b/doc/whatsnew/2.13.rst
@@ -123,6 +123,11 @@ Other Changes
Closes #4434
Closes #5370
+* ``encoding`` can now be supplied as a positional argument to calls that open
+ files without triggering ``unspecified-encoding``.
+
+ Closes #5638
+
* Fatal errors now emit a score of 0.0 regardless of whether the linted module
contained any statements
diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py
index 7093bb0da..638b7f3c9 100644
--- a/pylint/checkers/stdlib.py
+++ b/pylint/checkers/stdlib.py
@@ -636,13 +636,22 @@ class StdlibChecker(DeprecatedMixin, BaseChecker):
):
encoding_arg = None
try:
- if open_module == "pathlib" and node.func.attrname == "read_text":
- encoding_arg = utils.get_argument_from_call(
- node, position=0, keyword="encoding"
- )
+ if open_module == "pathlib":
+ if node.func.attrname == "read_text":
+ encoding_arg = utils.get_argument_from_call(
+ node, position=0, keyword="encoding"
+ )
+ elif node.func.attrname == "write_text":
+ encoding_arg = utils.get_argument_from_call(
+ node, position=1, keyword="encoding"
+ )
+ else:
+ encoding_arg = utils.get_argument_from_call(
+ node, position=2, keyword="encoding"
+ )
else:
encoding_arg = utils.get_argument_from_call(
- node, position=None, keyword="encoding"
+ node, position=3, keyword="encoding"
)
except utils.NoSuchArgumentError:
self.add_message("unspecified-encoding", node=node)
diff --git a/tests/functional/u/unspecified_encoding_py38.py b/tests/functional/u/unspecified_encoding_py38.py
index ce5f3e816..306f94e69 100644
--- a/tests/functional/u/unspecified_encoding_py38.py
+++ b/tests/functional/u/unspecified_encoding_py38.py
@@ -143,3 +143,16 @@ args_good_one = IOArgs(encoding=None, mode="wb")
# Test for crash reported in https://github.com/PyCQA/pylint/issues/5321
open(FILENAME, args_good_one.mode, encoding=args_good_one.encoding)
+
+# Positional arguments
+open(FILENAME, "w", -1, "utf-8")
+open(FILENAME, "w", -1) # [unspecified-encoding]
+
+Path(FILENAME).open("w", -1, "utf-8")
+Path(FILENAME).open("w", -1) # [unspecified-encoding]
+
+Path(FILENAME).read_text("utf-8")
+Path(FILENAME).read_text() # [unspecified-encoding]
+
+Path(FILENAME).write_text("string", "utf-8")
+Path(FILENAME).write_text("string") # [unspecified-encoding]
diff --git a/tests/functional/u/unspecified_encoding_py38.txt b/tests/functional/u/unspecified_encoding_py38.txt
index 60a811eca..59a648a40 100644
--- a/tests/functional/u/unspecified_encoding_py38.txt
+++ b/tests/functional/u/unspecified_encoding_py38.txt
@@ -23,3 +23,7 @@ unspecified-encoding:81:0:81:21::Using open without explicitly specifying an enc
unspecified-encoding:82:0:82:25::Using open without explicitly specifying an encoding:UNDEFINED
unspecified-encoding:83:0:83:25::Using open without explicitly specifying an encoding:UNDEFINED
unspecified-encoding:84:0:84:39::Using open without explicitly specifying an encoding:UNDEFINED
+unspecified-encoding:149:0:149:23::Using open without explicitly specifying an encoding:UNDEFINED
+unspecified-encoding:152:0:152:28::Using open without explicitly specifying an encoding:UNDEFINED
+unspecified-encoding:155:0:155:26::Using open without explicitly specifying an encoding:UNDEFINED
+unspecified-encoding:158:0:158:35::Using open without explicitly specifying an encoding:UNDEFINED