88import os
99import re
1010import sys
11- import urllib .parse
1211from pathlib import Path
13- from typing import TypedDict
14-
15- import yaml
16- from packaging .requirements import Requirement
17- from packaging .specifiers import SpecifierSet
1812
1913from parse_metadata import read_metadata
2014from utils import (
@@ -143,34 +137,6 @@ def check_metadata() -> None:
143137 read_metadata (distribution )
144138
145139
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-
174140def check_requirement_pins () -> None :
175141 """Check that type checkers and linters are pinned to an exact version."""
176142 requirements = parse_requirements ()
@@ -182,23 +148,6 @@ def check_requirement_pins() -> None:
182148 assert str (spec ).startswith ("==" ), msg
183149
184150
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-
202151if __name__ == "__main__" :
203152 assert sys .version_info >= (3 , 9 ), "Python 3.9+ is required to run this test"
204153 check_stdlib ()
@@ -208,4 +157,3 @@ def check_precommit_requirements() -> None:
208157 check_no_symlinks ()
209158 check_test_cases ()
210159 check_requirement_pins ()
211- check_precommit_requirements ()
0 commit comments