core-framework 0.12.5__py3-none-any.whl → 0.12.7__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.
- core/__init__.py +1 -1
- core/auth/__init__.py +15 -0
- core/auth/backends.py +5 -5
- core/auth/decorators.py +28 -6
- core/auth/helpers.py +104 -0
- core/cli/main.py +6 -4
- core/dependencies.py +3 -1
- core/permissions.py +29 -6
- core/tenancy.py +3 -2
- {core_framework-0.12.5.dist-info → core_framework-0.12.7.dist-info}/METADATA +1 -1
- {core_framework-0.12.5.dist-info → core_framework-0.12.7.dist-info}/RECORD +13 -12
- {core_framework-0.12.5.dist-info → core_framework-0.12.7.dist-info}/WHEEL +0 -0
- {core_framework-0.12.5.dist-info → core_framework-0.12.7.dist-info}/entry_points.txt +0 -0
core/__init__.py
CHANGED
core/auth/__init__.py
CHANGED
|
@@ -121,9 +121,18 @@ from core.auth.views import (
|
|
|
121
121
|
from core.auth.middleware import (
|
|
122
122
|
AuthenticationMiddleware,
|
|
123
123
|
OptionalAuthenticationMiddleware,
|
|
124
|
+
JWTAuthBackend,
|
|
125
|
+
AuthenticatedUser,
|
|
124
126
|
ensure_auth_middleware,
|
|
125
127
|
)
|
|
126
128
|
|
|
129
|
+
# Helper functions for consistent user access
|
|
130
|
+
from core.auth.helpers import (
|
|
131
|
+
get_request_user,
|
|
132
|
+
is_authenticated,
|
|
133
|
+
set_request_user,
|
|
134
|
+
)
|
|
135
|
+
|
|
127
136
|
__all__ = [
|
|
128
137
|
# Base
|
|
129
138
|
"AuthBackend",
|
|
@@ -196,5 +205,11 @@ __all__ = [
|
|
|
196
205
|
# Middleware
|
|
197
206
|
"AuthenticationMiddleware",
|
|
198
207
|
"OptionalAuthenticationMiddleware",
|
|
208
|
+
"JWTAuthBackend",
|
|
209
|
+
"AuthenticatedUser",
|
|
199
210
|
"ensure_auth_middleware",
|
|
211
|
+
# Helpers
|
|
212
|
+
"get_request_user",
|
|
213
|
+
"is_authenticated",
|
|
214
|
+
"set_request_user",
|
|
200
215
|
]
|
core/auth/backends.py
CHANGED
|
@@ -161,14 +161,14 @@ class ModelBackend(AuthBackend):
|
|
|
161
161
|
|
|
162
162
|
async def login(self, request: "Request", user: Any) -> None:
|
|
163
163
|
"""Executa ações pós-login."""
|
|
164
|
-
# Armazena usuário no request.state
|
|
165
|
-
|
|
164
|
+
# Armazena usuário no request.state (for backward compatibility)
|
|
165
|
+
from core.auth.helpers import set_request_user
|
|
166
|
+
set_request_user(request, user)
|
|
166
167
|
|
|
167
168
|
async def logout(self, request: "Request", user: Any) -> None:
|
|
168
169
|
"""Executa ações de logout."""
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
request.state.user = None
|
|
170
|
+
from core.auth.helpers import set_request_user
|
|
171
|
+
set_request_user(request, None)
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
class TokenAuthBackend(AuthBackend):
|
core/auth/decorators.py
CHANGED
|
@@ -29,6 +29,28 @@ if TYPE_CHECKING:
|
|
|
29
29
|
pass
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def _get_user(request: Request) -> Any | None:
|
|
33
|
+
"""
|
|
34
|
+
Get authenticated user from request.
|
|
35
|
+
|
|
36
|
+
Internal helper to avoid circular imports.
|
|
37
|
+
Checks both Starlette and legacy patterns.
|
|
38
|
+
"""
|
|
39
|
+
# Pattern 1: request.user (Starlette AuthenticationMiddleware)
|
|
40
|
+
user = getattr(request, "user", None)
|
|
41
|
+
if user is not None:
|
|
42
|
+
if getattr(user, "is_authenticated", False):
|
|
43
|
+
if hasattr(user, "_user"):
|
|
44
|
+
return user._user
|
|
45
|
+
return user
|
|
46
|
+
|
|
47
|
+
# Pattern 2: request.state.user (legacy)
|
|
48
|
+
if hasattr(request, "state"):
|
|
49
|
+
return getattr(request.state, "user", None)
|
|
50
|
+
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
32
54
|
# =============================================================================
|
|
33
55
|
# Classes de Permissão (para uso em ViewSets)
|
|
34
56
|
# =============================================================================
|
|
@@ -70,7 +92,7 @@ class HasPermission(PermissionBase):
|
|
|
70
92
|
request: Request,
|
|
71
93
|
view: Any = None,
|
|
72
94
|
) -> bool:
|
|
73
|
-
user =
|
|
95
|
+
user = _get_user(request)
|
|
74
96
|
|
|
75
97
|
if user is None:
|
|
76
98
|
return False
|
|
@@ -135,7 +157,7 @@ class IsInGroup(PermissionBase):
|
|
|
135
157
|
request: Request,
|
|
136
158
|
view: Any = None,
|
|
137
159
|
) -> bool:
|
|
138
|
-
user =
|
|
160
|
+
user = _get_user(request)
|
|
139
161
|
|
|
140
162
|
if user is None:
|
|
141
163
|
return False
|
|
@@ -179,7 +201,7 @@ class IsSuperuser(PermissionBase):
|
|
|
179
201
|
request: Request,
|
|
180
202
|
view: Any = None,
|
|
181
203
|
) -> bool:
|
|
182
|
-
user =
|
|
204
|
+
user = _get_user(request)
|
|
183
205
|
|
|
184
206
|
if user is None:
|
|
185
207
|
return False
|
|
@@ -207,7 +229,7 @@ class IsStaff(PermissionBase):
|
|
|
207
229
|
request: Request,
|
|
208
230
|
view: Any = None,
|
|
209
231
|
) -> bool:
|
|
210
|
-
user =
|
|
232
|
+
user = _get_user(request)
|
|
211
233
|
|
|
212
234
|
if user is None:
|
|
213
235
|
return False
|
|
@@ -235,7 +257,7 @@ class IsActive(PermissionBase):
|
|
|
235
257
|
request: Request,
|
|
236
258
|
view: Any = None,
|
|
237
259
|
) -> bool:
|
|
238
|
-
user =
|
|
260
|
+
user = _get_user(request)
|
|
239
261
|
|
|
240
262
|
if user is None:
|
|
241
263
|
return False
|
|
@@ -371,7 +393,7 @@ def login_required():
|
|
|
371
393
|
...
|
|
372
394
|
"""
|
|
373
395
|
async def check(request: Request):
|
|
374
|
-
user =
|
|
396
|
+
user = _get_user(request)
|
|
375
397
|
|
|
376
398
|
if user is None:
|
|
377
399
|
raise HTTPException(
|
core/auth/helpers.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Helper functions for authentication.
|
|
3
|
+
|
|
4
|
+
Provides consistent user access across the framework, supporting both:
|
|
5
|
+
- request.user (Starlette AuthenticationMiddleware pattern - preferred)
|
|
6
|
+
- request.state.user (legacy pattern - backward compatibility)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import Any, TYPE_CHECKING
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from starlette.requests import Request
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger("core.auth")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_request_user(request: "Request") -> Any | None:
|
|
21
|
+
"""
|
|
22
|
+
Get authenticated user from request.
|
|
23
|
+
|
|
24
|
+
Checks both patterns for compatibility:
|
|
25
|
+
1. request.user (Starlette AuthenticationMiddleware - preferred)
|
|
26
|
+
2. request.state.user (legacy pattern)
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
request: The Starlette/FastAPI request object
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
The authenticated user model or None if not authenticated
|
|
33
|
+
|
|
34
|
+
Example:
|
|
35
|
+
from core.auth.helpers import get_request_user
|
|
36
|
+
|
|
37
|
+
async def my_view(request: Request):
|
|
38
|
+
user = get_request_user(request)
|
|
39
|
+
if user is None:
|
|
40
|
+
raise HTTPException(401, "Not authenticated")
|
|
41
|
+
"""
|
|
42
|
+
# Pattern 1: request.user (Starlette AuthenticationMiddleware)
|
|
43
|
+
user = getattr(request, "user", None)
|
|
44
|
+
if user is not None:
|
|
45
|
+
# Check if it's an authenticated user (has is_authenticated = True)
|
|
46
|
+
if getattr(user, "is_authenticated", False):
|
|
47
|
+
# If it's our AuthenticatedUser wrapper, return the underlying model
|
|
48
|
+
if hasattr(user, "_user"):
|
|
49
|
+
return user._user
|
|
50
|
+
return user
|
|
51
|
+
|
|
52
|
+
# Pattern 2: request.state.user (legacy)
|
|
53
|
+
user = getattr(request.state, "user", None) if hasattr(request, "state") else None
|
|
54
|
+
|
|
55
|
+
return user
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def is_authenticated(request: "Request") -> bool:
|
|
59
|
+
"""
|
|
60
|
+
Check if request has an authenticated user.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
request: The Starlette/FastAPI request object
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
True if authenticated, False otherwise
|
|
67
|
+
"""
|
|
68
|
+
# Pattern 1: request.user with is_authenticated
|
|
69
|
+
user = getattr(request, "user", None)
|
|
70
|
+
if user is not None and getattr(user, "is_authenticated", False):
|
|
71
|
+
return True
|
|
72
|
+
|
|
73
|
+
# Pattern 2: request.state.user
|
|
74
|
+
if hasattr(request, "state"):
|
|
75
|
+
user = getattr(request.state, "user", None)
|
|
76
|
+
if user is not None:
|
|
77
|
+
return True
|
|
78
|
+
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def set_request_user(request: "Request", user: Any | None) -> None:
|
|
83
|
+
"""
|
|
84
|
+
Set the authenticated user on the request.
|
|
85
|
+
|
|
86
|
+
Sets both patterns for maximum compatibility:
|
|
87
|
+
- request.state.user (for dependencies and legacy code)
|
|
88
|
+
|
|
89
|
+
Note: request.user is set by Starlette's AuthenticationMiddleware
|
|
90
|
+
via scope["user"] and cannot be set directly.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
request: The Starlette/FastAPI request object
|
|
94
|
+
user: The user model or None
|
|
95
|
+
"""
|
|
96
|
+
if hasattr(request, "state"):
|
|
97
|
+
request.state.user = user
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
__all__ = [
|
|
101
|
+
"get_request_user",
|
|
102
|
+
"is_authenticated",
|
|
103
|
+
"set_request_user",
|
|
104
|
+
]
|
core/cli/main.py
CHANGED
|
@@ -1039,9 +1039,10 @@ class AuthViewSet(ModelViewSet):
|
|
|
1039
1039
|
Returns:
|
|
1040
1040
|
Current user data
|
|
1041
1041
|
"""
|
|
1042
|
-
# User is available via request.
|
|
1042
|
+
# User is available via request.user (Starlette pattern) or request.state.user (legacy)
|
|
1043
1043
|
# permission_classes=[IsAuthenticated] ensures user is authenticated
|
|
1044
|
-
|
|
1044
|
+
from core.auth.helpers import get_request_user
|
|
1045
|
+
user = get_request_user(request)
|
|
1045
1046
|
|
|
1046
1047
|
if user is None:
|
|
1047
1048
|
raise HTTPException(status_code=401, detail="Authentication required")
|
|
@@ -1065,9 +1066,10 @@ class AuthViewSet(ModelViewSet):
|
|
|
1065
1066
|
body = await request.json()
|
|
1066
1067
|
data = ChangePasswordInput.model_validate(body)
|
|
1067
1068
|
|
|
1068
|
-
# User is available via request.
|
|
1069
|
+
# User is available via request.user (Starlette pattern) or request.state.user (legacy)
|
|
1069
1070
|
# permission_classes=[IsAuthenticated] ensures user is authenticated
|
|
1070
|
-
|
|
1071
|
+
from core.auth.helpers import get_request_user
|
|
1072
|
+
user = get_request_user(request)
|
|
1071
1073
|
|
|
1072
1074
|
if user is None:
|
|
1073
1075
|
raise HTTPException(status_code=401, detail="Authentication required")
|
core/dependencies.py
CHANGED
|
@@ -395,12 +395,14 @@ async def get_request_context(request: Request) -> dict[str, Any]:
|
|
|
395
395
|
|
|
396
396
|
Útil para logging e auditoria.
|
|
397
397
|
"""
|
|
398
|
+
from core.auth.helpers import get_request_user
|
|
399
|
+
|
|
398
400
|
return {
|
|
399
401
|
"method": request.method,
|
|
400
402
|
"url": str(request.url),
|
|
401
403
|
"client_ip": request.client.host if request.client else None,
|
|
402
404
|
"user_agent": request.headers.get("user-agent"),
|
|
403
|
-
"user":
|
|
405
|
+
"user": get_request_user(request),
|
|
404
406
|
}
|
|
405
407
|
|
|
406
408
|
|
core/permissions.py
CHANGED
|
@@ -19,6 +19,29 @@ if TYPE_CHECKING:
|
|
|
19
19
|
from core.views import APIView
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
def _get_user(request: Request) -> Any | None:
|
|
23
|
+
"""
|
|
24
|
+
Get authenticated user from request.
|
|
25
|
+
|
|
26
|
+
Internal helper to avoid circular imports.
|
|
27
|
+
Checks both Starlette and legacy patterns.
|
|
28
|
+
"""
|
|
29
|
+
# Pattern 1: request.user (Starlette AuthenticationMiddleware)
|
|
30
|
+
user = getattr(request, "user", None)
|
|
31
|
+
if user is not None:
|
|
32
|
+
if getattr(user, "is_authenticated", False):
|
|
33
|
+
# If it's our AuthenticatedUser wrapper, return the underlying model
|
|
34
|
+
if hasattr(user, "_user"):
|
|
35
|
+
return user._user
|
|
36
|
+
return user
|
|
37
|
+
|
|
38
|
+
# Pattern 2: request.state.user (legacy)
|
|
39
|
+
if hasattr(request, "state"):
|
|
40
|
+
return getattr(request.state, "user", None)
|
|
41
|
+
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
|
|
22
45
|
class Permission(ABC):
|
|
23
46
|
"""
|
|
24
47
|
Classe base para permissões.
|
|
@@ -32,7 +55,7 @@ class Permission(ABC):
|
|
|
32
55
|
request: Request,
|
|
33
56
|
view: APIView | None = None,
|
|
34
57
|
) -> bool:
|
|
35
|
-
user =
|
|
58
|
+
user = _get_user(request)
|
|
36
59
|
return user is not None and user.is_admin
|
|
37
60
|
"""
|
|
38
61
|
|
|
@@ -214,7 +237,7 @@ class IsAuthenticated(Permission):
|
|
|
214
237
|
request: Request,
|
|
215
238
|
view: "APIView | None" = None,
|
|
216
239
|
) -> bool:
|
|
217
|
-
user =
|
|
240
|
+
user = _get_user(request)
|
|
218
241
|
return user is not None
|
|
219
242
|
|
|
220
243
|
|
|
@@ -236,7 +259,7 @@ class IsAuthenticatedOrReadOnly(Permission):
|
|
|
236
259
|
if request.method in self.SAFE_METHODS:
|
|
237
260
|
return True
|
|
238
261
|
|
|
239
|
-
user =
|
|
262
|
+
user = _get_user(request)
|
|
240
263
|
return user is not None
|
|
241
264
|
|
|
242
265
|
|
|
@@ -250,7 +273,7 @@ class IsAdmin(Permission):
|
|
|
250
273
|
request: Request,
|
|
251
274
|
view: "APIView | None" = None,
|
|
252
275
|
) -> bool:
|
|
253
|
-
user =
|
|
276
|
+
user = _get_user(request)
|
|
254
277
|
if user is None:
|
|
255
278
|
return False
|
|
256
279
|
|
|
@@ -285,7 +308,7 @@ class IsOwner(Permission):
|
|
|
285
308
|
if obj is None:
|
|
286
309
|
return True
|
|
287
310
|
|
|
288
|
-
user =
|
|
311
|
+
user = _get_user(request)
|
|
289
312
|
if user is None:
|
|
290
313
|
return False
|
|
291
314
|
|
|
@@ -318,7 +341,7 @@ class HasRole(Permission):
|
|
|
318
341
|
request: Request,
|
|
319
342
|
view: "APIView | None" = None,
|
|
320
343
|
) -> bool:
|
|
321
|
-
user =
|
|
344
|
+
user = _get_user(request)
|
|
322
345
|
if user is None:
|
|
323
346
|
return False
|
|
324
347
|
|
core/tenancy.py
CHANGED
|
@@ -231,8 +231,9 @@ async def extract_tenant_from_request(
|
|
|
231
231
|
|
|
232
232
|
Checks user, header, and query param in order.
|
|
233
233
|
"""
|
|
234
|
-
|
|
235
|
-
|
|
234
|
+
from core.auth.helpers import get_request_user
|
|
235
|
+
|
|
236
|
+
user = get_request_user(request)
|
|
236
237
|
if user is not None:
|
|
237
238
|
tenant_id = getattr(user, user_tenant_attr, None)
|
|
238
239
|
if tenant_id is not None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.7
|
|
4
4
|
Summary: Core Framework - Django-inspired, FastAPI-powered. Alta performance, baixo acoplamento, produtividade extrema.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SorPuti/core-framework
|
|
6
6
|
Project-URL: Documentation, https://github.com/SorPuti/core-framework#readme
|
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
core/__init__.py,sha256=
|
|
1
|
+
core/__init__.py,sha256=iBDdZ1c2d4AF0Ge4SFgwizp-q1o3MkcPJESG69yUKig,12058
|
|
2
2
|
core/app.py,sha256=sCA3mJI696i7MIjrPxfOr5zEYt0njarQfHHy3EAajk4,21071
|
|
3
3
|
core/choices.py,sha256=rhcL3p2dB7RK99zIilpmoTFVcibQEIaRpz0CY0kImCE,10502
|
|
4
4
|
core/config.py,sha256=2-MVF9nLoYmxpYYH_Gzn4-Sa3MU87YZskRPtlNyhg6Q,14049
|
|
5
5
|
core/database.py,sha256=XqB5tZnb9UYDbVGIh96YbmbGJZMqln6-diPBHCr3VWk,11564
|
|
6
6
|
core/datetime.py,sha256=bzqlAj3foA-lzbhXjlEiDNR2D-nwXu9mpxpdcUb-Pmw,32730
|
|
7
|
-
core/dependencies.py,sha256=
|
|
7
|
+
core/dependencies.py,sha256=p207A8qwj-QVAb7nNSe3HxkefClwSQNQQylSFFa-meU,11627
|
|
8
8
|
core/exceptions.py,sha256=cdcffeYnMzCbS4hApOYNmPVNbPUpKcrgJbi3nKhqTuI,22702
|
|
9
9
|
core/fields.py,sha256=F2NdToowkJ_LFvPN9KVyxIFES1AlVDy7WkEp-8UiBpA,9327
|
|
10
10
|
core/middleware.py,sha256=MZVw7smJ2MiycYvkaYIC2cNpyqYGk3m-eeoDandqZU4,23506
|
|
11
11
|
core/models.py,sha256=jdNdjRPKBZiOBOgg8CmDYBwmuWdD7twCIpqINLGY4Q4,33788
|
|
12
|
-
core/permissions.py,sha256=
|
|
12
|
+
core/permissions.py,sha256=rWfKYHLpWvhWnyHN7QsOmvRkX-23fgSzidFSWOrhQfs,10781
|
|
13
13
|
core/querysets.py,sha256=Z87-U06Un_xA9GKwcjXx0yzw6F_xf_tvG_rBT5UGL9c,22678
|
|
14
14
|
core/relations.py,sha256=UbdRgj0XQGI4lv2FQV1ImSAwu4Pn8yxTkSsdzR3m8cM,21372
|
|
15
15
|
core/routing.py,sha256=vIiJN8bQ2836WW2zUKTJVBTC8RpjtDYgEGdz7mldnGc,15422
|
|
16
16
|
core/serializers.py,sha256=gR5Y7wTACm1pECkUEpAKBUbPmONGLMDDwej4fyIiOdo,9438
|
|
17
|
-
core/tenancy.py,sha256=
|
|
17
|
+
core/tenancy.py,sha256=R4tNrLcAgRRDSqOvJS2IRXcD2J-zoCE4ng01ip9xWKI,9169
|
|
18
18
|
core/validators.py,sha256=LCDyvqwIKnMaUEdaVx5kWveZt3XsydknZ_bxBL4ic5U,27895
|
|
19
19
|
core/views.py,sha256=Vm2FREET0IJ2JZbClNJ0vvZ6RN5aQKC1sDXsrOb4-SY,43319
|
|
20
|
-
core/auth/__init__.py,sha256=
|
|
21
|
-
core/auth/backends.py,sha256=
|
|
20
|
+
core/auth/__init__.py,sha256=_yr4rMMvDt_uKujzkKfqlQZ6x9UiQ6jmRppw14hTQNc,4645
|
|
21
|
+
core/auth/backends.py,sha256=PkLk2RQN2rQdtYSiN0mn7cqSp95hnLjO9xTFZqSsPF8,10486
|
|
22
22
|
core/auth/base.py,sha256=Q7vXgwTmgdmyW7G8eJmDket2bKB_8YFnraZ_kK9_gTs,21425
|
|
23
|
-
core/auth/decorators.py,sha256=
|
|
23
|
+
core/auth/decorators.py,sha256=OE9yMQgwnSN8wYAnYhBjAMz__K5E1yoTGkdZCUsafEg,12826
|
|
24
24
|
core/auth/hashers.py,sha256=0gIf67TU0k5H744FADpyh9_ugxA7m3mhYPZxLh_lEtc,12808
|
|
25
|
+
core/auth/helpers.py,sha256=nuaVL9KzIy6ZkVWz9Z327qe4-sfF0NbbJDFIX3tR6vg,3020
|
|
25
26
|
core/auth/middleware.py,sha256=3Wddxi2MKHrHguKfdW9LRKhHaHcmQ807edVcsFLqhVc,16645
|
|
26
27
|
core/auth/models.py,sha256=aEE7deQKPS1aH0Btzzh3Z1Bwuqy8zvLZwu4JFEmiUNk,34058
|
|
27
28
|
core/auth/permissions.py,sha256=v3ykAgNpq5wJ0NkuC_FuveMctOkDfM9Xp11XEnUAuBg,12461
|
|
@@ -29,7 +30,7 @@ core/auth/schemas.py,sha256=L0W96dOD348rJDGeu1K5Rz3aJj-GdwMr2vbwwsYfo2g,3469
|
|
|
29
30
|
core/auth/tokens.py,sha256=jOF40D5O8WRG8klRwMBuSG-jOhdsp1irXn2aZ2puNSg,9149
|
|
30
31
|
core/auth/views.py,sha256=3gMaq8pzWoWr29ExJk21JgGay2fE3Fq3Tz99Wb_ftvE,14203
|
|
31
32
|
core/cli/__init__.py,sha256=obodnvfe8DUziqpk-IAaHTEOb1KSfYQeuBZEAofut4o,449
|
|
32
|
-
core/cli/main.py,sha256=
|
|
33
|
+
core/cli/main.py,sha256=Odl-tetCDffs9xJ7l18xK4X583nGXYmD3nr-w-8cdZM,119787
|
|
33
34
|
core/deployment/__init__.py,sha256=RNcBRO9oB3WRnhtTTwM6wzVEcUKpKF4XfRkGSbbykIc,794
|
|
34
35
|
core/deployment/docker.py,sha256=ywraIk-ncbHiAX2vXH7jcU9KjhCGPIg7j0xgOTu5Cg8,8681
|
|
35
36
|
core/deployment/kubernetes.py,sha256=IV6gf664EFEyQry2ehgJ2UFhZhWovKpaHXln_0WXCMg,8414
|
|
@@ -78,7 +79,7 @@ example/auth.py,sha256=zBpLutb8lVKnGfQqQ2wnyygsSutHYZzeJBuhnFhxBaQ,4971
|
|
|
78
79
|
example/models.py,sha256=xKdx0kJ9n0tZ7sCce3KhV3BTvKvsh6m7G69eFm3ukf0,4549
|
|
79
80
|
example/schemas.py,sha256=wJ9QofnuHp4PjtM_IuMMBLVFVDJ4YlwcF6uQm1ooKiY,6139
|
|
80
81
|
example/views.py,sha256=GQwgQcW6yoeUIDbF7-lsaZV7cs8G1S1vGVtiwVpZIQE,14338
|
|
81
|
-
core_framework-0.12.
|
|
82
|
-
core_framework-0.12.
|
|
83
|
-
core_framework-0.12.
|
|
84
|
-
core_framework-0.12.
|
|
82
|
+
core_framework-0.12.7.dist-info/METADATA,sha256=ulDjkkAMX9Axdn5SN_mpqSe4oVF4-EKprbwBTA5rwOs,12791
|
|
83
|
+
core_framework-0.12.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
84
|
+
core_framework-0.12.7.dist-info/entry_points.txt,sha256=lQ65IAOpieqU1VcHCUReeyandpyy8IKGix6IkJW_4Is,39
|
|
85
|
+
core_framework-0.12.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|