diff --git a/piker/brokers/cli.py b/piker/brokers/cli.py index e212831a..492edb96 100644 --- a/piker/brokers/cli.py +++ b/piker/brokers/cli.py @@ -1,24 +1,26 @@ """ Console interface to broker client/daemons. """ -import importlib -from pprint import pformat +import json +from functools import partial +from importlib import import_module + import click import trio -from ..log import get_console_log + +from ..log import get_console_log, colorize_json -def run(loglevel, main): +def run(main, loglevel='info'): log = get_console_log(loglevel) - # main loop + # main sandwich try: - client = trio.run(main) + return trio.run(main) except Exception as err: log.exception(err) - else: - log.debug( - f"Exiting with last access info:\n{pformat(client.access_data)}\n") + finally: + log.debug("Exiting pikerd") @click.command() @@ -26,5 +28,34 @@ def run(loglevel, main): @click.option('--loglevel', '-l', default='info', help='Logging level') def pikerd(broker, loglevel): # import broker module daemon entry point - brokermod = importlib.import_module('.' + broker, 'piker.brokers') - run(loglevel, brokermod.serve_forever) + brokermod = import_module('.' + broker, 'piker.brokers') + run(brokermod.serve_forever, loglevel) + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.option('--broker', default='questrade', help='Broker backend to use') +@click.option('--loglevel', '-l', default='warning', help='Logging level') +@click.argument('meth', nargs=1) +@click.argument('kwargs', nargs=-1, required=True) +def api(meth, kwargs, loglevel, broker): + """Client for testing broker API methods with pretty printing of output. + """ + log = get_console_log(loglevel) + brokermod = import_module('.' + broker, 'piker.brokers') + + _kwargs = {} + for kwarg in kwargs: + if '=' not in kwarg: + log.error(f"kwarg `{kwarg}` must be of form =") + else: + key, _, value = kwarg.partition('=') + _kwargs[key] = value + + data = run(partial(brokermod.api, meth, **_kwargs), loglevel=loglevel) + if data: + click.echo(colorize_json(data))