diff --git a/src/controller/base.py b/src/controller/base.py index b036a39..bbbd735 100644 --- a/src/controller/base.py +++ b/src/controller/base.py @@ -1,17 +1,24 @@ from __future__ import annotations import os -from typing import Optional +from typing import Optional, Union +import pandas as pd from PyQt5.QtCore import QThread class BaseMediator: - def __init__(self, monitor: BaseDirectoryMonitor): + def __init__(self, + monitor: BaseDirectoryMonitor, + converter: BaseDataConverter): self._monitor = monitor self._monitor.mediator = self + self._converter = converter + self._converter.mediator = self - def notify(self, files: list[str]): + def notify(self, + source: Union[BaseDirectoryMonitor, BaseDataConverter], + data: Union[list[str], list[pd.DataFrame]]): ... @@ -51,3 +58,19 @@ class BaseDirectoryMonitor(QThread): def _init_state(self): files = os.listdir(self._directory_path) self._files = files + + +class BaseDataConverter: + def __init__(self, mediator: Optional[BaseMediator] = None): + self._mediator = mediator + + @property + def mediator(self) -> BaseMediator: + return self._mediator + + @mediator.setter + def mediator(self, mediator: BaseMediator) -> None: + self._mediator = mediator + + def convert_data(self, files: list[str]) -> None: + ... diff --git a/src/controller/converter.py b/src/controller/converter.py new file mode 100644 index 0000000..2dde68e --- /dev/null +++ b/src/controller/converter.py @@ -0,0 +1,20 @@ +import pandas as pd + +#FIXME: костыль для выключения предупреждения "replace deprecated". Потом надо поправить. +pd.set_option('future.no_silent_downcasting', True) + +from controller.base import BaseDataConverter + + +class DataConverter(BaseDataConverter): + + @staticmethod + def _replace_bool(dataframe: pd.DataFrame) -> pd.DataFrame: + bool_columns = dataframe.columns[dataframe.isin([True, False]).any()] + dataframe[bool_columns] = dataframe[bool_columns].replace({True: 1, False: 0}) + return dataframe + + def convert_data(self, files: list[str]) -> None: + dataframes = [pd.read_csv(file) for file in files] + converted_dataframes = list(map(self._replace_bool, dataframes)) + self._mediator.notify(self, converted_dataframes) diff --git a/src/controller/mediator.py b/src/controller/mediator.py index 90061fe..4c48415 100644 --- a/src/controller/mediator.py +++ b/src/controller/mediator.py @@ -1,13 +1,19 @@ -from controller.base import BaseMediator +import pandas as pd +from typing import Union from loguru import logger +from controller.base import BaseMediator, BaseDirectoryMonitor, BaseDataConverter + class Mediator(BaseMediator): - def notify(self, files: list[str]): - for file in files: - # TODO: create dataframe - # TODO: create plot widget - # TODO: send plot widget to controller - logger.info(f"File handled: {file}") + def notify(self, + source: Union[BaseDirectoryMonitor, BaseDataConverter], + data: Union[list[str], list[pd.DataFrame]]): + if issubclass(source.__class__, BaseDirectoryMonitor): + self._converter.convert_data(data) + + if issubclass(source.__class__, BaseDataConverter): + # TODO: отправить датафреймы в конструктор графиков + logger.info(data) diff --git a/src/controller/monitor.py b/src/controller/monitor.py index e1d210b..f4fef70 100644 --- a/src/controller/monitor.py +++ b/src/controller/monitor.py @@ -14,10 +14,11 @@ class DirectoryMonitor(BaseDirectoryMonitor): while True: files = os.listdir(self._directory_path) - new_files = sorted(list(filter(lambda x: x not in self._files, files))) + new_files = sorted(list(map(lambda x: os.path.join(self._directory_path, x), + filter(lambda x: x not in self._files, files)))) if new_files: logger.info(f"New files detected: {new_files}") - self._mediator.notify(new_files) + self._mediator.notify(self, new_files) self._files = files if not files: self._files = [] diff --git a/src/main.py b/src/main.py index 2e946c4..2b2e18c 100644 --- a/src/main.py +++ b/src/main.py @@ -7,6 +7,7 @@ from gui.mainGui import MainWindow from cfg.schema import ConfigSchema from controller.monitor import DirectoryMonitor from controller.mediator import Mediator +from controller.converter import DataConverter def read_json(filepath: str) -> dict: @@ -22,7 +23,8 @@ def main(): app = QtWidgets.QApplication(sys.argv) config = ConfigSchema(**read_json("config/config.json")) monitor = DirectoryMonitor(config.trace_storage_path, config.monitor_update_period) - mediator = Mediator(monitor) + data_converter = DataConverter() + mediator = Mediator(monitor, data_converter) monitor.start() window = MainWindow()