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

1#!/usr/bin/env python3 

2"""Sparkle command to remove a solver from the Sparkle platform.""" 

3 

4import sys 

5import argparse 

6import shutil 

7 

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 

16 

17 

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 

23 

24 

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() 

30 

31 # Define command line arguments 

32 parser = parser_function() 

33 

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 ) 

41 

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) 

49 

50 print(f"Start removing solver {solver_path.name} ...") 

51 

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 

59 

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 ) 

67 

68 jobs_help.check_running_waiting_jobs( 

69 gv.settings().DEFAULT_log_output, 

70 ) 

71 

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() 

79 

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) 

86 

87 print(f"Removing solver {solver_path.name} done!") 

88 sys.exit(0) 

89 

90 

91if __name__ == "__main__": 

92 main(sys.argv[1:])