|
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