Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit 81c48aa

Browse files
authored
Merge pull request #2 from martinRenou/rename_package
Rename Python module to requests
2 parents 7141500 + 5f3381e commit 81c48aa

File tree

8 files changed

+191
-175
lines changed

8 files changed

+191
-175
lines changed

requests/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .api import * # noqa
2+
from .models import * # noqa
3+
from .sessions import * # noqa

requests/api.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import time
2+
3+
from .models import Response
4+
from .utils import js, new_js_object, js_null
5+
6+
7+
def request(method, url, headers=None, auth=None, data=None, params=None):
8+
# setup xml request
9+
xmlr = new_js_object(js.XMLHttpRequest)
10+
11+
# url object
12+
url = new_js_object(js.URL, url)
13+
14+
# params
15+
if params is not None:
16+
for k, v in params.items():
17+
url.searchParams.set(k, v)
18+
19+
# basic auth
20+
if auth is not None:
21+
xmlr.open(method, url, False, auth[0], auth[1])
22+
xmlr.setRequestHeader(
23+
"Authorization", "Basic " + js.btoa(f"{auth[0]}:{auth[1]}")
24+
)
25+
xmlr.withCredentials = True
26+
else:
27+
xmlr.open(method, url, False)
28+
29+
# headers
30+
if headers is None:
31+
headers = dict()
32+
for k, v in headers.items():
33+
xmlr.setRequestHeader(k, v)
34+
35+
# this allows for easy js-to-py
36+
xmlr.responseType = "arraybuffer"
37+
38+
# send xml request and time it
39+
t0 = time.time()
40+
if data is None:
41+
xmlr.send(js_null())
42+
else:
43+
request.send("")
44+
elapsed = time.time() - t0
45+
46+
# build and return response object
47+
return Response(xmlr, elapsed)
48+
49+
50+
get = lambda url, **kwargs: request(method="GET", url=url, **kwargs)
51+
put = lambda url, **kwargs: request(method="PUT", url=url, **kwargs)
52+
post = lambda url, **kwargs: request(method="POST", url=url, **kwargs)
53+
update = lambda url, **kwargs: request(method="UPDATE", url=url, **kwargs)
54+
delete = lambda url, **kwargs: request(method="DELETE", url=url, **kwargs)
55+
56+
__all__ = ["get", "put", "post", "update", "delete", "request"]

requests/models.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import json
2+
3+
from .utils import js_to_py, parse_get_all_response_headers
4+
5+
6+
class Response(object):
7+
def __init__(self, request, elapsed):
8+
self._request = request
9+
self._request_response = js_to_py(request.response)
10+
self.content = self._request_response.tobytes()
11+
self.encoding = "UTF-8"
12+
self.elapsed = elapsed
13+
self.status_code = self._request.status
14+
self.url = self._request.responseURL
15+
16+
def __bool__(self):
17+
return self.status_code <= 400
18+
19+
def close(self):
20+
pass
21+
22+
@property
23+
def headers(self):
24+
return parse_get_all_response_headers(self._request)
25+
26+
@property
27+
def text(self):
28+
return self.content.decode(self.encoding)
29+
30+
def json(self):
31+
return json.loads(self.content.decode(self.encoding))
32+
33+
def raise_for_status(self):
34+
if self.status_code > 400:
35+
raise RuntimeError(f"status code = {self.status_code}. thats bad")

requests/sessions.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from .api import request
2+
3+
4+
class Session(object):
5+
def __init__(self):
6+
self.auth = None
7+
self.headers = dict()
8+
9+
def request(self, method, url, headers=None, auth=None, data=None, params=None):
10+
# handle headers
11+
if headers is None:
12+
headers = dict()
13+
headers = {**self.headers, **headers}
14+
15+
# handle auth
16+
if auth is None:
17+
auth = self.auth
18+
19+
return request(
20+
method=method, url=url, auth=auth, data=data, params=params, headers=headers
21+
)
22+
23+
def get(self, url, **kwargs):
24+
return self.request(method="GET", url=url, **kwargs)
25+
26+
def put(self, url, **kwargs):
27+
return self.request(method="PUT", url=url, **kwargs)
28+
29+
def post(self, url, **kwargs):
30+
return self.request(method="POST", url=url, **kwargs)
31+
32+
def update(self, url, **kwargs):
33+
return self.request(method="UPDATE", url=url, **kwargs)
34+
35+
def delete(self, url, **kwargs):
36+
return self.request(method="DELETE", url=url, **kwargs)

requests/utils.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import sys
2+
3+
if "pyodide" not in sys.modules:
4+
import pyjs
5+
6+
js = pyjs.js
7+
use_pyjs = True
8+
else:
9+
import js
10+
11+
use_pyjs = False
12+
13+
14+
def js_to_py(js_object):
15+
if use_pyjs:
16+
return pyjs.to_py(js_object)
17+
else:
18+
return js_object.to_py()
19+
20+
21+
def new_js_object(js_object, *args):
22+
23+
if use_pyjs:
24+
return pyjs.new(js_object, *args)
25+
else:
26+
return js_object.new(*args)
27+
28+
29+
def js_null():
30+
if use_pyjs:
31+
return pyjs.js_null()
32+
else:
33+
return None
34+
35+
36+
def parse_get_all_response_headers(request):
37+
body = r"""
38+
var allResponseHeaders = request.getAllResponseHeaders()
39+
var arr = allResponseHeaders.split("\r\n");
40+
var headers = {};
41+
allResponseHeaders
42+
.trim()
43+
.split(/[\r\n]+/)
44+
.map(value => value.split(/: /))
45+
.forEach(keyValue => {
46+
headers[keyValue[0].trim()] = keyValue[1].trim();
47+
});
48+
return headers
49+
"""
50+
headers = js.Function("request", body)(request)
51+
return js_to_py(headers)
52+
53+
54+
__all__ = [
55+
"js",
56+
"js_to_py",
57+
"new_js_object",
58+
"js_null",
59+
"parse_get_all_response_headers",
60+
]

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ name = wasm_requests
33
version = 0.1.5
44

55
[options]
6-
packages = wasm_requests
6+
packages = requests
77
install_requires =

wasm_requests/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

wasm_requests/wasm_requests.py

Lines changed: 0 additions & 173 deletions
This file was deleted.

0 commit comments

Comments
 (0)