diff --git a/envs/failing-env2.yaml b/envs/failing-env2.yaml new file mode 100644 index 0000000..4aa11c8 --- /dev/null +++ b/envs/failing-env2.yaml @@ -0,0 +1,4 @@ +channels: + - conda-forge +dependencies: + - package_no_version_not_in_exclude diff --git a/minimum_versions.py b/minimum_versions.py index f2bdaa2..559e694 100644 --- a/minimum_versions.py +++ b/minimum_versions.py @@ -153,6 +153,22 @@ def parse_environment(text): return specs, warnings +def assert_spec_has_version(environments): + # packages in policy.exclude were already removed + + for env, specs in environments.items(): + for spec in specs: + if spec.version is None: + + msg = ( + f"No minimum version found for '{spec.name}' in '{env}'. Either" + " add a version or add to the list of excluded packages in the" + " policy file." + ) + + raise ValueError(msg) + + def parse_policy(file): policy = yaml.safe_load(file) try: @@ -344,6 +360,10 @@ def parse_date(string): @click.option("--today", type=parse_date, default=None) @click.option("--policy", "policy_file", type=click.File(mode="r"), required=True) def main(today, policy_file, environment_paths): + _main(today, policy_file, environment_paths) + + +def _main(today, policy_file, environment_paths): console = Console() policy = parse_policy(policy_file) @@ -360,6 +380,8 @@ def main(today, policy_file, environment_paths): for env, (specs, _) in parsed_environments.items() } + assert_spec_has_version(environments) + all_packages = list( dict.fromkeys(spec.name for spec in concat(environments.values())) ) diff --git a/test_script.py b/test_script.py index 22a62f9..577d0e3 100644 --- a/test_script.py +++ b/test_script.py @@ -1,9 +1,10 @@ import datetime as dt +import pathlib import pytest from rattler import Version -from minimum_versions import Policy, Release, Spec +from minimum_versions import Policy, Release, Spec, _main @pytest.mark.parametrize( @@ -27,6 +28,22 @@ def test_spec_parse(text, expected_spec, expected_name, expected_warnings): assert actual_warnings == expected_warnings +def test_error_missing_version_or_exclude(): + + msg = ( + "No minimum version found for 'package_no_version_not_in_exclude' in" + " 'failing-env2'. Either add a version or add to the list of excluded packages" + " in the policy file." + ) + + with open("policy.yaml") as policy: + + environment_paths = [pathlib.Path("envs/failing-env2.yaml")] + + with pytest.raises(ValueError, match=msg): + _main(dt.date(2023, 12, 12), policy, environment_paths=environment_paths) + + @pytest.mark.parametrize( ["package_name", "policy", "today", "expected"], (