Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/optitype/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ def main():
@click.option(
"--solver",
type=click.Choice(["glpk", "cbc", "cplex"]),
default="glpk",
envvar="OPTITYPE_SOLVER",
help="ILP solver to use. Default: glpk.",
)
Expand Down Expand Up @@ -189,7 +188,8 @@ def run(
pipeline_config.razers3_args = razers3_args
pipeline_config.yara_args = yara_args
pipeline_config.mapping_threads = threads
pipeline_config.solver = solver
if solver is not None:
pipeline_config.solver = solver
pipeline_config.ilp_threads = ilp_threads
pipeline_config.delete_bam = not keep_bam

Expand All @@ -200,7 +200,7 @@ def run(
click.echo(f"Sequence type: {seq_type}")
click.echo(f"Output directory: {outdir}")
click.echo(f"Mapper: {mapper}")
click.echo(f"Solver: {solver}")
click.echo(f"Solver: {pipeline_config.solver}")
click.echo()

try:
Expand Down
39 changes: 38 additions & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Tests for CLI interface."""

from pathlib import Path
from unittest.mock import patch
from unittest.mock import MagicMock, patch

from click.testing import CliRunner

Expand Down Expand Up @@ -33,6 +33,43 @@ def test_cli_run_help():
assert expected in result.output


def test_cli_solver_precedence(tmp_path):
"""CLI/env solver values override config, which overrides the built-in default."""
config_file = tmp_path / "config.ini"
config_file.write_text("[ilp]\nsolver=cbc\n")
cases = [
("config", ["-c", str(config_file)], None, "cbc"),
("command-line", ["-c", str(config_file), "--solver", "glpk"], None, "glpk"),
("cli-over-env", ["-c", str(config_file), "--solver", "glpk"], "cplex", "glpk"),
("environment", ["-c", str(config_file)], "cplex", "cplex"),
("default", [], None, "glpk"),
]

runner = CliRunner()
pipeline_result = MagicMock(output_csv="result.tsv", output_plot="coverage.pdf")
pipeline_result.result_4digit.iloc.__getitem__.return_value = {"nof_reads": 0, "obj": 0}
for name, extra_args, env_solver, expected in cases:
args = [
"run",
"-i",
str(Path(__file__)),
"--dna",
"-o",
str(tmp_path / name),
"-v",
*extra_args,
]
with (
patch("optitype.cli.shutil.which", return_value=None),
patch("optitype.pipeline.run_pipeline", return_value=pipeline_result) as run_pipeline,
):
result = runner.invoke(main, args, env={"OPTITYPE_SOLVER": env_solver})

assert result.exit_code == 0, result.output
assert run_pipeline.call_args.kwargs["config"].solver == expected
assert f"Solver: {expected}" in result.output


def test_cli_check_deps():
"""Test that check-deps command works."""
runner = CliRunner()
Expand Down