alpha-python 0.7.7__py3-none-any.whl → 0.7.9__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/domain/models/user.py +13 -0
- alpha/factories/field_iterator.py +3 -0
- alpha/factories/request_factory.py +6 -2
- alpha/handlers/templates/python-flask/__main__.mustache +31 -10
- alpha/infra/connectors/sql_alchemy.py +2 -2
- alpha/providers/models/identity.py +13 -6
- alpha/services/authentication_service.py +2 -1
- alpha/utils/openapi_test/container.py +4 -1
- alpha/utils/openapi_test/models.py +72 -3
- alpha/utils/openapi_test/service.py +34 -50
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/METADATA +1 -1
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/RECORD +16 -16
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/WHEEL +0 -0
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/entry_points.txt +0 -0
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/licenses/LICENSE +0 -0
- {alpha_python-0.7.7.dist-info → alpha_python-0.7.9.dist-info}/top_level.txt +0 -0
alpha/domain/models/user.py
CHANGED
|
@@ -205,3 +205,16 @@ class User(LifeCycleBase, BaseDomainModel):
|
|
|
205
205
|
self.admin = obj.admin
|
|
206
206
|
|
|
207
207
|
return cast(DomainModel, self)
|
|
208
|
+
|
|
209
|
+
def update_from_identity(self, identity: Identity) -> Self:
|
|
210
|
+
"""Update the User instance with data from an Identity instance. Only
|
|
211
|
+
the email and display name are updated.
|
|
212
|
+
|
|
213
|
+
Parameters
|
|
214
|
+
----------
|
|
215
|
+
identity
|
|
216
|
+
Identity object to update from.
|
|
217
|
+
"""
|
|
218
|
+
self.email = identity.email
|
|
219
|
+
self.display_name = identity.display_name
|
|
220
|
+
return self
|
|
@@ -131,6 +131,8 @@ class Field:
|
|
|
131
131
|
|
|
132
132
|
Parameters
|
|
133
133
|
----------
|
|
134
|
+
key
|
|
135
|
+
Name of the pydantic field
|
|
134
136
|
obj
|
|
135
137
|
pydantic Field
|
|
136
138
|
|
|
@@ -140,6 +142,7 @@ class Field:
|
|
|
140
142
|
Field object
|
|
141
143
|
"""
|
|
142
144
|
init = getattr(obj, "init", True)
|
|
145
|
+
init = init if init is not None else True
|
|
143
146
|
type = getattr(obj, "annotation", None)
|
|
144
147
|
default = getattr(obj, "default", MISSING)
|
|
145
148
|
|
|
@@ -160,7 +160,9 @@ class RequestFactory:
|
|
|
160
160
|
for item in value
|
|
161
161
|
]
|
|
162
162
|
|
|
163
|
-
if isinstance(
|
|
163
|
+
if isinstance(
|
|
164
|
+
cls, (DataclassInstance | AttrsInstance | PydanticInstance)
|
|
165
|
+
):
|
|
164
166
|
return self._to_dataclass(value=value, cls=cls)
|
|
165
167
|
|
|
166
168
|
if isinstance(cls, type(Enum)):
|
|
@@ -181,7 +183,9 @@ class RequestFactory:
|
|
|
181
183
|
return value
|
|
182
184
|
|
|
183
185
|
def _to_dataclass(
|
|
184
|
-
self,
|
|
186
|
+
self,
|
|
187
|
+
value: OpenAPIModel | Any,
|
|
188
|
+
cls: DataclassInstance | AttrsInstance | PydanticInstance,
|
|
185
189
|
) -> (
|
|
186
190
|
DataclassInstance
|
|
187
191
|
| AttrsInstance
|
|
@@ -36,9 +36,6 @@ if os.getenv('FLASK_ENV') != 'production':
|
|
|
36
36
|
|
|
37
37
|
app = connexion.App(__name__, specification_dir='./openapi/')
|
|
38
38
|
app.app.json_encoder = JSONEncoder
|
|
39
|
-
app.add_api('openapi.yaml',
|
|
40
|
-
arguments={'title': '{{appName}}'},
|
|
41
|
-
pythonic_params=True)
|
|
42
39
|
|
|
43
40
|
compress = Compress()
|
|
44
41
|
compress.init_app(app.app)
|
|
@@ -57,19 +54,37 @@ LoggingConfigurator(
|
|
|
57
54
|
)
|
|
58
55
|
{{/disableLoggingConfigurator}}
|
|
59
56
|
{{#featureCORS}}
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
origins = container.config.cors.origins()
|
|
58
|
+
supports_credentials = container.config.cors.supports_credentials()
|
|
59
|
+
|
|
60
|
+
if origins is None:
|
|
62
61
|
logging.info(
|
|
63
62
|
"CORS origins not configured, defaulting to allow all origins"
|
|
64
63
|
)
|
|
65
|
-
|
|
66
|
-
logging.info(f"Enabling CORS for origins: {
|
|
67
|
-
CORS(
|
|
64
|
+
origins = ["*"]
|
|
65
|
+
logging.info(f"Enabling CORS for origins: {origins}")
|
|
66
|
+
CORS(
|
|
67
|
+
app.app,
|
|
68
|
+
origins=origins,
|
|
69
|
+
supports_credentials=supports_credentials or False,
|
|
70
|
+
resources=container.config.cors.resources() or r"/*",
|
|
71
|
+
methods=container.config.cors.methods() or ["GET", "HEAD", "POST", "OPTIONS", "PUT", "PATCH", "DELETE"],
|
|
72
|
+
allow_headers=container.config.cors.allow_headers() or "*",
|
|
73
|
+
expose_headers=container.config.cors.expose_headers(),
|
|
74
|
+
max_age=container.config.cors.max_age(),
|
|
75
|
+
vary_header=container.config.cors.vary_header() or True,
|
|
76
|
+
send_wildcard=container.config.cors.send_wildcard() or False,
|
|
77
|
+
)
|
|
68
78
|
{{/featureCORS}}
|
|
69
|
-
|
|
70
|
-
app.container = container
|
|
71
79
|
{{/initContainerFunction}}
|
|
72
80
|
|
|
81
|
+
app.add_api(
|
|
82
|
+
'openapi.yaml',
|
|
83
|
+
arguments={'title': '{{appName}}'},
|
|
84
|
+
pythonic_params=True
|
|
85
|
+
)
|
|
86
|
+
{{#initContainerFunction}}app.container = container{{/initContainerFunction}}
|
|
87
|
+
|
|
73
88
|
|
|
74
89
|
@app.app.after_request
|
|
75
90
|
def add_headers(response: Response):
|
|
@@ -93,6 +108,12 @@ def add_headers(response: Response):
|
|
|
93
108
|
):
|
|
94
109
|
continue
|
|
95
110
|
response.headers[header] = value
|
|
111
|
+
{{#featureCORS}}
|
|
112
|
+
request_origin = request.headers.get("Origin", None)
|
|
113
|
+
if supports_credentials and request_origin:
|
|
114
|
+
response.headers["Access-Control-Allow-Origin"] = request_origin
|
|
115
|
+
response.headers["Access-Control-Allow-Credentials"] = "true"
|
|
116
|
+
{{/featureCORS}}
|
|
96
117
|
return response
|
|
97
118
|
|
|
98
119
|
logging.info(f'Started {{servicePackage}} API on \'{socket.gethostname()}\'')
|
|
@@ -32,7 +32,7 @@ class SqlAlchemyDatabase:
|
|
|
32
32
|
db_name
|
|
33
33
|
Database name, by default ""
|
|
34
34
|
db_type
|
|
35
|
-
Database type, by default "postgresql"
|
|
35
|
+
Database type and driver, by default "postgresql+psycopg2"
|
|
36
36
|
conn_str
|
|
37
37
|
Connection string. Can be used instead of host, port, username,
|
|
38
38
|
password, and db_name, by default None
|
|
@@ -55,7 +55,7 @@ class SqlAlchemyDatabase:
|
|
|
55
55
|
username: str = "",
|
|
56
56
|
password: str = "",
|
|
57
57
|
db_name: str = "",
|
|
58
|
-
db_type: str = "postgresql",
|
|
58
|
+
db_type: str = "postgresql+psycopg2",
|
|
59
59
|
conn_str: str | None = None,
|
|
60
60
|
schema_name: str = "public",
|
|
61
61
|
create_schema: bool = True,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
+
from enum import Enum
|
|
4
5
|
from typing import Mapping, Any, Self, Sequence, TYPE_CHECKING, cast
|
|
5
6
|
from datetime import datetime, timezone
|
|
6
7
|
|
|
@@ -321,18 +322,24 @@ class Identity:
|
|
|
321
322
|
User object to update from.
|
|
322
323
|
"""
|
|
323
324
|
self.username = user.username
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
325
|
+
self.role = (
|
|
326
|
+
user.role.name if isinstance(user.role, Enum) else user.role
|
|
327
|
+
)
|
|
328
|
+
self.admin = user.admin
|
|
328
329
|
for permission in user.permissions or []:
|
|
329
330
|
self.permissions = self._append_on_sequence(
|
|
330
331
|
self.permissions, str(permission)
|
|
331
332
|
)
|
|
332
333
|
for group in user.groups or []:
|
|
333
334
|
self.groups = self._append_on_sequence(self.groups, str(group))
|
|
334
|
-
|
|
335
|
-
|
|
335
|
+
|
|
336
|
+
# Update email and display name only if they are not already set. This
|
|
337
|
+
# ensures that existing values which are provided by an identity
|
|
338
|
+
# provider are not overwritten.
|
|
339
|
+
if not self.email:
|
|
340
|
+
self.email = user.email
|
|
341
|
+
if not self.display_name:
|
|
342
|
+
self.display_name = user.display_name
|
|
336
343
|
|
|
337
344
|
def update_from_groups(self, groups: list[Group]) -> None:
|
|
338
345
|
"""Update the Identity permissions with data from a list of Group
|
|
@@ -622,12 +622,13 @@ class AuthenticationService:
|
|
|
622
622
|
)
|
|
623
623
|
if user:
|
|
624
624
|
identity.update_from_user(user)
|
|
625
|
+
user.update_from_identity(identity)
|
|
625
626
|
|
|
626
627
|
else:
|
|
627
628
|
# Create new user from identity if not found in database
|
|
628
629
|
user = self._user_model.from_identity(identity)
|
|
629
630
|
users.add(user)
|
|
630
|
-
|
|
631
|
+
self.uow.commit()
|
|
631
632
|
|
|
632
633
|
return identity
|
|
633
634
|
|
|
@@ -147,7 +147,9 @@ def init_container():
|
|
|
147
147
|
"username": os.getenv("TEST_PSQL_USERNAME", "postgres"),
|
|
148
148
|
"password": os.getenv("TEST_PSQL_PASSWORD", "postgres"),
|
|
149
149
|
"db_name": os.getenv("TEST_PSQL_DB_NAME", "postgres"),
|
|
150
|
-
"db_type": os.getenv(
|
|
150
|
+
"db_type": os.getenv(
|
|
151
|
+
"TEST_PSQL_DB_TYPE", "postgresql+psycopg2"
|
|
152
|
+
),
|
|
151
153
|
},
|
|
152
154
|
"authentication": {
|
|
153
155
|
"use_cookies": True,
|
|
@@ -175,6 +177,7 @@ def init_container():
|
|
|
175
177
|
},
|
|
176
178
|
"cors": {
|
|
177
179
|
"origins": ["*"],
|
|
180
|
+
"supports_credentials": True,
|
|
178
181
|
},
|
|
179
182
|
"jwt": {
|
|
180
183
|
"secret": "supersecretkey0123456789",
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from typing import Any, Literal, Self, Sequence
|
|
1
|
+
from datetime import datetime, timedelta, timezone, date
|
|
2
|
+
from typing import Any, Literal, Self, Sequence, Optional, Type, TypeVar
|
|
4
3
|
from uuid import UUID
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from attrs import define
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
from enum import Enum, auto
|
|
5
8
|
|
|
6
9
|
from alpha.domain.models.base_model import BaseDomainModel
|
|
7
10
|
from alpha.providers.models.identity import Identity
|
|
@@ -59,6 +62,9 @@ class TestUser(LifeCycleBase, BaseDomainModel):
|
|
|
59
62
|
display_name=identity.display_name,
|
|
60
63
|
)
|
|
61
64
|
|
|
65
|
+
def update_from_identity(self, identity: Identity) -> None:
|
|
66
|
+
return None
|
|
67
|
+
|
|
62
68
|
|
|
63
69
|
@dataclass
|
|
64
70
|
class TestToken(BaseDomainModel):
|
|
@@ -119,3 +125,66 @@ class TestToken(BaseDomainModel):
|
|
|
119
125
|
obj["expires_at"] = self.expires_at.isoformat()
|
|
120
126
|
|
|
121
127
|
return obj
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
P = TypeVar("P", bound="Pet")
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class PetType(Enum):
|
|
134
|
+
NONE = 0
|
|
135
|
+
DOG = auto()
|
|
136
|
+
CAT = auto()
|
|
137
|
+
RABBIT = auto()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@dataclass
|
|
141
|
+
class Pet:
|
|
142
|
+
name: str
|
|
143
|
+
pet_type: PetType
|
|
144
|
+
date_of_birth: date
|
|
145
|
+
weight: Optional[float] = None
|
|
146
|
+
good_boy: Optional[bool] = None
|
|
147
|
+
id: int = field(default=1)
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def age(self) -> int:
|
|
151
|
+
delta = date(2022, 2, 2) - self.date_of_birth
|
|
152
|
+
return delta.days // 365
|
|
153
|
+
|
|
154
|
+
def to_dict(self) -> dict[str, Any]:
|
|
155
|
+
return {
|
|
156
|
+
"id": 1,
|
|
157
|
+
"name": self.name,
|
|
158
|
+
"pet_type": self.pet_type.name,
|
|
159
|
+
"age": self.age,
|
|
160
|
+
"weight": self.weight,
|
|
161
|
+
"good_boy": self.good_boy,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def factory(cls: Type[P], **kwargs) -> P:
|
|
166
|
+
return cls(
|
|
167
|
+
name=kwargs["name"],
|
|
168
|
+
pet_type=PetType[kwargs["pet_type"]],
|
|
169
|
+
date_of_birth=kwargs["date_of_birth"],
|
|
170
|
+
good_boy=kwargs["good_boy"],
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@define
|
|
175
|
+
class AttrsPet:
|
|
176
|
+
name: str
|
|
177
|
+
pet_type: PetType
|
|
178
|
+
date_of_birth: date
|
|
179
|
+
weight: Optional[float] = None
|
|
180
|
+
good_boy: Optional[bool] = None
|
|
181
|
+
id: int = 1
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class PydanticPet(BaseModel):
|
|
185
|
+
name: str
|
|
186
|
+
pet_type: PetType
|
|
187
|
+
date_of_birth: date
|
|
188
|
+
weight: Optional[float] = None
|
|
189
|
+
good_boy: Optional[bool] = None
|
|
190
|
+
id: int = 1
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
from copy import deepcopy
|
|
2
2
|
import datetime
|
|
3
|
-
from
|
|
4
|
-
from enum import Enum, auto
|
|
5
|
-
from typing import Any, Optional, Type, TypeVar
|
|
6
|
-
|
|
3
|
+
from typing import Any
|
|
7
4
|
import dateutil
|
|
8
5
|
from werkzeug.datastructures import FileStorage
|
|
9
6
|
|
|
@@ -23,52 +20,10 @@ from alpha.exceptions import (
|
|
|
23
20
|
UnauthorizedException,
|
|
24
21
|
UnprocessableContentException,
|
|
25
22
|
)
|
|
23
|
+
from alpha.utils.openapi_test.models import AttrsPet, Pet, PetType, PydanticPet
|
|
26
24
|
|
|
27
25
|
from . import exceptions
|
|
28
26
|
|
|
29
|
-
P = TypeVar("P", bound="Pet")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class PetType(Enum):
|
|
33
|
-
NONE = 0
|
|
34
|
-
DOG = auto()
|
|
35
|
-
CAT = auto()
|
|
36
|
-
RABBIT = auto()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@dataclass
|
|
40
|
-
class Pet:
|
|
41
|
-
name: str
|
|
42
|
-
pet_type: PetType
|
|
43
|
-
date_of_birth: datetime.date
|
|
44
|
-
weight: Optional[float] = None
|
|
45
|
-
good_boy: Optional[bool] = None
|
|
46
|
-
id: int = field(default=1)
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def age(self) -> int:
|
|
50
|
-
delta = datetime.date(2022, 2, 2) - self.date_of_birth
|
|
51
|
-
return delta.days // 365
|
|
52
|
-
|
|
53
|
-
def to_dict(self) -> dict[str, Any]:
|
|
54
|
-
return {
|
|
55
|
-
"id": 1,
|
|
56
|
-
"name": self.name,
|
|
57
|
-
"pet_type": self.pet_type.name,
|
|
58
|
-
"age": self.age,
|
|
59
|
-
"weight": self.weight,
|
|
60
|
-
"good_boy": self.good_boy,
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
@classmethod
|
|
64
|
-
def factory(cls: Type[P], **kwargs) -> P:
|
|
65
|
-
return cls(
|
|
66
|
-
name=kwargs["name"],
|
|
67
|
-
pet_type=PetType[kwargs["pet_type"]],
|
|
68
|
-
date_of_birth=kwargs["date_of_birth"],
|
|
69
|
-
good_boy=kwargs["good_boy"],
|
|
70
|
-
)
|
|
71
|
-
|
|
72
27
|
|
|
73
28
|
class TestService:
|
|
74
29
|
@staticmethod
|
|
@@ -103,15 +58,44 @@ class TestService:
|
|
|
103
58
|
"The object is not an instance of Pet"
|
|
104
59
|
)
|
|
105
60
|
|
|
61
|
+
def check_attrs_class(self, pet: AttrsPet) -> AttrsPet:
|
|
62
|
+
if isinstance(pet, AttrsPet):
|
|
63
|
+
return pet
|
|
64
|
+
raise exceptions.InvalidInstance(
|
|
65
|
+
"The object is not an instance of AttrsPet; received type: "
|
|
66
|
+
f"{type(pet)}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def check_pydantic_class(self, pet: PydanticPet) -> PydanticPet:
|
|
70
|
+
if isinstance(pet, PydanticPet):
|
|
71
|
+
return pet
|
|
72
|
+
raise exceptions.InvalidInstance(
|
|
73
|
+
"The object is not an instance of PydanticPet; received type: "
|
|
74
|
+
f"{type(pet)}"
|
|
75
|
+
)
|
|
76
|
+
|
|
106
77
|
def check_dataclass_return_list(self, pet: Pet) -> list[Pet]:
|
|
107
78
|
if isinstance(pet, Pet):
|
|
108
79
|
pet2 = deepcopy(pet)
|
|
109
80
|
pet2.id = 2
|
|
110
81
|
pet2.name = "Dug"
|
|
111
82
|
return [pet, pet2]
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
83
|
+
|
|
84
|
+
def check_attrs_class_return_list(self, pet: AttrsPet) -> list[AttrsPet]:
|
|
85
|
+
if isinstance(pet, AttrsPet):
|
|
86
|
+
pet2 = deepcopy(pet)
|
|
87
|
+
pet2.id = 2
|
|
88
|
+
pet2.name = "Dug"
|
|
89
|
+
return [pet, pet2]
|
|
90
|
+
|
|
91
|
+
def check_pydantic_class_return_list(
|
|
92
|
+
self, pet: PydanticPet
|
|
93
|
+
) -> list[PydanticPet]:
|
|
94
|
+
if isinstance(pet, PydanticPet):
|
|
95
|
+
pet2 = deepcopy(pet)
|
|
96
|
+
pet2.id = 2
|
|
97
|
+
pet2.name = "Dug"
|
|
98
|
+
return [pet, pet2]
|
|
115
99
|
|
|
116
100
|
def handle4xx(self, pet: Pet) -> Any:
|
|
117
101
|
if pet.weight and pet.weight < 0:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alpha-python
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.9
|
|
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
|
|
@@ -15,18 +15,18 @@ alpha/domain/models/group.py,sha256=yrSDbt1MsQ-8rYl57jKlA-gJAn8q_qseT7T0LwgvFSs,
|
|
|
15
15
|
alpha/domain/models/life_cycle_base.py,sha256=xRwcTPRR0pHwsBN_dyaN8d1AVuKOEF6iNCS0IWZntDY,875
|
|
16
16
|
alpha/domain/models/permission.py,sha256=pqFu6WnqEqry9x8InPhXNTZInLcoY7fb9Fk8jMBRISw,3195
|
|
17
17
|
alpha/domain/models/role.py,sha256=95cUc8VDB7o_IXJdTBF0KFJUyvOfRtpNkxTslzpVqIQ,4614
|
|
18
|
-
alpha/domain/models/user.py,sha256=
|
|
18
|
+
alpha/domain/models/user.py,sha256=zGyABzzQo1qWiI4CtFoD1J9GF3CwPj1UbxhIIrNqc-8,7277
|
|
19
19
|
alpha/factories/__init__.py,sha256=baxoq0UY7UYust7NiR9wT954nJw5bfgSmOWvLjBt2C4,278
|
|
20
20
|
alpha/factories/_type_conversion_matrix.py,sha256=mhMYpus6OFE0sZB0gQ-b1ndIOhiA1ScprvDa9tLANAM,5055
|
|
21
21
|
alpha/factories/_type_mapping.py,sha256=f8cRfu8KUfw1ggY0Txs6fEX2e6GaXrsNcc2SCeYFRHM,789
|
|
22
22
|
alpha/factories/class_factories.py,sha256=e0NCQDU1qCOQxoApICjZi3dnLLZ85Py5JOHqzLRbOSQ,17131
|
|
23
23
|
alpha/factories/default_field_factory.py,sha256=J8fM48Yar1KpXX8SR1iB3buGr1hkYeayH5IYWoBqaHk,1770
|
|
24
|
-
alpha/factories/field_iterator.py,sha256=
|
|
24
|
+
alpha/factories/field_iterator.py,sha256=PlExqVAmeYmlnE_iJ-tcAuIHiIgwwmqmlX-vYrkTAQY,6406
|
|
25
25
|
alpha/factories/jwt_factory.py,sha256=ZuamKmi12uZve-TQByppeMlH1aiBNWraejd2wpZuB3k,8429
|
|
26
26
|
alpha/factories/logging_handler_factory.py,sha256=ZoVkD2S3Pl7NMMfhcFF8k76BlKTsvis75udLX-JqQ30,3063
|
|
27
27
|
alpha/factories/model_class_factory.py,sha256=VK80vLHGF-XdlW3aln5C9tHSQv81NLxz5ti5jYxdv4w,5862
|
|
28
28
|
alpha/factories/password_factory.py,sha256=uK8X5bNvlyUtxvJXH7MXmYLiaM4jmsS6sZrx7Ew07kM,5031
|
|
29
|
-
alpha/factories/request_factory.py,sha256=
|
|
29
|
+
alpha/factories/request_factory.py,sha256=qDAiMvPmH-YcG7fAIRE5vjgnw-26MmbB16DV7-6s-bY,7615
|
|
30
30
|
alpha/factories/response_factory.py,sha256=du2tqJdqzTSIpWeC3z8LmVKKZHqrLZ-1G42TBLbIQG4,6749
|
|
31
31
|
alpha/factories/type_factories.py,sha256=3MCSQ1g1neBVPk0cSbhmGED7O4AQNMmBK8OmTLwuaGM,6478
|
|
32
32
|
alpha/factories/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -47,7 +47,7 @@ alpha/handlers/templates/python-flask/Dockerfile.mustache,sha256=nyginFsU-nKyq0b
|
|
|
47
47
|
alpha/handlers/templates/python-flask/README.mustache,sha256=X-giJMN_juUrVoW2mj_2Npw6q1s8NGsAgToK2um3NLQ,1368
|
|
48
48
|
alpha/handlers/templates/python-flask/__init__model.mustache,sha256=JRwyJmOCAD8nskG1DnYjt7orBTmza8qPQ2N24JaPcuY,209
|
|
49
49
|
alpha/handlers/templates/python-flask/__init__test.mustache,sha256=wUxDXcyE4rPh3sDp8MvR5m8vqzoU25Fw1bo_xh6InnY,438
|
|
50
|
-
alpha/handlers/templates/python-flask/__main__.mustache,sha256=
|
|
50
|
+
alpha/handlers/templates/python-flask/__main__.mustache,sha256=LN4FxQyvsCGAYQlD2ccdYIY0hyY1DBi-3Apncia350w,3847
|
|
51
51
|
alpha/handlers/templates/python-flask/base_model.mustache,sha256=B--jl9LmfiHACq9n1kDxm6YTi6tb1oSUFnZya_IKOhU,2184
|
|
52
52
|
alpha/handlers/templates/python-flask/controller.mustache,sha256=PoQ1nOa7wjqH1KEuWSIyC0XZlcz0iqBf9aEHTbPFEuo,18721
|
|
53
53
|
alpha/handlers/templates/python-flask/controller_test.mustache,sha256=2i2cwgQonT1RMJQwdxeq8B3x8-hLjpK7YkI--LkKLOI,2848
|
|
@@ -70,7 +70,7 @@ alpha/infra/__init__.py,sha256=4eIKsW1N06_vVBrO2u1ESU5iURBb0cGvxcscaPsB4PE,1018
|
|
|
70
70
|
alpha/infra/connectors/__init__.py,sha256=kEh_mOIIqkWeY4cilislM8ZjKXNFp8zBuMThfbJ1CGc,647
|
|
71
71
|
alpha/infra/connectors/ldap_connector.py,sha256=Ce2IspqcrTEkYwlhxoh8QOzEK51-ZcJ9t6RCytk0Ob8,5132
|
|
72
72
|
alpha/infra/connectors/oidc_connector.py,sha256=z9AY1lMVK5nULd80zOvJzo8zPbp6CHJ7fv2smp71eIs,15675
|
|
73
|
-
alpha/infra/connectors/sql_alchemy.py,sha256=
|
|
73
|
+
alpha/infra/connectors/sql_alchemy.py,sha256=4SlETRrhIZtChPvgX2xLqyb8Kb4XCoB1uwNGHckRw3o,5145
|
|
74
74
|
alpha/infra/databases/__init__.py,sha256=IyA_aB9h_7rOM-aa50QLsA_q4e9W4HnJOqh76aDyrj4,106
|
|
75
75
|
alpha/infra/databases/sql_alchemy.py,sha256=7t17M8UEgW1NMX9LYW6A14EM5UxEJZyp-8a_xLEONAs,235
|
|
76
76
|
alpha/infra/models/__init__.py,sha256=SIakw9bAPXwFmx3I7exCRBs3e2Ug3etOJy6JyIOR1Uc,348
|
|
@@ -108,7 +108,7 @@ alpha/providers/ldap_provider.py,sha256=nZhSvLXl-dWN6bEBQ6UO8r-xpb_QzY2m7mkzQA7a
|
|
|
108
108
|
alpha/providers/oidc_provider.py,sha256=8-VWHzWYXpgwfqi64hnMYcT7Hp1p8Gr8I1EIPDgY6nA,14603
|
|
109
109
|
alpha/providers/models/__init__.py,sha256=SI-qTA3JMOxXx4o1h7frk8x3PRj0g_GSCEbLzyvw7CI,409
|
|
110
110
|
alpha/providers/models/credentials.py,sha256=IjGm1MpnUrwnTo1Of5eacNtkh72Iqj2uKTsoyq1po_o,1304
|
|
111
|
-
alpha/providers/models/identity.py,sha256=
|
|
111
|
+
alpha/providers/models/identity.py,sha256=5Sit9QrcX7J5YVaduXqV7F9jFwvnPotAWgBbUocIhKA,16559
|
|
112
112
|
alpha/providers/models/token.py,sha256=xLiE-bWufbcWgkKpar5R2VAE8YhjyhWF44yN0Me9sJw,4793
|
|
113
113
|
alpha/repositories/__init__.py,sha256=i4kyfLbLSHUzrqDF9Q96CgEaK-srPtEIspUD6uUjElk,787
|
|
114
114
|
alpha/repositories/rest_api_repository.py,sha256=BC_M5_HPwWKwMRsHI2PNCmqu0SC5Tw9ZGhZ7eaLIFgw,48702
|
|
@@ -121,7 +121,7 @@ alpha/repositories/refresh/database_repository.py,sha256=b5Z0_nVairZOaqQ6OBb6_X2
|
|
|
121
121
|
alpha/repositories/refresh/file_repository.py,sha256=EoygSFD7XLzSmnY1W2d3pdlNbQ0rcxwhRGNrlbMH62g,5490
|
|
122
122
|
alpha/repositories/refresh/memory_repository.py,sha256=r0P2DVgTTDSqV8g1OaNf8knqpiysb-LaWW0pdS2wZaQ,3926
|
|
123
123
|
alpha/services/__init__.py,sha256=yeUbS-N0127DSejbCAv9jbdKuHRa_H5Ue0CtsWf4ghI,224
|
|
124
|
-
alpha/services/authentication_service.py,sha256=
|
|
124
|
+
alpha/services/authentication_service.py,sha256=3HBAz3orzxxM9loigIdNc3EHyRg8ongeF_zK0SAFSIU,29894
|
|
125
125
|
alpha/services/user_lifecycle_management.py,sha256=yj0ITtD_WOCVo54KaNSC29XPixxdKi9ArvCMeQm6WKA,2696
|
|
126
126
|
alpha/services/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
127
|
alpha/services/models/cookie.py,sha256=vxNLPtMmOGlxFLKdccxEV7hd_mPKmFCEao8SczNOilo,132
|
|
@@ -138,15 +138,15 @@ alpha/utils/secret_generator.py,sha256=LjsKb8oDfsfmCCcTKrqtw_duqJ7u3V_o6zGGuG26_
|
|
|
138
138
|
alpha/utils/verify_identity.py,sha256=Y1pdcVl8Z_I4ibw2KY7i5QwTQrY29WwpBOJ6j0YOAow,2271
|
|
139
139
|
alpha/utils/version_checker.py,sha256=W8v69hDbrr0VvJ40gpFmXMtVawrDmUz_YGWssKUTmVE,380
|
|
140
140
|
alpha/utils/openapi_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
141
|
-
alpha/utils/openapi_test/container.py,sha256=
|
|
141
|
+
alpha/utils/openapi_test/container.py,sha256=xdQ22lSsr_CjInwVl4QRB2mJke9oiTDjgi9Mzsrlaik,6685
|
|
142
142
|
alpha/utils/openapi_test/exceptions.py,sha256=FfVodhZrajSGQEZngKZRmlJCxjQP502OqQgu3qdtuN4,298
|
|
143
|
-
alpha/utils/openapi_test/models.py,sha256=
|
|
143
|
+
alpha/utils/openapi_test/models.py,sha256=5iZpUqgXy6T5f4v1XctD23l87m4g_pCVeuH09MbUv4A,5081
|
|
144
144
|
alpha/utils/openapi_test/orm.py,sha256=Py95GV_0e7wI1MYDZR1_EHkvTgev6eNo70SVmnD7kGc,3045
|
|
145
145
|
alpha/utils/openapi_test/response.py,sha256=IxbQ6Nw258LLViHkgfjOpc7zWGTP8ofVOX1zrwDoR50,270
|
|
146
|
-
alpha/utils/openapi_test/service.py,sha256=
|
|
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.
|
|
152
|
-
alpha_python-0.7.
|
|
146
|
+
alpha/utils/openapi_test/service.py,sha256=WWR33FYr76zV7CD8OWYc1B0zofv3_DDo0jnRPV6uJuM,4948
|
|
147
|
+
alpha_python-0.7.9.dist-info/licenses/LICENSE,sha256=5KwEqC3KUoH4lVXgZ9tGriKOl-LGxHkXBWo16mFmAYM,1070
|
|
148
|
+
alpha_python-0.7.9.dist-info/METADATA,sha256=FM8botA-RX1qExZNw9obuJhGnvuhnjbKILY71DfQMtQ,8639
|
|
149
|
+
alpha_python-0.7.9.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
150
|
+
alpha_python-0.7.9.dist-info/entry_points.txt,sha256=LBEXdcofOugYYdZ46nz5Dxj_aj1QbRBkumfPGhy-GXI,41
|
|
151
|
+
alpha_python-0.7.9.dist-info/top_level.txt,sha256=tqmNnOmi2RSSiPo99C03fD5Cc3r9za9xTjPAoQC1EGA,6
|
|
152
|
+
alpha_python-0.7.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|