alpha-python 0.7.2__py3-none-any.whl → 0.7.4__py3-none-any.whl
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.
- alpha/adapters/rest_api_unit_of_work.py +14 -10
- alpha/domain/models/group.py +3 -3
- alpha/domain/models/user.py +4 -4
- alpha/factories/request_factory.py +10 -0
- alpha/handlers/templates/python-flask/controller.mustache +1 -0
- alpha/interfaces/api_repository.py +21 -0
- alpha/interfaces/sql_repository.py +13 -2
- alpha/mixins/user_lifecycle.py +11 -11
- alpha/providers/models/identity.py +5 -3
- alpha/repositories/refresh/database_repository.py +2 -2
- alpha/utils/request_headers.py +50 -2
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/METADATA +2 -2
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/RECORD +17 -17
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/WHEEL +0 -0
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/entry_points.txt +0 -0
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/licenses/LICENSE +0 -0
- {alpha_python-0.7.2.dist-info → alpha_python-0.7.4.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Contains the REST API Unit of Work implementation."""
|
|
2
2
|
|
|
3
|
-
from typing import Any, TypeVar
|
|
3
|
+
from typing import Any, TypeVar, cast
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
6
|
|
|
7
|
+
from alpha.interfaces.http_client import HTTPClient
|
|
7
8
|
from alpha.repositories.models.repository_model import RepositoryModel
|
|
8
9
|
|
|
9
10
|
|
|
@@ -22,7 +23,7 @@ class RestApiUnitOfWork:
|
|
|
22
23
|
def __init__(
|
|
23
24
|
self,
|
|
24
25
|
repos: list[RepositoryModel[Any]],
|
|
25
|
-
session:
|
|
26
|
+
session: HTTPClient | None = None,
|
|
26
27
|
) -> None:
|
|
27
28
|
"""Initialize the Unit of Work with repositories.
|
|
28
29
|
|
|
@@ -44,11 +45,12 @@ class RestApiUnitOfWork:
|
|
|
44
45
|
|
|
45
46
|
def __enter__(self: UOW) -> UOW:
|
|
46
47
|
"""Enter the REST API Unit of Work context.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
against a declared
|
|
48
|
+
|
|
49
|
+
Initializes an `HTTPClient` session if one was not provided and attaches
|
|
50
|
+
the configured repositories as attributes on the unit of work instance.
|
|
51
|
+
Each repository is constructed using the shared session and its
|
|
52
|
+
associated configuration, and optionally validated against a declared
|
|
53
|
+
interface.
|
|
52
54
|
|
|
53
55
|
Returns
|
|
54
56
|
-------
|
|
@@ -56,7 +58,9 @@ class RestApiUnitOfWork:
|
|
|
56
58
|
The configured :class:`RestApiUnitOfWork` instance to be used
|
|
57
59
|
within the context manager.
|
|
58
60
|
"""
|
|
59
|
-
self._session =
|
|
61
|
+
self._session = cast(
|
|
62
|
+
HTTPClient, self._session or requests.sessions.Session()
|
|
63
|
+
)
|
|
60
64
|
|
|
61
65
|
for repo in self._repositories:
|
|
62
66
|
name: str = repo.name
|
|
@@ -100,12 +104,12 @@ class RestApiUnitOfWork:
|
|
|
100
104
|
raise NotImplementedError("RestApiUnitOfWork does not support refresh")
|
|
101
105
|
|
|
102
106
|
@property
|
|
103
|
-
def session(self) ->
|
|
107
|
+
def session(self) -> HTTPClient | None:
|
|
104
108
|
"""Get the current session.
|
|
105
109
|
|
|
106
110
|
Returns
|
|
107
111
|
-------
|
|
108
|
-
|
|
112
|
+
HTTPClient | None
|
|
109
113
|
The current session used for API interactions.
|
|
110
114
|
"""
|
|
111
115
|
return self._session
|
alpha/domain/models/group.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
2
|
from datetime import datetime, timezone
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, cast
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from alpha.domain.models.base_model import BaseDomainModel, DomainModel
|
|
@@ -36,7 +36,7 @@ class Group(LifeCycleBase, BaseDomainModel):
|
|
|
36
36
|
id: UUID | int | str | None = None
|
|
37
37
|
name: str | None = None
|
|
38
38
|
description: str | None = None
|
|
39
|
-
permissions:
|
|
39
|
+
permissions: list[str] = field(default_factory=list) # type: ignore
|
|
40
40
|
is_active: bool = True
|
|
41
41
|
|
|
42
42
|
def to_dict(self) -> dict[str, Any]:
|
alpha/domain/models/user.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
2
|
from datetime import datetime, timezone
|
|
3
|
-
from typing import Any, Self,
|
|
3
|
+
from typing import Any, Self, cast
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from alpha.domain.models.base_model import BaseDomainModel, DomainModel
|
|
@@ -67,8 +67,8 @@ class User(LifeCycleBase, BaseDomainModel):
|
|
|
67
67
|
email: str | None = None
|
|
68
68
|
phone: str | None = None
|
|
69
69
|
display_name: str | None = None
|
|
70
|
-
permissions:
|
|
71
|
-
groups:
|
|
70
|
+
permissions: list[str] = field(default_factory=list) # type: ignore
|
|
71
|
+
groups: list[str | Group] = field(default_factory=list) # type: ignore
|
|
72
72
|
is_active: bool = True
|
|
73
73
|
admin: bool = False
|
|
74
74
|
|
|
@@ -25,6 +25,8 @@ from alpha.interfaces.factories import (
|
|
|
25
25
|
)
|
|
26
26
|
from alpha.interfaces.openapi_model import OpenAPIModel
|
|
27
27
|
from alpha.interfaces.pydantic_instance import PydanticInstance
|
|
28
|
+
from alpha.providers.models.identity import Identity
|
|
29
|
+
from alpha.utils.request_headers import Headers
|
|
28
30
|
|
|
29
31
|
|
|
30
32
|
class RequestFactory:
|
|
@@ -184,6 +186,8 @@ class RequestFactory:
|
|
|
184
186
|
DataclassInstance
|
|
185
187
|
| AttrsInstance
|
|
186
188
|
| PydanticInstance
|
|
189
|
+
| Identity
|
|
190
|
+
| Headers
|
|
187
191
|
| None
|
|
188
192
|
| OpenAPIModel
|
|
189
193
|
):
|
|
@@ -202,6 +206,9 @@ class RequestFactory:
|
|
|
202
206
|
-------
|
|
203
207
|
DataclassInstance | AttrsInstance | PydanticInstance | None
|
|
204
208
|
Dataclass, attrs, or pydantic instance
|
|
209
|
+
Identity | Headers
|
|
210
|
+
If the value is an instance of Identity or Headers, it will be
|
|
211
|
+
returned as is.
|
|
205
212
|
OpenAPIModel
|
|
206
213
|
If the `use_model_class_factory` parameter is set to False, the
|
|
207
214
|
value will be returned as an OpenAPIModel instance.
|
|
@@ -211,6 +218,9 @@ class RequestFactory:
|
|
|
211
218
|
TypeError
|
|
212
219
|
The value is not an instance of the OpenAPI (Base)Model
|
|
213
220
|
"""
|
|
221
|
+
if isinstance(value, (Identity, Headers)):
|
|
222
|
+
return value
|
|
223
|
+
|
|
214
224
|
if not isinstance(value, OpenAPIModel):
|
|
215
225
|
raise TypeError(f"Unable to map {type(value)} on dataclass model")
|
|
216
226
|
|
|
@@ -198,6 +198,7 @@ def {{operationId}}(
|
|
|
198
198
|
auth_token = headers.auth_token if headers.has_auth_token else None
|
|
199
199
|
refresh_token = headers.refresh_token
|
|
200
200
|
api_key = headers.api_key
|
|
201
|
+
cookies = headers.cookies
|
|
201
202
|
|
|
202
203
|
{{#vendorExtensions.x-alpha-factory}}
|
|
203
204
|
factory = {{vendorExtensions.x-alpha-factory}}
|
|
@@ -11,6 +11,27 @@ from alpha.infra.models.json_patch import JsonPatch
|
|
|
11
11
|
class ApiRepository(Protocol[DomainModel]):
|
|
12
12
|
"""Repository contract for remote API resources."""
|
|
13
13
|
|
|
14
|
+
def request(
|
|
15
|
+
self,
|
|
16
|
+
method: str,
|
|
17
|
+
url: str,
|
|
18
|
+
**kwargs: Any,
|
|
19
|
+
) -> Any | None:
|
|
20
|
+
"""Make a custom API request.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
method
|
|
25
|
+
The HTTP method to use for the request (e.g., 'GET', 'POST',
|
|
26
|
+
'PATCH', 'PUT', 'DELETE').
|
|
27
|
+
url
|
|
28
|
+
The URL to which the request should be made.
|
|
29
|
+
**kwargs
|
|
30
|
+
Additional parameters to include in the API request, such as
|
|
31
|
+
headers, authentication tokens, or other request options.
|
|
32
|
+
"""
|
|
33
|
+
...
|
|
34
|
+
|
|
14
35
|
@overload
|
|
15
36
|
def add(
|
|
16
37
|
self,
|
|
@@ -3,7 +3,14 @@ SQLAlchemy ORM repository operations.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from enum import Enum
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import (
|
|
7
|
+
TYPE_CHECKING,
|
|
8
|
+
Any,
|
|
9
|
+
Literal,
|
|
10
|
+
Protocol,
|
|
11
|
+
overload,
|
|
12
|
+
runtime_checkable,
|
|
13
|
+
)
|
|
7
14
|
from uuid import UUID
|
|
8
15
|
|
|
9
16
|
from sqlalchemy.orm import Session
|
|
@@ -12,7 +19,11 @@ from sqlalchemy.orm.attributes import InstrumentedAttribute
|
|
|
12
19
|
from alpha.domain.models.base_model import BaseDomainModel, DomainModel
|
|
13
20
|
from alpha.infra.models.json_patch import JsonPatch
|
|
14
21
|
from alpha.interfaces.patchable import Patchable
|
|
15
|
-
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from alpha.interfaces.updatable import Updatable
|
|
25
|
+
else:
|
|
26
|
+
Updatable = Any
|
|
16
27
|
|
|
17
28
|
|
|
18
29
|
@runtime_checkable
|
alpha/mixins/user_lifecycle.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Contains the UserLifecycleMixin class"""
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from alpha.exceptions import BadRequestException, NotFoundException
|
|
@@ -11,6 +11,8 @@ from alpha.providers.models.identity import Identity
|
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from alpha.domain.models.user import User
|
|
14
|
+
else:
|
|
15
|
+
User = Any
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
class UserLifecycleMixin:
|
|
@@ -20,15 +22,13 @@ class UserLifecycleMixin:
|
|
|
20
22
|
|
|
21
23
|
uow: UnitOfWork
|
|
22
24
|
_users_repository_name: str
|
|
23
|
-
_user_model: type[
|
|
25
|
+
_user_model: type[User]
|
|
24
26
|
_password_support: bool
|
|
25
27
|
_password_factory: PasswordFactory
|
|
26
28
|
_user_username_attribute: str
|
|
27
29
|
_user_password_attribute: str
|
|
28
30
|
|
|
29
|
-
def add_user(
|
|
30
|
-
self, user: "User", identity: Identity | None = None
|
|
31
|
-
) -> "User":
|
|
31
|
+
def add_user(self, user: User, identity: Identity | None = None) -> User:
|
|
32
32
|
"""Adds a new user object to the repository
|
|
33
33
|
|
|
34
34
|
Parameters
|
|
@@ -79,7 +79,7 @@ class UserLifecycleMixin:
|
|
|
79
79
|
self.uow.commit()
|
|
80
80
|
return user
|
|
81
81
|
|
|
82
|
-
def get_user(self, user_id: str | int | UUID) ->
|
|
82
|
+
def get_user(self, user_id: str | int | UUID) -> User:
|
|
83
83
|
"""Get an user object by id from the repository
|
|
84
84
|
|
|
85
85
|
Parameters
|
|
@@ -110,7 +110,7 @@ class UserLifecycleMixin:
|
|
|
110
110
|
|
|
111
111
|
return user
|
|
112
112
|
|
|
113
|
-
def get_users(self) -> list[
|
|
113
|
+
def get_users(self) -> list[User]:
|
|
114
114
|
"""Gets all user objects from the repository
|
|
115
115
|
|
|
116
116
|
Returns
|
|
@@ -119,7 +119,7 @@ class UserLifecycleMixin:
|
|
|
119
119
|
A collection of all the user objects
|
|
120
120
|
"""
|
|
121
121
|
with self.uow:
|
|
122
|
-
users: SqlRepository[
|
|
122
|
+
users: SqlRepository[User] = getattr(
|
|
123
123
|
self.uow, self._users_repository_name
|
|
124
124
|
)
|
|
125
125
|
result = users.select()
|
|
@@ -136,7 +136,7 @@ class UserLifecycleMixin:
|
|
|
136
136
|
"""
|
|
137
137
|
user = self.get_user(user_id=user_id)
|
|
138
138
|
with self.uow:
|
|
139
|
-
users: SqlRepository[
|
|
139
|
+
users: SqlRepository[User] = getattr(
|
|
140
140
|
self.uow, self._users_repository_name
|
|
141
141
|
)
|
|
142
142
|
|
|
@@ -146,9 +146,9 @@ class UserLifecycleMixin:
|
|
|
146
146
|
def update_user(
|
|
147
147
|
self,
|
|
148
148
|
user_id: str | int | UUID,
|
|
149
|
-
user:
|
|
149
|
+
user: User,
|
|
150
150
|
identity: Identity | None = None,
|
|
151
|
-
) ->
|
|
151
|
+
) -> User:
|
|
152
152
|
"""Updates an existing user object in the repository
|
|
153
153
|
|
|
154
154
|
Parameters
|
|
@@ -9,6 +9,8 @@ from alpha.domain.models.group import Group
|
|
|
9
9
|
|
|
10
10
|
if TYPE_CHECKING:
|
|
11
11
|
from alpha.domain.models.user import User
|
|
12
|
+
else:
|
|
13
|
+
User = Any
|
|
12
14
|
|
|
13
15
|
DEFAULT_LDAP_MAPPINGS = {
|
|
14
16
|
"subject": "uid",
|
|
@@ -158,7 +160,7 @@ class Identity:
|
|
|
158
160
|
populate_groups: bool = True,
|
|
159
161
|
populate_permissions: bool = False,
|
|
160
162
|
populate_claims: bool = True,
|
|
161
|
-
) ->
|
|
163
|
+
) -> Identity:
|
|
162
164
|
"""Instantiate an Identity from an LDAP entry dictionary.
|
|
163
165
|
|
|
164
166
|
Parameters
|
|
@@ -211,7 +213,7 @@ class Identity:
|
|
|
211
213
|
)
|
|
212
214
|
|
|
213
215
|
@classmethod
|
|
214
|
-
def from_dict(cls, data: Mapping[str, Any]) ->
|
|
216
|
+
def from_dict(cls, data: Mapping[str, Any]) -> Identity:
|
|
215
217
|
"""Instantiate an Identity from a generic dictionary.
|
|
216
218
|
|
|
217
219
|
Parameters
|
|
@@ -252,7 +254,7 @@ class Identity:
|
|
|
252
254
|
)
|
|
253
255
|
|
|
254
256
|
@classmethod
|
|
255
|
-
def from_user(cls, user: User) ->
|
|
257
|
+
def from_user(cls, user: User) -> Identity:
|
|
256
258
|
"""Instantiate an Identity from a User instance.
|
|
257
259
|
|
|
258
260
|
Parameters
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from alpha import exceptions
|
|
2
|
-
from alpha.
|
|
2
|
+
from alpha.interfaces.sql_database import SqlDatabase
|
|
3
3
|
from alpha.providers.models.token import Token
|
|
4
4
|
|
|
5
5
|
|
|
@@ -15,7 +15,7 @@ class DatabaseRefreshRepository:
|
|
|
15
15
|
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
|
-
database_connector:
|
|
18
|
+
database_connector: SqlDatabase,
|
|
19
19
|
token_model: type[Token] = Token,
|
|
20
20
|
token_max_age_seconds: int = 7 * 24 * 3600,
|
|
21
21
|
token_length: int = 32,
|
alpha/utils/request_headers.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
-
from http import
|
|
2
|
+
from http.cookies import SimpleCookie
|
|
3
3
|
from typing import Mapping, Self
|
|
4
4
|
|
|
5
5
|
|
|
@@ -16,12 +16,28 @@ class Headers:
|
|
|
16
16
|
|
|
17
17
|
This class is designed to be immutable and uses slots for memory
|
|
18
18
|
efficiency.
|
|
19
|
+
|
|
20
|
+
Attributes
|
|
21
|
+
----------
|
|
22
|
+
auth_token
|
|
23
|
+
The authentication token, typically a JWT, extracted from the
|
|
24
|
+
"Authorization" header or from cookies.
|
|
25
|
+
auth_token_type
|
|
26
|
+
The type of the authentication token, typically "Bearer".
|
|
27
|
+
refresh_token
|
|
28
|
+
The refresh token, extracted from the "X-Refresh-Token" header or from
|
|
29
|
+
cookies.
|
|
30
|
+
api_key
|
|
31
|
+
The API key, extracted from the "X-API-Key" header or from cookies.
|
|
32
|
+
cookies
|
|
33
|
+
A mapping of cookie names to their values, if any cookies are present.
|
|
19
34
|
"""
|
|
20
35
|
|
|
21
36
|
auth_token: str | None = None
|
|
22
37
|
auth_token_type: str | None = None
|
|
23
38
|
refresh_token: str | None = None
|
|
24
39
|
api_key: str | None = None
|
|
40
|
+
_cookie_jar: SimpleCookie | None = None
|
|
25
41
|
|
|
26
42
|
@classmethod
|
|
27
43
|
def from_headers(
|
|
@@ -73,8 +89,9 @@ class Headers:
|
|
|
73
89
|
api_key = headers.get("X-API-Key")
|
|
74
90
|
cookies_header = headers.get("Cookie")
|
|
75
91
|
|
|
92
|
+
cookie_jar: SimpleCookie | None = None
|
|
76
93
|
if cookies_header is not None:
|
|
77
|
-
cookie_jar =
|
|
94
|
+
cookie_jar = SimpleCookie(cookies_header)
|
|
78
95
|
|
|
79
96
|
if not auth_token and auth_token_cookie_name in cookie_jar:
|
|
80
97
|
auth_token = cookie_jar[auth_token_cookie_name].value
|
|
@@ -89,6 +106,7 @@ class Headers:
|
|
|
89
106
|
auth_token_type=auth_token_type,
|
|
90
107
|
refresh_token=refresh_token,
|
|
91
108
|
api_key=api_key,
|
|
109
|
+
_cookie_jar=cookie_jar,
|
|
92
110
|
)
|
|
93
111
|
|
|
94
112
|
@property
|
|
@@ -107,6 +125,20 @@ class Headers:
|
|
|
107
125
|
def has_api_key(self) -> bool:
|
|
108
126
|
return True if self.api_key else False
|
|
109
127
|
|
|
128
|
+
@property
|
|
129
|
+
def cookies(self) -> dict[str, str]:
|
|
130
|
+
"""Return a dictionary of cookies extracted from the request headers.
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
dict[str, str]
|
|
135
|
+
A dictionary mapping cookie names to their values. If no cookies
|
|
136
|
+
are present, an empty dictionary is returned.
|
|
137
|
+
"""
|
|
138
|
+
if self._cookie_jar is None:
|
|
139
|
+
return {}
|
|
140
|
+
return self._cookie_jar_to_dict(self._cookie_jar)
|
|
141
|
+
|
|
110
142
|
def __repr__(self) -> str:
|
|
111
143
|
return (
|
|
112
144
|
f"Headers(auth_token={'***' if self.auth_token else None}, "
|
|
@@ -114,3 +146,19 @@ class Headers:
|
|
|
114
146
|
f"refresh_token={'***' if self.refresh_token else None}, "
|
|
115
147
|
f"api_key={'***' if self.api_key else None})"
|
|
116
148
|
)
|
|
149
|
+
|
|
150
|
+
@staticmethod
|
|
151
|
+
def _cookie_jar_to_dict(cookie_jar: SimpleCookie) -> dict[str, str]:
|
|
152
|
+
"""Convert a SimpleCookie object to a dictionary.
|
|
153
|
+
|
|
154
|
+
Parameters
|
|
155
|
+
----------
|
|
156
|
+
cookie_jar
|
|
157
|
+
A SimpleCookie object containing the cookies.
|
|
158
|
+
|
|
159
|
+
Returns
|
|
160
|
+
-------
|
|
161
|
+
dict[str, str]
|
|
162
|
+
A dictionary mapping cookie names to their values.
|
|
163
|
+
"""
|
|
164
|
+
return {key: morsel.value for key, morsel in cookie_jar.items()}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alpha-python
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: Alpha is intended to be the first dependency you need to add to your Python application. It is a Python library which contains standard building blocks that can be used in applications that are used as APIs and/or make use of database interaction.
|
|
5
5
|
Author-email: Bart Reijling <bart@reijling.eu>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -34,7 +34,7 @@ Requires-Dist: argon2-cffi>=25.1.0
|
|
|
34
34
|
Requires-Dist: httpx
|
|
35
35
|
Requires-Dist: cryptography
|
|
36
36
|
Provides-Extra: api-generator
|
|
37
|
-
Requires-Dist: openapi-generator-cli==7.
|
|
37
|
+
Requires-Dist: openapi-generator-cli==7.24.0; extra == "api-generator"
|
|
38
38
|
Requires-Dist: jdk4py; extra == "api-generator"
|
|
39
39
|
Provides-Extra: flask
|
|
40
40
|
Requires-Dist: connexion[swagger-ui]<3,>=2.14.2; extra == "flask"
|
|
@@ -4,17 +4,17 @@ alpha/encoder.py,sha256=dPFDfCofX2ehhOZuC7EEoj00l5sclE-BAvq01oQpo4o,2891
|
|
|
4
4
|
alpha/exceptions.py,sha256=AHoFMPyHvjj6j_1X2TS40dSaFBzCDtgzAmucimSZjfc,5793
|
|
5
5
|
alpha/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
alpha/adapters/__init__.py,sha256=pGpAtLuVs-jOyRShjO1BwSHpB5MyStJ3Hs9wPm49Q2s,201
|
|
7
|
-
alpha/adapters/rest_api_unit_of_work.py,sha256=
|
|
7
|
+
alpha/adapters/rest_api_unit_of_work.py,sha256=ttUjCaNW8wKL93O_dH4XfjSgwMOBhubdxcyt3G_1Qrk,3589
|
|
8
8
|
alpha/adapters/sqla_unit_of_work.py,sha256=NSo1u2DXN4m8sGQpU044qrox24AMLgjUg9jV1Pwq9aI,3992
|
|
9
9
|
alpha/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
alpha/containers/container.py,sha256=NJW3ApUauhtwd2ifHGo0J6-F8eJwGdq3xAe5KGQXXqU,6509
|
|
11
11
|
alpha/domain/__init__.py,sha256=W9QCx29uXMUdmfdWEC0ISeNwZ9OMS3zpCl-fHFFh8So,506
|
|
12
12
|
alpha/domain/models/__init__.py,sha256=W9QCx29uXMUdmfdWEC0ISeNwZ9OMS3zpCl-fHFFh8So,506
|
|
13
13
|
alpha/domain/models/base_model.py,sha256=eI6ff0qugsQhWZahBoGH7xWMVY9Mhss9XdGR3yecG28,1826
|
|
14
|
-
alpha/domain/models/group.py,sha256=
|
|
14
|
+
alpha/domain/models/group.py,sha256=z00kYzPDs-3IZuXWO3hpw_uQYZqK3fcQzMROG5tgOxA,2790
|
|
15
15
|
alpha/domain/models/life_cycle_base.py,sha256=xRwcTPRR0pHwsBN_dyaN8d1AVuKOEF6iNCS0IWZntDY,875
|
|
16
16
|
alpha/domain/models/role.py,sha256=95cUc8VDB7o_IXJdTBF0KFJUyvOfRtpNkxTslzpVqIQ,4614
|
|
17
|
-
alpha/domain/models/user.py,sha256=
|
|
17
|
+
alpha/domain/models/user.py,sha256=VnC6sBdw001ivaH3-SSuPCeeb6A6YYYHowMgfBXprG0,4952
|
|
18
18
|
alpha/factories/__init__.py,sha256=baxoq0UY7UYust7NiR9wT954nJw5bfgSmOWvLjBt2C4,278
|
|
19
19
|
alpha/factories/_type_conversion_matrix.py,sha256=mhMYpus6OFE0sZB0gQ-b1ndIOhiA1ScprvDa9tLANAM,5055
|
|
20
20
|
alpha/factories/_type_mapping.py,sha256=f8cRfu8KUfw1ggY0Txs6fEX2e6GaXrsNcc2SCeYFRHM,789
|
|
@@ -25,7 +25,7 @@ alpha/factories/jwt_factory.py,sha256=ZuamKmi12uZve-TQByppeMlH1aiBNWraejd2wpZuB3
|
|
|
25
25
|
alpha/factories/logging_handler_factory.py,sha256=ZoVkD2S3Pl7NMMfhcFF8k76BlKTsvis75udLX-JqQ30,3063
|
|
26
26
|
alpha/factories/model_class_factory.py,sha256=VK80vLHGF-XdlW3aln5C9tHSQv81NLxz5ti5jYxdv4w,5862
|
|
27
27
|
alpha/factories/password_factory.py,sha256=uK8X5bNvlyUtxvJXH7MXmYLiaM4jmsS6sZrx7Ew07kM,5031
|
|
28
|
-
alpha/factories/request_factory.py,sha256=
|
|
28
|
+
alpha/factories/request_factory.py,sha256=jyMOtya6ppe6gZuauLzCArk6PAYx6oT9RGXUUhKS3aI,7504
|
|
29
29
|
alpha/factories/response_factory.py,sha256=du2tqJdqzTSIpWeC3z8LmVKKZHqrLZ-1G42TBLbIQG4,6749
|
|
30
30
|
alpha/factories/type_factories.py,sha256=3MCSQ1g1neBVPk0cSbhmGED7O4AQNMmBK8OmTLwuaGM,6478
|
|
31
31
|
alpha/factories/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -48,7 +48,7 @@ alpha/handlers/templates/python-flask/__init__model.mustache,sha256=JRwyJmOCAD8n
|
|
|
48
48
|
alpha/handlers/templates/python-flask/__init__test.mustache,sha256=wUxDXcyE4rPh3sDp8MvR5m8vqzoU25Fw1bo_xh6InnY,438
|
|
49
49
|
alpha/handlers/templates/python-flask/__main__.mustache,sha256=D11Z_bhka_NsK3EP8iSzV8_Hcc15L-uOntH2IbzrKng,2942
|
|
50
50
|
alpha/handlers/templates/python-flask/base_model.mustache,sha256=B--jl9LmfiHACq9n1kDxm6YTi6tb1oSUFnZya_IKOhU,2184
|
|
51
|
-
alpha/handlers/templates/python-flask/controller.mustache,sha256=
|
|
51
|
+
alpha/handlers/templates/python-flask/controller.mustache,sha256=PoQ1nOa7wjqH1KEuWSIyC0XZlcz0iqBf9aEHTbPFEuo,18721
|
|
52
52
|
alpha/handlers/templates/python-flask/controller_test.mustache,sha256=2i2cwgQonT1RMJQwdxeq8B3x8-hLjpK7YkI--LkKLOI,2848
|
|
53
53
|
alpha/handlers/templates/python-flask/dockerignore.mustache,sha256=hqlHuqIMLuuwvVqK6xhIcfaezKoChriR3D7TvxtkjGo,906
|
|
54
54
|
alpha/handlers/templates/python-flask/encoder.mustache,sha256=03rsvhN_QdqaWsQC2v3772UvrLEXna9WcvxQsl6mwiU,866
|
|
@@ -79,7 +79,7 @@ alpha/infra/models/order_by.py,sha256=QN4ALsbJ-zoh1dx5OHZ2L9pijwfjBM5G0pBbpNrNHn
|
|
|
79
79
|
alpha/infra/models/query_clause.py,sha256=xLWxm-cWrODMqpqqVIu1veSVBWLENt97TTHq8CinP7M,2555
|
|
80
80
|
alpha/infra/models/search_filter.py,sha256=5Q0lbeAYOnyzudX7HfEwZSzLKC9oJgT62jnHaNrRGmg,21755
|
|
81
81
|
alpha/interfaces/__init__.py,sha256=Pi2aWR9DgamgSnTDZH6VwG_t21ZnaD-J_hvpvgV8b9g,1681
|
|
82
|
-
alpha/interfaces/api_repository.py,sha256=
|
|
82
|
+
alpha/interfaces/api_repository.py,sha256=aem_SDZzUU5TbhHi-FgYhtVBfzEJPIwexo7XWppo6WA,22428
|
|
83
83
|
alpha/interfaces/attrs_instance.py,sha256=56PjY6s0FuoX63EJusFDXsPFJpxRDGZwbD-R19j7RIw,257
|
|
84
84
|
alpha/interfaces/dataclass_instance.py,sha256=BSau0UxwdhuXsp6oKsWnptSx6QTt2uT-vcheqgfsSos,307
|
|
85
85
|
alpha/interfaces/factories.py,sha256=groCMQwUJK6TJefe9Y4rB-q_iGzeetuucMLSY9l7X3s,2673
|
|
@@ -92,14 +92,14 @@ alpha/interfaces/pydantic_instance.py,sha256=S96jLEWRmDyvYV3VqofSqjiN-lcjfkjiNp7
|
|
|
92
92
|
alpha/interfaces/refresh_repository.py,sha256=7D3Rejc6l905Y1DJwHC4SKbPXQrXya-yYzzlG4tPEhQ,1206
|
|
93
93
|
alpha/interfaces/sql_database.py,sha256=-YiMBSrGkd2NTS4FEBjXenlPnVQW2t3SvQJMDRyHDjA,919
|
|
94
94
|
alpha/interfaces/sql_mapper.py,sha256=OSGIwbtlQ5-cBHUIiJfLgJlkBU3MgMAbSdxj8X2v-eI,624
|
|
95
|
-
alpha/interfaces/sql_repository.py,sha256=
|
|
95
|
+
alpha/interfaces/sql_repository.py,sha256=obygYC-6ABjeac94sm93lP458gihS8G-X9b3V7jHkk0,9907
|
|
96
96
|
alpha/interfaces/token_factory.py,sha256=MeSvnyH699vBG0c7Oli4M6RT1wEsCVTNy7V4XQpu31o,1882
|
|
97
97
|
alpha/interfaces/unit_of_work.py,sha256=P32wTGw4N54QV_x2BBusrApANmI88wgA7bLmC-1AozI,1464
|
|
98
98
|
alpha/interfaces/updatable.py,sha256=vGpxvqrn9dCMumP_Ty3EGs-bp3KiPG8l-v-9rfjOLSQ,472
|
|
99
99
|
alpha/mixins/__init__.py,sha256=aPTNpi4JEzdsFW9Joq0ktgtoP2MJqNLOc1uRPxJkl4A,252
|
|
100
100
|
alpha/mixins/group_lifecycle.py,sha256=MxfecqcGaAjtYlQxd-ryX29VYNJVoCBJXWXE3RsGPeQ,4464
|
|
101
101
|
alpha/mixins/jwt_provider.py,sha256=SvBUNmCoJbDnWBCS1C8mD9sJ-08aZnwtOpySskYOGxA,1950
|
|
102
|
-
alpha/mixins/user_lifecycle.py,sha256=
|
|
102
|
+
alpha/mixins/user_lifecycle.py,sha256=iQPHnAobRhNJyZ5is0WfKFpOKy0y_9w_VNiMwQxYp4U,5418
|
|
103
103
|
alpha/providers/__init__.py,sha256=DM0Zu_hYNc9JI7cKVQD7J84lwpv5-GNTntMzM1k_ZPI,938
|
|
104
104
|
alpha/providers/api_key_provider.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
105
105
|
alpha/providers/database_provider.py,sha256=Q0qAdJYgEg1hjVHUenB-Qy-pW69E5p0cZ5IMP_JWE9Q,7974
|
|
@@ -107,7 +107,7 @@ alpha/providers/ldap_provider.py,sha256=R3jCammHPS8Krd4G6W1t-nT7RAmPW-JCoirhJwdr
|
|
|
107
107
|
alpha/providers/oidc_provider.py,sha256=t1ftGcDjZuopuvb0qyPexFdNzhsKhiatxnfLb2HBP8g,13812
|
|
108
108
|
alpha/providers/models/__init__.py,sha256=SI-qTA3JMOxXx4o1h7frk8x3PRj0g_GSCEbLzyvw7CI,409
|
|
109
109
|
alpha/providers/models/credentials.py,sha256=IjGm1MpnUrwnTo1Of5eacNtkh72Iqj2uKTsoyq1po_o,1304
|
|
110
|
-
alpha/providers/models/identity.py,sha256=
|
|
110
|
+
alpha/providers/models/identity.py,sha256=wAG8BfQtn33ieKunZl3PzzQNorK6I-2LVZin8uTA1L8,14993
|
|
111
111
|
alpha/providers/models/token.py,sha256=xLiE-bWufbcWgkKpar5R2VAE8YhjyhWF44yN0Me9sJw,4793
|
|
112
112
|
alpha/repositories/__init__.py,sha256=i4kyfLbLSHUzrqDF9Q96CgEaK-srPtEIspUD6uUjElk,787
|
|
113
113
|
alpha/repositories/rest_api_repository.py,sha256=BC_M5_HPwWKwMRsHI2PNCmqu0SC5Tw9ZGhZ7eaLIFgw,48702
|
|
@@ -116,7 +116,7 @@ alpha/repositories/models/__init__.py,sha256=PY3kFG0z5r5ALcwBFXVNO9GAVNn1tVTkvUp
|
|
|
116
116
|
alpha/repositories/models/repository_model.py,sha256=WpfW90HpDvwDK5jcqNcprIKugqxcMaQWoqEFEgr0FoA,1038
|
|
117
117
|
alpha/repositories/refresh/__init__.py,sha256=7iik5l6yHvUiUCSrm66IJpUff-z6XVJJxGqluZz2tF0,496
|
|
118
118
|
alpha/repositories/refresh/cache_repository.py,sha256=Z9uopwKT0r0_nYKGXLbyAcgMFRuUFXzzZHhE6dtK3l0,2319
|
|
119
|
-
alpha/repositories/refresh/database_repository.py,sha256=
|
|
119
|
+
alpha/repositories/refresh/database_repository.py,sha256=b5Z0_nVairZOaqQ6OBb6_X2L0PyoXNARRx0eY9JaJFA,4780
|
|
120
120
|
alpha/repositories/refresh/file_repository.py,sha256=EoygSFD7XLzSmnY1W2d3pdlNbQ0rcxwhRGNrlbMH62g,5490
|
|
121
121
|
alpha/repositories/refresh/memory_repository.py,sha256=r0P2DVgTTDSqV8g1OaNf8knqpiysb-LaWW0pdS2wZaQ,3926
|
|
122
122
|
alpha/services/__init__.py,sha256=yeUbS-N0127DSejbCAv9jbdKuHRa_H5Ue0CtsWf4ghI,224
|
|
@@ -131,7 +131,7 @@ alpha/utils/is_attrs.py,sha256=7EOltIJlhK9uF_nVLLCbaQV5EH8PO-ssqZcTs94y3Ic,426
|
|
|
131
131
|
alpha/utils/is_pydantic.py,sha256=-P4n3n59_YftVqvIIQ_GovxUxQMFIt8htTDd0j2hFis,629
|
|
132
132
|
alpha/utils/logging_configurator.py,sha256=wnwcBjI4wzvz2R0oMgEHffoGo9FfgPhf-1ZIlA9Eydo,3817
|
|
133
133
|
alpha/utils/logging_level_checker.py,sha256=elCxkVW07BnVGPhIHf_TQyHCAPpdNY8xp5bszrziRS0,697
|
|
134
|
-
alpha/utils/request_headers.py,sha256=
|
|
134
|
+
alpha/utils/request_headers.py,sha256=n5iwnyDPQ8myqk5i7ETThDTE3_qnl5Z6E-E81i_L_jk,5909
|
|
135
135
|
alpha/utils/response_object.py,sha256=UsmL50ziE2rRjGLdzGEdQ99YWTUbIUWjBN7OGO4cneg,7811
|
|
136
136
|
alpha/utils/secret_generator.py,sha256=LjsKb8oDfsfmCCcTKrqtw_duqJ7u3V_o6zGGuG26_XE,393
|
|
137
137
|
alpha/utils/verify_identity.py,sha256=Y1pdcVl8Z_I4ibw2KY7i5QwTQrY29WwpBOJ6j0YOAow,2271
|
|
@@ -143,9 +143,9 @@ alpha/utils/openapi_test/models.py,sha256=POqDD2v2VqPmVLnbvgZ0kVlVzL9Are1oFHmuyy
|
|
|
143
143
|
alpha/utils/openapi_test/orm.py,sha256=Py95GV_0e7wI1MYDZR1_EHkvTgev6eNo70SVmnD7kGc,3045
|
|
144
144
|
alpha/utils/openapi_test/response.py,sha256=IxbQ6Nw258LLViHkgfjOpc7zWGTP8ofVOX1zrwDoR50,270
|
|
145
145
|
alpha/utils/openapi_test/service.py,sha256=ycrEUlQmygKthnOhEiir-wtbPFi5cT-bepVclaL9FAk,5003
|
|
146
|
-
alpha_python-0.7.
|
|
147
|
-
alpha_python-0.7.
|
|
148
|
-
alpha_python-0.7.
|
|
149
|
-
alpha_python-0.7.
|
|
150
|
-
alpha_python-0.7.
|
|
151
|
-
alpha_python-0.7.
|
|
146
|
+
alpha_python-0.7.4.dist-info/licenses/LICENSE,sha256=5KwEqC3KUoH4lVXgZ9tGriKOl-LGxHkXBWo16mFmAYM,1070
|
|
147
|
+
alpha_python-0.7.4.dist-info/METADATA,sha256=lezhQhf7GAVLhYWKZL8XK2qUcxu_qwI5-MDaac3oFGU,8645
|
|
148
|
+
alpha_python-0.7.4.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
|
|
149
|
+
alpha_python-0.7.4.dist-info/entry_points.txt,sha256=LBEXdcofOugYYdZ46nz5Dxj_aj1QbRBkumfPGhy-GXI,41
|
|
150
|
+
alpha_python-0.7.4.dist-info/top_level.txt,sha256=tqmNnOmi2RSSiPo99C03fD5Cc3r9za9xTjPAoQC1EGA,6
|
|
151
|
+
alpha_python-0.7.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|