apexdevkit 1.3.14__tar.gz → 1.4.1__tar.gz
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.
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/PKG-INFO +1 -1
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/router.py +43 -17
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/rest.py +2 -2
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/pyproject.toml +1 -1
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/LICENSE +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/README.md +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/error.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/builder.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/dependable.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/response.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/schema.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/service.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/httpx.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/database.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/__init__.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/fake.py +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
1
2
|
from dataclasses import dataclass, field
|
|
2
3
|
from functools import cached_property
|
|
3
|
-
from typing import Annotated, Any, Iterable,
|
|
4
|
+
from typing import Annotated, Any, Iterable, Self, TypeVar
|
|
4
5
|
|
|
5
6
|
from fastapi import APIRouter, Depends, Path
|
|
6
7
|
from fastapi.responses import JSONResponse
|
|
@@ -78,16 +79,31 @@ class RestfulResponse:
|
|
|
78
79
|
T = TypeVar("T")
|
|
79
80
|
|
|
80
81
|
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
@dataclass
|
|
83
|
+
class RestfulServiceBuilder(ABC):
|
|
84
|
+
parent_id: str = field(init=False)
|
|
85
|
+
user: Any = field(init=False)
|
|
86
|
+
|
|
87
|
+
def with_user(self, user: Any) -> "RestfulServiceBuilder":
|
|
88
|
+
self.user = user
|
|
89
|
+
|
|
90
|
+
return self
|
|
91
|
+
|
|
92
|
+
def with_parent(self, identity: str) -> "RestfulServiceBuilder":
|
|
93
|
+
self.parent_id = identity
|
|
94
|
+
|
|
95
|
+
return self
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def build(self) -> RestfulService:
|
|
83
99
|
pass
|
|
84
100
|
|
|
85
101
|
|
|
86
|
-
@dataclass
|
|
87
|
-
class
|
|
102
|
+
@dataclass
|
|
103
|
+
class PreBuiltRestfulService(RestfulServiceBuilder):
|
|
88
104
|
service: RestfulService
|
|
89
105
|
|
|
90
|
-
def
|
|
106
|
+
def build(self) -> RestfulService:
|
|
91
107
|
return self.service
|
|
92
108
|
|
|
93
109
|
|
|
@@ -99,13 +115,13 @@ class RestfulRouter:
|
|
|
99
115
|
|
|
100
116
|
name: RestfulName = field(init=False)
|
|
101
117
|
fields: SchemaFields = field(init=False)
|
|
102
|
-
infra:
|
|
118
|
+
infra: RestfulServiceBuilder = field(init=False)
|
|
103
119
|
|
|
104
120
|
parent: str = field(init=False, default="")
|
|
105
121
|
|
|
106
122
|
def __post_init__(self) -> None:
|
|
107
123
|
if self.service:
|
|
108
|
-
self.infra =
|
|
124
|
+
self.infra = PreBuiltRestfulService(self.service)
|
|
109
125
|
|
|
110
126
|
@cached_property
|
|
111
127
|
def response(self) -> RestfulResponse:
|
|
@@ -148,11 +164,11 @@ class RestfulRouter:
|
|
|
148
164
|
return self
|
|
149
165
|
|
|
150
166
|
def with_service(self, value: RestfulService) -> Self:
|
|
151
|
-
self.infra =
|
|
167
|
+
self.infra = PreBuiltRestfulService(value)
|
|
152
168
|
|
|
153
169
|
return self
|
|
154
170
|
|
|
155
|
-
def with_infra(self, value:
|
|
171
|
+
def with_infra(self, value: RestfulServiceBuilder) -> Self:
|
|
156
172
|
self.infra = value
|
|
157
173
|
|
|
158
174
|
return self
|
|
@@ -176,7 +192,12 @@ class RestfulRouter:
|
|
|
176
192
|
include_in_schema=is_documented,
|
|
177
193
|
)
|
|
178
194
|
def create_one(parent_id: parent_id_type, item: item_type) -> _Response:
|
|
179
|
-
|
|
195
|
+
try:
|
|
196
|
+
service = self.infra.with_parent(parent_id).build()
|
|
197
|
+
except DoesNotExistError as e:
|
|
198
|
+
return JSONResponse(
|
|
199
|
+
RestfulResponse(RestfulName(self.parent)).not_found(e), 404
|
|
200
|
+
)
|
|
180
201
|
|
|
181
202
|
try:
|
|
182
203
|
item = service.create_one(item)
|
|
@@ -206,7 +227,12 @@ class RestfulRouter:
|
|
|
206
227
|
include_in_schema=is_documented,
|
|
207
228
|
)
|
|
208
229
|
def create_many(parent_id: parent_id_type, items: collection_type) -> _Response:
|
|
209
|
-
|
|
230
|
+
try:
|
|
231
|
+
service = self.infra.with_parent(parent_id).build()
|
|
232
|
+
except DoesNotExistError as e:
|
|
233
|
+
return JSONResponse(
|
|
234
|
+
RestfulResponse(RestfulName(self.parent)).not_found(e), 404
|
|
235
|
+
)
|
|
210
236
|
|
|
211
237
|
try:
|
|
212
238
|
return self.response.created_many(service.create_many(items))
|
|
@@ -230,7 +256,7 @@ class RestfulRouter:
|
|
|
230
256
|
include_in_schema=is_documented,
|
|
231
257
|
)
|
|
232
258
|
def read_one(parent_id: parent_id_type, item_id: id_type) -> _Response:
|
|
233
|
-
service = self.infra.
|
|
259
|
+
service = self.infra.with_parent(parent_id).build()
|
|
234
260
|
|
|
235
261
|
try:
|
|
236
262
|
return self.response.found_one(service.read_one(item_id))
|
|
@@ -253,7 +279,7 @@ class RestfulRouter:
|
|
|
253
279
|
include_in_schema=is_documented,
|
|
254
280
|
)
|
|
255
281
|
def read_all(parent_id: parent_id_type) -> _Response:
|
|
256
|
-
service = self.infra.
|
|
282
|
+
service = self.infra.with_parent(parent_id).build()
|
|
257
283
|
|
|
258
284
|
return self.response.found_many(list(service.read_all()))
|
|
259
285
|
|
|
@@ -282,7 +308,7 @@ class RestfulRouter:
|
|
|
282
308
|
item_id: id_type,
|
|
283
309
|
updates: update_type,
|
|
284
310
|
) -> _Response:
|
|
285
|
-
service = self.infra.
|
|
311
|
+
service = self.infra.with_parent(parent_id).build()
|
|
286
312
|
|
|
287
313
|
try:
|
|
288
314
|
service.update_one(item_id, **updates)
|
|
@@ -313,7 +339,7 @@ class RestfulRouter:
|
|
|
313
339
|
include_in_schema=is_documented,
|
|
314
340
|
)
|
|
315
341
|
def update_many(parent_id: parent_id_type, items: collection_type) -> _Response:
|
|
316
|
-
service = self.infra.
|
|
342
|
+
service = self.infra.with_parent(parent_id).build()
|
|
317
343
|
|
|
318
344
|
service.update_many(items)
|
|
319
345
|
|
|
@@ -336,7 +362,7 @@ class RestfulRouter:
|
|
|
336
362
|
include_in_schema=is_documented,
|
|
337
363
|
)
|
|
338
364
|
def delete_one(parent_id: parent_id_type, item_id: id_type) -> _Response:
|
|
339
|
-
service = self.infra.
|
|
365
|
+
service = self.infra.with_parent(parent_id).build()
|
|
340
366
|
|
|
341
367
|
try:
|
|
342
368
|
service.delete_one(item_id)
|
|
@@ -261,7 +261,7 @@ class RestResponse:
|
|
|
261
261
|
return self.with_message(value)
|
|
262
262
|
|
|
263
263
|
def with_message(self, value: str) -> Self:
|
|
264
|
-
assert self.json.value_of("error").to(dict) == {"message": value}
|
|
264
|
+
assert self.json.value_of("error").to(dict) == {"message": value}, self.json
|
|
265
265
|
|
|
266
266
|
return self
|
|
267
267
|
|
|
@@ -310,6 +310,6 @@ class RestResponse:
|
|
|
310
310
|
return self.with_data()
|
|
311
311
|
|
|
312
312
|
def with_data(self, **kwargs: Any) -> Self:
|
|
313
|
-
assert self.json.value_of("data").to(dict) == {**kwargs}
|
|
313
|
+
assert self.json.value_of("data").to(dict) == {**kwargs}, self.json
|
|
314
314
|
|
|
315
315
|
return self
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|