Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 40f4cd6

Browse files
Cleanup
1 parent 3090e34 commit 40f4cd6

File tree

13 files changed

+147
-176
lines changed

13 files changed

+147
-176
lines changed

pyproject.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ Chat = "https://lemmy.today/c/bevyframe"
3131
bevyframe = "bevyframe:cmdline"
3232
bf_widget = "bevyframe.sh_widget:main"
3333

34-
[project.optional-dependencies]
35-
ios = []
36-
android = []
34+
[tool.setuptools.package-data]
35+
"bevyframe" = ["Scripts/*.js"]
3736

3837
[build-system]
3938
requires = ["setuptools","wheel"]

src/bevyframe/Features/BridgeJS.py

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,10 @@
1+
import importlib.resources
12
import os
23

34

45
def client_side_bridge() -> str:
56
# noinspection JSUnresolvedReference
6-
functions = '''
7-
const _bridge = (func, ...args) => {
8-
fetch(`${location.protocol}//${location.host}/.well-known/bevyframe/proxy`,{
9-
method:'POST',
10-
headers:{
11-
'Content-Type':'application/json',
12-
Cookie: document.cookie
13-
},
14-
body: JSON.stringify({
15-
func:func,
16-
args:args,
17-
path:window.location.pathname
18-
})
19-
})
20-
.then(res => res.json())
21-
.then(data => {
22-
if (data.error) throw new Error(data.error);
23-
else if (data.type === 'return') return data.value;
24-
else if (data.type === 'script') eval(data.value);
25-
else if (data.type === 'view') {
26-
const target = data.element === 'body' ? document.body : document.querySelector(data.element);
27-
target.innerHTML = '';
28-
if (Array.isArray(data.value))
29-
for (let element of data.value)
30-
renderWidget(element, target);
31-
else
32-
target.innerHTML = data.value;
33-
}
34-
})
35-
.catch(err => { });
36-
};
37-
'''
7+
functions = importlib.resources.files('bevyframe').joinpath('Scripts/bridge.js').read_text()
388
for i in os.listdir('./functions/'):
399
if i.endswith('.py'):
4010
i = i[:-3]

src/bevyframe/Features/Login.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import hmac
66
import json
77
import time
8-
import jwt
98
import os
109

1110

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,9 @@
1+
import importlib.resources
12
import json
23

34

45
def service_worker() -> str:
56
with open('./manifest.json') as f:
67
manifest = json.load(f)
7-
return '''
8-
const CACHE_NAME = "bevyframe-offline-pages";
9-
const OFFLINE_PAGE = "''' + manifest['app']['offlineview'] + '''";
10-
self.addEventListener("install", (event) => {
11-
event.waitUntil(caches.open(CACHE_NAME).then((cache) => { return cache.add(OFFLINE_PAGE); }));
12-
});
13-
self.addEventListener("activate", (event) => {
14-
event.waitUntil(
15-
caches.keys().then((cacheNames) => {
16-
return Promise.all( cacheNames.map((name) => { if (name !== CACHE_NAME) return caches.delete(name); }));
17-
})
18-
);
19-
});
20-
self.addEventListener("fetch", (event) => {
21-
event.respondWith(
22-
(async () => {
23-
try {
24-
const networkResponse = await fetch(event.request);
25-
if (event.request.destination === 'document') {
26-
const cache = await caches.open(CACHE_NAME);
27-
cache.put(event.request, networkResponse.clone());
28-
}
29-
return networkResponse;
30-
} catch (error) {
31-
const cache = await caches.open(CACHE_NAME);
32-
const cachedResponse = await cache.match(event.request);
33-
return cachedResponse || cache.match(OFFLINE_PAGE);
34-
}
35-
})()
36-
);
37-
});
38-
'''
8+
sw = importlib.resources.files('bevyframe').joinpath('Scripts/sw.js').read_text()
9+
return sw.replace('---offlineview---', manifest['app']['offlineview'])

src/bevyframe/Frame/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@
22
import sys
33
import os
44
from datetime import datetime
5-
65
from bevyframe.Features.Login import get_session
76
from bevyframe.Objects.Context import Context
87
from bevyframe.Objects.Response import Response
98
import requests
109
import json
11-
import time
1210
from bevyframe.Features.Style import compile_object as compile_style
1311
from bevyframe.Helpers.Identifiers import https_codes
1412
from bevyframe.Frame.error_handler import error_handler
1513
from bevyframe.Frame.route import route
1614
from bevyframe.Frame.Responser import responser
17-
from bevyframe.Frame.default_logging import default_logging
1815
from TheProtocols.theprotocols import TheProtocols
1916
from bevyframe.Frame.wsgi_runner import make_server
2017

@@ -94,7 +91,11 @@ def route(self, path: str, whitelist: list = None, blacklist: list = None) -> an
9491
def default_logging(self, func: callable) -> callable:
9592
if 'CustomLogging' in self.disabled:
9693
return lambda: func()
97-
return default_logging(self, func)
94+
self.default_logging_str = func
95+
def wrapper(r: Context, req_time: str) -> callable:
96+
return func(r, req_time)
97+
wrapper.__name__ = func.__name__
98+
return wrapper
9899

99100
@property
100101
def reverse_routes(self) -> dict[str, str]:
@@ -136,7 +137,7 @@ def __call__(self, environ: dict, start_response: callable) -> list[bytes]:
136137
recv['headers'].update({key: environ[header]})
137138
recv['credentials'] = get_session(
138139
self.secret,
139-
recv['headers'].get('Cookie', 's=').removesuffix(';').split(';').pop().split('s=')[1]
140+
recv['headers'].get('Cookie', 's=').split('s=')[1].split(';')[0]
140141
) if 's=' in recv['headers'].get('Cookie', 's=') else None
141142
r = Context(recv, self)
142143
display_status_code = True

src/bevyframe/Frame/default_logging.py

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

src/bevyframe/Frame/error_handler.py

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from bevyframe.Widgets.Page import Page
77
from bevyframe.Objects.Response import Response
88
from bevyframe.Helpers.Identifiers import *
9-
from bevyframe.Widgets.Widget import Widget
109

1110

1211
def error_handler(self, request: Context, status_code: int, exception: str) -> Response:
@@ -22,55 +21,43 @@ def error_handler(self, request: Context, status_code: int, exception: str) -> R
2221
resp.status_code = status_code
2322
return resp
2423
except:
24+
pwd = os.getcwd()
2525
exception = exception.replace('<', '&lt;').replace('>', '&gt;')
2626
t = exception.replace('\n', '<br>').split('<br> File')
2727
e_boxes = [
28-
Widget(
29-
'h1',
30-
innertext=f'{https_codes[status_code]}'
31-
)
28+
f'<h1>{https_codes[status_code]}</h1>'
3229
]
3330
if 'Debugger' not in self.disabled and self.debug:
3431
if status_code == 500:
3532
for e in t:
3633
if e.startswith('Traceback'):
37-
e_boxes.append(
38-
Widget(
39-
'div',
40-
style={'margin-bottom': '10px', 'padding-top': '10px', 'font-family': 'monospace'},
41-
innertext=e
42-
)
43-
)
34+
e_boxes.append(f'''
35+
<div style="margin-bottom: 10px; padding-top: 10px; font-family: monospace;">
36+
{e}
37+
</div>
38+
''')
4439
elif 'site-packages' in e:
45-
e_boxes.append(
46-
Widget(
47-
'div',
48-
selector='the_box',
49-
style={'margin-bottom': '10px', 'padding-top': '10px', 'font-family': 'monospace'},
50-
innertext=(
51-
'Module ' +
52-
e.split('site-packages/')[1].split('/')[0] + ', ' +
53-
'file ' +
54-
e.split('site-packages/' + e.split('site-packages/')[1].split('/')[0] + '/')[
55-
1].split('"')[0] +
56-
e.removeprefix(e.split(',')[0])
57-
)
58-
)
59-
)
60-
else:
61-
e_boxes.append(
62-
Widget(
63-
'div',
64-
selector='the_box',
65-
style={'margin-bottom': '10px', 'padding-top': '10px', 'font-family': 'monospace', 'overflow': 'hidden'},
66-
innertext=(
67-
'Path ' +
68-
e.split('"')[1].removeprefix('.').removesuffix('/__init__.py').removeprefix(
69-
os.getcwd()) +
70-
e.removeprefix(e.split('"')[0] + '"' + e.split('"')[1] + '"')
71-
)
72-
)
73-
)
40+
e_boxes.append(f'''
41+
<div
42+
class="the_box"
43+
style="margin-bottom: 10px; padding-top: 10px; font-family: monospace;" >
44+
Module
45+
{e.split('site-packages/')[1].split('/')[0]},
46+
file
47+
{e.split('site-packages/' + e.split('site-packages/')[1].split('/')[0] + '/')[1].split('"')[0]}
48+
{e.removeprefix(e.split(',')[0])}
49+
</div>
50+
''')
51+
elif '/bevyframe/' not in e.split('"')[1].removeprefix(pwd).removeprefix('/pages/'):
52+
e_boxes.append(f'''
53+
<div
54+
class="the_box"
55+
style="margin-bottom: 15px; padding: 20px; font-family: monospace; overflow: hidden" >
56+
{'Path' if e.split('"')[1].startswith(pwd + '/pages/') else 'Script'}
57+
{e.split('"')[1].removeprefix(pwd).removeprefix('/pages/').removesuffix('__init__.py')}
58+
{e.removeprefix(e.split('"')[0] + '"' + e.split('"')[1] + '",')}
59+
</div>
60+
''')
7461
else:
7562
print(exception)
7663
# noinspection PyBroadException

src/bevyframe/Objects/Activity.py

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,15 @@
11
class Activity:
2-
def __init__(self, context: list[str] | str | dict) -> None:
3-
self.properties = {}
4-
self.context = context if isinstance(context, list) else [context]
2+
def __init__(self, **kwargs) -> None:
3+
self.properties = kwargs
4+
self.context = []
55

6-
def __call__(self, **kwargs: any) -> None:
7-
for key, value in kwargs.items():
8-
self.properties.update({key: value})
9-
10-
def __setattr__(self, key: str, value: any) -> None:
11-
self.properties[key] = value
12-
13-
def __getattr__(self, key: str) -> any:
14-
if key == 'properties':
15-
return object.__getattribute__(self, 'properties')
16-
if key in self.properties:
17-
return self.properties[key]
18-
else:
19-
raise AttributeError
20-
21-
def pop(self, key: str) -> any:
22-
return self.properties.pop(key)
23-
24-
def __delattr__(self, item) -> None:
25-
self.properties.pop(item)
6+
def add_context(self, item: (str, dict)) -> None:
7+
self.context.append(item)
268

279
def remove_context(self, item: (str, dict)) -> None:
2810
self.context.remove(item)
2911

3012
def bf_widget(self) -> dict:
3113
d = {"@context": ["https://www.w3.org/ns/activitystreams"] + self.context}
3214
d.update(self.properties)
33-
return d
15+
return d

src/bevyframe/Scripts/bridge.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const _bridge = (func, ...args) => {
2+
fetch(`${location.protocol}//${location.host}/.well-known/bevyframe/proxy`,{
3+
method:'POST',
4+
headers:{
5+
'Content-Type':'application/json',
6+
Cookie: document.cookie
7+
},
8+
body: JSON.stringify({
9+
func:func,
10+
args:args,
11+
path:window.location.pathname
12+
})
13+
})
14+
.then(res => res.json())
15+
.then(data => {
16+
if (data.error)
17+
throw new Error(data.error);
18+
else if (data.type === 'return')
19+
return data.value;
20+
else if (data.type === 'script')
21+
eval(data.value);
22+
else if (data.type === 'view') {
23+
const target = data.element === 'body' ?
24+
document.body :
25+
document.querySelector(data.element);
26+
target.innerHTML = '';
27+
if (Array.isArray(data.value))
28+
for (let element of data.value)
29+
renderWidget(element, target);
30+
else
31+
target.innerHTML = data.value;
32+
}
33+
})
34+
.catch(err => { console.error(err) });
35+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const renderWidget = (data, parent = document.body) => {
2+
if (Array.isArray(data) && data.length === 3) {
3+
const [tag, attrs, children] = data;
4+
const el = document.createElement(tag);
5+
Object.entries(attrs || {}).forEach(([key, value]) => {
6+
el.setAttribute(key, value);
7+
});
8+
children.forEach(child => {
9+
if (Array.isArray(child)) {
10+
renderWidget(child, el);
11+
} else {
12+
el.appendChild(document.createTextNode(child));
13+
}
14+
});
15+
parent.appendChild(el);
16+
} else {
17+
parent.innerHTML = parent.innerHTML + data;
18+
}
19+
}
20+
21+
const renderAll = () => {
22+
document.body.innerHTML = "";
23+
for (let element of `---body---`) {
24+
renderWidget(element);
25+
}
26+
};

0 commit comments

Comments
 (0)