|
10 | 10 | import tempfile |
11 | 11 | from configparser import ConfigParser |
12 | 12 | from importlib.util import find_spec |
| 13 | +from typing import Dict |
| 14 | +from warnings import warn |
13 | 15 |
|
14 | 16 | import jsonschema |
15 | 17 | import nbformat |
16 | 18 | import pytest |
17 | 19 | from nbconvert.preprocessors import ExecutePreprocessor |
| 20 | +from packaging.requirements import Requirement |
| 21 | +from packaging.specifiers import SpecifierSet |
18 | 22 | from packaging.version import Version |
19 | 23 |
|
20 | 24 | try: |
@@ -225,18 +229,37 @@ def test_contributing_versions(the_contributing_doc, the_binder_env, pkg): |
225 | 229 |
|
226 | 230 |
|
227 | 231 | @pytest.mark.parametrize( |
228 | | - "pkg,requirement,spec", |
| 232 | + "pkg,requirement,version,has_specifier", |
229 | 233 | [ |
230 | | - [PY_FRONT_PATH, "jupyter_lsp", f">={PY_SERVER_VERSION}"], |
231 | | - [PY_FRONT_PATH, "jupyterlab", LAB_SPEC], |
232 | | - [PY_SERVER_PATH, "jupyter_server", REQUIRED_JUPYTER_SERVER], |
| 234 | + [PY_FRONT_PATH, "jupyter_lsp", PY_SERVER_VERSION, False], |
| 235 | + [PY_FRONT_PATH, "jupyterlab", LAB_SPEC, True], |
| 236 | + [PY_SERVER_PATH, "jupyter_server", REQUIRED_JUPYTER_SERVER, True], |
233 | 237 | ], |
234 | 238 | ) |
235 | | -def test_install_requires(pkg, requirement, spec): |
| 239 | +def test_install_requires(pkg, requirement: str, version: str, has_specifier: bool): |
236 | 240 | """are python packages requirements consistent with other versions?""" |
237 | 241 | config = ConfigParser() |
238 | 242 | config.read(pkg / "setup.cfg") |
239 | | - assert f"{requirement} {spec}" in config["options"]["install_requires"] |
| 243 | + requirements: Dict[str, Requirement] = { |
| 244 | + requirement.name: requirement |
| 245 | + for line in config["options"]["install_requires"].splitlines() |
| 246 | + if line.strip() |
| 247 | + for requirement in [Requirement(line)] |
| 248 | + } |
| 249 | + assert requirement in requirements |
| 250 | + parsed_specifier = str(requirements[requirement].specifier) |
| 251 | + raw_specifier = version if has_specifier else f">={version}" |
| 252 | + expected_specifier = str(SpecifierSet(raw_specifier)) |
| 253 | + |
| 254 | + if has_specifier: |
| 255 | + assert expected_specifier == parsed_specifier |
| 256 | + else: |
| 257 | + assert Version(version) in requirements[requirement].specifier |
| 258 | + if expected_specifier != parsed_specifier: |
| 259 | + warn( |
| 260 | + f"Version matches, but specifier might need updating:" |
| 261 | + f" {requirement} {parsed_specifier}; version: {version}" |
| 262 | + ) |
240 | 263 |
|
241 | 264 |
|
242 | 265 | def check_integrity(): |
|
0 commit comments