]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Elide empty items at the end of a ValueList with a fixed (minimum) length
authorHenryk Plötz <henryk@ploetzli.ch>
Tue, 28 Aug 2018 23:30:19 +0000 (01:30 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Mon, 3 Dec 2018 18:34:29 +0000 (19:34 +0100)
fints/types.py

index 54bd0bf1fbef08a7ffe2b73041cb83c02de9cd44..b24cfd9fbd8395e883b57312cdb7f7d0abb0b638 100644 (file)
@@ -43,18 +43,22 @@ class ValueList:
     def __delitem__(self, i):
         self.__setitem__(i, None)
 
+    def _get_minimal_true_length(self):
+        retval = 0
+        for i, val in enumerate(self._data):
+            if isinstance(val, Container):
+                if val.is_unset():
+                    continue
+            elif val is None:
+                continue
+            retval = i+1
+        return retval
+
     def __len__(self):
         if self._parent.count is not None:
             return self._parent.count
         else:
-            retval = 0
-            for i, val in enumerate(self._data):
-                if isinstance(val, Container):
-                    if val.is_unset():
-                        continue
-                elif val is None:
-                    continue
-                retval = i+1
+            retval = self._get_minimal_true_length()
             if self._parent.min_count is not None:
                 if self._parent.min_count > retval:
                     retval = self._parent.min_count
@@ -75,7 +79,12 @@ class ValueList:
             ( (prefix + level*indent) if first_level_indent else "")
             + "[{}\n".format(first_line_suffix)
         )
-        for val in self:
+        min_true_length = self._get_minimal_true_length()
+        skipped_items = 0
+        for i, val in enumerate(self):
+            if i > min_true_length:
+                skipped_items += 1
+                continue
             if print_doc:
                 docstring = self._parent._inline_doc_comment(val)
             else:
@@ -86,6 +95,8 @@ class ValueList:
                 )
             else:
                 val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, trailer=",", print_doc=print_doc, first_line_suffix=docstring)
+        if skipped_items:
+            stream.write( (prefix + (level+1)*indent) + "# {} empty items skipped\n".format(skipped_items) )
         stream.write( (prefix + level*indent) + "]{}\n".format(trailer) )
 
 class SegmentSequence: