apexdevkit 1.4.2__tar.gz → 1.4.4__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.
Files changed (32) hide show
  1. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/PKG-INFO +1 -1
  2. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/router.py +203 -119
  3. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/pyproject.toml +1 -1
  4. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/LICENSE +0 -0
  5. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/README.md +0 -0
  6. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/__init__.py +0 -0
  7. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/annotation/__init__.py +0 -0
  8. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/annotation/deprecate.py +0 -0
  9. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/error.py +0 -0
  10. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/__init__.py +0 -0
  11. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/builder.py +0 -0
  12. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/dependable.py +0 -0
  13. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/docs.py +0 -0
  14. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/response.py +0 -0
  15. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/schema.py +0 -0
  16. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/fastapi/service.py +0 -0
  17. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/__init__.py +0 -0
  18. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/fake.py +0 -0
  19. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/fluent.py +0 -0
  20. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/httpx.py +0 -0
  21. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/json.py +0 -0
  22. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/http/url.py +0 -0
  23. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/py.typed +0 -0
  24. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/repository/__init__.py +0 -0
  25. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/repository/connector.py +0 -0
  26. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/repository/database.py +0 -0
  27. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/repository/in_memory.py +0 -0
  28. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/repository/interface.py +0 -0
  29. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/testing/__init__.py +0 -0
  30. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/testing/database.py +0 -0
  31. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/testing/fake.py +0 -0
  32. {apexdevkit-1.4.2 → apexdevkit-1.4.4}/apexdevkit/testing/rest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apexdevkit
3
- Version: 1.4.2
3
+ Version: 1.4.4
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -4,7 +4,6 @@ from functools import cached_property
4
4
  from typing import Annotated, Any, Callable, Iterable, Self, TypeVar
5
5
 
6
6
  from fastapi import APIRouter, Depends, Path
7
- from fastapi.requests import Request
8
7
  from fastapi.responses import JSONResponse
9
8
 
10
9
  from apexdevkit.error import DoesNotExistError, ExistsError, ForbiddenError
@@ -108,7 +107,7 @@ class PreBuiltRestfulService(RestfulServiceBuilder):
108
107
  return self.service
109
108
 
110
109
 
111
- def no_user(request: Request) -> None:
110
+ def no_user() -> None:
112
111
  pass
113
112
 
114
113
 
@@ -181,30 +180,36 @@ class RestfulRouter:
181
180
  def with_create_one_endpoint(
182
181
  self,
183
182
  is_documented: bool = True,
184
- extract_user: Callable[[Request], Any] = no_user,
183
+ extract_user: Callable[..., Any] = no_user,
185
184
  ) -> Self:
