diff --git a/.gitignore b/.gitignore index 5a82abd..8a793ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,16 @@ -astra.db +# databases +*.db + +# pycache __pycache__ + +# mypy +.mypy_cache + +# pytest +.pytest_cache + +# pyinstaller +*.spec +dist/ +build/ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 98d1eaf..ba3183e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ PyYAML~=6.0.1 SQLAlchemy~=2.0.23 h5py~=3.10.0 pandas~=2.1.3 -pytest -matplotlib~=3.8.2 \ No newline at end of file +pytest~=7.4.3 +matplotlib~=3.8.2 diff --git a/src/astra/__pycache__/__init__.cpython-310.pyc b/src/astra/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9a01c54..0000000 Binary files a/src/astra/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/src/astra/__pycache__/__init__.cpython-311.pyc b/src/astra/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index eaeda75..0000000 Binary files a/src/astra/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/src/astra/__pycache__/__init__.cpython-312.pyc b/src/astra/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a9fcf52..0000000 Binary files a/src/astra/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/__init__.cpython-310.pyc b/src/astra/data/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index b381f0c..0000000 Binary files a/src/astra/data/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/__init__.cpython-311.pyc b/src/astra/data/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 370ce88..0000000 Binary files a/src/astra/data/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/__init__.cpython-312.pyc b/src/astra/data/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index dc5d11f..0000000 Binary files a/src/astra/data/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/alarms.cpython-312.pyc b/src/astra/data/__pycache__/alarms.cpython-312.pyc deleted file mode 100644 index 186982e..0000000 Binary files a/src/astra/data/__pycache__/alarms.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/config_manager.cpython-310.pyc b/src/astra/data/__pycache__/config_manager.cpython-310.pyc deleted file mode 100644 index d5056b1..0000000 Binary files a/src/astra/data/__pycache__/config_manager.cpython-310.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/config_manager.cpython-312.pyc b/src/astra/data/__pycache__/config_manager.cpython-312.pyc deleted file mode 100644 index 0bc6a79..0000000 Binary files a/src/astra/data/__pycache__/config_manager.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/data_manager.cpython-311.pyc b/src/astra/data/__pycache__/data_manager.cpython-311.pyc deleted file mode 100644 index 785711b..0000000 Binary files a/src/astra/data/__pycache__/data_manager.cpython-311.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/data_manager.cpython-312.pyc b/src/astra/data/__pycache__/data_manager.cpython-312.pyc deleted file mode 100644 index 0dcd396..0000000 Binary files a/src/astra/data/__pycache__/data_manager.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/dict_parsing.cpython-312.pyc b/src/astra/data/__pycache__/dict_parsing.cpython-312.pyc deleted file mode 100644 index c1693a7..0000000 Binary files a/src/astra/data/__pycache__/dict_parsing.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/parameters.cpython-312.pyc b/src/astra/data/__pycache__/parameters.cpython-312.pyc deleted file mode 100644 index db4adcd..0000000 Binary files a/src/astra/data/__pycache__/parameters.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/telemetry_data.cpython-312.pyc b/src/astra/data/__pycache__/telemetry_data.cpython-312.pyc deleted file mode 100644 index e8dbc95..0000000 Binary files a/src/astra/data/__pycache__/telemetry_data.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/__pycache__/telemetry_manager.cpython-312.pyc b/src/astra/data/__pycache__/telemetry_manager.cpython-312.pyc deleted file mode 100644 index 4f796a1..0000000 Binary files a/src/astra/data/__pycache__/telemetry_manager.cpython-312.pyc and /dev/null differ diff --git a/src/astra/data/alarm_container.py b/src/astra/data/alarm_container.py index a2f08f4..4c3e5b2 100644 --- a/src/astra/data/alarm_container.py +++ b/src/astra/data/alarm_container.py @@ -1,3 +1,5 @@ +"""This module provides classes for storing and working with alarms.""" + from datetime import timedelta from queue import Queue from threading import Lock, Timer @@ -5,18 +7,20 @@ from astra.data.alarms import AlarmPriority, Alarm, AlarmCriticality -NEW_QUEUE_KEY = 'n' - class AlarmObserver: """ Observes the state of the global alarms container and notifies interested parties whenever an update occurs - :param watchers: A list of functions to call on any update to the alarm container - :param mutex: Synchronization tool as many threads may notify watchers of updates + :param: watchers: A list of functions to call on any update to the alarm container + :type: list[Callable] + + :param: mutex: Synchronization tool as many threads may notify watchers of updates + :type: Lock """ - watchers = [] + + watchers: list[Callable] = [] _mutex = Lock() @classmethod @@ -43,17 +47,28 @@ class AlarmsContainer: A container for a global alarms dict that utilizes locking for multithreading :param alarms: The actual dictionary of alarms held + :type: dict[str, list[Alarm]] + :param mutex: A lock used for mutating cls.alarms + :type: Lock + :param observer: An Observer to monitor the state of the container + :type: AlarmObserver """ + observer = AlarmObserver() - alarms = {AlarmPriority.WARNING.name: [], AlarmPriority.LOW.name: [], - AlarmPriority.MEDIUM.name: [], AlarmPriority.HIGH.name: [], - AlarmPriority.CRITICAL.name: [], NEW_QUEUE_KEY: Queue()} + alarms: dict[str, list[Alarm]] = { + AlarmPriority.WARNING.name: [], + AlarmPriority.LOW.name: [], + AlarmPriority.MEDIUM.name: [], + AlarmPriority.HIGH.name: [], + AlarmPriority.CRITICAL.name: [], + } + new_alarms: Queue[Alarm] = Queue() mutex = Lock() @classmethod - def get_alarms(cls) -> dict[str, list[Alarm] | Queue]: + def get_alarms(cls) -> dict[str, list[Alarm]]: """ Returns a shallow copy of @@ -63,16 +78,16 @@ def get_alarms(cls) -> dict[str, list[Alarm] | Queue]: return cls.alarms.copy() @classmethod - def add_alarms(cls, alarms: list[Alarm], - apm: Mapping[timedelta, Mapping[AlarmCriticality, AlarmPriority]]) -> None: + def add_alarms( + cls, alarms: list[Alarm], apm: Mapping[timedelta, Mapping[AlarmCriticality, AlarmPriority]] + ) -> None: """ Updates the alarms global variable after acquiring the lock for it - :param dm: Holds information of data criticality and priority :param apm: Maps information on alarms to correct priority level :param alarms: The set of alarms to add to """ - new_alarms = [] + new_alarms: list[tuple[Alarm, AlarmCriticality]] = [] times = [0, 5, 15, 30] timer_vals = [] alarms.sort(reverse=True) @@ -82,8 +97,8 @@ def add_alarms(cls, alarms: list[Alarm], with cls.mutex: for alarm in alarms: criticality = alarm.criticality - alarm_timer_vals = [] - cls.alarms[NEW_QUEUE_KEY].put(alarm) + alarm_timer_vals: list[timedelta] = [] + cls.new_alarms.put(alarm) # Find the closest timeframe from 0, 5, 15, and 30 minutes from when the # alarm was created to when it was actually confirmed @@ -100,9 +115,9 @@ def add_alarms(cls, alarms: list[Alarm], if alarm.event.creation_time < endpoint_time and not alarm_timer_vals: priority_name = apm[timedelta(minutes=times[i - 1])][criticality] priority = AlarmPriority(priority_name) - cls.alarms[priority].append(alarm) + cls.alarms[priority.name].append(alarm) alarm.priority = priority - new_alarms.append([alarm, priority]) + new_alarms.append((alarm, priority)) remaining_time = endpoint_time - alarm.event.creation_time alarm_timer_vals.append(remaining_time) @@ -112,7 +127,7 @@ def add_alarms(cls, alarms: list[Alarm], priority = apm[timedelta(minutes=30)][criticality] alarm.priority = priority cls.alarms[priority.name].append(alarm) - new_alarms.append([alarm, priority]) + new_alarms.append((alarm, priority)) timer_vals.append(alarm_timer_vals) # Now that the state of the alarms container has been update, notify watchers @@ -120,7 +135,9 @@ def add_alarms(cls, alarms: list[Alarm], # Now, we need to create a timer thread for each alarm for i in range(len(new_alarms)): - alarm = new_alarms[i] + alarm_data: Alarm = new_alarms[i][0] + alarm_crit: AlarmCriticality = new_alarms[i][1] + associated_times = timer_vals[i] for associated_time in associated_times: @@ -128,30 +145,37 @@ def add_alarms(cls, alarms: list[Alarm], # the index well later use into it time_interval = len(times) - len(associated_times) + i - new_timer = Timer(associated_time.seconds, cls._update_priority, - args=[alarm, timedelta(minutes=times[time_interval]), apm]) + new_timer = Timer( + associated_time.seconds, + cls._update_priority, + args=[alarm_data, alarm_crit, timedelta(minutes=times[time_interval]), apm], + ) new_timer.start() @classmethod - def _update_priority(cls, alarm_data: list[Alarm, AlarmPriority], time: timedelta, - apm: Mapping[timedelta, Mapping[AlarmCriticality, AlarmPriority]]) -> None: + def _update_priority( + cls, + alarm: Alarm, + alarm_crit: AlarmCriticality, + time: timedelta, + apm: Mapping[timedelta, Mapping[AlarmCriticality, AlarmPriority]], + ) -> None: """ Uses the alarm priority matrix with