Skip to content

Commit c2560c7

Browse files
committed
sync flake8 versions
1 parent baa8539 commit c2560c7

5 files changed

+136
-2
lines changed

.pre-commit-config.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ repos:
6969
rev: v1.2.2
7070
hooks:
7171
- id: yesqa
72+
additional_dependencies: [flake8==3.9.0]
7273
- repo: local
7374
hooks:
7475
- id: flake8-rst
@@ -158,6 +159,13 @@ repos:
158159
files: ^(environment.yml|requirements-dev.txt)$
159160
pass_filenames: false
160161
additional_dependencies: [pyyaml]
162+
- id: sync-flake8-versions
163+
name: Check flake8 version is synced across flake8, yesqa, and environment.yml
164+
language: python
165+
entry: python scripts/sync_flake8_versions.py
166+
files: ^(\.pre-commit-config\.yaml|environment\.yml)$
167+
pass_filenames: false
168+
additional_dependencies: [pyyaml]
161169
- id: title-capitalization
162170
name: Validate correct capitalization among titles in documentation
163171
entry: python scripts/validate_rst_title_capitalization.py

environment.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ dependencies:
2020
# code checks
2121
- black=20.8b1
2222
- cpplint
23-
- flake8
23+
- flake8=3.9.0
2424
- flake8-bugbear>=21.3.2 # used by flake8, find likely bugs
2525
- flake8-comprehensions>=3.1.0 # used by flake8, linting of unnecessary comprehensions
2626
- isort>=5.2.1 # check that imports are in the right order

requirements-dev.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ asv
88
cython>=0.29.21
99
black==20.8b1
1010
cpplint
11-
flake8
11+
flake8==3.9.0
1212
flake8-bugbear>=21.3.2
1313
flake8-comprehensions>=3.1.0
1414
isort>=5.2.1

scripts/sync_flake8_versions.py

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
"""
2+
Check that the flake8 pins are the same in:
3+
4+
- environment.yml
5+
- .pre-commit-config.yaml, in the flake8 hook
6+
- .pre-commit-config.yaml, in the additional dependencies of the yesqa hook
7+
8+
The flake8 hook revision in .pre-commit-config.yaml is taken as the reference revision.
9+
10+
Usage: either
11+
12+
- ``python scripts/sync_flake8_versions.py``, or
13+
- ``pre-commit run sync-flake8-versions --all-files``.
14+
"""
15+
import sys
16+
from typing import (
17+
Any,
18+
Mapping,
19+
NamedTuple,
20+
Sequence,
21+
Tuple,
22+
TypeVar,
23+
)
24+
25+
import yaml
26+
27+
28+
class Revisions(NamedTuple):
29+
precommit_rev: str
30+
precommit_yesqa_rev: str
31+
environment_rev: str
32+
33+
34+
YamlMapping = Mapping[str, Any]
35+
Repo = TypeVar("Repo", bound=YamlMapping)
36+
37+
38+
def _get_repo_hook(repos: Sequence[Repo], hook_name: str) -> Tuple[Repo, YamlMapping]:
39+
for repo in repos:
40+
for hook in repo["hooks"]:
41+
if hook["id"] == hook_name:
42+
return repo, hook
43+
else:
44+
raise RuntimeError(f"Repo with hook {hook_name} not found")
45+
46+
47+
def get_revisions(precommit_config: YamlMapping, environment: YamlMapping) -> Revisions:
48+
repos = precommit_config["repos"]
49+
flake8_repo, _ = _get_repo_hook(repos, "flake8")
50+
precommit_rev = flake8_repo["rev"]
51+
52+
_, yesqa_hook = _get_repo_hook(repos, "yesqa")
53+
additional_dependencies = yesqa_hook.get("additional_dependencies", [])
54+
for dep in additional_dependencies:
55+
if "==" in dep:
56+
pkg, rev = dep.split("==", maxsplit=1)
57+
if pkg == "flake8":
58+
precommit_yesqa_rev = rev
59+
break
60+
else:
61+
raise RuntimeError(
62+
"flake8 not found, or not pinned, in additional dependencies of yesqa "
63+
"hook in .pre-commit-config.yaml"
64+
)
65+
66+
deps = environment["dependencies"]
67+
for dep in deps:
68+
if isinstance(dep, str) and "=" in dep:
69+
pkg, rev = dep.split("=", maxsplit=1)
70+
if pkg == "flake8":
71+
environment_rev = rev
72+
break
73+
else:
74+
raise RuntimeError("flake8 not found, or not pinned, in environment.yml")
75+
76+
return Revisions(precommit_rev, precommit_yesqa_rev, environment_rev)
77+
78+
79+
if __name__ == "__main__":
80+
with open(".pre-commit-config.yaml") as fd:
81+
precommit_config = yaml.safe_load(fd)
82+
with open("environment.yml") as fd:
83+
environment = yaml.safe_load(fd)
84+
85+
revisions = get_revisions(precommit_config, environment)
86+
87+
if revisions.environment_rev != revisions.precommit_rev:
88+
sys.stdout.write(
89+
f"flake8 pin in environment.yml is {revisions.environment_rev}, "
90+
f"should be {revisions.precommit_rev}\n"
91+
)
92+
sys.exit(1)
93+
94+
if revisions.precommit_yesqa_rev != revisions.precommit_rev:
95+
sys.stdout.write(
96+
f"flake8 pin in yesqa is {revisions.precommit_yesqa_rev}, "
97+
f"should be {revisions.precommit_rev}\n"
98+
)
99+
sys.exit(1)
100+
101+
sys.exit(0)
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from ..sync_flake8_versions import (
2+
Revisions,
3+
get_revisions,
4+
)
5+
6+
7+
def test_get_revisions():
8+
precommit_config = {
9+
"repos": [
10+
{
11+
"repo": "https://gitlab.com/pycqa/flake8",
12+
"rev": "foo",
13+
"hooks": [{"id": "flake8"}],
14+
},
15+
{
16+
"repo": "https://github.com/asottile/yesqa",
17+
"rev": "v1.2.2",
18+
"hooks": [{"id": "yesqa", "additional_dependencies": ["flake8==bar"]}],
19+
},
20+
]
21+
}
22+
environment = {"dependencies": ["flake8=qux"]}
23+
result = get_revisions(precommit_config, environment)
24+
expected = Revisions("foo", "bar", "qux")
25+
assert result == expected

0 commit comments

Comments
 (0)