From b6134303d467becc58136d30fc9ddf06f93fc50c Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 9 Nov 2022 14:10:57 +1030 Subject: [PATCH] pyln: add context manager to simpify filter use. Signed-off-by: Rusty Russell Changelog-Added: pyln: LightningRpc has new `reply_filter` context manager for reducing output of RPC commands. --- contrib/pyln-client/pyln/client/lightning.py | 19 +++++++++++++++++++ contrib/pyln-testing/pyln/testing/utils.py | 3 ++- tests/test_misc.py | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/contrib/pyln-client/pyln/client/lightning.py b/contrib/pyln-client/pyln/client/lightning.py index 1f1c917c9..4a4d2e8d9 100644 --- a/contrib/pyln-client/pyln/client/lightning.py +++ b/contrib/pyln-client/pyln/client/lightning.py @@ -285,6 +285,7 @@ class UnixDomainSocketRpc(object): self.executor = executor self.logger = logger self._notify = None + self._filter = None if caller_name is None: self.caller_name = os.path.splitext(os.path.basename(sys.argv[0]))[0] else: @@ -379,6 +380,8 @@ class UnixDomainSocketRpc(object): "id": this_id, } + if filter is None: + filter = self._filter if filter is not None: request["filter"] = filter @@ -438,6 +441,22 @@ class UnixDomainSocketRpc(object): yield self._notify = old + @contextmanager + def reply_filter(self, filter): + """Filter the fields returned from am RPC call (or more than one).. + + This is a context manager and should be used like this: + + ```python + with rpc.reply_filter({"transactions": [{"outputs": [{"amount_msat": true, "type": true}]}]}): + rpc.listtransactions() + ``` + """ + old = self._filter + self._filter = filter + yield + self._filter = old + class LightningRpc(UnixDomainSocketRpc): """ diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index 61d773aea..50b1c9d84 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -705,7 +705,8 @@ class PrettyPrintingLightningRpc(LightningRpc): "result": res }, indent=2)) - if schemas and schemas[1] and not filter: + # FIXME: if filter set, just remove "required" from schemas? + if schemas and schemas[1] and filter is None and self._filter is None: schemas[1].validate(res) return res diff --git a/tests/test_misc.py b/tests/test_misc.py index e4f227f6c..062a6280f 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -2823,6 +2823,11 @@ def test_field_filter(node_factory, chainparams): dec = l1.rpc.call('decodepay', {'bolt11': inv['bolt11']}, filter={"currency": True}) assert dec == {"currency": chainparams['bip173_prefix']} + # Use context manager: + with l1.rpc.reply_filter({"currency": True}): + dec = l1.rpc.decodepay(bolt11=inv['bolt11']) + assert dec == {"currency": chainparams['bip173_prefix']} + # Two fields dec = l1.rpc.call('decodepay', {'bolt11': inv['bolt11']}, filter={"currency": True, "payment_hash": True}) assert dec == {"currency": chainparams['bip173_prefix'],