omserv 0.0.0.dev316__py3-none-any.whl → 0.0.0.dev318__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 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
- class Route(ta.NamedTuple):
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
- def handles(*routes: Route):
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 Config # noqa
18
- from .default import serve # noqa
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.dev316
3
+ Version: 0.0.0.dev318
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.dev316
15
+ Requires-Dist: omlish==0.0.0.dev318
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=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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=2YAWnfC0XOsxud2LLDwC-s9raORe2ZCMLV-Iznj5UjY,6193
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=jrFdrxfnQwjK5DW5y9w0alw6IKToGn2IQyZDhsuGHv4,372
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.dev316.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
50
- omserv-0.0.0.dev316.dist-info/METADATA,sha256=Q490EZ8A4E4lhn00T9vTLpRgphOq4PCyqnCDnkIpSx0,1005
51
- omserv-0.0.0.dev316.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
52
- omserv-0.0.0.dev316.dist-info/entry_points.txt,sha256=ivSrdA_ahEbI-eVMu-XZS-z4VrnQISvpecIkOqC9zFM,35
53
- omserv-0.0.0.dev316.dist-info/top_level.txt,sha256=HXehpnxeKscKNULzKNzZ27oNawBrsh1PaNAirbX-XNA,7
54
- omserv-0.0.0.dev316.dist-info/RECORD,,
49
+ omserv-0.0.0.dev318.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
50
+ omserv-0.0.0.dev318.dist-info/METADATA,sha256=9pdSkCKP5r2K8Mt4QZ43WCMKh6vnBeWSCQuf-B5gfmM,1005
51
+ omserv-0.0.0.dev318.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
52
+ omserv-0.0.0.dev318.dist-info/entry_points.txt,sha256=ivSrdA_ahEbI-eVMu-XZS-z4VrnQISvpecIkOqC9zFM,35
53
+ omserv-0.0.0.dev318.dist-info/top_level.txt,sha256=HXehpnxeKscKNULzKNzZ27oNawBrsh1PaNAirbX-XNA,7
54
+ omserv-0.0.0.dev318.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.7.1)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5