From: Henryk Plötz Date: Tue, 7 Aug 2018 23:56:47 +0000 (+0200) Subject: Shorten output by suppressing unset and optional fields X-Git-Tag: v2.0.0~1^2~154 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88ab2f0e959460cd8c0a04adc550557c41bc3f7c;p=thirdparty%2Fpython-fints.git Shorten output by suppressing unset and optional fields --- diff --git a/fints/formals.py b/fints/formals.py index 5568023..5afac16 100644 --- a/fints/formals.py +++ b/fints/formals.py @@ -333,13 +333,37 @@ class Container(metaclass=ContainerMeta): setattr(retval, name, value) return retval + def is_unset(self): + for name in self._fields.keys(): + val = getattr(self, name) + if isinstance(val, Container): + if not val.is_unset(): + return False + elif val is not None: + return False + return True + + @property + def _repr_items(self): + for name, field in self._fields.items(): + val = getattr(self, name) + if not field.required: + if isinstance(val, Container): + if val.is_unset(): + continue + elif val is None: + continue + yield (name, val) + + if self._additional_data: + yield ("_additional_data", self._additional_data) + def __repr__(self): - return "{}{}({})".format( - "{}.".format(self.__class__.__module__), + return "{}.{}({})".format( + self.__class__.__module__, self.__class__.__name__, ", ".join( - "{}={!r}".format(name, getattr(self, name)) - for name in list(self._fields.keys())+( ['_additional_data'] if self._additional_data else [] ) + "{}={!r}".format(name, val) for (name, val) in self._repr_items ) ) @@ -351,7 +375,7 @@ class Container(metaclass=ContainerMeta): ( (prefix + level*indent) if first_level_indent else "") + "{}.{}(".format(self.__class__.__module__, self.__class__.__name__) + "\n" ) - for name, field in self._fields.items(): + for name, value in self._repr_items: val = getattr(self, name) if not hasattr( getattr(val, 'print_nested', None), '__call__'): stream.write( @@ -362,11 +386,6 @@ class Container(metaclass=ContainerMeta): (prefix + (level+1)*indent) + "{} = ".format(name) ) val.print_nested(stream=stream, level=level+2, indent=indent, prefix=prefix, first_level_indent=False, trailer=",") - if self._additional_data: - stream.write( - (prefix + (level+1)*indent) + "_additional_data=\n" + - (prefix + (level+2)*indent) + "{!r},\n".format(self._additional_data) - ) stream.write( (prefix + level*indent) + "){}\n".format(trailer) ) class ShortReprMixin: @@ -375,9 +394,8 @@ class ShortReprMixin: "{}.".format(self.__class__.__module__), self.__class__.__name__, ", ".join( - [ "{!r}".format(getattr(self, name)) - for name in list(self._fields.keys())] + - ( ['_additional_data={!r}'.format(self._additional_data)] if self._additional_data else [] ) + ("{!r}".format(value) if not name.startswith("_") else "{}={!r}".format(name, value)) + for (name, value) in self._repr_items ) ) diff --git a/tests/test_formals.py b/tests/test_formals.py index 3afa712..42b1539 100644 --- a/tests/test_formals.py +++ b/tests/test_formals.py @@ -277,6 +277,21 @@ def test_parse_restrictions(): with pytest.raises(ValueError, match='min_length=2 not reached'): A(a=1) +def test_unset(): + class A(Container): + a = NumericField() + + class B(Container): + b = ContainerField(type=A) + c = NumericField() + + assert A().is_unset() + assert not A(a=1).is_unset() + assert A(a=None).is_unset() + + assert B().is_unset() + assert B(b=A()).is_unset() + assert not B(c=1).is_unset() def test_sequence_repr(): s = SegmentSequence() @@ -286,4 +301,4 @@ def test_sequence_repr(): def test_segmentheader_short(): h = SegmentHeader('HNHBS', 5, 1) - assert repr(h) == "fints.formals.SegmentHeader('HNHBS', 5, 1, None)" + assert repr(h) == "fints.formals.SegmentHeader('HNHBS', 5, 1)"