Browse Source

Introduce testable api handler

Basti Tee 5 years ago
parent
commit
14d6f1348e
5 changed files with 34 additions and 9 deletions
  1. 2 2
      .vscode/launch.json
  2. 1 0
      Pipfile
  3. 4 6
      acme/api.py
  4. 26 0
      acme/api_handler.py
  5. 1 1
      acme/state.py

+ 2 - 2
.vscode/launch.json

@@ -28,7 +28,7 @@
             "request": "launch",
             "module": "flask",
             "env": {
-                "FLASK_APP": "acme",
+                "FLASK_APP": "acme.api",
             },
             "args": [
                 "run",
@@ -38,4 +38,4 @@
             "jinja": true
         }
     ]
-}
+}

+ 1 - 0
Pipfile

@@ -11,6 +11,7 @@ flake8 = "*"
 
 [packages]
 flask = "*"
+rx = "*"
 
 [requires]
 python_version = "3.6"

+ 4 - 6
acme/api.py

@@ -3,19 +3,17 @@
 """REST API routes."""
 
 from flask import Flask, request
-from .state import AppState
+from .api_handler import ApiHandler
 
 app = Flask(__name__)
-app_state = AppState()
+api_handler = ApiHandler()
 
 
 @app.route("/", methods=['GET'])
 def get_message():  # pylint: disable=E0211
-    return app_state.get_message() + '\n'
+    return api_handler.handle('GET', '/', request)
 
 
 @app.route("/", methods=['POST'])
 def set_message():  # pylint: disable=E0211
-    message = request.args.get('message')
-    app_state.set_message(message)
-    return app_state.get_message() + '\n'
+    return api_handler.handle('POST', '/', request)

+ 26 - 0
acme/api_handler.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+"""TODO
+curl http://localhost:5000 && curl -XPOST "http:/localhost:5000?message=$( date +%s )" && curl http://localhost:5000
+"""
+
+# from rx import Observer
+from .state import AppState
+
+
+class ApiHandler():
+    """API backend."""
+
+    def __init__(self):
+        self.app_state = AppState()
+
+    def handle(self, http_method, path, request):
+        """Dispatch incoming API requests."""
+        print(http_method, ' >>> ', path, ' >>> ', request)
+
+        if http_method is 'GET' and path is '/':
+            return self.app_state.get_message() + '\n'
+        elif http_method is 'POST' and path is '/':
+            message = request.args.get('message')
+            self.app_state.set_message(message)
+            return self.app_state.get_message() + '\n'

+ 1 - 1
acme/state.py

@@ -9,7 +9,7 @@ class AppState():
         self.message = 'Hello world!'
 
     def set_message(self, message):
-        self.message = message
+        self.message = '' if not message else message
 
     def get_message(self):
         return self.message