Skip to content

Commit 4d10656

Browse files
committed
Refactor code
1 parent 8eea3b3 commit 4d10656

File tree

4 files changed

+160
-124
lines changed

4 files changed

+160
-124
lines changed

integration_tests/base_routes.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ async def hello(request):
4343
global callCount
4444
callCount += 1
4545
message = "Called " + str(callCount) + " times"
46-
print(message)
47-
return jsonify(request)
46+
print(message, request)
47+
return {"status_code": "200", "body": "hello", "type": "text"}
48+
# return
4849

4950

5051
@app.before_request("/")

robyn/__init__.py

+11-122
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .processpool import spawn_process
1414
from .log_colors import Colors
1515
from .ws import WS
16+
from .router import Router, MiddlewareRouter, WebSocketRouter
1617

1718
# 3rd party imports and exports
1819
from multiprocess import Process
@@ -32,11 +33,10 @@ def __init__(self, file_object):
3233
self.dev = self.parser.is_dev()
3334
self.processes = self.parser.num_processes()
3435
self.workers = self.parser.workers()
35-
self.routes = []
36+
self.router = Router()
37+
self.middleware_router = MiddlewareRouter()
38+
self.web_socket_router = WebSocketRouter()
3639
self.headers = []
37-
self.routes = []
38-
self.middlewares = []
39-
self.web_sockets = {}
4040
self.directories = []
4141
self.event_handlers = {}
4242

@@ -51,133 +51,23 @@ def add_route(self, route_type, endpoint, handler):
5151

5252
""" We will add the status code here only
5353
"""
54-
async def async_inner_handler(*args):
55-
res = await handler(args)
56-
if type(res) == "dict":
57-
if "status_code" not in res:
58-
res["status_code"] = "200"
59-
else:
60-
response = {
61-
"status_code": "200",
62-
"body": res,
63-
"type": "text"
64-
}
65-
res = response
66-
return res
67-
68-
def inner_handler(*args):
69-
res = handler(args)
70-
if type(res) == "dict":
71-
if "status_code" not in res:
72-
res["status_code"] = 200
73-
else:
74-
response = {
75-
"status_code": 200,
76-
"body": res,
77-
"type": "text"
78-
}
79-
res = response
80-
return res
81-
82-
number_of_params = len(signature(handler).parameters)
83-
if asyncio.iscoroutinefunction(handler):
84-
self.routes.append(
85-
(
86-
route_type,
87-
endpoint,
88-
async_inner_handler,
89-
True,
90-
number_of_params,
91-
)
92-
)
93-
else:
94-
self.routes.append(
95-
(
96-
route_type,
97-
endpoint,
98-
inner_handler,
99-
False,
100-
number_of_params,
101-
)
102-
)
103-
104-
def add_middleware_route(self, route_type, endpoint, handler):
105-
"""
106-
[This is base handler for the middleware decorator]
107-
108-
:param route_type [str]: [??]
109-
:param endpoint [str]: [endpoint for the route added]
110-
:param handler [function]: [represents the sync or async function passed as a handler for the route]
111-
"""
112-
113-
""" We will add the status code here only
114-
"""
115-
number_of_params = len(signature(handler).parameters)
116-
self.middlewares.append(
117-
(
118-
route_type,
119-
endpoint,
120-
handler,
121-
asyncio.iscoroutinefunction(handler),
122-
number_of_params,
123-
)
124-
)
54+
self.router.add_route(route_type, endpoint, handler)
12555

12656
def before_request(self, endpoint):
12757
"""
12858
[The @app.before_request decorator to add a get route]
12959
13060
:param endpoint [str]: [endpoint to server the route]
13161
"""
132-
133-
# This inner function is basically a wrapper arround the closure(decorator)
134-
# being returned.
135-
# It takes in a handler and converts it in into a closure
136-
# and returns the arguments.
137-
# Arguments are returned as they could be modified by the middlewares.
138-
def inner(handler):
139-
async def async_inner_handler(*args):
140-
await handler(args)
141-
return args
142-
143-
def inner_handler(*args):
144-
handler(*args)
145-
return args
146-
147-
if asyncio.iscoroutinefunction(handler):
148-
self.add_middleware_route("BEFORE_REQUEST", endpoint, async_inner_handler)
149-
else:
150-
self.add_middleware_route("BEFORE_REQUEST", endpoint, inner_handler)
151-
152-
return inner
62+
return self.middleware_router.add_before_request(endpoint)
15363

15464
def after_request(self, endpoint):
15565
"""
15666
[The @app.after_request decorator to add a get route]
15767
15868
:param endpoint [str]: [endpoint to server the route]
15969
"""
160-
161-
# This inner function is basically a wrapper arround the closure(decorator)
162-
# being returned.
163-
# It takes in a handler and converts it in into a closure
164-
# and returns the arguments.
165-
# Arguments are returned as they could be modified by the middlewares.
166-
def inner(handler):
167-
async def async_inner_handler(*args):
168-
await handler(args)
169-
return args
170-
171-
def inner_handler(*args):
172-
handler(*args)
173-
return args
174-
175-
if asyncio.iscoroutinefunction(handler):
176-
self.add_middleware_route("AFTER_REQUEST", endpoint, async_inner_handler)
177-
else:
178-
self.add_middleware_route("AFTER_REQUEST", endpoint, inner_handler)
179-
180-
return inner
70+
return self.middleware_router.add_after_request(endpoint)
18171

