diff --git a/httomo/cli.py b/httomo/cli.py index 9817763fa..47a4f8ac5 100644 --- a/httomo/cli.py +++ b/httomo/cli.py @@ -265,7 +265,7 @@ def run( method_wrapper_comm = global_comm if not does_contain_sweep else MPI.COMM_SELF if global_comm.rank == 0: - initialise_output_directory(pipeline, does_contain_sweep) + initialise_output_dir_copy_files_inject_defaults(pipeline, does_contain_sweep) global_comm.Barrier() @@ -380,9 +380,15 @@ def set_global_constants( httomo.globals.MAX_CPU_SLICES = max_cpu_slices -def initialise_output_directory( +def initialise_output_dir_copy_files_inject_defaults( pipeline: Union[Path, str], does_contain_sweep: bool ) -> None: + """This function does the following: + - creates output folder + - copies the distortion coefficient file (if provided) + - injects omitted default parameters into the pipeline file + - copies the YAML or JSON pipeline file + """ try: Path.mkdir(httomo.globals.run_out_dir, parents=True, exist_ok=True) except PermissionError as e: diff --git a/httomo/cli_utils.py b/httomo/cli_utils.py index 1e10d0593..bd7066ff7 100644 --- a/httomo/cli_utils.py +++ b/httomo/cli_utils.py @@ -1,9 +1,7 @@ import json from pathlib import Path -from typing import Union, Dict, List, Any - -MANUAL_SWEEP_TAG = "!Sweep" -RANGE_SWEEP_TAG = "!SweepRange" +from typing import Union, Dict, Any +from httomo.ui_layer import yaml_loader def is_sweep_pipeline(pipeline: Union[Path, str]) -> bool: @@ -34,9 +32,12 @@ def is_sweep_pipeline(pipeline: Union[Path, str]) -> bool: if isinstance(pipeline, (Path, str)) and ( isinstance(pipeline, Path) or Path(pipeline).exists() ): - with open(pipeline) as f: - for line in f: - if MANUAL_SWEEP_TAG in line or RANGE_SWEEP_TAG in line: + pipeline_conf = yaml_loader(pipeline) + for method in pipeline_conf: + for value in method["parameters"].values(): + if isinstance( + value, tuple + ): # checking if sweep tags were parsed into tuples return True return False diff --git a/tests/test_cli.py b/tests/test_cli.py index cd236acb6..3dd745ace 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -3,7 +3,6 @@ import tempfile import pytest -from pytest_mock import MockerFixture from click.testing import CliRunner import httomo @@ -12,7 +11,7 @@ set_global_constants, transform_limit_str_to_bytes, main, - initialise_output_directory, + initialise_output_dir_copy_files_inject_defaults, ) from httomo.ui_layer import PipelineFormat @@ -121,7 +120,7 @@ def test_cli_run_accepts_json_string_with_format_flag(mocker, pipeline_format: s mock_transform_layer.return_value = mock_transform_instance mock_transform_instance.transform.return_value = mock_pipeline - mocker.patch("httomo.cli.initialise_output_directory") + mocker.patch("httomo.cli.initialise_output_dir_copy_files_inject_defaults") mocker.patch("httomo.cli.execute_high_throughput_run") mocker.patch("httomo.cli.is_sweep_pipeline", return_value=False) mocker.patch("httomo.cli.make_monitors", return_value=None) @@ -172,7 +171,6 @@ def test_cli_run_accepts_json_string_with_format_flag(mocker, pipeline_format: s def test_initialise_output_directory_handles_json_string(tmp_path): """Test that initialise_output_directory correctly handles JSON string input.""" - from httomo.cli import initialise_output_directory # Set up the global output directory output_dir = tmp_path / "output" @@ -181,7 +179,7 @@ def test_initialise_output_directory_handles_json_string(tmp_path): json_string = json.dumps(SAMPLE_JSON_PIPELINE) # Call the function with a JSON string - initialise_output_directory(json_string, False) + initialise_output_dir_copy_files_inject_defaults(json_string, False) # Verify directory was created assert output_dir.exists() @@ -206,7 +204,7 @@ def test_initialise_output_directory_handles_path_input( pipeline_path = Path(__file__).parent.parent / standard_loader # Call the function with a Path - initialise_output_directory(pipeline_path, False) + initialise_output_dir_copy_files_inject_defaults(pipeline_path, False) # Verify directory was created assert output_dir.exists() @@ -219,7 +217,7 @@ def test_output_dir_created_if_doesnt_exist(tmp_path: Path, standard_loader: str output_dir_cli_arg = tmp_path / "out" httomo.globals.run_out_dir = output_dir_cli_arg / "httomo-output-dir" pipeline_path = Path(__file__).parent.parent / standard_loader - initialise_output_directory(pipeline_path, False) + initialise_output_dir_copy_files_inject_defaults(pipeline_path, False) assert output_dir_cli_arg.exists() assert httomo.globals.run_out_dir.exists()