autogenerate-rpc-examples.py: added feature to be able to rewrite the request in Rewriter
What changed, and why it matters
This commit only changes an internal test helper script used to generate documentation examples. It adds the ability to rewrite request parameters in example snippets, similar to the existing ability to rewrite responses. There is no change to the actual Core Lightning node software, network protocol, wallet handling, or any user-facing runtime behavior. It is not a security fix and does not introduce a security issue.
No security action needed. This is a test/documentation tooling change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch modifies tests/autogenerate-rpc-examples.py. It extends the Rewriter dataclass with a new ‘requests’ field and updates rewrite_example() to apply deep updates to request params when matching an example_id. All existing Rewriter call sites are updated to pass an empty requests list, preserving prior behavior. A single blank line is also removed elsewhere in the file. The change is purely additive test infrastructure for documentation generation.
Changed components
tests/autogenerate-rpc-examples.pyInspect captured patch +17 / −1
diff --git a/tests/autogenerate-rpc-examples.py b/tests/autogenerate-rpc-examples.py
index 2e577d5a..cb8f9f07 100644
--- a/tests/autogenerate-rpc-examples.py
+++ b/tests/autogenerate-rpc-examples.py
@@ -106,6 +106,7 @@ def wait_for_wallet_txs(node, timeout=10):
class Rewriter:
section: str # e.g. "connect"
example_id: str # e.g. "example:connect#1"
+ requests: List[Mapping[str, Any]]
responses: List[Mapping[str, Any]]
@@ -144,6 +145,8 @@ def rewrite_example(all_examples: Dict[str, Any], rw: Rewriter) -> None:
if req.get("id") == rw.example_id:
for resp_patch in rw.responses:
_deep_update(resp, resp_patch)
+ for req_patch in rw.requests:
+ _deep_update(req.setdefault("params", {}), req_patch)
return
raise ValueError(f"Example with id {rw.example_id!r} not found in section {rw.section!r}")
@@ -173,6 +176,7 @@ def rewrite_examples(examples: Dict[str, Any]):
# The command_id is highly caller dependent, so clean it up.
Rewriter("askrene-listreservations",
"example:askrene-listreservations#1",
+ [],
[{"reservations": [{'command_id': 'examples.py:askrene-reserve#1/cln:askrene-reserve#2'},
{'command_id': 'examples.py:askrene-reserve#2/cln:askrene-reserve#3'},
{'command_id': 'examples.py:askrene-reserve#3/cln:askrene-reserve#4'},
@@ -180,21 +184,25 @@ def rewrite_examples(examples: Dict[str, Any]):
# The proof changes each time
Rewriter("fetchbip353",
"example:fetchbip353#1",
+ [],
[{"proof": "0473656e6404736f6d650475736572105f626974636f696e2d7061796d656e740673617473746f026d65000005000100000e10002c046d6174740475736572105f626974636f696e2d7061796d656e740b6d617474636f72616c6c6f03636f6d000473656e6404736f6d650475736572105f626974636f696e2d7061796d656e740673617473746f026d6500002e000100000e10005d00050d0600000e1068cbae9b68b92483d1730673617473746f026d6500791e02a2bcc49002f748cf633b058fabf9975dce37ae6383429819624a898a0e6c7f4931fd84ca7ba8120c00f220a9a71a799c8e91acd635a34281dc4bc33e0f046d6174740475736572105f626974636f696e2d7061796d656e740b6d617474636f72616c6c6f03636f6d000010000100000e1001ecff626974636f696e3a626331717a7477793678656e337a647474377a3076726761706d6a74667a3861636a6b6670356670376c3f6c6e6f3d6c6e6f317a7235717975677167736b726b37306b716d7571377633646e7232666e6d68756b7073396e386875743438766b7170716e736b743273767371776a616b70376b36707968746b7578773779326b716d73786c777275687a7176307a736e686839713374397868783339737563367173723037656b6d3565736479756d307736366d6e783876647175777670376470356a70376a337635637036616a3077333239666e6b7171763630713936737a356e6b726335723935716666783030327135337471646beb3878396d32746d7438356a74706d63796376666e727078336c723435683267376e6133736563377867756374667a7a636d386a6a71746a3579613237746536306a303376707430767139746d326e3979786c32686e67666e6d79676573613235733475347a6c78657771707670393478743772757234726878756e776b74686b39766c79336c6d356868307071763461796d6371656a6c6773736e6c707a776c6767796b6b616a7037796a73356a76723261676b79797063646c6a323830637934366a70796e73657a72636a326b7761326c797238787664366c666b706834787278746b327863336c7071046d6174740475736572105f626974636f696e2d7061796d656e740b6d617474636f72616c6c6f03636f6d00002e000100000e10006300100d0500000e1068ccc7d068ba3db826480b6d617474636f72616c6c6f03636f6d00f68a7e7a8f8643e433f854a733dd74db2a4ae01812ffaaed6d1243d7a665d518cf5b37c101d147329e5ba45d95fd1e8ca71e77894305e1081e7b0f442d20fdc90673617473746f026d6500002b000100000e1000245b360d022333b5ea25720720a8c54553c0641e8ccb8a917af20c694f10bf7ce3851e3f6e0673617473746f026d6500002b000100000e100024c4010d02a229c6d54c38b7bb723b48a6aceab1e7fdb6ae2a22b9b57c5ca6b942ed8ea2fe0673617473746f026d6500002e000100000e100096002b080200000e1068d1697c68b5abece2ad026d65006ed35281fc11d421c48a99a7c8b822442269ba75aa723517f93bd346c11ae9c23377a4d0ca9845a09fbed97fb3684219a197fb9bc9cbd7085fb7404c40a5d8bf6deacb0f6ab7036bf5ea979b0fd000a2da96da313b5d63bbe33efe58550af3ccccd1a107b87a6ee3e61abc92e6b87a300bcafd8f12e6c6197f3d4b82116749b0026d6500002b00010000bfd80024b12808027708c8a6d5d72b63214bbff50cb54553f7e07a1fa5e9074bd8d63c43102d8559026d6500002e00010000bfd80113002b08010001518068d0594068bf27b0b5690028415c2b258249314cf220c0631e898b98c786853de415c336421fbd0e2a4a50d64aeff8a369d0c0eb79b311b4c2732c1b902987986fe1ee230142fe2deccdc09647551f094e69a6ea8a813b0688b7cbbc846ecea7683c02ac45d0ff3cc2b6fda10233afdf963fa61c58a835684c7d708fab49efc38866675dec7787dbd8066492e2d77d70e6cd50893533ab80f2a2817a6476ad054ffad9c5dfdd68ecfece3c73eecc1fa0c2ac4c130014af201f11feef6788c8e91286a4279e06b491c55824a0718a2bf1775485c4f86ee834655e32be4a2f1b500d240008da68632c1134c21463151f5c5323944e2349536db8d822636eed2ec8fedb8c0f6692fcf066b59c000030000100005da101080101030803010001acffb409bcc939f831f7a1e5ec88f7a59255ec53040be432027390a4ce896d6f9086f3c5e177fbfe118163aaec7af1462c47945944c4e2c026be5e98bbcded25978272e1e3e079c5094d573f0e83c92f02b32d3513b1550b826929c80dd0f92cac966d17769fd5867b647c3f38029abdc48152eb8f207159ecc5d232c7c1537c79f4b7ac28ff11682f21681bf6d6aba555032bf6f9f036beb2aaa5b3778d6eebfba6bf9ea191be4ab0caea759e2f773a1f9029c73ecb8d5735b9321db085f1b8e2d8038fe2941992548cee0d67dd4547e11dd63af9c9fc1c5466fb684cf009d7197c2cf79e792ab501e6a8a1ca519af2cb9b5f6367e94c0d47502451357be1b5000030000100005da101080101030803010001af7a8deba49d995a792aefc80263e991efdbc86138a931deb2c65d5682eab5d3b03738e3dfdc89d96da64c86c0224d9ce02514d285da3068b19054e5e787b2969058e98e12566c8c808c40c0b769e1db1a24a1bd9b31e303184a31fc7bb56b85bbba8abc02cd5040a444a36d47695969849e16ad856bb58e8fac8855224400319bdab224d83fc0e66aab32ff74bfeaf0f91c454e6850a1295207bbd4cdde8f6ffb08faa9755c2e3284efa01f99393e18786cb132f1e66ebc6517318e1ce8a3b7337ebb54d035ab57d9706ecd9350d4afacd825e43c8668eece89819caf6817af62dc4fbd82f0e33f6647b2b6bda175f14607f59f4635451e6b27df282ef73d87000030000100005da101080100030803010001b11b182a464c3adc6535aa59613bda7a61cac86945c20b773095941194f4b9f516e8bd924b1e50e3fe83918b51e54529d4e5a1e45303df8462241d5e05979979ae5bf9c6c598c08a496e17f3bd3732d5aebe62667b61db1bbe178f27ac99408165a230d6aee78348e6c67789541f845b2ada96667f8dd16ae44f9e260c4a138b3bb1015965ebe609434a06464bd7d29bac47c3017e83c0f89bca1a9e3bdd0813715f3484292df589bc632e27d37efc02837cb85d770d5bd53a36edc99a8294771aa93cf22406f5506c8cf850ed85c1a475dee5c2d3700b3f5631d903524b849995c20cb407ed411f70b428ae3d642716fe239335aa961a752e67fb6dca0bf729000030000100005da101080100030803010001b6aec4b48567e2925a2d9c4fa4c96e6dddf86215a9bd8dd579c38ccb1199ed1be89946a7f72fc2633909a2792d0eed1b5afb2ee4c78d865a76d6cd9369d999c96af6be0a2274b8f2e9e0a0065bd20257570f08bc14c16f5616426881a83dbce6926e391c138a2ec317efa7349264de2e791c9b7d4a6048ee6eedf27bf1ece398ff0d229f18377cb1f6b98d1228ef217b8146c0c73851b89a6fc37c621ca187e16428a743ffea0072e185ef93e39525cee3ad01e0c94d2e511c8c313322c29ab91631e1856049a36898684c3056e5997473816fb547acb0be6e660bdfa89a5cb28b3669d8625f3f018c7b3b8a4860e774ee8261811ce7f96c461bc162c1a374f300002e000100005da10113003008000002a30068cdee8068b23f004f66001c5875f402770a5fe9251e7be7783b6d0545cb59ecad7d25cb5ce75ad583c47f809ecbe168ebfc57dee0e0eca8f6b92f32fb8cf3808c95640ae8e7fcd11b57d948b3b2749ae53b799fdd665d2b37a179401afda48534952859f22884a9cb9526e147fb867b7cd1463004a0385e9ad278aa41a9b63405d636733dc822f6a8b17d9eafc00e08717d558c6d3a3315c6c2ff3479b537290fe5ce9f1b280894951c5ec31305ebfa60260354cfc340ffe8d9b809a440ea9cdd8e4e14cbefec6c7f3967ab7776f7b1bc13589596b1f6d60176d3223126bac85abb2b55cb30a5d0615d6147a5dafb841a5b7ea1c1580b1a6b3dcf7607d12e19d2971aaf8747fdab1c42bb026d65000030000100000db900880100030803010001b36eee22bd8e610570cd88bfc3fedafa006a58b9714432aa3a6f9dd39a905c4e86aa1cdf5827119c81e1245d94ee4838ae22f05cc922ca30122aefa4da19d90a965b4317071b9331187f5cf4eb570dbd8e01987c2593a85b92e0440c635d15da13405f6ca7d78289ef0d6fe4716b8b62abd18dc07b0a9edd54182353ef836539026d65000030000100000db901080101030803010001c103be3a2aa47686ab01ba1b23799ff108d0c0530dfe35cebdd320b7abc851d1abf191378d155127e17fb029628385482b34ac3b042093d6097574b36ee277e31d20003272871bc76d1762dab33397eaae97d853932da5a96886a1b7c61bc52fcd1f1f23c7026a48fa1b190cb8b97d42b45b49948c45187efec3c7867812627a0220e5497c36ee4e92452fb5c1bda2dceaebf71c0e3909a61a5d6498dfc41c71cd0412dbbf442e43c378c9fb4043a1523cfd7ce320ce29fce606db73a8c78150b9808db8bb71898858d7a48ead8870f364b6e271ac642fe3160de3bc44b5a89ccf9e21e2ae5a877253db495f611a8a16a657f7ad9aeb906d5bc9c86f2883b5ed026d65000030000100000db900880100030803010001bfe96cdfe309deee4c579edbbfb50264719c35e25f64a525f81fe2479be4a907bfa9ce8b048ec167217690a145208507367cfec4ab4f9726cf55ecb79bf287836df0e0e946463a56e01b1a7d2e98681274f42ceb5817b1e253920b50f2e63f4be1a7c41f948a4a7235259a58eb0a9e4ccca370e2b3d363e4c289b897ffa329ab026d6500002e000100000db901160030080100000e1068d1697c68b5abecb128026d65005c91285cf473abf2c412efd0459436d9a291d1462928b3fcb8b30ea6d0d817e03dc8fe06994cfffad8ce447e08d85689e8c0966eac684716d98b4d116c08004b38bdbbec00b943f0afcf1c2b98fa4c8c36ded6823d99b61d96251b337037708ab2786ae66c48f08a70cc4d00b4dfbe44ac192c6c716470de238476913ae9574693514cf6ef3cd90b072127d42a2bf12ab871332a548a73bfd9d72479b90af179692389722fab448b23cd03ca8503a5e70857e644f8a29a4a15918a5a8cd317526b1d0ec0065b15da6a3021e6543f623887e5f099df3ddf8dd75bcaa355ed03d3e3de982359a6a93eca7def06797b12e63a0ffa6dc17e620dd13b6a0d2ac25df00673617473746f026d65000030000100000c8d00440100030dedcbe3954643072571e6c4c163cfe9ef330f5e430a3e6ca5eb76a9c97d1e3fcb9cba6a6a9ea371474b27c3d8ebb3a9ad9f1006be07d5155d669fdc7cc0db4d6a0673617473746f026d65000030000100000c8d00440101030d79bca014d652db03985a4edc2ada39c35f7daf8b86656ba6cd2df96f1da8c05f81d584aad62ee3c42ac7cbd29c5d35b9fa0b3d568a556ae9794d8cb02bae1bcb0673617473746f026d6500002e000100000c8d005d00300d0200093a8068cd0e3168ba8419c4010673617473746f026d65007a17319b99137fb51bb57a513cd9fd257130de52cc9279697e727e1e95a0301653a1ea782e2d8a43d9c69528491a2e088a184128409ed0e3078597fd3732d5a30b6d617474636f72616c6c6f03636f6d00002b0001000026610024e2f50d02f0e161567d468087ff27b051abc94476178a7cb635da1aa705e05c77ca81de520b6d617474636f72616c6c6f03636f6d00002e0001000026610057002b0d020001518068c67a0468bd2f1c504103636f6d0021c40cf90af28c2fb2fd35ce8632ed73edcf43bee374fb2b54944a9e8e845d08da67afb417d3014894ac2a92cf6a73be53d7df516a298d63447af8588ccee3e703636f6d00002b00010000506600244d060d028acbb0cd28f41250a80a491389424d341522d946b0da0c0291f2d3d771d7805a03636f6d00002e0001000050660113002b08010001518068cf865068be54c0b56900a9e8604de5bb97b53b31029218bd6dce5e68cdc0bd577fd3a3def5107e17b108679df22104a4f842ecfee4ab6ee14fbd7169b9e4fc9545dd00b21b920f41f40e8b5ece643975dd26f930acdc77e9495acd4507a7b22c02c4f048dadb3d2db607d46720ede2024be8a450ab98e2cae38a594603c73bce8617b9c0ca4f303de8d09606389530fb45ec20e9e6df775a72f1b76e47ba3c3780e1a5d7a27e77645f298efe1c397f31cc9f86151216627bc7bfbf265ac5a563805db62c5df2ede65ccf1c5c3f25054d73b5b9095238d38a39e30d9c2b0ae17d8d93ed6764d452d4a3141c0355d89f261d46e1f3a37857345e5220fadbeb10c9ed234cd03adfe55a04fc03636f6d00003000010000382100440100030df17b60fb56d522f8634153e785c0a978532ea76de39d34bb356d3d042e07f29f7b992176cc83acef7b78ea750425203b18f2b8228b3cdd2bc7eb13c3e3035a7e03636f6d00003000010000382100440101030db71f0465101ddbe2bf0c9455d12fa16c1cda44f4bf1ba2553418ad1f3aa9b06973f21b84eb532cf4035ee8d4832ca26d89306a7d32560c0cb0129d450ac1083503636f6d00002e000100003821005700300d010001518068c6cafb68b3034f4d0603636f6d0096cb2d4c67b93febc13dff1cdea2ab3d7669bc767127cb975f1d2ff4a94b9c15ca83d6ae9c93bde066d08095c2d0bffde30b4aea0a94ad9902693de313cb2b390b6d617474636f72616c6c6f03636f6d00003000010000546000440100030d27ac3c16d55694869003db8f7ee177d74690a6ca1e0d719e78fe9a6a2029bb2183205b6723ca5f4d63b6bb07c5d5a35fef5907eaa22accb0435d0151e13a01cf0b6d617474636f72616c6c6f03636f6d00003000010000546000440100030d8b1cf07c86f18c19c8c3146db093893648dcc1ab5fb79e99ccbab4aa06f98d52ac27b92e215d9da98d7535f3c2ce038fbb9d41b9c63d3845d444feffc1f71ed70b6d617474636f72616c6c6f03636f6d00003000010000546000440101030dec7c1fa1752495c42d2224eace96ed74144e9cb811608dd91594974bdc723fdc5b38a37c3340f1deca68a7ec82248822954b2994de5ac99ff6e9db95fd42c94b0b6d617474636f72616c6c6f03636f6d00002e000100005460006300300d0200093a8068cd0b5a68ba8142e2f50b6d617474636f72616c6c6f03636f6d004299251a06613ed7b0d6d65c41c2df2694730e81bc9f6d7266304cbfb6721ac4cc91ba71eb1eded7d351e996c0ffaaac566829474b5bd0d9e0a0c057928d47ef"}]),
# Getinfo is version dependent and path dependent
Rewriter("getinfo",
"example:getinfo#1",
+ [],
[{"alias": "SILENTARTIST-" + CLN_NEXT_VERSION},
{"version": os.getenv('CLN_NEXT_VERSION')},
{"lightning-dir": "/home/rusty/.lightning/regtest"}]),
# Logs are high-variance
Rewriter("getlog",
"example:getlog#1",
+ [],
[{"bytes_used": 3271748},
{"log": [{"num_skipped": 177}, {}, {"num_skipped": 4562}, {"num_skipped": 4554}, {}]}]),
# listconfigs exposes lightning-dir paths, aliases
Rewriter("listconfigs",
"example:listconfigs#3",
+ [],
[{"configs": {"lightning-dir": {"value_str": "/home/rusty/.lightning/regtest"}}},
{"configs": {"alias": {"value_str": "SILENTARTIST-" + CLN_NEXT_VERSION}}},
{"configs": {"autoclean-expiredinvoices-age": {"source": "/home/rusty/.lightning/regtest/config.setconfig:2"}}},
@@ -207,17 +215,21 @@ def rewrite_examples(examples: Dict[str, Any]):
# setconfig also exposes paths
Rewriter("setconfig",
"example:setconfig#1",
+ [],
[{"config": {"source": "/home/rusty/.lightning/regtest/config.setconfig:2"}},
{"config": {"plugin": "/usr/local/libexec/plugins/autoclean"}}]),
Rewriter("setconfig",
"example:setconfig#2",
+ [],
[{"config": {"source": "/home/rusty/.lightning/regtest/config.setconfig:3"}}]),
# listnodes' aliases are version dependent
Rewriter("listnodes",
"example:listnodes#1",
+ [],
[{"nodes": [{"alias": "HOPPINGFIRE-" + CLN_NEXT_VERSION}]}]),
Rewriter("listnodes",
"example:listnodes#2",
+ [],
[{"nodes": [{"alias": "SILENTARTIST-" + CLN_NEXT_VERSION},
{"alias": "JUNIORBEAM-" + CLN_NEXT_VERSION},
{"alias": "HOPPINGFIRE-" + CLN_NEXT_VERSION},
@@ -225,23 +237,28 @@ def rewrite_examples(examples: Dict[str, Any]):
# Ephemeral ports used when they connect to us
Rewriter("listpeers",
"example:listpeers#2",
+ [],
[{"peers": [{},
{"netaddr": ["127.0.0.1:54321"]},
{}]}]),
# FIXME: SCB backup shouldn't save port for incoming connections
Rewriter("staticbackup",
"example:staticbackup#1",
+ [],
[{"scb": canned_scbs}]),
# FIXME: Why do these vary?
Rewriter("listhtlcs",
"example:listhtlcs#1",
+ [],
[{"htlcs": [{}] * 10 + [{"updated_index": 96}] + [{}] * 8 + [{"updated_index": 170}] + [{}] * 3}]),
# FIXME: These due to l1's different channel ordering maybe?
Rewriter("listpeerchannels",
"example:listpeerchannels#1",
+ [],
[{"channels": [{"scratch_txid": "f8042b0e29badb6450d57a8065a9c05d1a86cb8cd43d775d23bd3c8e3d180bd7"}]}]),
Rewriter("listpeerchannels",
"example:listpeerchannels#2",
+ [],
[{"channels": [{"scratch_txid": "f8042b0e29badb6450d57a8065a9c05d1a86cb8cd43d775d23bd3c8e3d180bd7"}, {}, {}]}]),
]
@@ -1163,7 +1180,6 @@ def generate_channels_examples(node_factory, bitcoind, l1, l3, l4, l5, regenerat
l1.rpc.close(channel['channel_id'])
wait_for(lambda: len(bitcoind.rpc.getrawmempool()) == 4)
l1.fundwallet(10**8)
-
destinations_2 = [
{
'id': f'{l3.info["id"]}@127.0.0.1:{l3.port}',
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.