Skip to content

Commit 4b3c5a4

Browse files
committed
Allow invalid variant in rules
1 parent 30a855b commit 4b3c5a4

File tree

3 files changed

+24
-380
lines changed

3 files changed

+24
-380
lines changed

src/feafea/__init__.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -824,15 +824,11 @@ def from_dict(c: DictConfig) -> CompiledConfig:
824824

825825
referenced_variants = set((flag, variant) for flag, variant in r.get("variants", {}).items())
826826

827-
# Remove any referenced variants that are not defined in the config.
828-
referenced_variants = {rv for rv in referenced_variants if rv[0] in flags}
829-
830-
if referenced_variants - all_variants:
831-
raise ValueError(f"unknown flag/variant in rule {rule_name}")
827+
valid_variants = referenced_variants.intersection(all_variants)
832828

833829
# Rule compilation.
834830

835-
py_flag = {f: [] for f in set(flag for flag, _ in referenced_variants)}
831+
py_flag = {f: [] for f in set(flag for flag, _ in valid_variants)}
836832
py_common = []
837833

838834
globals: dict[str, Any] = {
@@ -869,7 +865,8 @@ def from_dict(c: DictConfig) -> CompiledConfig:
869865
# Compile the flag dependent rules.
870866

871867
for flag, variant in r.get("variants", {}).items():
872-
if flag in py_flag: # Only process flags that exist in py_flag dict
868+
# Only process flag/variant combo that's valid
869+
if (flag, variant) in valid_variants:
873870
py_flag[flag].append(f"return {variant!r}")
874871

875872
for flag, py_lines in py_flag.items():

tests/test_configs.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ def setUpClass(cls):
139139
"gg": {
140140
"alias": "g",
141141
},
142+
"hh": {
143+
"default": False,
144+
}
142145
},
143146
"filters": {
144147
"f1": "attr:at1 in [5,6,7]",
@@ -207,13 +210,25 @@ def setUpClass(cls):
207210
"variants": {
208211
"nonexistent": "apply",
209212
}
213+
},
214+
"r11": {
215+
"filter": "attr:nonexistent",
216+
"variants": {
217+
"hh": True,
218+
},
219+
},
220+
"r12": {
221+
"filter": "attr:be_bad",
222+
"variants": {
223+
"hh": "badvariant",
224+
}
210225
}
211226
},
212227
},
213228
)
214229

215230
def test_valid_config_high_level(self):
216-
self.assertSetEqual(set(self._valid_config.flags), {"a", "b", "c", "cc", "d", "e", "f", "g", "h", "gg"})
231+
self.assertSetEqual(set(self._valid_config.flags), {"a", "b", "c", "cc", "d", "e", "f", "g", "h", "gg", "hh"})
217232
self.assertDictEqual(self._valid_config.flags["a"].metadata, {"category": "simple", "deprecated": False, "revision": 22})
218233
self.assertEqual(self._valid_config.flags["a"].name, "a")
219234
self.assertTrue(self._valid_config.flags["a"].type is bool)
@@ -246,14 +261,15 @@ def test_valid_const_config(self):
246261
("cc", {"at1": 5}, "const_rule", "r5", "med"), # alias of c
247262
("gg", {}, "const_rule", "r9", 9),
248263
("g", {}, "const_rule", "r9", 9), # setting rule against alias sets it against the original flag
264+
("hh", {"be_bad": True}, "default", "", False), # rule r11 has invalid variant
249265
]
250266

251267
for flag, attrs, reason, rule, variant in cases:
252268
with self.subTest(f"flag={flag}, attrs={attrs}"):
253269
ev = self._valid_config.flags[flag].eval(attrs)
254-
self.assertEqual(ev.variant, variant)
255-
self.assertEqual(ev.reason, reason)
256-
self.assertEqual(ev.rule, rule)
270+
self.assertEqual(ev.variant, variant, msg=f"flag={flag}, attrs={attrs}")
271+
self.assertEqual(ev.reason, reason, msg=f"flag={flag}, attrs={attrs}")
272+
self.assertEqual(ev.rule, rule, msg=f"flag={flag}, attrs={attrs}")
257273

258274

259275
class TestInvalidConfigs(unittest.TestCase):
@@ -318,7 +334,6 @@ def test_invalid_rules_def(self):
318334

319335
cases = [
320336
({}, ValidationError, "."),
321-
({"variants": {"a": 4}}, ValueError, "unknown flag/variant"), # non-existing variant
322337
({"split_group": 12}, ValidationError, "."),
323338
({"variants": {"a": 4}, "split_group": 12}, ValidationError, "."), # cannot combine split_group with variants
324339
({"metadata": "abc"}, ValidationError, "."),

0 commit comments

Comments
 (0)