From a11a8cac3bf65f3174027c607fed840368f789ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Fri, 1 Oct 2021 18:10:20 +0200
Subject: [PATCH] ENH: add converter that checks input against enum

When importing a table using the TableImporter, it is now possible to
use the enum_converter to assure that values are part of a supplied enum.
---
 src/caosadvancedtools/table_importer.py | 13 +++++++++++++
 unittests/test_table_importer.py        | 10 ++++++++++
 2 files changed, 23 insertions(+)

diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py
index 04c8ea23..89d404de 100755
--- a/src/caosadvancedtools/table_importer.py
+++ b/src/caosadvancedtools/table_importer.py
@@ -145,6 +145,19 @@ def win_path_converter(val):
     return path.as_posix()
 
 
+def enum_converter(val, options, ignore_case=True):
+    if ignore_case:
+        val = val.lower()
+        options = [o.lower() for o in options]
+
+    if val not in options:
+        raise ValueError(
+            "Field value is '{}', but it should be one of the following "
+            "values:  {}.".format(val, ", ".join(
+                ["'{}'".format(o) for o in options])))
+
+    return val
+
 class TSVImporter(object):
     def __init__(self, converters, obligatory_columns=[], unique_columns=[]):
         raise NotImplementedError()
diff --git a/unittests/test_table_importer.py b/unittests/test_table_importer.py
index 60ca940b..a9672b83 100644
--- a/unittests/test_table_importer.py
+++ b/unittests/test_table_importer.py
@@ -33,6 +33,7 @@ from caosadvancedtools.table_importer import (XLSImporter, assure_name_format,
                                               incomplete_date_converter,
                                               win_path_converter,
                                               win_path_list_converter,
+                                              enum_converter,
                                               yes_no_converter)
 
 
@@ -49,6 +50,15 @@ class ConverterTest(unittest.TestCase):
         self.assertRaises(ValueError, yes_no_converter, "True")
         self.assertRaises(ValueError, yes_no_converter, "true")
 
+    def test_enum(self):
+        self.assertEqual("false", enum_converter("false",
+                                                 ["FALSE", "TRUE"]))
+        self.assertEqual("FALSE", enum_converter("FALSE",
+                                                 ["FALSE", "TRUE"], False))
+        self.assertRaises(ValueError, enum_converter, "FALSE", [])
+        self.assertRaises(ValueError, enum_converter, "FALSE", ["fals"])
+        self.assertRaises(ValueError, enum_converter, "FALSE", ["false"], False)
+
     def test_assure_name_format(self):
         self.assertEqual(assure_name_format("Müstermann, Max"),
                          "Müstermann, Max")
-- 
GitLab