From 032f3282798f2c7120cc28ffe137191838a87452 Mon Sep 17 00:00:00 2001 From: Théo de la Hogue Date: Thu, 18 Jan 2024 20:41:09 +0100 Subject: Renaming File into FileWriter. --- src/argaze.test/DataLog/File.py | 37 ------------- src/argaze.test/DataLog/FileWriter.py | 37 +++++++++++++ src/argaze/ArFeatures.py | 6 +-- src/argaze/DataFeatures.py | 10 ++-- src/argaze/DataLog/File.py | 60 ---------------------- src/argaze/DataLog/FileWriter.py | 60 ++++++++++++++++++++++ src/argaze/DataLog/__init__.py | 2 +- .../utils/demo_data/demo_gaze_analysis_setup.json | 4 +- 8 files changed, 108 insertions(+), 108 deletions(-) delete mode 100644 src/argaze.test/DataLog/File.py create mode 100644 src/argaze.test/DataLog/FileWriter.py delete mode 100644 src/argaze/DataLog/File.py create mode 100644 src/argaze/DataLog/FileWriter.py (limited to 'src') diff --git a/src/argaze.test/DataLog/File.py b/src/argaze.test/DataLog/File.py deleted file mode 100644 index 2d66ea6..0000000 --- a/src/argaze.test/DataLog/File.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -""" """ - -__author__ = "Théo de la Hogue" -__credits__ = [] -__copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" -__license__ = "BSD" - -import unittest -import os - -from argaze import DataFeatures -from argaze.DataLog import File -from argaze.utils import UtilsFeatures - -DataFeaturesTest = UtilsFeatures.importFromTestPackage('DataFeatures') - -class TestTimeStampedDataLogger(unittest.TestCase): - """Test DataLogger class.""" - - def test_creation(self): - """Test logger creation.""" - - file_logger = File.TimeStampedDataLogger(path='./_export/logs/data.txt', separator=',') - - # Check file creation - self.assertEqual(os.path.exists('./_export/logs/data.txt'), True) - - # Write into file - file_logger.emit(0, 'A') - file_logger.emit(1, 'B') - file_logger.emit(2, 'C') - -if __name__ == '__main__': - - unittest.main() \ No newline at end of file diff --git a/src/argaze.test/DataLog/FileWriter.py b/src/argaze.test/DataLog/FileWriter.py new file mode 100644 index 0000000..648385c --- /dev/null +++ b/src/argaze.test/DataLog/FileWriter.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +""" """ + +__author__ = "Théo de la Hogue" +__credits__ = [] +__copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" +__license__ = "BSD" + +import unittest +import os + +from argaze import DataFeatures +from argaze.DataLog import FileWriter +from argaze.utils import UtilsFeatures + +DataFeaturesTest = UtilsFeatures.importFromTestPackage('DataFeatures') + +class TestTimeStampedDataLogger(unittest.TestCase): + """Test DataLogger class.""" + + def test_creation(self): + """Test logger creation.""" + + file_writer = FileWriter.TimeStampedDataLogger(path='./_export/logs/data.txt', separator=',') + + # Check file creation + self.assertEqual(os.path.exists('./_export/logs/data.txt'), True) + + # Write into file + file_writer.emit(0, 'A') + file_writer.emit(1, 'B') + file_writer.emit(2, 'C') + +if __name__ == '__main__': + + unittest.main() \ No newline at end of file diff --git a/src/argaze/ArFeatures.py b/src/argaze/ArFeatures.py index 7e7545e..67f60ab 100644 --- a/src/argaze/ArFeatures.py +++ b/src/argaze/ArFeatures.py @@ -464,7 +464,7 @@ class ArLayer(DataFeatures.SharedObject): # Log look data for logger_module_path, logger in self.loggers.items(): - logger(timestamp, DataFeatures.DataDictionary(look_data)) + logger.emit(timestamp, DataFeatures.DataDictionary(look_data)) # Unlock layer exploitation self.release() @@ -867,7 +867,7 @@ class ArFrame(DataFeatures.SharedObject): # Assess pipeline execution times execution_times = { 'gaze_movement_identifier': None, - 'scan_path_analyzers':{}, + 'scan_path_analyzers': DataFeatures.DataDictionary({}), 'heatmap': None } @@ -987,7 +987,7 @@ class ArFrame(DataFeatures.SharedObject): # Log look data for logger_module_path, logger in self.loggers.items(): - logger(timestamp, look_data) + logger.emit(timestamp, look_data) # Unlock frame exploitation self.release() diff --git a/src/argaze/DataFeatures.py b/src/argaze/DataFeatures.py index d58cecf..03776fd 100644 --- a/src/argaze/DataFeatures.py +++ b/src/argaze/DataFeatures.py @@ -460,16 +460,16 @@ class TimeStampedDataLogger(): logger_module = importlib.import_module(logger_module_path) return logger_module.TimeStampedDataLogger(**logger_parameters) - def __call__(self, timestamp: TimeStampType, data: DataDictionary) -> Any: - """Apply selector code to decide if data have to be logged, then apply formatter code before to call specific logger emit method.""" + def emit(self, timestamp: TimeStampType, data: DataDictionary) -> Any: + """Apply selector code to decide if data have to be logged, then apply formatter code before to call specific logger handle method.""" data['timestamp'] = timestamp if eval(self.selector, globals(), data): - self.emit(eval(self.formatter, globals(), data)) + self.handle(eval(self.formatter, globals(), data)) - def emit(self, formatted_log: any): - """Emit formatted log to a destination.""" + def handle(self, formatted_log: any): + """Handle formatted log emission to destination.""" raise NotImplementedError('handle() method not implemented') diff --git a/src/argaze/DataLog/File.py b/src/argaze/DataLog/File.py deleted file mode 100644 index 8179f8f..0000000 --- a/src/argaze/DataLog/File.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python - -"""Module for file logging. -""" - -__author__ = "Théo de la Hogue" -__credits__ = [] -__copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" -__license__ = "BSD" - -from typing import TypeVar, Tuple -from dataclasses import dataclass, field -import os, pathlib - -from argaze import DataFeatures - -@dataclass -class TimeStampedDataLogger(DataFeatures.TimeStampedDataLogger): - """Implementation of file logger.""" - - path: str = field(default=None) - """File path where to write data.""" - - header: str = field(default=None) - """String to write first.""" - - separator: str = field(default=", ") - """String used to separate list or tuple formatted log.""" - - def __post_init__(self): - """Check that folder structure exist and create file.""" - - self.path = pathlib.Path(self.path) - - if not os.path.exists(self.path.parent.absolute()): - os.makedirs(self.path.parent.absolute()) - - # Open file - self._file = open(self.path, 'w', encoding='utf-8', buffering=1) - - # Write header if required - if self.header is not None: - - print(self.header, file=self._file, flush=True) - - def __del__(self): - """Close file.""" - - self._file.close() - - def emit(self, formatted_log: any): - """Write log as a new line into file. List or tuple are converted into strings separated by separator char.""" - - # Format list or tuple element into quoted strings - if not isinstance(formatted_log, str): - - formatted_log = self.separator.join(f'\"{d}\"' for d in formatted_log) - - # Write into file - print(formatted_log, file=self._file, flush=True) \ No newline at end of file diff --git a/src/argaze/DataLog/FileWriter.py b/src/argaze/DataLog/FileWriter.py new file mode 100644 index 0000000..9b9fc5f --- /dev/null +++ b/src/argaze/DataLog/FileWriter.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +"""Module for file logging. +""" + +__author__ = "Théo de la Hogue" +__credits__ = [] +__copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" +__license__ = "BSD" + +from typing import TypeVar, Tuple +from dataclasses import dataclass, field +import os, pathlib + +from argaze import DataFeatures + +@dataclass +class TimeStampedDataLogger(DataFeatures.TimeStampedDataLogger): + """Implementation of file logger.""" + + path: str = field(default=None) + """File path where to write data.""" + + header: str = field(default=None) + """String to write first.""" + + separator: str = field(default=", ") + """String used to separate list or tuple formatted log.""" + + def __post_init__(self): + """Check that folder structure exist and create file.""" + + self.path = pathlib.Path(self.path) + + if not os.path.exists(self.path.parent.absolute()): + os.makedirs(self.path.parent.absolute()) + + # Open file + self._file = open(self.path, 'w', encoding='utf-8', buffering=1) + + # Write header if required + if self.header is not None: + + print(self.header, file=self._file, flush=True) + + def __del__(self): + """Close file.""" + + self._file.close() + + def handle(self, formatted_log: any): + """Write log as a new line into file. List or tuple are converted into strings separated by separator char.""" + + # Format list or tuple element into quoted strings + if not isinstance(formatted_log, str): + + formatted_log = self.separator.join(f'\"{d}\"' for d in formatted_log) + + # Write into file + print(formatted_log, file=self._file, flush=True) \ No newline at end of file diff --git a/src/argaze/DataLog/__init__.py b/src/argaze/DataLog/__init__.py index 3f5a36f..febd648 100644 --- a/src/argaze/DataLog/__init__.py +++ b/src/argaze/DataLog/__init__.py @@ -1,4 +1,4 @@ """ Various data logger handler. """ -__all__ = ['File'] \ No newline at end of file +__all__ = ['FileWriter'] \ No newline at end of file diff --git a/src/argaze/utils/demo_data/demo_gaze_analysis_setup.json b/src/argaze/utils/demo_data/demo_gaze_analysis_setup.json index 008727e..cfe5fc2 100644 --- a/src/argaze/utils/demo_data/demo_gaze_analysis_setup.json +++ b/src/argaze/utils/demo_data/demo_gaze_analysis_setup.json @@ -48,7 +48,7 @@ "Entropy":{} }, "loggers": { - "File" : { + "FileWriter" : { "path": "_export/logs/KCoefficientModified.csv", "header": "Timestamp (ms), K", "selector": "'argaze.GazeAnalysis.KCoefficient' in aoi_scan_path_analysis", @@ -58,7 +58,7 @@ } }, "loggers": { - "File" : { + "FileWriter" : { "path": "_export/logs/Fixations.csv", "header": "Timestamp (ms), Focus (px), Duration (ms), AOI", "selector": "GazeFeatures.is_fixation(gaze_movement) and gaze_movement.finished", -- cgit v1.1