Skip to content

Commit 4a22656

Browse files
Merge pull request #1323 from douglasjacobsen/fix-variant-issues
Fix issues with expanding variant values
2 parents 27b6c69 + 61ade0c commit 4a22656

File tree

7 files changed

+85
-19
lines changed

7 files changed

+85
-19
lines changed

lib/ramble/ramble/cmd/workspace.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -887,8 +887,13 @@ def workspace_info(args):
887887

888888
if args.variants:
889889
color.cprint(rucolor.nested_4(" Variants: "))
890-
for key, value in app_inst.variants.items():
891-
color.cprint(f" {key}: {value}")
890+
variant_set = set()
891+
for _, obj in app_inst._objects():
892+
variant_set = variant_set.union(
893+
obj.experiment_variants().as_set(expander=app_inst.expander)
894+
)
895+
for variant in variant_set:
896+
color.cprint(f" - {variant}")
892897

893898
if args.executables:
894899
color.cprint(rucolor.nested_4(" Executables: "))

lib/ramble/ramble/expander.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -756,10 +756,12 @@ def satisfies(
756756
the input requirement.
757757
"""
758758

759-
if variant_set is not None:
760-
variant_definitions = variant_set.as_set()
761-
else:
762-
variant_definitions = set()
759+
variant_definitions = set()
760+
761+
if hasattr(variant_set, "as_set"):
762+
for variant in variant_set.as_set():
763+
exp_variant = self.expand_var(variant)
764+
variant_definitions.add(exp_variant)
763765

764766
satisfied = True
765767
if reqs is not None:

lib/ramble/ramble/test/cmd/workspace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ def test_workspace_info_complete(workspace_name):
530530
assert f"Phases for {pipeline}" in output
531531

532532
assert "Variants:" in output
533-
assert "package_manager: spack" in output
533+
assert "package_manager=spack" in output
534534

535535
assert "Variables from Workspace" in output
536536
assert "Variables from Experiment" in output

lib/ramble/ramble/test/variant.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,3 +288,34 @@ def test_modifier_variants_works_with_when(
288288
with open(ws.config_file_path) as f:
289289
data = f.read()
290290
assert expected_spec in data
291+
292+
293+
def test_variant_info_works(request):
294+
ws_name = request.node.name
295+
296+
global_args = ["-w", ws_name]
297+
298+
with ramble.workspace.create(ws_name) as ws:
299+
workspace(
300+
"manage",
301+
"experiments",
302+
"when-variants",
303+
"--wf",
304+
"test_wl",
305+
"-v",
306+
"n_ranks=1",
307+
"-v",
308+
"n_nodes=1",
309+
"-v",
310+
"processes_per_node=1",
311+
"-p",
312+
"spack",
313+
global_args=global_args,
314+
)
315+
316+
ws._re_read()
317+
workspace("concretize", global_args=global_args)
318+
info_out = workspace("info", "--variants", global_args=global_args)
319+
320+
assert "application_name=when-variants" in info_out
321+
assert "indirect_variant=test-value" in info_out

lib/ramble/ramble/variants.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ramble.error
1414
import ramble.util.colors as rucolor
15+
from ramble.expander import Expander
1516

1617
reserved_variants = {
1718
"modifier",
@@ -249,17 +250,37 @@ def value(self, name: str):
249250

250251
return None
251252

252-
def as_set(self):
253+
def _expanded_set(self, expander: Optional[Expander] = None) -> set:
254+
"""Return an expanded version of the cached set in this variant set.
255+
256+
Args:
257+
expander (ramble.expander.Expander): Expander to use for expanding this set
258+
259+
Returns:
260+
(set): Set of exanded variant definitions
261+
"""
262+
263+
if expander is None:
264+
return self._set_cache
265+
266+
expanded_set = set()
267+
for variant in self._set_cache:
268+
expanded_set.add(expander.expand_var(variant))
269+
return expanded_set
270+
271+
def as_set(self, expander: Optional[Expander] = None) -> set:
253272
"""Construct a set of definitions for this variant set
254273
255274
The set of variant definitions will be used to determine if a when
256275
clause is valid or not.
257276
258277
Returns:
259278
set: A set consisting of strings with the variant definitions
279+
expander (ramble.expander.Expander): Expander to use when expanding
280+
variant definitions
260281
"""
261282
if self._set_cache is not None:
262-
return self._set_cache
283+
return self._expanded_set(expander)
263284

264285
defined_variants = set()
265286
out_set = set()
@@ -288,7 +309,7 @@ def as_set(self):
288309
out_set.add(variant.as_definition())
289310

290311
self._set_cache = out_set
291-
return out_set
312+
return self._expanded_set(expander)
292313

293314

294315
class Variant:
@@ -317,7 +338,7 @@ def copy(self):
317338
name=self.name, default=self.default, description=self.description, values=self.values
318339
)
319340

320-
def as_definition(self):
341+
def as_definition(self) -> str:
321342
"""Build a definition for this variant
322343
323344
Format the variant as a string which can be used to test against when
@@ -328,13 +349,6 @@ def as_definition(self):
328349
"""
329350
return self._definition
330351

331-
if isinstance(self.default, bool):
332-
if self.default:
333-
return f"+{self.name}"
334-
else:
335-
return f"~{self.name}"
336-
return f"{self.name}={str(self.default)}"
337-
338352
def as_str(self, n_indent: int = 0, verbose: bool = False):
339353
"""String documentation of this variant
340354

var/ramble/repos/builtin.mock/applications/when-variants/application.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@ class WhenVariants(ExecutableApplication):
5757
description="Variant to control whether validation is on or not",
5858
)
5959

60+
variant(
61+
"indirect_variant",
62+
default="{variant_variable}",
63+
description="Variant who's value comes from a variable",
64+
)
65+
66+
workload_variable(
67+
"variant_variable",
68+
default="test-value",
69+
description="Variable to control value of variant",
70+
workloads=["*"],
71+
)
72+
6073
with when("+validation"):
6174
register_validator(
6275
"fixed_n_nodes",

var/ramble/repos/builtin/base_classes/application-base/base_class.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,8 @@ def set_variables_and_variants(self, variables, variants, experiment_set):
598598
for cls in base_chain:
599599
if hasattr(cls, "name") and cls.name is not None:
600600
self.object_variants.multi_value_variant(
601-
"application_name", value=cls.name
601+
"application_name",
602+
value=self.expander.application_name,
602603
)
603604

604605
# Define workload_name variant as early as possible

0 commit comments

Comments
 (0)