Skip to content

Commit fbcd852

Browse files
committed
refactor: pass workflow name explicitly to ParameterManager
- ParameterManager.__init__() now accepts optional workflow_name param - WorkflowManager passes workflow name directly to ParameterManager - load_presets() normalizes workflow name (lowercase, hyphens) for lookup - Added tests for workflow_name parameter functionality This makes the preset lookup contract clearer: presets.json keys should use the normalized format (e.g., "topp-workflow" for "TOPP Workflow"). https://claude.ai/code/session_01BnipAqTf16J7kJVfnzah2U
1 parent 233d5b0 commit fbcd852

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

src/workflow/ParameterManager.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ class ParameterManager:
1717
params_file (Path): Path to the JSON file where parameters are saved.
1818
param_prefix (str): Prefix for general parameter keys in Streamlit's session state.
1919
topp_param_prefix (str): Prefix for TOPP tool parameter keys in Streamlit's session state.
20+
workflow_name (str): Name of the workflow, used for loading presets.
2021
"""
2122
# Methods related to parameter handling
22-
def __init__(self, workflow_dir: Path):
23+
def __init__(self, workflow_dir: Path, workflow_name: str = None):
2324
self.ini_dir = Path(workflow_dir, "ini")
2425
self.ini_dir.mkdir(parents=True, exist_ok=True)
2526
self.params_file = Path(workflow_dir, "params.json")
2627
self.param_prefix = f"{workflow_dir.stem}-param-"
2728
self.topp_param_prefix = f"{workflow_dir.stem}-TOPP-"
29+
# Store workflow name for preset loading; default to directory stem if not provided
30+
self.workflow_name = workflow_name or workflow_dir.stem
2831

2932
def create_ini(self, tool: str) -> bool:
3033
"""
@@ -187,9 +190,9 @@ def load_presets(self) -> dict:
187190
except (json.JSONDecodeError, IOError):
188191
return {}
189192

190-
# Get workflow name from the workflow directory stem
191-
workflow_name = self.ini_dir.parent.stem
192-
return all_presets.get(workflow_name, {})
193+
# Normalize workflow name to match preset keys (lowercase with hyphens)
194+
workflow_key = self.workflow_name.replace(" ", "-").lower()
195+
return all_presets.get(workflow_key, {})
193196

194197
def get_preset_names(self) -> list:
195198
"""

src/workflow/WorkflowManager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, name: str, workspace: str):
1818
self.workflow_dir = Path(workspace, name.replace(" ", "-").lower())
1919
self.file_manager = FileManager(self.workflow_dir)
2020
self.logger = Logger(self.workflow_dir)
21-
self.parameter_manager = ParameterManager(self.workflow_dir)
21+
self.parameter_manager = ParameterManager(self.workflow_dir, workflow_name=name)
2222
self.executor = CommandExecutor(self.workflow_dir, self.logger, self.parameter_manager)
2323
self.ui = StreamlitUI(self.workflow_dir, self.logger, self.executor, self.parameter_manager)
2424
self.params = self.parameter_manager.get_parameters_from_json()

tests/test_parameter_presets.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,56 @@ def test_apply_preset_preserves_existing_params(self, temp_workflow_dir, sample_
266266
assert saved_params["ToolA"]["param1"] == 10.0
267267

268268

269+
class TestWorkflowNameParameter:
270+
"""Tests for the workflow_name parameter in ParameterManager."""
271+
272+
def test_workflow_name_defaults_to_directory_stem(self, temp_workflow_dir):
273+
"""Test that workflow_name defaults to the directory stem when not provided."""
274+
pm = ParameterManager(temp_workflow_dir)
275+
assert pm.workflow_name == "test-workflow"
276+
277+
def test_workflow_name_can_be_explicitly_set(self, temp_workflow_dir):
278+
"""Test that workflow_name can be explicitly set."""
279+
pm = ParameterManager(temp_workflow_dir, workflow_name="My Custom Workflow")
280+
assert pm.workflow_name == "My Custom Workflow"
281+
282+
def test_load_presets_normalizes_workflow_name(self, temp_workflow_dir, temp_cwd):
283+
"""Test that load_presets normalizes the workflow name for lookup."""
284+
# Create presets with normalized key
285+
presets = {
286+
"my-custom-workflow": {
287+
"Test Preset": {
288+
"_description": "A test preset"
289+
}
290+
}
291+
}
292+
with open("presets.json", "w") as f:
293+
json.dump(presets, f)
294+
295+
# Pass workflow name with spaces and mixed case
296+
pm = ParameterManager(temp_workflow_dir, workflow_name="My Custom Workflow")
297+
preset_names = pm.get_preset_names()
298+
299+
assert "Test Preset" in preset_names
300+
301+
def test_load_presets_with_original_name_format(self, temp_workflow_dir, temp_cwd):
302+
"""Test that presets can use the same format as WorkflowManager normalization."""
303+
# This simulates how WorkflowManager passes the name
304+
presets = {
305+
"topp-workflow": {
306+
"Preset X": {"_description": "Test"}
307+
}
308+
}
309+
with open("presets.json", "w") as f:
310+
json.dump(presets, f)
311+
312+
# Simulating WorkflowManager passing "TOPP Workflow"
313+
pm = ParameterManager(temp_workflow_dir, workflow_name="TOPP Workflow")
314+
preset_names = pm.get_preset_names()
315+
316+
assert "Preset X" in preset_names
317+
318+
269319
class TestPresetsJsonFormat:
270320
"""Tests for the presets.json format validation."""
271321

0 commit comments

Comments
 (0)