From d3d967e961759d2fe734a9a63076b9971e9f2b36 Mon Sep 17 00:00:00 2001 From: LoveIsGrief Date: Fri, 3 Sep 2021 14:54:22 +0200 Subject: [PATCH] feat: Add script to print OpenAPI JSON This will allow generating OpenAPI clients in multiple languages without relying on manually updating the self-written client. --- freqtrade/commands/webserver_commands.py | 3 ++- freqtrade/rpc/api_server/webserver.py | 4 +++- freqtrade/rpc/rpc_manager.py | 1 + scripts/openapi.py | 19 +++++++++++++++++++ tests/rpc/test_rpc_apiserver.py | 2 ++ 5 files changed, 27 insertions(+), 2 deletions(-) create mode 100755 scripts/openapi.py diff --git a/freqtrade/commands/webserver_commands.py b/freqtrade/commands/webserver_commands.py index 9a5975227..ca4463888 100644 --- a/freqtrade/commands/webserver_commands.py +++ b/freqtrade/commands/webserver_commands.py @@ -12,4 +12,5 @@ def start_webserver(args: Dict[str, Any]) -> None: # Initialize configuration config = Configuration(args, RunMode.WEBSERVER).get_config() - ApiServer(config, standalone=True) + api_server = ApiServer(config, standalone=True) + api_server.start_api() diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 235063191..4a77abf48 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -68,8 +68,10 @@ class ApiServer(RPCHandler): default_response_class=FTJSONResponse, ) self.configure_app(self.app, self._config) + # self.start_api() - self.start_api() + def get_open_api_json(self): + return self.app.openapi() def add_rpc_handler(self, rpc: RPC): """ diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 8085ece94..55d9ce234 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -38,6 +38,7 @@ class RPCManager: logger.info('Enabling rpc.api_server') from freqtrade.rpc.api_server import ApiServer apiserver = ApiServer(config) + apiserver.start_api() apiserver.add_rpc_handler(self._rpc) self.registered_modules.append(apiserver) diff --git a/scripts/openapi.py b/scripts/openapi.py new file mode 100755 index 000000000..83075d1b5 --- /dev/null +++ b/scripts/openapi.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +import argparse +import json + +from freqtrade.rpc.api_server import ApiServer + + +def main(indent: int): + openapi_dict = ApiServer({"api_server": {}}).get_open_api_json() + print(json.dumps(openapi_dict, indent=indent), flush=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Simply outputs the OpenAPI JSON of the REST API") + parser.add_argument("-i", "--indent", type=int, default=2) + + args = parser.parse_args() + + main(args.indent) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 2852486ed..49b4527fa 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -320,6 +320,7 @@ def test_api_run(default_conf, mocker, caplog): mocker.patch('freqtrade.rpc.api_server.webserver.UvicornServer', server_mock) apiserver = ApiServer(default_conf) + apiserver.start_api() apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) assert server_mock.call_count == 1 @@ -395,6 +396,7 @@ def test_api_cleanup(default_conf, mocker, caplog): mocker.patch('freqtrade.rpc.api_server.webserver.UvicornServer', server_mock) apiserver = ApiServer(default_conf) + apiserver.start_api() apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) apiserver.cleanup()