From 93707f98003bbf64f0645233d3f16879fcf84648 Mon Sep 17 00:00:00 2001 From: Klaus-Uwe Mitterer Date: Tue, 19 Sep 2017 22:50:19 +0200 Subject: [PATCH] =?UTF-8?q?Starting=20to=20develop=20a=20Python3=20based?= =?UTF-8?q?=20re-implementation=20of=20the=20=C3=96BB=20API.=20Implemented?= =?UTF-8?q?=20argument=20parsing,=20added=20classes=20for=20connections,?= =?UTF-8?q?=20stations=20and=20services,=20as=20well=20as=20dummy=20worker?= =?UTF-8?q?s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + classes/__main__.py | 68 +++++++++++++++++++++++++++++++++++ main.py | 87 +++++++++++++++++++++++++++++++++++++++++++++ run.sh | 8 +++++ workers/conn.py | 2 ++ workers/val.py | 2 ++ 6 files changed, 168 insertions(+) create mode 100644 .gitignore create mode 100644 classes/__main__.py create mode 100644 main.py create mode 100755 run.sh create mode 100644 workers/conn.py create mode 100644 workers/val.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/classes/__main__.py b/classes/__main__.py new file mode 100644 index 0000000..a9041af --- /dev/null +++ b/classes/__main__.py @@ -0,0 +1,68 @@ +class Station: + def __init__(self, name, sttype, extid = None, xcoord = None, ycoord = None, prodclass = None): + self.name = name + self.sttype = stype + self.extid = extid + self.xcoord = xcoord + self.ycoord = ycoord + self.prodclass = prodclass + +class Service: + def __init__(self, name, svtype, depst, deptime, arrst, arrtime, deppf = None, currdep = None, arrpf = None, curarr = None, img = None, url = None): + self.name = name + self.svtype = svtype + self.depst = depst + self.deptime = deptime + self.arrst = arrst + self.arrtime = arrtime + self.deppf = deppf + self.currdep = currdep + self.arrpf = arrpf + self.curarr = curarr + self.img = img + self.url = url + +class Connection: + def __init__(self, buyurl = None, statusurl = None): + self.services = [] + self.buyurl = buyurl + self.statusurl = statusurl + + def addService(self, service): + self.services.append(service) + + def depst(self): + try: + return self.services[0].depst + except: + return None + + def arrst(self): + try: + return self.services[-1].arrst + except: + return None + + def deptime(self): + try: + return self.services[0].deptime + except: + return None + + def arrtime(self): + try: + return self.services[-1].arrtime + except: + return None + + def currdep(self): + try: + return self.services[0].currdep + except: + return None + + def currarr(self): + try: + return self.services[-1].currarr + except: + return None diff --git a/main.py b/main.py new file mode 100644 index 0000000..1fc3d11 --- /dev/null +++ b/main.py @@ -0,0 +1,87 @@ +import cgi +import datetime +import workers.conn +import workers.val + +def application(env, re): + if env["REQUEST_METHOD"] == "POST": + args = cgi.parse_qs(env['wsgi.input'].readline().decode(), True) + elif env["REQUEST_METHOD"] == "GET": + args = cgi.parse_qs(env['QUERY_STRING'], True) + else: + re("405 Method Not Allowed", []) + return + + try: + rtype = args["type"][0] + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "A request type must be provided.".encode() + return + + if rtype.lower() in ["conn", "connection"]: + try: + frm = args["from"][0] + to = args["to"][0] + + if not frm or not to: + raise ValueError() + + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "\"from\" and \"to\" values are required for this type of request.".encode() + return + + count = args["count"][0] if "count" in args and args["count"] else 3 + date = args["date"][0] if "date" in args and args["date"] else None + time = args["time"][0] if "time" in args and args["time"] else None + mode = args["mode"][0] if "mode" in args and args["mode"] else None + + try: + outtime = datetime.strptime("%s %s" % (date, time), "%d.%m.%Y %H:%M") + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "The \"date\" value must be in DD.MM.YYYY format, the \"time\" value must be in HH:MM format." + return + + try: + output = workers.conn.worker(frm, to, count, date, time, mode) + + except Exception as e: + re("500 Internal Server Error", []) + yield "

500 Internal Server Error

".encode() + if "debug" in args: + yield str(e).encode() + return + + re("200 OK", []) + return output.encode() + + elif rtype.lower() in ["val", "validate"]: + try: + name = args["name"] + + if not name: + raise ValueError() + + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "A \"name\" value is required for this type of request.".encode() + return + + try: + output = workers.val.worker(name) + + except: + re("500 Internal Server Error", []) + yield "

500 Internal Server Error

".encode() + if "debug" in args: + yield str(e).encode() + return + + re("200 OK", []) + return output.encode() diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..ab455e7 --- /dev/null +++ b/run.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +ip="0.0.0.0" +port="8803" + +workers=$((`getconf _NPROCESSORS_ONLN` * 4)) + +gunicorn -w $workers -b $ip:$port -n "OEBB API" main diff --git a/workers/conn.py b/workers/conn.py new file mode 100644 index 0000000..5764193 --- /dev/null +++ b/workers/conn.py @@ -0,0 +1,2 @@ +def worker(frm, to, count, time, mode): + return "Connection." diff --git a/workers/val.py b/workers/val.py new file mode 100644 index 0000000..f46a424 --- /dev/null +++ b/workers/val.py @@ -0,0 +1,2 @@ +def worker(name): + return "Validate."