18272
def add_directory(
18373
self, route, directory_path, index_file=None, show_files_listing=False
@@ -188,7 +78,7 @@ def add_header(self, key, value):
18878
self.headers.append((key, value))
18979

19080
def add_web_socket(self, endpoint, ws):
191-
self.web_sockets[endpoint] = ws
81+
self.web_socket_router.add_route(endpoint, ws)
19282

19383
def _add_event_handler(self, event_type: str, handler):
19484
print(f"Add event {event_type} handler")
@@ -213,17 +103,16 @@ def start(self, url="127.0.0.1", port=5000):
213103
if not self.dev:
214104
workers = self.workers
215105
socket = SocketHeld(url, port)
216-
print(self.middlewares)
217106
for _ in range(self.processes):
218107
copied_socket = socket.try_clone()
219108
p = Process(
220109
target=spawn_process,
221110
args=(
222111
self.directories,
223112
self.headers,
224-
self.routes,
225-
self.middlewares,
226-
self.web_sockets,
113+
self.router.get_routes(),
114+
self.middleware_router.get_routes(),
115+
self.web_socket_router.get_routes(),
227116
self.event_handlers,
228117
copied_socket,
229118
workers,

robyn/router.py

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from abc import ABC, abstractmethod
2+
from inspect import signature
3+
from asyncio import iscoroutinefunction
4+
5+
6+
class BaseRouter(ABC):
7+
@abstractmethod
8+
def add_route(*args):
9+
...
10+
11+
12+
class Router(BaseRouter):
13+
def __init__(self) -> None:
14+
super().__init__()
15+
self.routes = []
16+
17+
def _format_response(self, res):
18+
# handle file handlers
19+
response = {}
20+
if type(res) == dict:
21+
if "status_code" not in res:
22+
print("Getting here")
23+
res["status_code"] = "200"
24+
response = res
25+
else:
26+
response = {
27+
"status_code": "200",
28+
"body": res["body"],
29+
"type": "text",
30+
}
31+
print("Setting the response", response)
32+
else:
33+
response = {"status_code": "200", "body": res, "type": "text"}
34+
35+
return response
36+
37+
def add_route(self, route_type, endpoint, handler):
38+
async def async_inner_handler(*args):
39+
response = self._format_response(await handler(*args))
40+
print(f"This is the response in python: {response}")
41+
return response
42+
43+
def inner_handler(*args):
44+
response = self._format_response(handler(*args))
45+
return response
46+
47+
number_of_params = len(signature(handler).parameters)
48+
if iscoroutinefunction(handler):
49+
self.routes.append(
50+
(
51+
route_type,
52+
endpoint,
53+
async_inner_handler,
54+
True,
55+
number_of_params,
56+
)
57+
)
58+
else:
59+
self.routes.append(
60+
(
61+
route_type,
62+
endpoint,
63+
inner_handler,
64+
False,
65+
number_of_params,
66+
)
67+
)
68+
69+
self.routes.append((route_type, endpoint, handler))
70+
71+
def get_routes(self):
72+
return self.routes
73+
74+
75+
class MiddlewareRouter(BaseRouter):
76+
def __init__(self) -> None:
77+
super().__init__()
78+
self.routes = []
79+
80+
def add_route(self, route_type, endpoint, handler):
81+
number_of_params = len(signature(handler).parameters)
82+
self.routes.append(
83+
(
84+
route_type,
85+
endpoint,
86+
handler,
87+
iscoroutinefunction(handler),
88+
number_of_params,
89+
)
90+
)
91+
92+
# These inner function is basically a wrapper arround the closure(decorator)
93+
# being returned.
94+
# It takes in a handler and converts it in into a closure
95+
# and returns the arguments.
96+
# Arguments are returned as they could be modified by the middlewares.
97+
def add_after_request(self, endpoint):
98+
def inner(handler):
99+
async def async_inner_handler(*args):
100+
await handler(args)
101+
return args
102+
103+
def inner_handler(*args):
104+
handler(*args)
105+
return args
106+
107+
if iscoroutinefunction(handler):
108+
self.add_route("AFTER_REQUEST", endpoint, async_inner_handler)
109+
else:
110+
self.add_route("AFTER_REQUEST", endpoint, inner_handler)
111+
112+
return inner
113+
114+
def add_before_request(self, endpoint):
115+
def inner(handler):
116+
async def async_inner_handler(*args):
117+
await handler(args)
118+
return args
119+
120+
def inner_handler(*args):
121+
handler(*args)
122+
return args
123+
124+
if iscoroutinefunction(handler):
125+
self.add_route("BEFORE_REQUEST", endpoint, async_inner_handler)
126+
else:
127+
self.add_route("BEFORE_REQUEST", endpoint, inner_handler)
128+
129+
return inner
130+
131+
def get_routes(self):
132+
return self.routes
133+
134+
135+
class WebSocketRouter(BaseRouter):
136+
def __init__(self) -> None:
137+
super().__init__()
138+
self.routes = {}
139+
140+
def add_route(self, endpoint, web_socket):
141+
self.routes[endpoint] = web_socket
142+
143+
def get_routes(self):
144+
return self.routes

src/processor.rs

+2
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ async fn execute_http_function(
278278

279279
let output = output.await?;
280280
let res = Python::with_gil(|py| -> PyResult<HashMap<String, String>> {
281+
println!("This is the result of the code {:?}", output);
282+
281283
let res: HashMap<String, String> =
282284
output.into_ref(py).downcast::<PyDict>()?.extract()?;
283285
Ok(res)

0 commit comments

Comments
 (0)