alpha-python 0.7.3__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.
@@ -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: requests.sessions.Session | None = None,
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
- Initializes a :class:`requests.sessions.Session` if one was not
48
- provided and attaches the configured repositories as attributes on the
49
- unit of work instance. Each repository is constructed using the shared
50
- session and its associated configuration, and optionally validated
51
- against a declared interface.
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 = self._session or requests.sessions.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) -> requests.sessions.Session | None:
107
+ def session(self) -> HTTPClient | None:
104
108
  """Get the current session.
105
109
 
106
110
  Returns
107
111
  -------
108
- requests.sessions.Session | None
112
+ HTTPClient | None
109
113
  The current session used for API interactions.
110
114
  """
111
115
  return self._session
@@ -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, Sequence, cast
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: Sequence[str] | None = None
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]:
@@ -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, Sequence, cast
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: Sequence[str] | None = None
71
- groups: Sequence[str | Group] | None = None
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 Any, Literal, Protocol, overload, runtime_checkable
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
- from alpha.interfaces.updatable import Updatable
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
@@ -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["User"]
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) -> "User":
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["User"]:
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["User"] = getattr(
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["User"] = getattr(
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: "User",
149
+ user: User,
150
150
  identity: Identity | None = None,
151
- ) -> "User":
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
- ) -> "Identity":
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]) -> "Identity":
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) -> "Identity":
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.infra.connectors.sql_alchemy import SqlAlchemyDatabase
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: SqlAlchemyDatabase,
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,
@@ -1,5 +1,5 @@
1
1
  from dataclasses import dataclass
2
- from http import cookies
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 = cookies.SimpleCookie(cookies_header)
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
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
@@ -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=nxLQCV1Sj4Cm3bmwZ_QHG1o4yl8_vezpbVa1wVJ-szk,3548
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=NGrAdqs7pbMfGnJ1q8UgyyWGO1vzEpT2pRDSc_tHqRQ,2765
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=i1ah2_oeo995FrOxCPX0wXD2rb6pJtPSXgZW1YAho74,4899
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=vjkvsBkKKUZ7me5a8cEcFYet03qnUZ6f5Qyktfxospw,7159
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=wDY6EcZ6UiCkBXQKVrzhbOn_zAY6szW3jYNI0LiMohs,18691
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=MyP_cxTOh5QnrTWJZOUeigtqiW_8NxnBpwR8uQxFoLw,21856
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=nJCdF_G8YS7_VST_OL14wBA_Ne_DyGZhQQDAta1zqYk,9814
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=5Qjd29jVj3Qi4RNolpTDdFqot1WyiFk_-HA8b8QCbdQ,5424
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=6-OezJs7Ld_4HIcnAHKREymDcOUhV5YmR7JJNVYxrrA,14978
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=xcCnQtOeeZjRihMYzedLGKkPwKcwz1g29S9xB-WfZqo,4799
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=z_0mDT4NoQimG1zPCyM5-7T64BJ91eQXNILuIc08cYI,4310
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.3.dist-info/licenses/LICENSE,sha256=5KwEqC3KUoH4lVXgZ9tGriKOl-LGxHkXBWo16mFmAYM,1070
147
- alpha_python-0.7.3.dist-info/METADATA,sha256=qj7sHoKVVtUwGtdxX0RqsvzgdV_lgLvlmeOseXP7TH4,8645
148
- alpha_python-0.7.3.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
149
- alpha_python-0.7.3.dist-info/entry_points.txt,sha256=LBEXdcofOugYYdZ46nz5Dxj_aj1QbRBkumfPGhy-GXI,41
150
- alpha_python-0.7.3.dist-info/top_level.txt,sha256=tqmNnOmi2RSSiPo99C03fD5Cc3r9za9xTjPAoQC1EGA,6
151
- alpha_python-0.7.3.dist-info/RECORD,,
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,,