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.
Files changed (32) hide show
  1. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/PKG-INFO +1 -1
  2. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/router.py +43 -17
  3. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/rest.py +2 -2
  4. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/pyproject.toml +1 -1
  5. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/LICENSE +0 -0
  6. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/README.md +0 -0
  7. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/__init__.py +0 -0
  8. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/annotation/__init__.py +0 -0
  9. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/annotation/deprecate.py +0 -0
  10. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/error.py +0 -0
  11. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/__init__.py +0 -0
  12. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/builder.py +0 -0
  13. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/dependable.py +0 -0
  14. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/docs.py +0 -0
  15. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/response.py +0 -0
  16. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/schema.py +0 -0
  17. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/fastapi/service.py +0 -0
  18. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/__init__.py +0 -0
  19. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/fake.py +0 -0
  20. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/fluent.py +0 -0
  21. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/httpx.py +0 -0
  22. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/json.py +0 -0
  23. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/http/url.py +0 -0
  24. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/py.typed +0 -0
  25. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/__init__.py +0 -0
  26. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/connector.py +0 -0
  27. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/database.py +0 -0
  28. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/in_memory.py +0 -0
  29. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/repository/interface.py +0 -0
  30. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/__init__.py +0 -0
  31. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/database.py +0 -0
  32. {apexdevkit-1.3.14 → apexdevkit-1.4.1}/apexdevkit/testing/fake.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apexdevkit
3
- Version: 1.3.14
3
+ Version: 1.4.1
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -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, Protocol, Self, TypeVar
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
- class RestfulServiceInfra(Protocol):
82
- def service_for(self, parent_id: str) -> RestfulService:
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(frozen=True)
87
- class SingleRestfulServiceInfra:
102
+ @dataclass
103
+ class PreBuiltRestfulService(RestfulServiceBuilder):
88
104
  service: RestfulService
89
105
 
90
- def service_for(self, parent_id: str) -> RestfulService:
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: RestfulServiceInfra = field(init=False)
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 = SingleRestfulServiceInfra(self.service)
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 = SingleRestfulServiceInfra(value)
167
+ self.infra = PreBuiltRestfulService(value)
152
168
 
153
169
  return self
154
170
 
155
- def with_infra(self, value: RestfulServiceInfra) -> Self:
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
- service = self.infra.service_for(parent_id)
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
- service = self.infra.service_for(parent_id)
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.service_for(parent_id)
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.service_for(parent_id)
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.service_for(parent_id)
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.service_for(parent_id)
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.service_for(parent_id)
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "apexdevkit"
3
- version = "1.3.14"
3
+ version = "1.4.1"
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