|
47 | 47 | """ |
48 | 48 |
|
49 | 49 | import os |
50 | | -import sys |
51 | 50 | import json |
52 | 51 | import yaml |
53 | 52 | import argparse |
54 | | -import re |
55 | 53 |
|
56 | 54 | from lbaf.IO.lbsVTDataReader import LoadReader |
57 | 55 | from lbaf.Utils.lbsLogging import get_logger, Logger |
58 | 56 |
|
59 | | -def process_files(directory, file_stem, file_suffix, logger: Logger): |
60 | | - reader = LoadReader( |
61 | | - file_prefix = directory + file_stem, |
62 | | - logger = logger, |
63 | | - file_suffix = file_suffix |
64 | | - ) |
65 | | - |
66 | | - tasks = {} |
67 | | - n_ranks = reader.n_ranks |
68 | | - |
69 | | - try: |
70 | | - for rank in range(n_ranks): |
71 | | - _, data = reader._load_vt_file(rank) |
72 | | - phases = data.get("phases", []) |
73 | | - if not phases: |
74 | | - logger.warning("No phases found for rank %s", str(rank)) |
75 | | - continue |
76 | | - |
77 | | - last_phase = phases[-1] |
78 | | - |
79 | | - if "lb_iterations" in last_phase: |
80 | | - lb_iterations = last_phase["lb_iterations"] |
81 | | - if lb_iterations: |
82 | | - last_lb_iteration = lb_iterations[-1] |
83 | | - iteration_tasks = [task["entity"].get("seq_id", task["entity"].get("id")) for task in last_lb_iteration.get("tasks", [])] |
84 | | - tasks[rank] = iteration_tasks |
| 57 | +class JSONTaskLister: |
| 58 | + def __process_files(self): |
| 59 | + reader = LoadReader( |
| 60 | + file_prefix = self.__directory + self.__file_stem, |
| 61 | + logger = self.__logger, |
| 62 | + file_suffix = self.__file_suffix |
| 63 | + ) |
| 64 | + |
| 65 | + tasks = {} |
| 66 | + n_ranks = reader.n_ranks |
| 67 | + |
| 68 | + try: |
| 69 | + for rank in range(n_ranks): |
| 70 | + _, data = reader._load_vt_file(rank) |
| 71 | + phases = data.get("phases", []) |
| 72 | + if not phases: |
| 73 | + self.__logger.warning("No phases found for rank %s", str(rank)) |
| 74 | + continue |
| 75 | + |
| 76 | + last_phase = phases[-1] |
| 77 | + |
| 78 | + if "lb_iterations" in last_phase: |
| 79 | + lb_iterations = last_phase["lb_iterations"] |
| 80 | + if lb_iterations: |
| 81 | + last_lb_iteration = lb_iterations[-1] |
| 82 | + iteration_tasks = [task["entity"].get("seq_id", task["entity"].get("id")) for task in last_lb_iteration.get("tasks", [])] |
| 83 | + tasks[rank] = iteration_tasks |
| 84 | + else: |
| 85 | + self.__logger.warning("No lb_iterations found in the last phase of rank %s", str(rank)) |
85 | 86 | else: |
86 | | - logger.warning("No lb_iterations found in the last phase of rank %s", str(rank)) |
87 | | - else: |
88 | | - phase_tasks = [task["entity"].get("seq_id", task["entity"].get("id")) for task in last_phase.get("tasks", [])] |
89 | | - tasks[rank] = phase_tasks |
90 | | - except (json.JSONDecodeError, KeyError, ValueError, IndexError) as e: |
91 | | - logger.error("Error processing rank %s: %s", str(rank), e) |
92 | | - sys.exit(1) |
| 87 | + phase_tasks = [task["entity"].get("seq_id", task["entity"].get("id")) for task in last_phase.get("tasks", [])] |
| 88 | + tasks[rank] = phase_tasks |
| 89 | + except (json.JSONDecodeError, KeyError, ValueError, IndexError) as e: |
| 90 | + self.__logger.error("Error processing rank %s: %s", str(rank), e) |
| 91 | + return |
93 | 92 |
|
94 | | - return tasks |
| 93 | + return tasks |
95 | 94 |
|
96 | | -def main(): |
97 | | - parser = argparse.ArgumentParser(description="Extract tasks from JSON files.") |
98 | | - parser.add_argument("directory", type=str, help="Directory containing JSON files.") |
99 | | - parser.add_argument("--file-stem", type=str, default="data", help="File stem for JSON files (default: 'data').") |
100 | | - parser.add_argument("--file-suffix", type=str, default="json", help="File suffix for JSON files (default: 'json').") |
101 | | - parser.add_argument("--output", type=str, default="tasks.yml", help="Output YAML file (default: 'tasks.yml').") |
| 95 | + def run(self): |
| 96 | + parser = argparse.ArgumentParser(description="Extract tasks from JSON files.") |
| 97 | + parser.add_argument("directory", type=str, help="Directory containing JSON files.") |
| 98 | + parser.add_argument("--file-stem", type=str, default="data", help="File stem for JSON files (default: 'data').") |
| 99 | + parser.add_argument("--file-suffix", type=str, default="json", help="File suffix for JSON files (default: 'json').") |
| 100 | + parser.add_argument("--output", type=str, default="tasks.yml", help="Output YAML file (default: 'tasks.yml').") |
102 | 101 |
|
103 | | - args = parser.parse_args() |
| 102 | + args = parser.parse_args() |
104 | 103 |
|
105 | | - directory = args.directory |
106 | | - file_stem = args.file_stem |
107 | | - file_suffix = args.file_suffix |
108 | | - output_file = args.output |
| 104 | + self.__directory = args.directory |
| 105 | + self.__file_stem = args.file_stem |
| 106 | + self.__file_suffix = args.file_suffix |
| 107 | + self.__output_file = args.output |
109 | 108 |
|
110 | | - logger = get_logger() |
| 109 | + self.__logger = get_logger() |
111 | 110 |
|
112 | | - if not os.path.isdir(directory): |
113 | | - logger.error("Directory not found: %s", directory) |
114 | | - return |
| 111 | + if not os.path.isdir(self.__directory): |
| 112 | + self.__logger.error("Directory not found: %s", self.__directory) |
| 113 | + return |
115 | 114 |
|
116 | | - tasks = process_files(directory, file_stem, file_suffix, logger) |
| 115 | + tasks = self.__process_files() |
117 | 116 |
|
118 | | - try: |
119 | | - with open(output_file, 'w') as file: |
120 | | - yaml.safe_dump(tasks, file) |
121 | | - logger.info("Tasks successfully written to %s", output_file) |
122 | | - except IOError as e: |
123 | | - logger.error("Error writing to %s: %s", output_file, e) |
| 117 | + try: |
| 118 | + with open(self.__output_file, 'w') as file: |
| 119 | + yaml.safe_dump(tasks, file) |
| 120 | + self.__logger.info("Tasks successfully written to %s", self.__output_file) |
| 121 | + except IOError as e: |
| 122 | + self.__logger.error("Error writing to %s: %s", self.__output_file, e) |
| 123 | + return |
124 | 124 |
|
125 | 125 | if __name__ == "__main__": |
126 | | - main() |
| 126 | + JSONTaskLister().run() |
0 commit comments