Compare commits

..

23 commits
v6.0.0 ... main

Author SHA1 Message Date
anthony sottile
f1dff44d3a
Merge pull request #1227 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-12-22 16:55:44 -05:00
pre-commit-ci[bot]
a77d5edb63
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/setup-cfg-fmt: v3.1.0 → v3.2.0](https://github.com/asottile/setup-cfg-fmt/compare/v3.1.0...v3.2.0)
2025-12-22 20:26:27 +00:00
anthony sottile
5dcc56558c
Merge pull request #1222 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-12-15 16:04:03 -06:00
pre-commit-ci[bot]
a780519d03
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pre-commit/mirrors-mypy: v1.19.0 → v1.19.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.0...v1.19.1)
2025-12-15 20:48:45 +00:00
anthony sottile
6e513a2e71
Merge pull request #1217 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-12-01 16:11:12 -05:00
pre-commit-ci[bot]
401fb65f54
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pre-commit/mirrors-mypy: v1.18.2 → v1.19.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.2...v1.19.0)
2025-12-01 21:05:20 +00:00
anthony sottile
e59bbe6db7
Merge pull request #1215 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-11-25 10:52:14 -05:00
pre-commit-ci[bot]
ce6aed3bbe
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/pyupgrade: v3.21.1 → v3.21.2](https://github.com/asottile/pyupgrade/compare/v3.21.1...v3.21.2)
2025-11-24 20:53:37 +00:00
anthony sottile
459b301556
Merge pull request #1213 from pre-commit/check-docstring-first-deprecated
deprecate check-docstring-first without replacement
2025-11-22 15:23:59 -05:00
anthony sottile
d2cf95b9cf deprecate check-docstring-first without replacement
this hook has unfixable false positives and is not that useful

perhaps someone can write a flake8 plugin to replace the functionality
2025-11-22 15:21:07 -05:00
anthony sottile
f4e025486b
Merge pull request #1209 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-11-10 16:54:00 -05:00
pre-commit-ci[bot]
1592578eeb
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/pyupgrade: v3.21.0 → v3.21.1](https://github.com/asottile/pyupgrade/compare/v3.21.0...v3.21.1)
2025-11-10 20:59:49 +00:00
anthony sottile
3fed74c572
Merge pull request #1202 from pre-commit/fix-builtin-literal-check
fix nested calls for check-builtin-literals
2025-10-16 09:35:52 -04:00
Anthony Sottile
a804ba5239 fix nested calls for check-builtin-literals 2025-10-16 09:30:42 -04:00
anthony sottile
9ba250d7b3
Merge pull request #1200 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-10-13 16:53:54 -04:00
pre-commit-ci[bot]
b51ca91889
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/asottile/setup-cfg-fmt: v2.8.0 → v3.1.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.8.0...v3.1.0)
- [github.com/asottile/reorder-python-imports: v3.15.0 → v3.16.0](https://github.com/asottile/reorder-python-imports/compare/v3.15.0...v3.16.0)
- [github.com/asottile/add-trailing-comma: v3.2.0 → v4.0.0](https://github.com/asottile/add-trailing-comma/compare/v3.2.0...v4.0.0)
- [github.com/asottile/pyupgrade: v3.20.0 → v3.21.0](https://github.com/asottile/pyupgrade/compare/v3.20.0...v3.21.0)
2025-10-13 20:38:50 +00:00
anthony sottile
8e6ea961b7
Merge pull request #1197 from pre-commit/all-repos_autofix_all-repos-manual
py310+
2025-10-10 12:09:55 -04:00
anthony sottile
3411068391 py310+
Committed via https://github.com/asottile/all-repos
2025-10-09 17:44:52 -04:00
Anthony Sottile
a2cdab0afe
Merge pull request #1194 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-09-23 09:36:33 -04:00
pre-commit-ci[bot]
9148219126
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pre-commit/mirrors-mypy: v1.18.1 → v1.18.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.1...v1.18.2)
2025-09-22 20:44:07 +00:00
Anthony Sottile
3ab664f766
Merge pull request #1192 from pre-commit/pre-commit-ci-update-config
[pre-commit.ci] pre-commit autoupdate
2025-09-19 13:51:26 -04:00
pre-commit-ci[bot]
0925e7a9d1
[pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pre-commit/mirrors-mypy: v1.17.1 → v1.18.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.1...v1.18.1)
2025-09-15 20:23:54 +00:00
anthony sottile
e5e94e8702 what year is it? 2025-08-09 15:27:15 -04:00
9 changed files with 37 additions and 39 deletions

View file

@ -10,10 +10,10 @@ jobs:
main-windows: main-windows:
uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1
with: with:
env: '["py39"]' env: '["py310"]'
os: windows-latest os: windows-latest
main-linux: main-linux:
uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1
with: with:
env: '["py39", "py310", "py311", "py312"]' env: '["py310", "py311", "py312", "py313"]'
os: ubuntu-latest os: ubuntu-latest

View file

@ -10,23 +10,23 @@ repos:
- id: name-tests-test - id: name-tests-test
- id: requirements-txt-fixer - id: requirements-txt-fixer
- repo: https://github.com/asottile/setup-cfg-fmt - repo: https://github.com/asottile/setup-cfg-fmt
rev: v2.8.0 rev: v3.2.0
hooks: hooks:
- id: setup-cfg-fmt - id: setup-cfg-fmt
- repo: https://github.com/asottile/reorder-python-imports - repo: https://github.com/asottile/reorder-python-imports
rev: v3.15.0 rev: v3.16.0
hooks: hooks:
- id: reorder-python-imports - id: reorder-python-imports
args: [--py39-plus, --add-import, 'from __future__ import annotations'] args: [--py310-plus, --add-import, 'from __future__ import annotations']
- repo: https://github.com/asottile/add-trailing-comma - repo: https://github.com/asottile/add-trailing-comma
rev: v3.2.0 rev: v4.0.0
hooks: hooks:
- id: add-trailing-comma - id: add-trailing-comma
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v3.20.0 rev: v3.21.2
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [--py39-plus] args: [--py310-plus]
- repo: https://github.com/hhatto/autopep8 - repo: https://github.com/hhatto/autopep8
rev: v2.3.2 rev: v2.3.2
hooks: hooks:
@ -36,6 +36,6 @@ repos:
hooks: hooks:
- id: flake8 - id: flake8
- repo: https://github.com/pre-commit/mirrors-mypy - repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.17.1 rev: v1.19.1
hooks: hooks:
- id: mypy - id: mypy

View file

@ -29,7 +29,7 @@
entry: check-case-conflict entry: check-case-conflict
language: python language: python
- id: check-docstring-first - id: check-docstring-first
name: check docstring is first name: check docstring is first (deprecated)
description: checks a common error of defining a docstring after code. description: checks a common error of defining a docstring after code.
entry: check-docstring-first entry: check-docstring-first
language: python language: python

View file

@ -1,4 +1,4 @@
6.0.0 - 2024-08-09 6.0.0 - 2025-08-09
================== ==================
## Fixes ## Fixes

View file

@ -45,9 +45,6 @@ Require literal syntax when initializing empty or zero Python builtin types.
#### `check-case-conflict` #### `check-case-conflict`
Check for files with names that would conflict on a case-insensitive filesystem like MacOS HFS+ or Windows FAT. Check for files with names that would conflict on a case-insensitive filesystem like MacOS HFS+ or Windows FAT.
#### `check-docstring-first`
Checks for a common error of placing code before the docstring.
#### `check-executables-have-shebangs` #### `check-executables-have-shebangs`
Checks that non-binary executables have a proper shebang. Checks that non-binary executables have a proper shebang.
@ -207,6 +204,8 @@ Trims trailing whitespace.
- `check-byte-order-marker`: instead use fix-byte-order-marker - `check-byte-order-marker`: instead use fix-byte-order-marker
- `fix-encoding-pragma`: instead use [`pyupgrade`](https://github.com/asottile/pyupgrade) - `fix-encoding-pragma`: instead use [`pyupgrade`](https://github.com/asottile/pyupgrade)
- `check-docstring-first`: fundamentally flawed, deprecated without replacement.
### As a standalone package ### As a standalone package

View file

@ -26,36 +26,37 @@ class Call(NamedTuple):
class Visitor(ast.NodeVisitor): class Visitor(ast.NodeVisitor):
def __init__( def __init__(
self, self,
ignore: Sequence[str] | None = None, ignore: set[str],
allow_dict_kwargs: bool = True, allow_dict_kwargs: bool = True,
) -> None: ) -> None:
self.builtin_type_calls: list[Call] = [] self.builtin_type_calls: list[Call] = []
self.ignore = set(ignore) if ignore else set()
self.allow_dict_kwargs = allow_dict_kwargs self.allow_dict_kwargs = allow_dict_kwargs
self._disallowed = BUILTIN_TYPES.keys() - ignore
def _check_dict_call(self, node: ast.Call) -> bool: def _check_dict_call(self, node: ast.Call) -> bool:
return self.allow_dict_kwargs and bool(node.keywords) return self.allow_dict_kwargs and bool(node.keywords)
def visit_Call(self, node: ast.Call) -> None: def visit_Call(self, node: ast.Call) -> None:
if not isinstance(node.func, ast.Name): if (
# Ignore functions that are object attributes (`foo.bar()`). # Ignore functions that are object attributes (`foo.bar()`).
# Assume that if the user calls `builtins.list()`, they know what # Assume that if the user calls `builtins.list()`, they know what
# they're doing. # they're doing.
return isinstance(node.func, ast.Name) and
if node.func.id not in set(BUILTIN_TYPES).difference(self.ignore): node.func.id in self._disallowed and
return (node.func.id != 'dict' or not self._check_dict_call(node)) and
if node.func.id == 'dict' and self._check_dict_call(node): not node.args
return ):
elif node.args:
return
self.builtin_type_calls.append( self.builtin_type_calls.append(
Call(node.func.id, node.lineno, node.col_offset), Call(node.func.id, node.lineno, node.col_offset),
) )
self.generic_visit(node)
def check_file( def check_file(
filename: str, filename: str,
ignore: Sequence[str] | None = None, *,
ignore: set[str],
allow_dict_kwargs: bool = True, allow_dict_kwargs: bool = True,
) -> list[Call]: ) -> list[Call]:
with open(filename, 'rb') as f: with open(filename, 'rb') as f:

View file

@ -12,10 +12,10 @@ conflicts and keep the file nicely ordered.
from __future__ import annotations from __future__ import annotations
import argparse import argparse
from collections.abc import Callable
from collections.abc import Iterable from collections.abc import Iterable
from collections.abc import Sequence from collections.abc import Sequence
from typing import Any from typing import Any
from typing import Callable
from typing import IO from typing import IO
PASS = 0 PASS = 0

View file

@ -20,7 +20,7 @@ packages = find:
install_requires = install_requires =
ruamel.yaml>=0.15 ruamel.yaml>=0.15
tomli>=1.1.0;python_version<"3.11" tomli>=1.1.0;python_version<"3.11"
python_requires = >=3.9 python_requires = >=3.10
[options.packages.find] [options.packages.find]
exclude = exclude =

View file

@ -38,11 +38,6 @@ t1 = ()
''' '''
@pytest.fixture
def visitor():
return Visitor()
@pytest.mark.parametrize( @pytest.mark.parametrize(
('expression', 'calls'), ('expression', 'calls'),
[ [
@ -85,7 +80,8 @@ def visitor():
('builtins.tuple()', []), ('builtins.tuple()', []),
], ],
) )
def test_non_dict_exprs(visitor, expression, calls): def test_non_dict_exprs(expression, calls):
visitor = Visitor(ignore=set())
visitor.visit(ast.parse(expression)) visitor.visit(ast.parse(expression))
assert visitor.builtin_type_calls == calls assert visitor.builtin_type_calls == calls
@ -102,7 +98,8 @@ def test_non_dict_exprs(visitor, expression, calls):
('builtins.dict()', []), ('builtins.dict()', []),
], ],
) )
def test_dict_allow_kwargs_exprs(visitor, expression, calls): def test_dict_allow_kwargs_exprs(expression, calls):
visitor = Visitor(ignore=set())
visitor.visit(ast.parse(expression)) visitor.visit(ast.parse(expression))
assert visitor.builtin_type_calls == calls assert visitor.builtin_type_calls == calls
@ -114,17 +111,18 @@ def test_dict_allow_kwargs_exprs(visitor, expression, calls):
('dict(a=1, b=2, c=3)', [Call('dict', 1, 0)]), ('dict(a=1, b=2, c=3)', [Call('dict', 1, 0)]),
("dict(**{'a': 1, 'b': 2, 'c': 3})", [Call('dict', 1, 0)]), ("dict(**{'a': 1, 'b': 2, 'c': 3})", [Call('dict', 1, 0)]),
('builtins.dict()', []), ('builtins.dict()', []),
pytest.param('f(dict())', [Call('dict', 1, 2)], id='nested'),
], ],
) )
def test_dict_no_allow_kwargs_exprs(expression, calls): def test_dict_no_allow_kwargs_exprs(expression, calls):
visitor = Visitor(allow_dict_kwargs=False) visitor = Visitor(ignore=set(), allow_dict_kwargs=False)
visitor.visit(ast.parse(expression)) visitor.visit(ast.parse(expression))
assert visitor.builtin_type_calls == calls assert visitor.builtin_type_calls == calls
def test_ignore_constructors(): def test_ignore_constructors():
visitor = Visitor( visitor = Visitor(
ignore=('complex', 'dict', 'float', 'int', 'list', 'str', 'tuple'), ignore={'complex', 'dict', 'float', 'int', 'list', 'str', 'tuple'},
) )
visitor.visit(ast.parse(BUILTIN_CONSTRUCTORS)) visitor.visit(ast.parse(BUILTIN_CONSTRUCTORS))
assert visitor.builtin_type_calls == [] assert visitor.builtin_type_calls == []