apexdevkit 1.21.12__tar.gz → 1.22.2__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.21.12 → apexdevkit-1.22.2}/PKG-INFO +1 -1
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/builder.py +21 -1
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/mssql.py +21 -1
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/sql.py +13 -2
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/pyproject.toml +1 -1
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/LICENSE +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/README.md +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/environment.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/error.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/dependable.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/name.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/request.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/resource.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/response.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/router.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/schema.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fastapi/service.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/fluent.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/formatter.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/httpx/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/httpx/client.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/httpx/hooks.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/id.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/key_fn.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/query/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/query/generator.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/query/query.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/base.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/database.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/decorator.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/repository.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/repository/sqlite.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/server.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/synchronization.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/testing/__init__.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/testing/fake.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/testing/rest.py +0 -0
- {apexdevkit-1.21.12 → apexdevkit-1.22.2}/apexdevkit/value.py +0 -0
|
@@ -2,9 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
|
-
from typing import Any, Self
|
|
5
|
+
from typing import Any, Mapping, Self
|
|
6
6
|
|
|
7
7
|
from fastapi import APIRouter, FastAPI
|
|
8
|
+
from starlette.middleware.cors import CORSMiddleware
|
|
8
9
|
from starlette.responses import JSONResponse
|
|
9
10
|
|
|
10
11
|
from apexdevkit.error import ApiError
|
|
@@ -44,6 +45,9 @@ class FastApiBuilder:
|
|
|
44
45
|
return self
|
|
45
46
|
|
|
46
47
|
def with_route(self, **values: APIRouter) -> Self:
|
|
48
|
+
return self.with_routes(values)
|
|
49
|
+
|
|
50
|
+
def with_routes(self, values: Mapping[str, APIRouter]) -> Self:
|
|
47
51
|
for key, value in values.items():
|
|
48
52
|
self.app.include_router(
|
|
49
53
|
value, prefix=f"/{key}", tags=value.tags or [key.title()]
|
|
@@ -57,6 +61,22 @@ class FastApiBuilder:
|
|
|
57
61
|
|
|
58
62
|
return self
|
|
59
63
|
|
|
64
|
+
def with_frontend(self, origin: str) -> Self:
|
|
65
|
+
self.app.add_middleware(
|
|
66
|
+
CORSMiddleware,
|
|
67
|
+
allow_origins=[origin],
|
|
68
|
+
allow_credentials=True,
|
|
69
|
+
allow_methods=["*"],
|
|
70
|
+
allow_headers=["*"],
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
def with_swagger(self, **config: Any) -> Self:
|
|
76
|
+
self.app.swagger_ui_parameters = config
|
|
77
|
+
|
|
78
|
+
return self
|
|
79
|
+
|
|
60
80
|
|
|
61
81
|
@dataclass
|
|
62
82
|
class RestfulServiceBuilder(ABC):
|
|
@@ -151,6 +151,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
151
151
|
table: str | None = None
|
|
152
152
|
formatter: Formatter[Mapping[str, Any], ItemT] | None = None
|
|
153
153
|
fields: list[_SqlField] | None = None
|
|
154
|
+
custom_filters: list[str] | None = None
|
|
154
155
|
|
|
155
156
|
def with_username(self, value: str) -> MsSqlTableBuilder[ItemT]:
|
|
156
157
|
return MsSqlTableBuilder[ItemT](
|
|
@@ -159,6 +160,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
159
160
|
self.table,
|
|
160
161
|
self.formatter,
|
|
161
162
|
self.fields,
|
|
163
|
+
self.custom_filters,
|
|
162
164
|
)
|
|
163
165
|
|
|
164
166
|
def with_schema(self, value: str) -> MsSqlTableBuilder[ItemT]:
|
|
@@ -168,6 +170,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
168
170
|
self.table,
|
|
169
171
|
self.formatter,
|
|
170
172
|
self.fields,
|
|
173
|
+
self.custom_filters,
|
|
171
174
|
)
|
|
172
175
|
|
|
173
176
|
def with_table(self, value: str) -> MsSqlTableBuilder[ItemT]:
|
|
@@ -177,6 +180,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
177
180
|
value,
|
|
178
181
|
self.formatter,
|
|
179
182
|
self.fields,
|
|
183
|
+
self.custom_filters,
|
|
180
184
|
)
|
|
181
185
|
|
|
182
186
|
def with_formatter(
|
|
@@ -188,6 +192,7 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
188
192
|
self.table,
|
|
189
193
|
value,
|
|
190
194
|
self.fields,
|
|
195
|
+
self.custom_filters,
|
|
191
196
|
)
|
|
192
197
|
|
|
193
198
|
def with_fields(self, value: Iterable[_SqlField]) -> MsSqlTableBuilder[ItemT]:
|
|
@@ -213,17 +218,32 @@ class MsSqlTableBuilder(Generic[ItemT]):
|
|
|
213
218
|
self.table,
|
|
214
219
|
self.formatter,
|
|
215
220
|
key_list,
|
|
221
|
+
self.custom_filters,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def with_custom_filters(self, filters: Iterable[str]) -> MsSqlTableBuilder[ItemT]:
|
|
225
|
+
return MsSqlTableBuilder[ItemT](
|
|
226
|
+
self.username,
|
|
227
|
+
self.schema,
|
|
228
|
+
self.table,
|
|
229
|
+
self.formatter,
|
|
230
|
+
self.fields,
|
|
231
|
+
list(filters),
|
|
216
232
|
)
|
|
217
233
|
|
|
218
234
|
def build(self) -> SqlTable[ItemT]:
|
|
219
235
|
if not self.schema or not self.table or not self.formatter or not self.fields:
|
|
220
236
|
raise ValueError("Cannot build sql table.")
|
|
221
237
|
|
|
238
|
+
field_manager = SqlFieldManager.Builder().with_fields(self.fields)
|
|
239
|
+
if self.custom_filters and len(self.custom_filters) > 0:
|
|
240
|
+
field_manager = field_manager.with_custom_filters(self.custom_filters)
|
|
241
|
+
|
|
222
242
|
return DefaultSqlTable(
|
|
223
243
|
self.schema,
|
|
224
244
|
self.table,
|
|
225
245
|
self.formatter,
|
|
226
|
-
|
|
246
|
+
field_manager.for_mssql().build(),
|
|
227
247
|
self.username,
|
|
228
248
|
)
|
|
229
249
|
|
|
@@ -120,6 +120,7 @@ class SqlFieldBuilder:
|
|
|
120
120
|
@dataclass
|
|
121
121
|
class SqlFieldManager:
|
|
122
122
|
fields: list[_SqlField]
|
|
123
|
+
custom_filters: list[str]
|
|
123
124
|
key_formatter: str
|
|
124
125
|
value_formatter: str
|
|
125
126
|
|
|
@@ -209,7 +210,7 @@ class SqlFieldManager:
|
|
|
209
210
|
)
|
|
210
211
|
|
|
211
212
|
def _general_filters(self) -> str:
|
|
212
|
-
statements: list[str] = []
|
|
213
|
+
statements: list[str] = [] + self.custom_filters
|
|
213
214
|
for key in self.fields:
|
|
214
215
|
if key.is_filter:
|
|
215
216
|
inner_statements: list[str] = []
|
|
@@ -237,6 +238,8 @@ class SqlFieldManager:
|
|
|
237
238
|
|
|
238
239
|
@dataclass
|
|
239
240
|
class Builder:
|
|
241
|
+
custom_filters: list[str] = field(default_factory=list)
|
|
242
|
+
|
|
240
243
|
fields: list[_SqlField] = field(init=False)
|
|
241
244
|
key_formatter: str = field(init=False)
|
|
242
245
|
value_formatter: str = field(init=False)
|
|
@@ -246,6 +249,11 @@ class SqlFieldManager:
|
|
|
246
249
|
|
|
247
250
|
return self
|
|
248
251
|
|
|
252
|
+
def with_custom_filters(self, fields: list[str]) -> SqlFieldManager.Builder:
|
|
253
|
+
self.custom_filters = fields
|
|
254
|
+
|
|
255
|
+
return self
|
|
256
|
+
|
|
249
257
|
def for_sqlite(self) -> SqlFieldManager.Builder:
|
|
250
258
|
self.key_formatter = "x"
|
|
251
259
|
self.value_formatter = ":x"
|
|
@@ -260,5 +268,8 @@ class SqlFieldManager:
|
|
|
260
268
|
|
|
261
269
|
def build(self) -> SqlFieldManager:
|
|
262
270
|
return SqlFieldManager(
|
|
263
|
-
self.fields,
|
|
271
|
+
self.fields,
|
|
272
|
+
self.custom_filters,
|
|
273
|
+
self.key_formatter,
|
|
274
|
+
self.value_formatter,
|
|
264
275
|
)
|
|
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
|
|
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
|