Skip to content

Commit ea21a2e

Browse files
authored
Skip any configs not matching a meta (#2434)
1 parent d4923c6 commit ea21a2e

File tree

5 files changed

+127
-1
lines changed

5 files changed

+127
-1
lines changed

conda_smithy/configure_feedstock.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,12 +693,63 @@ def _collapse_subpackage_variants(
693693

694694
logger.debug("final used_key_values %s", pprint.pformat(used_key_values))
695695

696+
configs = break_up_top_level_values(top_level_loop_vars, used_key_values)
697+
698+
# return (configs, top_level_loop_vars)
699+
696700
return (
697-
break_up_top_level_values(top_level_loop_vars, used_key_values),
701+
[
702+
config
703+
for config in configs
704+
if not _is_config_skipped(config, top_level_loop_vars, list_of_metas)
705+
],
698706
top_level_loop_vars,
699707
)
700708

701709

710+
def _is_config_skipped(config, top_level_loop_vars, list_of_metas):
711+
trimmed_config = {loop_var: config[loop_var] for loop_var in top_level_loop_vars}
712+
logger.debug("checking config: %s", trimmed_config)
713+
for i, meta in enumerate(list_of_metas):
714+
trimmed_meta = {
715+
loop_var: meta.config.variant.get(loop_var)
716+
for loop_var in top_level_loop_vars
717+
}
718+
logger.debug(" checking in meta: %s", trimmed_meta)
719+
for loop_var in top_level_loop_vars:
720+
variant = meta.config.variant
721+
if loop_var not in variant:
722+
logger.debug(
723+
" skipping meta because %s is not in meta variant", loop_var
724+
)
725+
break
726+
if isinstance(variant[loop_var], (list, set)) and set(
727+
config[loop_var]
728+
) - set(variant[loop_var]):
729+
logger.debug(
730+
" skipping meta because %s in meta variant is %s, but in config is %s",
731+
loop_var,
732+
variant[loop_var],
733+
config[loop_var],
734+
)
735+
break
736+
if isinstance(variant[loop_var], (int, float, str)) and set(
737+
config[loop_var]
738+
) - set([variant[loop_var]]):
739+
logger.debug(
740+
" skipping meta because %s in meta variant is %s and in config is %s",
741+
loop_var,
742+
[variant[loop_var]],
743+
config[loop_var],
744+
)
745+
break
746+
else:
747+
logger.debug(" FOUND! meta variant matches config")
748+
return False
749+
logger.debug(" SKIPPED!")
750+
return True
751+
752+
702753
def _yaml_represent_ordereddict(yaml_representer, data):
703754
# represent_dict processes dict-likes with a .sort() method or plain iterables of key-value
704755
# pairs. Only for the latter it never sorts and retains the order of the OrderedDict.

news/2434-skipped-matrix.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
**Added:**
2+
3+
* <news item>
4+
5+
**Changed:**
6+
7+
* <news item>
8+
9+
**Deprecated:**
10+
11+
* <news item>
12+
13+
**Removed:**
14+
15+
* <news item>
16+
17+
**Fixed:**
18+
19+
* Fix configuration generation by respecting additive ``skip`` statements properly. (#1617 via #2434)
20+
21+
**Security:**
22+
23+
* <news item>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# https://github.com/conda-forge/conda-smithy/issues/1617
2+
mpi:
3+
- openmpi
4+
- nompi
5+
double:
6+
- "no"
7+
- "yes"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package:
2+
name: skip-rerenders-ok
3+
version: 1.0
4+
5+
build:
6+
# Only build for linux so we get up-to 4 configs (as per the conda-build-config-file)
7+
skip: true # [not linux64]
8+
# With this one skip, we remove one entry from the 2x2 matrix
9+
skip: true # [mpi == "nompi" and double == "yes"]
10+
11+
about: {}

tests/test_cli.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import shutil
55
import subprocess
6+
from pathlib import Path
67
from textwrap import dedent
78

89
import pytest
@@ -349,6 +350,39 @@ def test_render_variant_mismatches(testing_workdir):
349350
assert data["a"] == data["b"]
350351

351352

353+
def test_render_skipped_variants(testing_workdir):
354+
"""
355+
Regression test for https://github.com/conda-forge/conda-smithy/issues/1617
356+
"""
357+
parser = argparse.ArgumentParser()
358+
subparser = parser.add_subparsers()
359+
init_obj = cli.Init(subparser)
360+
regen_obj = cli.Regenerate(subparser)
361+
_thisdir = os.path.abspath(os.path.dirname(__file__))
362+
recipe = os.path.join(_thisdir, "recipes", "skip_rerenders_ok")
363+
feedstock_dir = os.path.join(testing_workdir, "test-skipped-variants-feedstock")
364+
args = InitArgs(
365+
recipe_directory=recipe,
366+
feedstock_directory=feedstock_dir,
367+
temporary_directory=os.path.join(recipe, "temp"),
368+
)
369+
init_obj(args)
370+
args = RegenerateArgs(
371+
feedstock_directory=feedstock_dir,
372+
feedstock_config=None,
373+
commit=False,
374+
no_check_uptodate=True,
375+
exclusive_config_file="recipe/conda_build_config.yaml",
376+
check=False,
377+
temporary_directory=os.path.join(recipe, "temp"),
378+
)
379+
regen_obj(args)
380+
381+
# We skip one config out of the 2x2 matrix, so we expect three configs
382+
configs = list(Path(feedstock_dir, ".ci_support").glob("*.yaml"))
383+
assert len(configs) == 3
384+
385+
352386
def test_render_readme_with_v1_recipe_name(testing_workdir):
353387
parser = argparse.ArgumentParser()
354388
subparser = parser.add_subparsers()

0 commit comments

Comments
 (0)