From 0f9c746c06843b10681475de058e2f6e36ce45fa Mon Sep 17 00:00:00 2001 From: Sean Robertson Date: Tue, 15 Feb 2022 15:04:48 -0800 Subject: [PATCH] rewrite to be compatible with somata-http --- __init__.py | 2 ++ client.py | 33 +++++++++++++++++++++++++++++++++ service.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 __init__.py create mode 100644 client.py create mode 100644 service.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..ad16f9a --- /dev/null +++ b/__init__.py @@ -0,0 +1,2 @@ +from .service import * +from .client import * diff --git a/client.py b/client.py new file mode 100644 index 0000000..20bb857 --- /dev/null +++ b/client.py @@ -0,0 +1,33 @@ +import requests +import os + +DNS_SUFFIX = os.environ.get('SOMATA_DNS_SUFFIX') + +class Client: + def __init__(self, service, options={}): + service_url = service + if DNS_SUFFIX: + service_url += '.' + DNS_SUFFIX + + self.base_url = 'http://%s/' % service_url + + def request(self, method, *args): + method_url = self.base_url + '%s.json' % method + data = {'args': args} + request = requests.post(method_url, json=data) + response = request.json() + + if type(response) == dict: + if 'type' and 'data' in response: + if response['type'] == 'response': + return response['data'] + elif response['type'] == 'error': + raise Exception(response['data']) + else: + print('Invalid response object', response) + return None + + else: + print('Invalid response format', response) + return None + diff --git a/service.py b/service.py new file mode 100644 index 0000000..c51c8e3 --- /dev/null +++ b/service.py @@ -0,0 +1,32 @@ +from gevent import monkey; monkey.patch_all() + +from bottle import route, run, request +import os + +PORT = os.environ.get('SOMATA_PORT', 8000) + +class Service: + def __init__(self, name, methods, options={}): + @route('/.json', method='post') + def method_route(method_name): + try: + method_fn = methods[method_name] + except Exception as err: + return { + 'type': 'error', + 'data': "No such method %s" % method_name + } + try: + data = method_fn(*request.json['args']) + return { + 'type': 'response', + 'data': data + } + except Exception as err: + return { + 'type': 'error', + 'data': str(err) + } + + run(host='0.0.0.0', port=PORT, server='gevent') +