From 3fbd636df733ba87da61baf827b12d75aa69bd9c Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 28 Feb 2024 16:03:22 -0500 Subject: [PATCH] fix: type parsing for ces,actions,credentials Re #117 --- seqerakit/helper.py | 51 ++++++++++++------------------ tests/unit/test_helper.py | 65 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/seqerakit/helper.py b/seqerakit/helper.py index 2b47599..0b71311 100644 --- a/seqerakit/helper.py +++ b/seqerakit/helper.py @@ -113,10 +113,10 @@ def parse_all_yaml(file_paths, destroy=False): def parse_block(block_name, item): # Define the mapping from block names to functions. block_to_function = { - "credentials": parse_credentials_block, - "compute-envs": parse_compute_envs_block, + "credentials": parse_type_block, + "compute-envs": parse_type_block, + "actions": parse_type_block, "teams": parse_teams_block, - "actions": parse_actions_block, "datasets": parse_datasets_block, "pipelines": parse_pipelines_block, "launch": parse_launch_block, @@ -141,27 +141,28 @@ def parse_generic_block(item): return cmd_args -def parse_credentials_block(item): +def parse_type_block(item, priority_keys=["type", "config-mode", "file-path"]): cmd_args = [] - for key, value in item.items(): - if key == "type": - cmd_args.append(str(value)) - elif isinstance(value, bool): - if value: - cmd_args.append(f"--{key}") - else: - cmd_args.extend([f"--{key}", str(value)]) - return cmd_args + # Ensure at least one of 'type' or 'file-path' is present + if not any(key in item for key in ["type", "file-path"]): + raise ValueError( + "Please specify at least 'type' or 'file-path' for creating the resource." + ) + + # Process priority keys first + for key in priority_keys: + if key in item: + cmd_args.append(str(item[key])) + del item[key] # Remove the key to avoid repeating in args -def parse_compute_envs_block(item): - cmd_args = [] for key, value in item.items(): - if key == "file-path" or key == "type" or key == "config-mode": - cmd_args.append(str(value)) - elif isinstance(value, bool): + if isinstance(value, bool): if value: cmd_args.append(f"--{key}") + elif key == "params": + temp_file_name = utils.create_temp_yaml(value) + cmd_args.extend(["--params-file", temp_file_name]) else: cmd_args.extend([f"--{key}", str(value)]) return cmd_args @@ -194,20 +195,6 @@ def parse_teams_block(item): return (cmd_args, members_cmd_args) -def parse_actions_block(item): - cmd_args = [] - temp_file_name = None - for key, value in item.items(): - if key == "type": - cmd_args.append(str(value)) - elif key == "params": - temp_file_name = utils.create_temp_yaml(value) - cmd_args.extend(["--params-file", temp_file_name]) - else: - cmd_args.extend([f"--{key}", str(value)]) - return cmd_args - - def parse_datasets_block(item): cmd_args = [] for key, value in item.items(): diff --git a/tests/unit/test_helper.py b/tests/unit/test_helper.py index ab7158c..66b1ec7 100644 --- a/tests/unit/test_helper.py +++ b/tests/unit/test_helper.py @@ -130,14 +130,14 @@ def test_create_mock_dataset_yaml(mock_yaml_file): assert result["datasets"] == expected_block_output -def test_create_mock_computeevs_yaml(mock_yaml_file): +def test_create_mock_computeevs_source_yaml(mock_yaml_file): test_data = { "compute-envs": [ { "name": "test_computeenv", "workspace": "my_organization/my_workspace", "credentials": "my_credentials", - "file-path": "./examples/yaml/computeenvs/computeenvs.yaml", + "file-path": "./computeenvs/computeenv.json", "wait": "AVAILABLE", "fusion-v2": True, "fargate": False, @@ -149,9 +149,9 @@ def test_create_mock_computeevs_yaml(mock_yaml_file): expected_block_output = [ { "cmd_args": [ + "./computeenvs/computeenv.json", "--credentials", "my_credentials", - "./examples/yaml/computeenvs/computeenvs.yaml", "--fusion-v2", "--name", "test_computeenv", @@ -171,6 +171,43 @@ def test_create_mock_computeevs_yaml(mock_yaml_file): assert result["compute-envs"] == expected_block_output +def test_create_mock_computeevs_cli_yaml(mock_yaml_file): + test_data = { + "compute-envs": [ + { + "name": "test_computeenv", + "workspace": "my_organization/my_workspace", + "credentials": "my_credentials", + "type": "aws-batch", + "config-mode": "forge", + "wait": "AVAILABLE", + } + ], + } + + expected_block_output = [ + { + "cmd_args": [ + "aws-batch", + "forge", + "--credentials", + "my_credentials", + "--name", + "test_computeenv", + "--wait", + "AVAILABLE", + "--workspace", + "my_organization/my_workspace", + ], + "overwrite": False, + } + ] + file_path = mock_yaml_file(test_data) + result = helper.parse_all_yaml([file_path]) + assert "compute-envs" in result + assert result["compute-envs"] == expected_block_output + + def test_create_mock_pipeline_add_yaml(mock_yaml_file): test_data = { "pipelines": [ @@ -191,7 +228,6 @@ def test_create_mock_pipeline_add_yaml(mock_yaml_file): } ] } - # params file cmds parsed separately expected_block_output = [ { @@ -239,3 +275,24 @@ def test_empty_yaml_file(mock_yaml_file): assert f"The file '{file_path}' is empty or does not contain valid data." in str( e.value ) + + +def test_error_type_yaml_file(mock_yaml_file): + test_data = { + "compute-envs": [ + { + "name": "test_computeenv", + "workspace": "my_organization/my_workspace", + "credentials": "my_credentials", + "wait": "AVAILABLE", + } + ], + } + file_path = mock_yaml_file(test_data) + + with pytest.raises(ValueError) as e: + helper.parse_all_yaml([file_path]) + assert ( + "Please specify at least 'type' or 'file-path' for creating the resource." + in str(e.value) + )