]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Implement more generic Field types
authorHenryk Plötz <henryk@ploetzli.ch>
Thu, 9 Aug 2018 22:39:58 +0000 (00:39 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Mon, 3 Dec 2018 18:34:17 +0000 (19:34 +0100)
Cleanup warnings in test

fints/formals.py
tests/test_formals.py

index f25ff799b5ef5ff41a48eb24036f8a175e5cc076..71adfc52229dab87d9a21d2a9bf00b55657df76b 100644 (file)
@@ -275,6 +275,7 @@ class DigitsField(FieldRenderFormatStringMixin, DataElementField):
 
 class FloatField(FieldRenderFormatStringMixin, DataElementField):
     type = 'float'
+    ## FIXME: Not implemented, no one uses this?
 
 class BinaryField(DataElementField):
     type = 'bin'
@@ -287,6 +288,56 @@ class BinaryField(DataElementField):
 
     def _parse_value(self, value): return bytes(value)
 
+class FixedLengthMixin:
+    FIXED_LENGTH = [None, None, None]
+
+    def __init__(self, *args, **kwargs):
+        for i, a in enumerate(('length', 'min_length', 'max_length')):
+            kwargs[a] = self.FIXED_LENGTH[i] if len(self.FIXED_LENGTH) > i else None
+
+        super().__init__(*args, **kwargs)
+
+class IDField(FixedLengthMixin, AlphanumericField):
+    type = 'id'
+    FIXED_LENGTH = [None, None, 30]
+
+class BooleanField(FixedLengthMixin, AlphanumericField):
+    type = 'jn'
+    FIXED_LENGTH = [1]
+
+    def _render_field(self, value):
+        return "J" if value else "N"
+
+    def _parse_field(self, value):
+        if value is None:
+            return None
+        if value == "J":
+            return True
+        elif value == "N":
+            return False
+        else:
+            raise ValueError("Invalid value {!r} for BooleanField".format(value))
+
+class CodeField(AlphanumericField):
+    type = 'code'
+
+    ## FIXME: Not further implemented, might want to use Enums
+
+class CountryField(FixedLengthMixin, DigitsField):
+    type = 'ctr'
+    FIXED_LENGTH = [3]
+
+class CurrencyField(FixedLengthMixin, AlphanumericField):
+    type = 'cur'
+    FIXED_LENGTH = [3]
+
+class DateField(FixedLengthMixin, NumericField):
+    type = 'dat'
+    FIXED_LENGTH = [8]
+
+class TimeField(FixedLengthMixin, DigitsField):
+    type = 'tim'
+    FIXED_LENGTH = [6]
 
 class SegmentSequence:
     def __init__(self, segments = None):
index 68590fb15b77762322223cb76a5cf3d09f777801..90b60de923c2f6276f393d7f1be66096bc90bb1b 100644 (file)
@@ -331,4 +331,5 @@ def test_container_generic():
 
     assert i1.a
 
-    i2 = A(a=[])
+    with pytest.warns(UserWarning, match=r'Generic field used for type None value \[\]'):
+        i2 = A(a=[])