186
- parent_id_type = Annotated[
187
- str,
188
- Path(alias=self.parent_id_alias, default_factory=str),
189
- ]
190
-
191
- item_type = Annotated[
192
- RawItem,
193
- Depends(self.schema.for_create_one()),
194
- ]
195
-
196
- @self.router.post(
185
+ self.router.add_api_route(
197
186
  "",
187
+ self.create_one(
188
+ User=Annotated[
189
+ Any,
190
+ Depends(extract_user),
191
+ ],
192
+ ParentId=Annotated[
193
+ str,
194
+ Path(alias=self.parent_id_alias, default_factory=str),
195
+ ],
196
+ Item=Annotated[
197
+ RawItem,
198
+ Depends(self.schema.for_create_one()),
199
+ ],
200
+ ),
201
+ methods=["POST"],
198
202
  status_code=201,
199
203
  responses={409: {}},
200
204
  response_model=self.schema.for_item(),
201
205
  include_in_schema=is_documented,
206
+ summary="Create One",
202
207
  )
203
- def create_one(
204
- user: Annotated[Any, Depends(extract_user)],
205
- parent_id: parent_id_type,
206
- item: item_type,
207
- ) -> _Response:
208
+
209
+ return self
210
+
211
+ def create_one(self, User, ParentId, Item) -> Callable[..., _Response]: # type: ignore
212
+ def endpoint(user: User, parent_id: ParentId, item: Item) -> _Response:
208
213
  try:
209
214
  service = self.infra.with_user(user).with_parent(parent_id).build()
210
215
  except DoesNotExistError as e:
@@ -219,35 +224,41 @@ class RestfulRouter:
219
224
 
220
225
  return self.response.created_one(item)
221
226
 
222
- return self
227
+ return endpoint
223
228
 
224
229
  def with_create_many_endpoint(
225
230
  self,
226
231
  is_documented: bool = True,
227
- extract_user: Callable[[Request], Any] = no_user,
232
+ extract_user: Callable[..., Any] = no_user,
228
233
  ) -> Self:
229
- parent_id_type = Annotated[
230
- str,
231
- Path(alias=self.parent_id_alias, default_factory=str),
232
- ]
233
-
234
- collection_type = Annotated[
235
- RawCollection,
236
- Depends(self.schema.for_create_many()),
237
- ]
238
-
239
- @self.router.post(
234
+ self.router.add_api_route(
240
235
  "/batch",
236
+ self.create_many(
237
+ User=Annotated[
238
+ Any,
239
+ Depends(extract_user),
240
+ ],
241
+ ParentId=Annotated[
242
+ str,
243
+ Path(alias=self.parent_id_alias, default_factory=str),
244
+ ],
245
+ Collection=Annotated[
246
+ RawCollection,
247
+ Depends(self.schema.for_create_many()),
248
+ ],
249
+ ),
250
+ methods=["POST"],
241
251
  status_code=201,
242
252
  responses={409: {}},
243
253
  response_model=self.schema.for_collection(),
244
254
  include_in_schema=is_documented,
255
+ summary="Create Many",
245
256
  )
246
- def create_many(
247
- user: Annotated[Any, Depends(extract_user)],
248
- parent_id: parent_id_type,
249
- items: collection_type,
250
- ) -> _Response:
257
+
258
+ return self
259
+
260
+ def create_many(self, User, ParentId, Collection) -> Callable[..., _Response]: # type: ignore
261
+ def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
251
262
  try:
252
263
  service = self.infra.with_user(user).with_parent(parent_id).build()
253
264
  except DoesNotExistError as e:
@@ -260,97 +271,143 @@ class RestfulRouter:
260
271
  except ExistsError as e:
261
272
  return JSONResponse(self.response.exists(e), 409)
262
273
 
263
- return self
274
+ return endpoint
264
275
 
265
276
  def with_read_one_endpoint(
266
277
  self,
267
278
  is_documented: bool = True,
268
- extract_user: Callable[[Request], Any] = no_user,
279
+ extract_user: Callable[..., Any] = no_user,
269
280
  ) -> Self:
270
- id_type = Annotated[str, Path(alias=self.id_alias)]
271
- parent_id_type = Annotated[
272
- str,
273
- Path(alias=self.parent_id_alias, default_factory=str),
274
- ]
275
-
276
- @self.router.get(
281
+ self.router.add_api_route(
277
282
  self.item_path,
283
+ self.read_one(
284
+ User=Annotated[
285
+ Any,
286
+ Depends(extract_user),
287
+ ],
288
+ ParentId=Annotated[
289
+ str,
290
+ Path(alias=self.parent_id_alias, default_factory=str),
291
+ ],
292
+ ItemId=Annotated[
293
+ str,
294
+ Path(alias=self.id_alias),
295
+ ],
296
+ ),
297
+ methods=["GET"],
278
298
  status_code=200,
279
299
  responses={404: {}},
280
300
  response_model=self.schema.for_item(),
281
301
  include_in_schema=is_documented,
302
+ summary="Read One",
282
303
  )
283
- def read_one(
284
- user: Annotated[Any, Depends(extract_user)],
285
- parent_id: parent_id_type,
286
- item_id: id_type,
287
- ) -> _Response:
288
- service = self.infra.with_user(user).with_parent(parent_id).build()
304
+
305
+ return self
306
+
307
+ def read_one(self, User, ParentId, ItemId) -> Callable[..., _Response]: # type: ignore
308
+ def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
309
+ try:
310
+ service = self.infra.with_user(user).with_parent(parent_id).build()
311
+ except DoesNotExistError as e:
312
+ return JSONResponse(
313
+ RestfulResponse(RestfulName(self.parent)).not_found(e), 404
314
+ )
289
315
 
290
316
  try:
291
317
  return self.response.found_one(service.read_one(item_id))
292
318
  except DoesNotExistError as e:
293
319
  return JSONResponse(self.response.not_found(e), 404)
294
320
 
295
- return self
321
+ return endpoint
296
322
 
297
323
  def with_read_all_endpoint(
298
324
  self,
299
325
  is_documented: bool = True,
300
- extract_user: Callable[[Request], Any] = no_user,
326
+ extract_user: Callable[..., Any] = no_user,
301
327
  ) -> Self:
302
- parent_id_type = Annotated[
303
- str,
304
- Path(alias=self.parent_id_alias, default_factory=str),
305
- ]
306
-
307
- @self.router.get(
328
+ self.router.add_api_route(
308
329
  "",
330
+ self.read_all(
331
+ User=Annotated[
332
+ Any,
333
+ Depends(extract_user),
334
+ ],
335
+ ParentId=Annotated[
336
+ str,
337
+ Path(alias=self.parent_id_alias, default_factory=str),
338
+ ],
339
+ ),
340
+ methods=["GET"],
309
341
  status_code=200,
310
342
  responses={},
311
343
  response_model=self.schema.for_collection(),
312
344
  include_in_schema=is_documented,
345
+ summary="Read All",
313
346
  )
314
- def read_all(
315
- user: Annotated[Any, Depends(extract_user)],
316
- parent_id: parent_id_type,
317
- ) -> _Response:
318
- service = self.infra.with_user(user).with_parent(parent_id).build()
347
+
348
+ return self
349
+
350
+ def read_all(self, User, ParentId) -> Callable[..., _Response]: # type: ignore
351
+ def endpoint(user: User, parent_id: ParentId) -> _Response:
352
+ try:
353
+ service = self.infra.with_user(user).with_parent(parent_id).build()
354
+ except DoesNotExistError as e:
355
+ return JSONResponse(
356
+ RestfulResponse(RestfulName(self.parent)).not_found(e), 404
357
+ )
319
358
 
320
359
  return self.response.found_many(list(service.read_all()))
321
360
 
322
- return self
361
+ return endpoint
323
362
 
324
363
  def with_update_one_endpoint(
325
364
  self,
326
365
  is_documented: bool = True,
327
- extract_user: Callable[[Request], Any] = no_user,
366
+ extract_user: Callable[..., Any] = no_user,
328
367
  ) -> Self:
329
- parent_id_type = Annotated[
330
- str,
331
- Path(alias=self.parent_id_alias, default_factory=str),
332
- ]
333
- id_type = Annotated[str, Path(alias=self.id_alias)]
334
- update_type = Annotated[
335
- RawItem,
336
- Depends(self.schema.for_update_one()),
337
- ]
338
-
339
- @self.router.patch(
368
+ self.router.add_api_route(
340
369
  self.item_path,
370
+ self.update_one(
371
+ User=Annotated[
372
+ Any,
373
+ Depends(extract_user),
374
+ ],
375
+ ParentId=Annotated[
376
+ str,
377
+ Path(alias=self.parent_id_alias, default_factory=str),
378
+ ],
379
+ ItemId=Annotated[
380
+ str,
381
+ Path(alias=self.id_alias),
382
+ ],
383
+ Updates=Annotated[
384
+ RawItem,
385
+ Depends(self.schema.for_update_one()),
386
+ ],
387
+ ),
388
+ methods=["PATCH"],
341
389
  status_code=200,
342
390
  responses={404: {}},
343
391
  response_model=self.schema.for_no_data(),
344
392
  include_in_schema=is_documented,
393
+ summary="Update One",
345
394
  )
346
- def update_one(
347
- user: Annotated[Any, Depends(extract_user)],
348
- parent_id: parent_id_type,
349
- item_id: id_type,
350
- updates: update_type,
351
- ) -> _Response:
352
- service = self.infra.with_user(user).with_parent(parent_id).build()
353
395
 
396
+ return self
397
+
398
+ def update_one(self, User, ParentId, ItemId, Updates) -> Callable[..., _Response]: # type: ignore
399
+ def endpoint(
400
+ user: User,
401
+ parent_id: ParentId,
402
+ item_id: ItemId,
403
+ updates: Updates,
404
+ ) -> _Response:
405
+ try:
406
+ service = self.infra.with_user(user).with_parent(parent_id).build()
407
+ except DoesNotExistError as e:
408
+ return JSONResponse(
409
+ RestfulResponse(RestfulName(self.parent)).not_found(e), 404
410
+ )
354
411
  try:
355
412
  service.update_one(item_id, **updates)
356
413
  except DoesNotExistError as e:
@@ -360,66 +417,93 @@ class RestfulRouter:
360
417
 
361
418
  return self.response.ok()
362
419
 
363
- return self
420
+ return endpoint
364
421
 
365
422
  def with_update_many_endpoint(
366
423
  self,
367
424
  is_documented: bool = True,
368
- extract_user: Callable[[Request], Any] = no_user,
425
+ extract_user: Callable[..., Any] = no_user,
369
426
  ) -> Self:
370
- parent_id_type = Annotated[
371
- str,
372
- Path(alias=self.parent_id_alias, default_factory=str),
373
- ]
374
- collection_type = Annotated[
375
- RawCollection,
376
- Depends(self.schema.for_update_many()),
377
- ]
378
-
379
- @self.router.patch(
427
+ self.router.add_api_route(
380
428
  "",
429
+ self.update_many(
430
+ User=Annotated[
431
+ Any,
432
+ Depends(extract_user),
433
+ ],
434
+ ParentId=Annotated[
435
+ str,
436
+ Path(alias=self.parent_id_alias, default_factory=str),
437
+ ],
438
+ Collection=Annotated[
439
+ RawCollection,
440
+ Depends(self.schema.for_update_many()),
441
+ ],
442
+ ),
443
+ methods=["PATCH"],
381
444
  status_code=200,
382
445
  responses={},
383
446
  response_model=self.schema.for_no_data(),
384
447
  include_in_schema=is_documented,
448
+ summary="Update Many",
385
449
  )
386
- def update_many(
387
- user: Annotated[Any, Depends(extract_user)],
388
- parent_id: parent_id_type,
389
- items: collection_type,
390
- ) -> _Response:
391
- service = self.infra.with_user(user).with_parent(parent_id).build()
450
+
451
+ return self
452
+
453
+ def update_many(self, User, ParentId, Collection) -> Callable[..., _Response]: # type: ignore
454
+ def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
455
+ try:
456
+ service = self.infra.with_user(user).with_parent(parent_id).build()
457
+ except DoesNotExistError as e:
458
+ return JSONResponse(
459
+ RestfulResponse(RestfulName(self.parent)).not_found(e), 404
460
+ )
392
461
 
393
462
  service.update_many(items)
394
463
 
395
464
  return self.response.ok()
396
465
 
397
- return self
466
+ return endpoint
398
467
 
399
468
  def with_delete_one_endpoint(
400
469
  self,
401
470
  is_documented: bool = True,
402
- extract_user: Callable[[Request], Any] = no_user,
471
+ extract_user: Callable[..., Any] = no_user,
403
472
  ) -> Self:
404
- parent_id_type = Annotated[
405
- str,
406
- Path(alias=self.parent_id_alias, default_factory=str),
407
- ]
408
- id_type = Annotated[str, Path(alias=self.id_alias)]
409
-
410
- @self.router.delete(
473
+ self.router.add_api_route(
411
474
  self.item_path,
475
+ self.delete_one(
476
+ User=Annotated[
477
+ Any,
478
+ Depends(extract_user),
479
+ ],
480
+ ParentId=Annotated[
481
+ str,
482
+ Path(alias=self.parent_id_alias, default_factory=str),
483
+ ],
484
+ ItemId=Annotated[
485
+ str,
486
+ Path(alias=self.id_alias),
487
+ ],
488
+ ),
489
+ methods=["DELETE"],
412
490
  status_code=200,
413
491
  responses={404: {}},
414
492
  response_model=self.schema.for_no_data(),
415
493
  include_in_schema=is_documented,
494
+ summary="Delete One",
416
495
  )
417
- def delete_one(
418
- user: Annotated[Any, Depends(extract_user)],
419
- parent_id: parent_id_type,
420
- item_id: id_type,
421
- ) -> _Response:
422
- service = self.infra.with_user(user).with_parent(parent_id).build()
496
+
497
+ return self
498
+
499
+ def delete_one(self, User, ParentId, ItemId) -> Callable[..., _Response]: # type: ignore
500
+ def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
501
+ try:
502
+ service = self.infra.with_user(user).with_parent(parent_id).build()
503
+ except DoesNotExistError as e:
504
+ return JSONResponse(
505
+ RestfulResponse(RestfulName(self.parent)).not_found(e), 404
506
+ )
423
507
 
424
508
  try:
425
509
  service.delete_one(item_id)
@@ -428,7 +512,7 @@ class RestfulRouter:
428
512
 
429
513
  return self.response.ok()
430
514
 
431
- return self
515
+ return endpoint
432
516
 
433
517
  def with_sub_resource(self, **names: APIRouter) -> Self:
434
518
  for name, router in names.items():
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "apexdevkit"
3
- version = "1.4.2"
3
+ version = "1.4.4"
4
4
  description = "Apex Development Tools for python."
5
5
  authors = ["Apex Dev <dev@apex.ge>"]
6
6
  readme = "README.md"
File without changes
File without changes