summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>2020-11-29 14:45:48 +0100
committersternenseemann <git@lukasepple.de>2020-11-29 15:17:07 +0100
commit81b466cd24fee1a555527a3aebe465d9882abf22 (patch)
treef28dba1c1376472620bc6e929f760e70666a45aa
parentcac3ad5fb54f94a804397810fb2a2c5fbc7ffdfd (diff)
feat(clients): add python client library for REST API
-rw-r--r--clients/py/flipdot_gschichtler/__init__.py63
-rw-r--r--clients/py/setup.py9
-rw-r--r--nix/python-flipdot-gschichtler.nix24
3 files changed, 96 insertions, 0 deletions
diff --git a/clients/py/flipdot_gschichtler/__init__.py b/clients/py/flipdot_gschichtler/__init__.py
new file mode 100644
index 0000000..b78663f
--- /dev/null
+++ b/clients/py/flipdot_gschichtler/__init__.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+import requests
+
+class FlipdotGschichtlerError(Exception):
+    """Error from the REST API"""
+    def __init__(self, endpoint, status, message):
+        self.endpoint = endpoint
+        self.status = status
+        self.message = message
+
+class FlipdotGschichtlerClient():
+    def __init__(self, base_url, api_token = None):
+        self.base_url = base_url
+        self.api_token = api_token
+
+    def __get_error_message(self, r):
+        try:
+            return r.json()['error']
+        except KeyError:
+            return 'no message given'
+        except ValueError:
+            return 'no json response'
+
+    def add(self, text):
+        endpoint = '/api/v2/queue/add'
+        r = requests.post(self.base_url + endpoint, data = { 'text' : text })
+
+        if r.status_code == 200:
+            return r.json()['id']
+        else:
+            message = self.__get_error_message(r)
+            raise FlipdotGschichtlerError(endpoint, r.status_code, message)
+
+    def delete(self, queue_id):
+        if self.api_token is None:
+            raise Exception('missing api token')
+
+        endpoint = '/api/v2/queue/' + str(queue_id)
+        r = requests.delete(self.base_url + endpoint, data = { 'token': self.api_token })
+
+        if r.status_code != 204:
+            message = self.__get_error_message(r)
+            raise FlipdotGschichtlerError(endpoint, r.status_code, message)
+
+    def queue(self):
+        endpoint = '/api/v2/queue'
+        r = requests.get(self.base_url + endpoint)
+
+        if r.status_code == 200:
+            return r.json()['queue']
+        else:
+            message = self.__get_error_message(r)
+            raise FlipdotGschichtlerClient(endpoint, r.status_code, message)
+
+    def queue_length(self):
+        endpoint = '/api/v2/queue'
+        r = requests.get(self.base_url + endpoint)
+
+        if r.status_code == 200:
+            return r.json()['length']
+        else:
+            message = self.__get_error_message(r)
+            raise FlipdotGschichtlerClient(endpoint, r.status_code, message)
diff --git a/clients/py/setup.py b/clients/py/setup.py
new file mode 100644
index 0000000..70711ec
--- /dev/null
+++ b/clients/py/setup.py
@@ -0,0 +1,9 @@
+from setuptools import setup
+
+setup(
+    name = 'flipdot-gschichtler',
+    version = '2.0.0',
+    packages = [ 'flipdot_gschichtler' ],
+    install_requires = [ 'requests>=2.24.0' ],
+    python_requires = '>=3.5'
+)
diff --git a/nix/python-flipdot-gschichtler.nix b/nix/python-flipdot-gschichtler.nix
new file mode 100644
index 0000000..a85598d
--- /dev/null
+++ b/nix/python-flipdot-gschichtler.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, requests
+, rootSrc
+}:
+
+buildPythonPackage rec {
+  pname = "flipdot-gschichtler";
+  version = import ./version.nix;
+
+  src = rootSrc + "/clients/py";
+
+  doCheck = false;
+
+  postPatch = ''
+    sed -i "s/version = '.*'/version = '${version}'/" setup.py
+  '';
+
+  propagatedBuildInputs = [ requests ];
+
+  pythonImportsCheck = [ "flipdot_gschichtler" ];
+
+  meta = {
+    description = "Python client for the flipdot-gschichtler API";
+  };
+}