Changeset - 582316ae8564
[Not reviewed]
0 3 0
Brett Smith - 4 years ago 2020-06-15 18:19:10
brettcsmith@brettcsmith.org
data: Add Metadata.report_links() method.

This is just a variant of get_links() that eats TypeError.
Higher-level reporting code often wants it.
3 files changed with 40 insertions and 16 deletions:
0 comments (0 inline, 0 general)
conservancy_beancount/data.py
Show inline comments
...
 
@@ -254,2 +254,15 @@ class Metadata(MutableMapping[MetaKey, MetaValue]):
 

	
 
    def report_links(self, key: MetaKey) -> Sequence[str]:
 
        """Return a sequence of link strings under the named metadata key
 

	
 
        get_links raises a TypeError if the metadata is not a string.
 
        This method simply returns the empty sequence.
 
        Validation code (like in the plugin) usually uses get_links()
 
        while reporting code uses report_links().
 
        """
 
        try:
 
            return self.get_links(key)
 
        except TypeError:
 
            return ()
 

	
 
    @overload
conservancy_beancount/reports/core.py
Show inline comments
...
 
@@ -337,11 +337,6 @@ class RelatedPostings(Sequence[data.Posting]):
 

	
 
    def _all_meta_links(self, key: MetaKey) -> Iterator[str]:
 
        for post in self:
 
            try:
 
                yield from post.meta.get_links(key)
 
            except TypeError:
 
                pass
 

	
 
    def all_meta_links(self, key: MetaKey) -> Iterator[str]:
 
        return filters.iter_unique(self._all_meta_links(key))
 
        return filters.iter_unique(
 
            link for post in self for link in post.meta.report_links(key)
 
        )
 

	
tests/test_data_metadata.py
Show inline comments
...
 
@@ -30,2 +30,11 @@ SIMPLE_TXN_METAKEYS = frozenset(['filename', 'lineno', 'note'])
 

	
 
LINK_STRINGS = [
 
    '',
 
    'link',
 
    '  link',
 
    'link  ',
 
    'link1  link2',
 
    ' link1  link2   link3    ',
 
]
 

	
 
def test_metadata_transforms_source():
...
 
@@ -38,10 +47,3 @@ def test_metadata_transforms_source():
 

	
 
@pytest.mark.parametrize('value', [
 
    '',
 
    'link',
 
    '  link',
 
    'link  ',
 
    'link1  link2',
 
    ' link1  link2   link3    ',
 
])
 
@pytest.mark.parametrize('value', LINK_STRINGS)
 
def test_get_links(value):
...
 
@@ -60,2 +62,16 @@ def test_get_links_bad_type(value):
 

	
 
@pytest.mark.parametrize('value', LINK_STRINGS)
 
def test_report_links(value):
 
    meta = data.Metadata({'key': value})
 
    assert list(meta.report_links('key')) == value.split()
 

	
 
def test_report_links_missing():
 
    meta = data.Metadata({})
 
    assert not meta.report_links('key')
 

	
 
@pytest.mark.parametrize('value', testutil.NON_STRING_METADATA_VALUES)
 
def test_report_links_bad_type(value):
 
    meta = data.Metadata({'key': value})
 
    assert not meta.report_links('key')
 

	
 
def test_first_link_from_txn(simple_txn):
0 comments (0 inline, 0 general)