mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 06:41:44 +01:00
pylightning: Migrate the test plugin to use the new wrapper
Should be a lot easier to see what happens :-) Signed-off-by: Christian Decker <decker.christian@gmail.com>
This commit is contained in:
parent
d88228280e
commit
643480cfd8
3 changed files with 20 additions and 104 deletions
|
@ -1,111 +1,28 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Simple plugin to show how to build new plugins for c-lightning
|
||||
|
||||
It demonstrates how a plugin communicates with c-lightning, how it
|
||||
registers command line arguments that should be passed through and how
|
||||
it can register JSON-RPC commands. We communicate with the main daemon
|
||||
through STDIN and STDOUT, reading and writing JSON-RPC requests.
|
||||
|
||||
"""
|
||||
import json
|
||||
import sys
|
||||
from lightning import Plugin
|
||||
|
||||
|
||||
greeting = "World"
|
||||
plugin = Plugin(autopatch=True)
|
||||
|
||||
|
||||
def json_hello(request, name):
|
||||
greeting = "Hello {}".format(name)
|
||||
return greeting
|
||||
@plugin.method("hello")
|
||||
def hello(name, plugin):
|
||||
"""This is the documentation string for the hello-function.
|
||||
|
||||
It gets reported as the description when registering the function
|
||||
as a method with `lightningd`.
|
||||
|
||||
def json_fail(request):
|
||||
raise ValueError("This will fail")
|
||||
|
||||
|
||||
def json_getmanifest(request):
|
||||
global greeting
|
||||
return {
|
||||
"options": [
|
||||
{"name": "greeting",
|
||||
"type": "string",
|
||||
"default": greeting,
|
||||
"description": "What name should I call you?"},
|
||||
],
|
||||
"rpcmethods": [
|
||||
{
|
||||
"name": "hello",
|
||||
"description": "Returns a personalized greeting for {name}",
|
||||
},
|
||||
{
|
||||
"name": "fail",
|
||||
"description": "Always returns a failure for testing",
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
def plugin_log(message, level="info"):
|
||||
payload = {
|
||||
"jsonrpc": "2.0",
|
||||
"method": "log",
|
||||
"params": {
|
||||
"level": level,
|
||||
"message": message,
|
||||
}
|
||||
}
|
||||
json.dump(payload, fp=sys.stdout)
|
||||
sys.stdout.write('\n\n')
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
def json_init(request, options, configuration):
|
||||
"""The main daemon is telling us the relevant cli options
|
||||
"""
|
||||
global greeting
|
||||
greeting = request['params']['options']['greeting']
|
||||
plugin_log("Plugin helloworld.py initialized with greeting \"{}\"".format(greeting), "debug")
|
||||
|
||||
return "ok"
|
||||
greeting = plugin.get_option('greeting')
|
||||
s = '{} {}'.format(greeting, name)
|
||||
plugin.log(s)
|
||||
return s
|
||||
|
||||
|
||||
methods = {
|
||||
'hello': json_hello,
|
||||
'fail': json_fail,
|
||||
'getmanifest': json_getmanifest,
|
||||
'init': json_init,
|
||||
}
|
||||
@plugin.method("init")
|
||||
def init(options, configuration, plugin):
|
||||
plugin.log("Plugin helloworld.py initialized")
|
||||
|
||||
|
||||
partial = ""
|
||||
for l in sys.stdin:
|
||||
try:
|
||||
partial += l
|
||||
request = json.loads(partial)
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
result = None
|
||||
method = methods[request['method']]
|
||||
params = request['params']
|
||||
try:
|
||||
if isinstance(params, dict):
|
||||
result = method(request, **params)
|
||||
else:
|
||||
result = method(request, *params)
|
||||
result = {
|
||||
"jsonrpc": "2.0",
|
||||
"result": result,
|
||||
"id": request['id']
|
||||
}
|
||||
except Exception:
|
||||
result = {
|
||||
"jsonrpc": "2.0",
|
||||
"error": "Error while processing {}".format(request['method']),
|
||||
"id": request['id']
|
||||
}
|
||||
|
||||
json.dump(result, fp=sys.stdout)
|
||||
sys.stdout.write('\n')
|
||||
sys.stdout.flush()
|
||||
partial = ""
|
||||
plugin.add_option('greeting', 'Hello', 'The greeting I should use.')
|
||||
plugin.run()
|
||||
|
|
|
@ -180,7 +180,6 @@ class Plugin(object):
|
|||
|
||||
def _getmanifest(self):
|
||||
methods = []
|
||||
|
||||
for name, func in self.methods.items():
|
||||
# Skip the builtin ones, they don't get reported
|
||||
if name in ['getmanifest', 'init']:
|
||||
|
|
|
@ -28,7 +28,7 @@ def test_option_passthrough(node_factory):
|
|||
|
||||
# Now try to see if it gets accepted, would fail to start if the
|
||||
# option didn't exist
|
||||
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'})
|
||||
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'})
|
||||
n.stop()
|
||||
|
||||
|
||||
|
@ -40,7 +40,7 @@ def test_rpc_passthrough(node_factory):
|
|||
|
||||
"""
|
||||
plugin_path = 'contrib/plugins/helloworld.py'
|
||||
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'})
|
||||
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'})
|
||||
|
||||
# Make sure that the 'hello' command that the helloworld.py plugin
|
||||
# has registered is available.
|
||||
|
@ -52,8 +52,8 @@ def test_rpc_passthrough(node_factory):
|
|||
assert n.daemon.is_in_log('Plugin helloworld.py initialized')
|
||||
|
||||
# Now try to call it and see what it returns:
|
||||
greet = n.rpc.hello(name='Sun')
|
||||
assert(greet == "Hello Sun")
|
||||
greet = n.rpc.hello(name='World')
|
||||
assert(greet == "Ciao World")
|
||||
with pytest.raises(RpcError):
|
||||
n.rpc.fail()
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue