omserv 0.0.0.dev315__py3-none-any.whl → 0.0.0.dev317__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omserv/apps/__init__.py +44 -0
- omserv/apps/routes.py +73 -8
- omserv/server/__init__.py +11 -2
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/METADATA +2 -2
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/RECORD +9 -9
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/WHEEL +1 -1
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/entry_points.txt +0 -0
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/licenses/LICENSE +0 -0
- {omserv-0.0.0.dev315.dist-info → omserv-0.0.0.dev317.dist-info}/top_level.txt +0 -0
omserv/apps/__init__.py
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
from .base import ( # noqa
|
2
|
+
SCOPE,
|
3
|
+
|
4
|
+
BaseServerUrl,
|
5
|
+
BASE_SERVER_URL,
|
6
|
+
|
7
|
+
url_for,
|
8
|
+
)
|
9
|
+
|
10
|
+
from .markers import ( # noqa
|
11
|
+
AppMarker,
|
12
|
+
|
13
|
+
append_app_marker,
|
14
|
+
get_app_markers,
|
15
|
+
|
16
|
+
AppMarkerProcessor,
|
17
|
+
NopAppMarkerProcessor,
|
18
|
+
|
19
|
+
AppMarkerProcessorMap,
|
20
|
+
)
|
21
|
+
|
22
|
+
from .routes import ( # noqa
|
23
|
+
KnownMethod,
|
24
|
+
KNOWN_METHODS,
|
25
|
+
|
26
|
+
Route,
|
27
|
+
RouteHandler,
|
28
|
+
|
29
|
+
handles,
|
30
|
+
HANDLES_APP_MARKER_PROCESSORS,
|
31
|
+
|
32
|
+
RouteHandlerHolder,
|
33
|
+
get_marked_route_handlers,
|
34
|
+
|
35
|
+
DuplicateRouteError,
|
36
|
+
build_route_handler_map,
|
37
|
+
|
38
|
+
RouteHandlerApp,
|
39
|
+
)
|
40
|
+
|
41
|
+
from .sessions import ( # noqa
|
42
|
+
SESSION,
|
43
|
+
with_session,
|
44
|
+
)
|
omserv/apps/routes.py
CHANGED
@@ -24,6 +24,28 @@ from .markers import append_app_marker
|
|
24
24
|
from .markers import get_app_markers
|
25
25
|
|
26
26
|
|
27
|
+
CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
|
28
|
+
|
29
|
+
|
30
|
+
KnownMethod: ta.TypeAlias = ta.Literal[
|
31
|
+
'DELETE',
|
32
|
+
'GET',
|
33
|
+
'HEAD',
|
34
|
+
'PATCH',
|
35
|
+
'POST',
|
36
|
+
'PUT',
|
37
|
+
]
|
38
|
+
|
39
|
+
KNOWN_METHODS: tuple[str, ...] = (
|
40
|
+
'DELETE',
|
41
|
+
'GET',
|
42
|
+
'HEAD',
|
43
|
+
'PATCH',
|
44
|
+
'POST',
|
45
|
+
'PUT',
|
46
|
+
)
|
47
|
+
|
48
|
+
|
27
49
|
PatOrStr: ta.TypeAlias = re.Pattern | str
|
28
50
|
|
29
51
|
|
@@ -33,14 +55,37 @@ log = logging.getLogger(__name__)
|
|
33
55
|
##
|
34
56
|
|
35
57
|
|
36
|
-
|
58
|
+
@dc.dataclass(frozen=True)
|
59
|
+
class Route(lang.Final):
|
37
60
|
method: str
|
38
61
|
path: PatOrStr
|
39
62
|
|
63
|
+
def __post_init__(self) -> None:
|
64
|
+
check.non_empty_str(self.method)
|
65
|
+
check.equal(self.method, self.method.upper())
|
66
|
+
if isinstance(self.path, str):
|
67
|
+
check.arg(self.path.startswith('/'))
|
68
|
+
else:
|
69
|
+
check.isinstance(self.path, re.Pattern)
|
70
|
+
|
71
|
+
#
|
72
|
+
|
73
|
+
@classmethod
|
74
|
+
def delete(cls, path: PatOrStr) -> 'Route':
|
75
|
+
return cls('DELETE', path)
|
76
|
+
|
40
77
|
@classmethod
|
41
78
|
def get(cls, path: PatOrStr) -> 'Route':
|
42
79
|
return cls('GET', path)
|
43
80
|
|
81
|
+
@classmethod
|
82
|
+
def head(cls, path: PatOrStr) -> 'Route':
|
83
|
+
return cls('HEAD', path)
|
84
|
+
|
85
|
+
@classmethod
|
86
|
+
def patch(cls, path: PatOrStr) -> 'Route':
|
87
|
+
return cls('PATCH', path)
|
88
|
+
|
44
89
|
@classmethod
|
45
90
|
def post(cls, path: PatOrStr) -> 'Route':
|
46
91
|
return cls('POST', path)
|
@@ -49,27 +94,44 @@ class Route(ta.NamedTuple):
|
|
49
94
|
def put(cls, path: PatOrStr) -> 'Route':
|
50
95
|
return cls('PUT', path)
|
51
96
|
|
52
|
-
@classmethod
|
53
|
-
def delete(cls, path: PatOrStr) -> 'Route':
|
54
|
-
return cls('DELETE', path)
|
55
|
-
|
56
97
|
|
57
98
|
class RouteHandler(ta.NamedTuple):
|
58
99
|
route: Route
|
59
100
|
handler: asgi.App
|
60
101
|
|
61
102
|
|
103
|
+
##
|
104
|
+
|
105
|
+
|
62
106
|
@dc.dataclass(frozen=True)
|
63
107
|
class _HandlesAppMarker(AppMarker, lang.Final):
|
64
108
|
routes: ta.Sequence[Route]
|
65
109
|
|
66
110
|
|
67
|
-
|
111
|
+
@ta.overload
|
112
|
+
def handles(method: KnownMethod, path: PatOrStr) -> ta.Callable[[CallableT], CallableT]:
|
113
|
+
...
|
114
|
+
|
115
|
+
|
116
|
+
@ta.overload
|
117
|
+
def handles(*routes: Route) -> ta.Callable[[CallableT], CallableT]:
|
118
|
+
...
|
119
|
+
|
120
|
+
|
121
|
+
def handles(*args):
|
122
|
+
routes: list[Route]
|
123
|
+
if any(isinstance(a, Route) for a in args):
|
124
|
+
routes = [check.isinstance(a, Route) for a in args]
|
125
|
+
elif args:
|
126
|
+
method, path = args
|
127
|
+
routes = [Route(check.in_(method, KNOWN_METHODS), path)]
|
128
|
+
else:
|
129
|
+
routes = []
|
130
|
+
|
68
131
|
def inner(fn):
|
69
132
|
append_app_marker(fn, _HandlesAppMarker(routes))
|
70
133
|
return fn
|
71
134
|
|
72
|
-
routes = tuple(map(check.of_isinstance(Route), routes))
|
73
135
|
return inner
|
74
136
|
|
75
137
|
|
@@ -107,6 +169,9 @@ def get_marked_route_handlers(h: RouteHandlerHolder) -> ta.Sequence[RouteHandler
|
|
107
169
|
return ret
|
108
170
|
|
109
171
|
|
172
|
+
##
|
173
|
+
|
174
|
+
|
110
175
|
@dc.dataclass()
|
111
176
|
class DuplicateRouteError(Exception):
|
112
177
|
route_handlers: ta.Sequence[RouteHandler]
|
@@ -179,7 +244,7 @@ class RouteHandlerApp(asgi.App_):
|
|
179
244
|
pat_apps = [
|
180
245
|
a
|
181
246
|
for r, a in pat_rts
|
182
|
-
if check.isinstance(r, re.Pattern).fullmatch(path)
|
247
|
+
if check.isinstance(r.path, re.Pattern).fullmatch(path)
|
183
248
|
]
|
184
249
|
if pat_apps:
|
185
250
|
return check.single(pat_apps)
|
omserv/server/__init__.py
CHANGED
@@ -14,5 +14,14 @@ See:
|
|
14
14
|
- https://github.com/encode/starlette
|
15
15
|
- https://github.com/tiangolo/fastapi
|
16
16
|
"""
|
17
|
-
from .config import
|
18
|
-
|
17
|
+
from .config import ( # noqa
|
18
|
+
Config,
|
19
|
+
)
|
20
|
+
|
21
|
+
from .default import ( # noqa
|
22
|
+
serve,
|
23
|
+
)
|
24
|
+
|
25
|
+
from .types import ( # noqa
|
26
|
+
AsgiWrapper,
|
27
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omserv
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev317
|
4
4
|
Summary: omserv
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omlish==0.0.0.dev317
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: h11~=0.16; extra == "all"
|
18
18
|
Requires-Dist: h2~=4.2; extra == "all"
|
@@ -1,11 +1,11 @@
|
|
1
1
|
omserv/.manifests.json,sha256=qn9Vc6VXiVo9RzpJdLzQi_x2DPZIP3cq4S2bkqvJqjY,260
|
2
2
|
omserv/__about__.py,sha256=uf--5HCe4fnc_IJQyQO03TUR2jiyuzOGu3s9UnbidhM,765
|
3
3
|
omserv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
omserv/apps/__init__.py,sha256=
|
4
|
+
omserv/apps/__init__.py,sha256=buRI0lsNdbR08TjRKLhGsFHWETS2Br_mb6mm-8u9FII,617
|
5
5
|
omserv/apps/base.py,sha256=HYsWbDot7zOnsdSL8dF_ANrNXEYgWIGzlnBdCU7n8v8,376
|
6
6
|
omserv/apps/inject.py,sha256=GxM-TT3Ln8YrYBedJF__wY-zs4G3ow7RlxT2afr0FDs,2416
|
7
7
|
omserv/apps/markers.py,sha256=JE_px0vsJqoDIDRFu9xtXsKjtxYAshUsFB0aRsoeIcg,965
|
8
|
-
omserv/apps/routes.py,sha256=
|
8
|
+
omserv/apps/routes.py,sha256=dYhLtfN8jWJNWDz4t3cOJd0DDAQuTFG3FTmFP8QEUw0,7412
|
9
9
|
omserv/apps/sessions.py,sha256=4HFHra43S0TaM2OcWUZ06eQwAqEaXuhjK5X5jlI0_44,1423
|
10
10
|
omserv/apps/templates.py,sha256=PBRZHIF9UbnFnq-4EC6RmPeRkeH8lCBbpJkSdseHs6A,2125
|
11
11
|
omserv/nginx/__init__.py,sha256=2d63LCGFA2qS7gdl2nCvNPmQWXNICu19wZIihQJPHCs,48
|
@@ -19,7 +19,7 @@ omserv/nodes/models.py,sha256=EOaq-aW1rbGOzHTmTULhbVwV5j_burL07qh2QO9smdM,1273
|
|
19
19
|
omserv/nodes/registry.py,sha256=y67VMowll9IuLiTVgauAcbP8-evFJNqpwocwwt7kZL4,3478
|
20
20
|
omserv/nodes/sql.py,sha256=vy7RP50JiH3jQHMVa7Hxk0pFJK3QcbGeTvyNppB1W4I,2826
|
21
21
|
omserv/server/LICENSE,sha256=VKPNmbyrS9wcwcx20hBlVtLP01brb2dByHrWHeNLPag,1050
|
22
|
-
omserv/server/__init__.py,sha256=
|
22
|
+
omserv/server/__init__.py,sha256=YnPjrvhQAAqyNSv_hMJOID7JaP1CXXE7c7rSrsBEJtU,440
|
23
23
|
omserv/server/config.py,sha256=oGWL1kuk45bJ6sVr8n3ow5Q-1nz9EqByjoykU2iOHIY,1189
|
24
24
|
omserv/server/debug.py,sha256=N7RI0Jj-ttmys3DJD0RREmGG5XZpTCp6y9Yu0x98Agg,299
|
25
25
|
omserv/server/default.py,sha256=hmfy--Q35QFMU8oTf4uHwVM2qBFG8mQDR9Wik2f1yZk,970
|
@@ -46,9 +46,9 @@ omserv/server/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
46
46
|
omserv/server/streams/httpstream.py,sha256=0DeiAPLGbEGNa0fHTs8lUpi_CFZs4M5_QB-TiS8mobQ,8015
|
47
47
|
omserv/server/streams/utils.py,sha256=aMOrqWIg_Hht5W4kLg3y7oR5AEkVvMrZhyjzo6U5owE,1527
|
48
48
|
omserv/server/streams/wsstream.py,sha256=3Vyzox7dCE1tDSXjb6xBubWo41ZF9d38Hrsrlj6h1J8,15482
|
49
|
-
omserv-0.0.0.
|
50
|
-
omserv-0.0.0.
|
51
|
-
omserv-0.0.0.
|
52
|
-
omserv-0.0.0.
|
53
|
-
omserv-0.0.0.
|
54
|
-
omserv-0.0.0.
|
49
|
+
omserv-0.0.0.dev317.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
50
|
+
omserv-0.0.0.dev317.dist-info/METADATA,sha256=8APUYPHLIJOgNG-7JKspxb__V19jSL9y_-lWAzMh-uc,1005
|
51
|
+
omserv-0.0.0.dev317.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
52
|
+
omserv-0.0.0.dev317.dist-info/entry_points.txt,sha256=ivSrdA_ahEbI-eVMu-XZS-z4VrnQISvpecIkOqC9zFM,35
|
53
|
+
omserv-0.0.0.dev317.dist-info/top_level.txt,sha256=HXehpnxeKscKNULzKNzZ27oNawBrsh1PaNAirbX-XNA,7
|
54
|
+
omserv-0.0.0.dev317.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|