8
8
import os
9
9
import re
10
10
import sys
11
- import urllib .parse
12
11
from pathlib import Path
13
- from typing import TypedDict
14
-
15
- import yaml
16
- from packaging .requirements import Requirement
17
- from packaging .specifiers import SpecifierSet
18
12
19
13
from parse_metadata import read_metadata
20
14
from utils import (
@@ -143,34 +137,6 @@ def check_metadata() -> None:
143
137
read_metadata (distribution )
144
138
145
139
146
- class PreCommitConfigRepos (TypedDict ):
147
- hooks : list [dict [str , str ]]
148
- repo : str
149
-
150
-
151
- class PreCommitConfig (TypedDict ):
152
- repos : list [PreCommitConfigRepos ]
153
-
154
-
155
- def get_precommit_requirements () -> dict [str , SpecifierSet ]:
156
- with open (".pre-commit-config.yaml" , encoding = "UTF-8" ) as precommit_file :
157
- precommit = precommit_file .read ()
158
- yam : PreCommitConfig = yaml .load (precommit , Loader = yaml .Loader )
159
- precommit_requirements : dict [str , SpecifierSet ] = {}
160
- for repo in yam ["repos" ]:
161
- package_rev = repo .get ("rev" )
162
- if not isinstance (package_rev , str ):
163
- continue
164
- package_name = Path (urllib .parse .urlparse (repo ["repo" ]).path ).name
165
- package_specifier = SpecifierSet (f"=={ package_rev .removeprefix ('v' )} " )
166
- precommit_requirements [package_name ] = package_specifier
167
- for hook in repo ["hooks" ]:
168
- for additional_req in hook .get ("additional_dependencies" , ()):
169
- req = Requirement (additional_req )
170
- precommit_requirements [req .name ] = req .specifier
171
- return precommit_requirements
172
-
173
-
174
140
def check_requirement_pins () -> None :
175
141
"""Check that type checkers and linters are pinned to an exact version."""
176
142
requirements = parse_requirements ()
@@ -182,23 +148,6 @@ def check_requirement_pins() -> None:
182
148
assert str (spec ).startswith ("==" ), msg
183
149
184
150
185
- def check_precommit_requirements () -> None :
186
- """Check that the requirements in the requirements file and .pre-commit-config.yaml match."""
187
- requirements_txt_requirements = parse_requirements ()
188
- precommit_requirements = get_precommit_requirements ()
189
- no_txt_entry_msg = f"All pre-commit requirements must also be listed in `{ REQS_FILE } ` (missing {{requirement!r}})"
190
- for requirement , specifier in precommit_requirements .items ():
191
- # annoying: the Ruff and Black repos for pre-commit are different to the names in the requirements file
192
- if requirement in {"ruff-pre-commit" , "black-pre-commit-mirror" }:
193
- requirement = requirement .split ("-" )[0 ]
194
- assert requirement in requirements_txt_requirements , no_txt_entry_msg .format (requirement = requirement )
195
- specifier_mismatch = (
196
- f'Specifier "{ specifier } " for { requirement !r} in `.pre-commit-config.yaml` '
197
- f'does not match specifier "{ requirements_txt_requirements [requirement ].specifier } " in `{ REQS_FILE } `'
198
- )
199
- assert specifier == requirements_txt_requirements [requirement ].specifier , specifier_mismatch
200
-
201
-
202
151
if __name__ == "__main__" :
203
152
assert sys .version_info >= (3 , 9 ), "Python 3.9+ is required to run this test"
204
153
check_stdlib ()
@@ -208,4 +157,3 @@ def check_precommit_requirements() -> None:
208
157
check_no_symlinks ()
209
158
check_test_cases ()
210
159
check_requirement_pins ()
211
- check_precommit_requirements ()
0 commit comments