data: PostingMeta.detached() can be chain-called.

This commit is contained in:
Brett Smith 2020-10-26 14:52:41 -04:00
parent f7883ac314
commit 2b23eba549
2 changed files with 21 additions and 1 deletions

View file

@ -567,7 +567,7 @@ class PostingMeta(Metadata):
that may want to "split" and manipulate the metadata multiple times.
"""
retval = type(self)(self.txn, self.index, self.post)
retval.meta = retval.meta.new_child()
retval.meta = self.meta.new_child()
return retval

View file

@ -144,6 +144,26 @@ def test_mutable_copy():
assert all(post.meta is None for post in txn.postings)
assert meta.date == txn.date
def test_double_detached():
txn = testutil.Transaction(filename='f', lineno=140, postings=[
('Income:Donations', -19),
])
meta1 = data.PostingMeta(txn, 0).detached()
meta1['metakey'] = 'meta'
meta1['layerkey'] = 'one'
meta2 = meta1.detached()
meta2['layerkey'] = 'two'
expected = {
'filename': 'f',
'lineno': 140,
'metakey': 'meta',
'layerkey': 'two',
}
assert dict(meta2) == expected
expected['layerkey'] = 'one'
assert dict(meta1) == expected
assert not any(post.meta for post in txn.postings)
# The .get() tests are arguably testing the stdlib, but they're short and
# they confirm that we're using the stdlib as we intend.
def test_get_with_meta_value(simple_txn):