Coverage for src/sparkle/CLI/remove_solver.py: 78%
49 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-08 12:00 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-08 12:00 +0000
1#!/usr/bin/env python3
2"""Sparkle command to remove a solver from the Sparkle platform."""
4import sys
5import argparse
6import shutil
8from sparkle.platform import file_help as sfh
9from sparkle.CLI.help import global_variables as gv
10from sparkle.structures import PerformanceDataFrame
11from sparkle.CLI.help import logging as sl
12from sparkle.CLI.initialise import check_for_initialise
13from sparkle.CLI.help import argparse_custom as ac
14from sparkle.CLI.help.nicknames import resolve_object_name
15from sparkle.CLI.help import jobs as jobs_help
18def parser_function() -> argparse.ArgumentParser:
19 """Define the command line arguments."""
20 parser = argparse.ArgumentParser(description="Remove a solver from the platform.")
21 parser.add_argument(*ac.SolverRemoveArgument.names, **ac.SolverRemoveArgument.kwargs)
22 return parser
25def main(argv: list[str]) -> None:
26 """Main function of the remove solver command."""
27 # Log command call
28 sl.log_command(sys.argv, gv.settings().random_state)
29 check_for_initialise()
31 # Define command line arguments
32 parser = parser_function()
34 # Process command line arguments
35 args = parser.parse_args(argv)
36 solver_path = resolve_object_name(
37 args.solver,
38 gv.file_storage_data_mapping[gv.solver_nickname_list_path],
39 gv.settings().DEFAULT_solver_dir,
40 )
42 if solver_path is None:
43 print(f'Could not resolve Solver path/name "{solver_path}"!')
44 sys.exit(-1)
45 if not solver_path.parent == gv.settings().DEFAULT_solver_dir:
46 # Allow user to only specify solvers in Sparkle solver dir
47 print("Specified Solver is not is platform directory! Exiting.")
48 sys.exit(-1)
50 print(f"Start removing solver {solver_path.name} ...")
52 solver_nickname_mapping = gv.file_storage_data_mapping[gv.solver_nickname_list_path]
53 if len(solver_nickname_mapping):
54 nickname = None
55 for key in solver_nickname_mapping:
56 if solver_nickname_mapping[key] == str(solver_path):
57 nickname = key
58 break
60 sfh.add_remove_platform_item(
61 solver_path,
62 gv.solver_nickname_list_path,
63 gv.file_storage_data_mapping[gv.solver_nickname_list_path],
64 key=nickname,
65 remove=True,
66 )
68 jobs_help.check_running_waiting_jobs(
69 gv.settings().DEFAULT_log_output,
70 )
72 if gv.settings().DEFAULT_performance_data_path.exists():
73 performance_data = PerformanceDataFrame(
74 gv.settings().DEFAULT_performance_data_path
75 )
76 if str(solver_path) in performance_data.solvers:
77 performance_data.remove_solver(str(solver_path))
78 performance_data.save_csv()
80 # We unlink symbolics links, erase copies
81 if solver_path.is_symlink():
82 solver_path.unlink()
83 else:
84 # Remove the directory and all its files
85 shutil.rmtree(solver_path)
87 print(f"Removing solver {solver_path.name} done!")
88 sys.exit(0)
91if __name__ == "__main__":
92 main(sys.argv[1:])