u-toolkit 0.1.7__tar.gz → 0.1.8__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 (41) hide show
  1. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/PKG-INFO +1 -1
  2. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/pyproject.toml +1 -1
  3. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/exception.py +33 -20
  4. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/.github/workflows/publish.yml +0 -0
  5. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/.gitignore +0 -0
  6. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/README.md +0 -0
  7. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/__init__.py +0 -0
  8. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/alias_generators.py +0 -0
  9. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/datetime.py +0 -0
  10. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/decorators.py +0 -0
  11. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/enum.py +0 -0
  12. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/__init__.py +0 -0
  13. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/cbv.py +0 -0
  14. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/config.py +0 -0
  15. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/helpers.py +0 -0
  16. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/lifespan.py +0 -0
  17. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/pagination.py +0 -0
  18. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/fastapi/responses.py +0 -0
  19. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/function.py +0 -0
  20. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/helpers.py +0 -0
  21. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/logger.py +0 -0
  22. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/merge.py +0 -0
  23. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/object.py +0 -0
  24. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/path.py +0 -0
  25. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/pydantic/__init__.py +0 -0
  26. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/pydantic/fields.py +0 -0
  27. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/pydantic/models.py +0 -0
  28. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/pydantic/type_vars.py +0 -0
  29. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/signature.py +0 -0
  30. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/__init__.py +0 -0
  31. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/fields.py +0 -0
  32. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/function.py +0 -0
  33. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/orm/__init__.py +0 -0
  34. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/orm/fields.py +0 -0
  35. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/orm/models.py +0 -0
  36. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/table_info.py +0 -0
  37. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/src/u_toolkit/sqlalchemy/type_vars.py +0 -0
  38. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/tests/__init__.py +0 -0
  39. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/tests/fastapi/__init__.py +0 -0
  40. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/tests/fastapi/test_cbv.py +0 -0
  41. {u_toolkit-0.1.7 → u_toolkit-0.1.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: u-toolkit
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: pydantic>=2.11.3
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "u-toolkit"
3
- version = "0.1.7"
3
+ version = "0.1.8"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,5 +1,6 @@
1
+ import inspect
1
2
  from collections.abc import Callable, Sequence
2
- from typing import Generic, Literal, Protocol, cast
3
+ from typing import Any, Generic, Literal, TypeVar, cast
3
4
 
4
5
  from fastapi import Response, status
5
6
  from fastapi.responses import JSONResponse, ORJSONResponse
@@ -10,12 +11,12 @@ from u_toolkit.pydantic.type_vars import BaseModelT
10
11
 
11
12
 
12
13
  try:
13
- import orjson
14
+ import orjson # type: ignore
14
15
  except ImportError: # pragma: nocover
15
16
  orjson = None # type: ignore
16
17
 
17
18
 
18
- class WrapperError(BaseModel, Generic[BaseModelT]): # type: ignore
19
+ class WrapperError(BaseModel, Generic[BaseModelT]):
19
20
  @classmethod
20
21
  def create(
21
22
  cls: type["WrapperError[BaseModelT]"],
@@ -24,7 +25,10 @@ class WrapperError(BaseModel, Generic[BaseModelT]): # type: ignore
24
25
  raise NotImplementedError
25
26
 
26
27
 
27
- class EndpointError(WrapperError, Generic[BaseModelT]):
28
+ WrapperErrorT = TypeVar("WrapperErrorT", bound=WrapperError)
29
+
30
+
31
+ class EndpointError(WrapperError[BaseModelT], Generic[BaseModelT]):
28
32
  error: BaseModelT
29
33
 
30
34
  @classmethod
@@ -32,20 +36,17 @@ class EndpointError(WrapperError, Generic[BaseModelT]):
32
36
  return cls(error=model)
33
37
 
34
38
 
35
- class HTTPErrorInterface(Protocol):
36
- status: int
37
-
38
- @classmethod
39
- def response_class(cls) -> type[BaseModel]: ...
40
-
41
-
42
- class NamedHTTPError(Exception, Generic[BaseModelT]):
39
+ class NamedHTTPError(Exception, Generic[WrapperErrorT, BaseModelT]):
43
40
  status: int = status.HTTP_400_BAD_REQUEST
44
41
  code: str | None = None
45
- targets: Sequence[str] | None = None
46
- target_transform: Callable[[str], str] | None = None
42
+ targets: Sequence[Any] | None = None
43
+ target_transform: Callable[[Any], Any] | None = None
47
44
  message: str | None = None
48
- wrapper_class: type[WrapperError[BaseModelT]] | None = EndpointError
45
+ wrapper: (
46
+ type[WrapperError[BaseModelT]]
47
+ | tuple[WrapperErrorT, Callable[[BaseModelT], WrapperErrorT]]
48
+ | None
49
+ ) = None
49
50
 
50
51
  @classmethod
51
52
  def error_name(cls):
@@ -87,7 +88,7 @@ class NamedHTTPError(Exception, Generic[BaseModelT]):
87
88
  target: str | None = None,
88
89
  headers: dict[str, str] | None = None,
89
90
  ) -> None:
90
- kwargs = {
91
+ kwargs: dict[str, Any] = {
91
92
  "code": self.error_code(),
92
93
  "message": message or "operation failed",
93
94
  }
@@ -99,10 +100,13 @@ class NamedHTTPError(Exception, Generic[BaseModelT]):
99
100
  kwargs["message"] = kwargs["message"].format(target=target)
100
101
 
101
102
  self.model = self.model_class()(**kwargs)
103
+ create: Callable[[BaseModelT], BaseModel] | None = None
104
+ if inspect.isclass(self.wrapper):
105
+ create = self.wrapper.create
106
+ elif isinstance(self.wrapper, tuple):
107
+ create = self.wrapper[1]
102
108
  self.data: BaseModel = (
103
- self.wrapper_class.create(self.model)
104
- if self.wrapper_class is not None
105
- else self.model
109
+ create(self.model) if create is not None else self.model
106
110
  )
107
111
 
108
112
  self.headers = headers
@@ -116,7 +120,16 @@ class NamedHTTPError(Exception, Generic[BaseModelT]):
116
120
  @classmethod
117
121
  def response_class(cls):
118
122
  model = cls.model_class()
119
- return cls.wrapper_class if cls.wrapper_class is not None else model
123
+
124
+ if cls.wrapper:
125
+ wrapper: Any
126
+ if inspect.isclass(cls.wrapper):
127
+ wrapper = cls.wrapper
128
+ else:
129
+ wrapper = cls.wrapper[0]
130
+ return wrapper[model]
131
+
132
+ return model
120
133
 
121
134
  @classmethod
122
135
  def response_schema(cls):
File without changes
File without changes
File without changes
File without changes