Starting to develop a Python3 based re-implementation of the ÖBB API. Implemented argument parsing, added classes for connections, stations and services, as well as dummy workers.
This commit is contained in:
commit
93707f9800
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
__pycache__
|
68
classes/__main__.py
Normal file
68
classes/__main__.py
Normal file
|
@ -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
|
87
main.py
Normal file
87
main.py
Normal file
|
@ -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 "<h1>400 Bad Request</h1>".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 "<h1>400 Bad Request</h1>".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 "<h1>400 Bad Request</h1>".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 "<h1>500 Internal Server Error</h1>".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 "<h1>400 Bad Request</h1>".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 "<h1>500 Internal Server Error</h1>".encode()
|
||||
if "debug" in args:
|
||||
yield str(e).encode()
|
||||
return
|
||||
|
||||
re("200 OK", [])
|
||||
return output.encode()
|
8
run.sh
Executable file
8
run.sh
Executable file
|
@ -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
|
2
workers/conn.py
Normal file
2
workers/conn.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
def worker(frm, to, count, time, mode):
|
||||
return "Connection."
|
2
workers/val.py
Normal file
2
workers/val.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
def worker(name):
|
||||
return "Validate."
|
Loading…
Reference in a new issue