astral-sh / ruff

An extremely fast Python linter and code formatter, written in Rust.
https://docs.astral.sh/ruff
MIT License
33.29k stars 1.11k forks source link

Request: flake8-encodings #3278

Open henryiii opened 1 year ago

henryiii commented 1 year ago

I noticed https://pypi.org/project/flake8-encodings/ was missing when porting a package over to Ruff. This checks for encoding= missing from open (and configparser.ConfigParser and pathlib.Path) calls.

Here are the checks:

ENC001 = "ENC001 no encoding specified for 'open'."
ENC002 = "ENC002 'encoding=None' used for 'open'."
ENC003 = "ENC003 no encoding specified for 'open' with unknown mode."
ENC004 = "ENC004 'encoding=None' used for 'open' with unknown mode."

ENC011 = "ENC011 no encoding specified for 'configparser.ConfigParser.read'."
ENC012 = "ENC012 'encoding=None' used for 'configparser.ConfigParser.read'."

ENC021 = "ENC021 no encoding specified for 'pathlib.Path.open'."
ENC022 = "ENC022 'encoding=None' used for 'pathlib.Path.open'."
ENC023 = "ENC023 no encoding specified for 'pathlib.Path.read_text'."
ENC024 = "ENC024 'encoding=None' used for 'pathlib.Path.read_text'."
ENC025 = "ENC025 no encoding specified for 'pathlib.Path.write_text'."
ENC026 = "ENC026 'encoding=None' used for 'pathlib.Path.write_text'."

This is an extremely common need (it's available at runtime with PYTHONWARNDEFAULTENCODING (PEP 597) and is needed for Python 3.15 compatibility PEP 686), so I'm surprised no existing checks seem to cover it; wouldn't be surprised if my searching skills were just not good enough.

Edit: Ahh, this might be the not-yet-implemented unspecified-encoding / W1514 from pylint.

charliermarsh commented 1 year ago

Python 3.15!

pwuertz commented 10 months ago

Should this be detected when enabling PLW1514 in current versions of ruff? The PR https://github.com/astral-sh/ruff/pull/3416 does seem to include some tests for issues with Path, but it didn't make it into ruff yet?

RubenVanEldik commented 2 months ago

I would like to bump this request!

Currently when you have some code such as:

import pathlib

with open(pathlib.Path("path/to/file.txt")) as f:
    print(f)

Ruff will raise 2 issues:

  1. PLW1514 open in text mode without explicit encoding argument
  2. PTH123 open() should be replaced by Path.open()

If you first solve the second issue, the first issue will be gone, which led me to believe that Path.open() doesn't require it, which is not the case!

Would the Ruff team be open to include the flake8-encodings ruleset? And do you think this could be a good first issue? If so I would be willing to pick it up (it would mean it will take a while before this will be implemented though 🙃 )