From 9ce9f067061b9a144520230c004bfd173c64fe2d Mon Sep 17 00:00:00 2001
From: David Schaefer <david.schaefer@ufz.de>
Date: Mon, 21 Nov 2022 13:54:40 +0100
Subject: [PATCH] implement an abstract translatro interface

---
 saqc/core/translation/__init__.py         |  1 +
 saqc/core/translation/basescheme.py       | 27 ++++++++++++++++++-----
 saqc/core/translation/dmpscheme.py        |  4 ++--
 saqc/core/translation/positionalscheme.py |  4 ++--
 tests/core/test_translator.py             |  4 ++--
 5 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/saqc/core/translation/__init__.py b/saqc/core/translation/__init__.py
index 45aa07796..c2db9856f 100644
--- a/saqc/core/translation/__init__.py
+++ b/saqc/core/translation/__init__.py
@@ -8,6 +8,7 @@
 from saqc.core.translation.basescheme import (
     FloatScheme,
     SimpleScheme,
+    MappingScheme,
     TranslationScheme,
 )
 from saqc.core.translation.dmpscheme import DmpScheme
diff --git a/saqc/core/translation/basescheme.py b/saqc/core/translation/basescheme.py
index 1b42a8eff..511fc92d0 100644
--- a/saqc/core/translation/basescheme.py
+++ b/saqc/core/translation/basescheme.py
@@ -7,6 +7,7 @@
 # -*- coding: utf-8 -*-
 
 from __future__ import annotations
+from abc import abstractmethod
 
 from typing import Any, Dict
 
@@ -16,13 +17,27 @@ import pandas as pd
 from dios import DictOfSeries
 from saqc.constants import BAD, FILTER_ALL, GOOD, UNFLAGGED
 from saqc.core.flags import Flags
-from saqc.lib.types import ExternalFlag
+from saqc.lib.types import ExternalFlag, PandasLike
 
 ForwardMap = Dict[ExternalFlag, float]
 BackwardMap = Dict[float, ExternalFlag]
 
-
 class TranslationScheme:
+
+    @abstractmethod
+    def __call__(self, ExternalFlag) -> float:
+        pass
+
+    @abstractmethod
+    def forward(self, PandasLike) -> Flags:
+        pass
+
+    @abstractmethod
+    def backward(self, Flags) -> DictOfSeries:
+        pass
+
+
+class MappingScheme(TranslationScheme):
     """
     This class provides the basic translation mechanism and should serve as
     a base class for every other translation scheme.
@@ -81,7 +96,7 @@ class TranslationScheme:
 
     @staticmethod
     def _translate(
-        flags: Flags | pd.DataFrame | pd.Series,
+        flags: Flags | pd.DataFrame | pd.Series | DictOfSeries,
         trans_map: ForwardMap | BackwardMap,
     ) -> DictOfSeries:
         """
@@ -130,7 +145,7 @@ class TranslationScheme:
             return float(flag)
         return self._forward[flag]
 
-    def forward(self, flags: pd.DataFrame) -> Flags:
+    def forward(self, flags: pd.DataFrame | DictOfSeries | pd.Series) -> Flags:
         """
         Translate from 'external flags' to 'internal flags'
 
@@ -177,7 +192,7 @@ class TranslationScheme:
         return out
 
 
-class FloatScheme(TranslationScheme):
+class FloatScheme(MappingScheme):
 
     """
     Acts as the default Translator, provides a changeable subset of the
@@ -193,7 +208,7 @@ class FloatScheme(TranslationScheme):
         super().__init__(self._MAP, self._MAP)
 
 
-class SimpleScheme(TranslationScheme):
+class SimpleScheme(MappingScheme):
 
     """
     Acts as the default Translator, provides a changeable subset of the
diff --git a/saqc/core/translation/dmpscheme.py b/saqc/core/translation/dmpscheme.py
index f5354871f..f56762398 100644
--- a/saqc/core/translation/dmpscheme.py
+++ b/saqc/core/translation/dmpscheme.py
@@ -17,7 +17,7 @@ import pandas as pd
 from saqc.constants import BAD, DOUBTFUL, GOOD, UNFLAGGED
 from saqc.core.flags import Flags
 from saqc.core.history import History
-from saqc.core.translation.basescheme import BackwardMap, ForwardMap, TranslationScheme
+from saqc.core.translation.basescheme import BackwardMap, ForwardMap, MappingScheme
 
 _QUALITY_CAUSES = [
     "",
@@ -40,7 +40,7 @@ _QUALITY_LABELS = [
 ]
 
 
-class DmpScheme(TranslationScheme):
+class DmpScheme(MappingScheme):
 
     """
     Implements the translation from and to the flagging scheme implemented in
diff --git a/saqc/core/translation/positionalscheme.py b/saqc/core/translation/positionalscheme.py
index 1fb581d56..32ffdd09f 100644
--- a/saqc/core/translation/positionalscheme.py
+++ b/saqc/core/translation/positionalscheme.py
@@ -12,10 +12,10 @@ import pandas as pd
 
 from saqc.constants import BAD, DOUBTFUL, GOOD, UNFLAGGED
 from saqc.core.flags import Flags, History
-from saqc.core.translation.basescheme import BackwardMap, ForwardMap, TranslationScheme
+from saqc.core.translation.basescheme import BackwardMap, ForwardMap, MappingScheme
 
 
-class PositionalScheme(TranslationScheme):
+class PositionalScheme(MappingScheme):
 
     """
     Implements the translation from and to the flagging scheme implemented by CHS
diff --git a/tests/core/test_translator.py b/tests/core/test_translator.py
index 61d789e40..0a84a5f88 100644
--- a/tests/core/test_translator.py
+++ b/tests/core/test_translator.py
@@ -16,7 +16,7 @@ import pytest
 from saqc.constants import BAD, DOUBTFUL, FILTER_NONE, UNFLAGGED
 from saqc.core.core import SaQC
 from saqc.core.flags import Flags
-from saqc.core.translation import DmpScheme, PositionalScheme, TranslationScheme
+from saqc.core.translation import DmpScheme, PositionalScheme, MappingScheme
 from tests.common import initData
 
 
@@ -27,7 +27,7 @@ def _genTranslators():
             dtype(-1): BAD,
             **{dtype(f * 10): float(f) for f in range(10)},
         }
-        scheme = TranslationScheme(flags, {v: k for k, v in flags.items()})
+        scheme = MappingScheme(flags, {v: k for k, v in flags.items()})
         yield flags, scheme
 
 
-- 
GitLab