Changeset - 0045d8d03205
[Not reviewed]
0 2 0
Brett Smith - 4 years ago 2021-01-09 15:09:08
brettcsmith@brettcsmith.org
fields: Add FormField.add_kid() method.
2 files changed with 14 insertions and 0 deletions:
0 comments (0 inline, 0 general)
conservancy_beancount/pdfforms/fields.py
Show inline comments
...
 
@@ -118,32 +118,38 @@ class FormField:
 
            raise PDFSpecError("field does not specify a field type") from None
 
        try:
 
            return FieldType[source.name]
 
        except (AttributeError, KeyError):
 
            raise PDFSpecError(f"field has invalid field type {source!r}") from None
 

	
 
    def kids(self) -> Iterator['FormField']:
 
        for source in self._get_value('Kids', ()):
 
            yield self.by_type(resolve1(source))
 

	
 
    def parent(self) -> Optional['FormField']:
 
        try:
 
            return self.by_type(self._get_value('Parent'))
 
        except KeyError:
 
            return None
 

	
 
    def add_kid(self, kid: 'FormField') -> None:
 
        if kid.parent() is not None:
 
            raise ValueError("given kid field already has a parent")
 
        kid._source['Parent'] = self._source
 
        self._source.setdefault('Kids', []).append(kid._source)
 

	
 
    def is_terminal(self) -> bool:
 
        return not self._get_value('Kids', None)
 

	
 
    def flags(self) -> int:
 
        return self._get_value('Ff', 0)  # type:ignore[no-any-return]
 

	
 
    def is_readonly(self) -> bool:
 
        return bool(self.flags() & FieldFlags.ReadOnly)
 

	
 
    def name(self) -> str:
 
        return pdfutils.decode_text(self._get_value('T', b''))
 

	
 
    def value(self) -> Any:
 
        return self._get_value('V', None)  # type:ignore[no-any-return]
 

	
 
    def set_value(self, value: Any) -> None:
tests/test_pdfforms_fields.py
Show inline comments
...
 
@@ -355,16 +355,24 @@ def test_recursive_as_mapping():
 
    root_field = fieldsmod.FormField(source)
 
    actual = root_field.as_mapping()
 
    for expected_key in [
 
            'root',
 
            'root.texts',
 
            'root.texts.tx1',
 
            'root.texts.tx2',
 
            'root.buttons',
 
            'root.buttons.btn1',
 
            'root.buttons.btn2',
 
    ]:
 
        key, field = next(actual)
 
        assert key == expected_key
 
        _, _, expected_name = expected_key.rpartition('.')
 
        assert field.name() == expected_name
 
    assert next(actual, None) is None
 

	
 
def test_add_kid():
 
    parent = fieldsmod.FormField(field_source('parent'))
 
    kid = fieldsmod.FormField(field_source('kid'))
 
    parent.add_kid(kid)
 
    actual, = parent.kids()
 
    assert actual.name() == 'kid'
 
    assert actual.parent().name() == 'parent'
0 comments (0 inline, 0 general)