prefect-client 2.20.4__py3-none-any.whl → 3.0.0__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.
- prefect/__init__.py +74 -110
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/compatibility/migration.py +166 -0
- prefect/_internal/concurrency/__init__.py +2 -2
- prefect/_internal/concurrency/api.py +1 -35
- prefect/_internal/concurrency/calls.py +0 -6
- prefect/_internal/concurrency/cancellation.py +0 -3
- prefect/_internal/concurrency/event_loop.py +0 -20
- prefect/_internal/concurrency/inspection.py +3 -3
- prefect/_internal/concurrency/primitives.py +1 -0
- prefect/_internal/concurrency/services.py +23 -0
- prefect/_internal/concurrency/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/integrations.py +7 -0
- prefect/_internal/pydantic/__init__.py +0 -45
- prefect/_internal/pydantic/annotations/pendulum.py +2 -2
- prefect/_internal/pydantic/v1_schema.py +21 -22
- prefect/_internal/pydantic/v2_schema.py +0 -2
- prefect/_internal/pydantic/v2_validated_func.py +18 -23
- prefect/_internal/pytz.py +1 -1
- prefect/_internal/retries.py +61 -0
- prefect/_internal/schemas/bases.py +45 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +47 -233
- prefect/agent.py +3 -695
- prefect/artifacts.py +173 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +405 -153
- prefect/blocks/fields.py +2 -57
- prefect/blocks/notifications.py +43 -28
- prefect/blocks/redis.py +168 -0
- prefect/blocks/system.py +67 -20
- prefect/blocks/webhook.py +2 -9
- prefect/cache_policies.py +239 -0
- prefect/client/__init__.py +4 -0
- prefect/client/base.py +33 -27
- prefect/client/cloud.py +65 -20
- prefect/client/collections.py +1 -1
- prefect/client/orchestration.py +650 -442
- prefect/client/schemas/actions.py +115 -100
- prefect/client/schemas/filters.py +46 -52
- prefect/client/schemas/objects.py +228 -178
- prefect/client/schemas/responses.py +18 -36
- prefect/client/schemas/schedules.py +55 -36
- prefect/client/schemas/sorting.py +2 -0
- prefect/client/subscriptions.py +8 -7
- prefect/client/types/flexible_schedule_list.py +11 -0
- prefect/client/utilities.py +9 -6
- prefect/concurrency/asyncio.py +60 -11
- prefect/concurrency/context.py +24 -0
- prefect/concurrency/events.py +2 -2
- prefect/concurrency/services.py +46 -16
- prefect/concurrency/sync.py +51 -7
- prefect/concurrency/v1/asyncio.py +143 -0
- prefect/concurrency/v1/context.py +27 -0
- prefect/concurrency/v1/events.py +61 -0
- prefect/concurrency/v1/services.py +116 -0
- prefect/concurrency/v1/sync.py +92 -0
- prefect/context.py +246 -149
- prefect/deployments/__init__.py +33 -18
- prefect/deployments/base.py +10 -15
- prefect/deployments/deployments.py +2 -1048
- prefect/deployments/flow_runs.py +178 -0
- prefect/deployments/runner.py +72 -173
- prefect/deployments/schedules.py +31 -25
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +7 -0
- prefect/deployments/steps/pull.py +15 -21
- prefect/deployments/steps/utility.py +2 -1
- prefect/docker/__init__.py +20 -0
- prefect/docker/docker_image.py +82 -0
- prefect/engine.py +15 -2475
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +20 -7
- prefect/events/clients.py +142 -80
- prefect/events/filters.py +14 -18
- prefect/events/related.py +74 -75
- prefect/events/schemas/__init__.py +0 -5
- prefect/events/schemas/automations.py +55 -46
- prefect/events/schemas/deployment_triggers.py +7 -197
- prefect/events/schemas/events.py +46 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +4 -5
- prefect/events/worker.py +23 -8
- prefect/exceptions.py +15 -0
- prefect/filesystems.py +30 -529
- prefect/flow_engine.py +827 -0
- prefect/flow_runs.py +379 -7
- prefect/flows.py +470 -360
- prefect/futures.py +382 -331
- prefect/infrastructure/__init__.py +5 -26
- prefect/infrastructure/base.py +3 -320
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +13 -8
- prefect/infrastructure/provisioners/container_instance.py +14 -9
- prefect/infrastructure/provisioners/ecs.py +10 -8
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/__init__.py +4 -0
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +9 -9
- prefect/logging/formatters.py +2 -4
- prefect/logging/handlers.py +9 -14
- prefect/logging/loggers.py +5 -5
- prefect/main.py +72 -0
- prefect/plugins.py +2 -64
- prefect/profiles.toml +16 -2
- prefect/records/__init__.py +1 -0
- prefect/records/base.py +223 -0
- prefect/records/filesystem.py +207 -0
- prefect/records/memory.py +178 -0
- prefect/records/result_store.py +64 -0
- prefect/results.py +577 -504
- prefect/runner/runner.py +117 -47
- prefect/runner/server.py +32 -34
- prefect/runner/storage.py +3 -12
- prefect/runner/submit.py +2 -10
- prefect/runner/utils.py +2 -2
- prefect/runtime/__init__.py +1 -0
- prefect/runtime/deployment.py +1 -0
- prefect/runtime/flow_run.py +40 -5
- prefect/runtime/task_run.py +1 -0
- prefect/serializers.py +28 -39
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +209 -332
- prefect/states.py +160 -63
- prefect/task_engine.py +1478 -57
- prefect/task_runners.py +383 -287
- prefect/task_runs.py +240 -0
- prefect/task_worker.py +463 -0
- prefect/tasks.py +684 -374
- prefect/transactions.py +410 -0
- prefect/types/__init__.py +72 -86
- prefect/types/entrypoint.py +13 -0
- prefect/utilities/annotations.py +4 -3
- prefect/utilities/asyncutils.py +227 -148
- prefect/utilities/callables.py +137 -45
- prefect/utilities/collections.py +134 -86
- prefect/utilities/dispatch.py +27 -14
- prefect/utilities/dockerutils.py +11 -4
- prefect/utilities/engine.py +186 -32
- prefect/utilities/filesystem.py +4 -5
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +18 -1
- prefect/utilities/schema_tools/validation.py +30 -0
- prefect/utilities/services.py +35 -9
- prefect/utilities/templating.py +12 -2
- prefect/utilities/timeout.py +20 -5
- prefect/utilities/urls.py +195 -0
- prefect/utilities/visualization.py +1 -0
- prefect/variables.py +78 -59
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +237 -244
- prefect/workers/block.py +5 -226
- prefect/workers/cloud.py +6 -0
- prefect/workers/process.py +265 -12
- prefect/workers/server.py +29 -11
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/METADATA +28 -24
- prefect_client-3.0.0.dist-info/RECORD +201 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
- prefect/_internal/pydantic/_base_model.py +0 -51
- prefect/_internal/pydantic/_compat.py +0 -82
- prefect/_internal/pydantic/_flags.py +0 -20
- prefect/_internal/pydantic/_types.py +0 -8
- prefect/_internal/pydantic/utilities/config_dict.py +0 -72
- prefect/_internal/pydantic/utilities/field_validator.py +0 -150
- prefect/_internal/pydantic/utilities/model_construct.py +0 -56
- prefect/_internal/pydantic/utilities/model_copy.py +0 -55
- prefect/_internal/pydantic/utilities/model_dump.py +0 -136
- prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
- prefect/_internal/pydantic/utilities/model_fields.py +0 -50
- prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
- prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
- prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
- prefect/_internal/pydantic/utilities/model_validate.py +0 -75
- prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
- prefect/_internal/pydantic/utilities/model_validator.py +0 -87
- prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
- prefect/_vendor/fastapi/__init__.py +0 -25
- prefect/_vendor/fastapi/applications.py +0 -946
- prefect/_vendor/fastapi/background.py +0 -3
- prefect/_vendor/fastapi/concurrency.py +0 -44
- prefect/_vendor/fastapi/datastructures.py +0 -58
- prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- prefect/_vendor/fastapi/dependencies/models.py +0 -64
- prefect/_vendor/fastapi/dependencies/utils.py +0 -877
- prefect/_vendor/fastapi/encoders.py +0 -177
- prefect/_vendor/fastapi/exception_handlers.py +0 -40
- prefect/_vendor/fastapi/exceptions.py +0 -46
- prefect/_vendor/fastapi/logger.py +0 -3
- prefect/_vendor/fastapi/middleware/__init__.py +0 -1
- prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
- prefect/_vendor/fastapi/middleware/cors.py +0 -3
- prefect/_vendor/fastapi/middleware/gzip.py +0 -3
- prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
- prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
- prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
- prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- prefect/_vendor/fastapi/openapi/constants.py +0 -2
- prefect/_vendor/fastapi/openapi/docs.py +0 -203
- prefect/_vendor/fastapi/openapi/models.py +0 -480
- prefect/_vendor/fastapi/openapi/utils.py +0 -485
- prefect/_vendor/fastapi/param_functions.py +0 -340
- prefect/_vendor/fastapi/params.py +0 -453
- prefect/_vendor/fastapi/py.typed +0 -0
- prefect/_vendor/fastapi/requests.py +0 -4
- prefect/_vendor/fastapi/responses.py +0 -40
- prefect/_vendor/fastapi/routing.py +0 -1331
- prefect/_vendor/fastapi/security/__init__.py +0 -15
- prefect/_vendor/fastapi/security/api_key.py +0 -98
- prefect/_vendor/fastapi/security/base.py +0 -6
- prefect/_vendor/fastapi/security/http.py +0 -172
- prefect/_vendor/fastapi/security/oauth2.py +0 -227
- prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
- prefect/_vendor/fastapi/security/utils.py +0 -10
- prefect/_vendor/fastapi/staticfiles.py +0 -1
- prefect/_vendor/fastapi/templating.py +0 -3
- prefect/_vendor/fastapi/testclient.py +0 -1
- prefect/_vendor/fastapi/types.py +0 -3
- prefect/_vendor/fastapi/utils.py +0 -235
- prefect/_vendor/fastapi/websockets.py +0 -7
- prefect/_vendor/starlette/__init__.py +0 -1
- prefect/_vendor/starlette/_compat.py +0 -28
- prefect/_vendor/starlette/_exception_handler.py +0 -80
- prefect/_vendor/starlette/_utils.py +0 -88
- prefect/_vendor/starlette/applications.py +0 -261
- prefect/_vendor/starlette/authentication.py +0 -159
- prefect/_vendor/starlette/background.py +0 -43
- prefect/_vendor/starlette/concurrency.py +0 -59
- prefect/_vendor/starlette/config.py +0 -151
- prefect/_vendor/starlette/convertors.py +0 -87
- prefect/_vendor/starlette/datastructures.py +0 -707
- prefect/_vendor/starlette/endpoints.py +0 -130
- prefect/_vendor/starlette/exceptions.py +0 -60
- prefect/_vendor/starlette/formparsers.py +0 -276
- prefect/_vendor/starlette/middleware/__init__.py +0 -17
- prefect/_vendor/starlette/middleware/authentication.py +0 -52
- prefect/_vendor/starlette/middleware/base.py +0 -220
- prefect/_vendor/starlette/middleware/cors.py +0 -176
- prefect/_vendor/starlette/middleware/errors.py +0 -265
- prefect/_vendor/starlette/middleware/exceptions.py +0 -74
- prefect/_vendor/starlette/middleware/gzip.py +0 -113
- prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
- prefect/_vendor/starlette/middleware/sessions.py +0 -82
- prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
- prefect/_vendor/starlette/middleware/wsgi.py +0 -147
- prefect/_vendor/starlette/py.typed +0 -0
- prefect/_vendor/starlette/requests.py +0 -328
- prefect/_vendor/starlette/responses.py +0 -347
- prefect/_vendor/starlette/routing.py +0 -933
- prefect/_vendor/starlette/schemas.py +0 -154
- prefect/_vendor/starlette/staticfiles.py +0 -248
- prefect/_vendor/starlette/status.py +0 -199
- prefect/_vendor/starlette/templating.py +0 -231
- prefect/_vendor/starlette/testclient.py +0 -804
- prefect/_vendor/starlette/types.py +0 -30
- prefect/_vendor/starlette/websockets.py +0 -193
- prefect/blocks/kubernetes.py +0 -119
- prefect/deprecated/__init__.py +0 -0
- prefect/deprecated/data_documents.py +0 -350
- prefect/deprecated/packaging/__init__.py +0 -12
- prefect/deprecated/packaging/base.py +0 -96
- prefect/deprecated/packaging/docker.py +0 -146
- prefect/deprecated/packaging/file.py +0 -92
- prefect/deprecated/packaging/orion.py +0 -80
- prefect/deprecated/packaging/serializers.py +0 -171
- prefect/events/instrument.py +0 -135
- prefect/infrastructure/container.py +0 -824
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- prefect/manifests.py +0 -20
- prefect/new_flow_engine.py +0 -449
- prefect/new_task_engine.py +0 -423
- prefect/pydantic/__init__.py +0 -76
- prefect/pydantic/main.py +0 -39
- prefect/software/__init__.py +0 -2
- prefect/software/base.py +0 -50
- prefect/software/conda.py +0 -199
- prefect/software/pip.py +0 -122
- prefect/software/python.py +0 -52
- prefect/task_server.py +0 -322
- prefect_client-2.20.4.dist-info/RECORD +0 -294
- /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
- /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,15 +0,0 @@
|
|
1
|
-
from .api_key import APIKeyCookie as APIKeyCookie
|
2
|
-
from .api_key import APIKeyHeader as APIKeyHeader
|
3
|
-
from .api_key import APIKeyQuery as APIKeyQuery
|
4
|
-
from .http import HTTPAuthorizationCredentials as HTTPAuthorizationCredentials
|
5
|
-
from .http import HTTPBasic as HTTPBasic
|
6
|
-
from .http import HTTPBasicCredentials as HTTPBasicCredentials
|
7
|
-
from .http import HTTPBearer as HTTPBearer
|
8
|
-
from .http import HTTPDigest as HTTPDigest
|
9
|
-
from .oauth2 import OAuth2 as OAuth2
|
10
|
-
from .oauth2 import OAuth2AuthorizationCodeBearer as OAuth2AuthorizationCodeBearer
|
11
|
-
from .oauth2 import OAuth2PasswordBearer as OAuth2PasswordBearer
|
12
|
-
from .oauth2 import OAuth2PasswordRequestForm as OAuth2PasswordRequestForm
|
13
|
-
from .oauth2 import OAuth2PasswordRequestFormStrict as OAuth2PasswordRequestFormStrict
|
14
|
-
from .oauth2 import SecurityScopes as SecurityScopes
|
15
|
-
from .open_id_connect_url import OpenIdConnect as OpenIdConnect
|
@@ -1,98 +0,0 @@
|
|
1
|
-
from typing import Optional
|
2
|
-
|
3
|
-
from prefect._vendor.fastapi.openapi.models import APIKey, APIKeyIn
|
4
|
-
from prefect._vendor.fastapi.security.base import SecurityBase
|
5
|
-
from prefect._vendor.starlette.exceptions import HTTPException
|
6
|
-
from prefect._vendor.starlette.requests import Request
|
7
|
-
from prefect._vendor.starlette.status import HTTP_403_FORBIDDEN
|
8
|
-
|
9
|
-
|
10
|
-
class APIKeyBase(SecurityBase):
|
11
|
-
pass
|
12
|
-
|
13
|
-
|
14
|
-
class APIKeyQuery(APIKeyBase):
|
15
|
-
def __init__(
|
16
|
-
self,
|
17
|
-
*,
|
18
|
-
name: str,
|
19
|
-
scheme_name: Optional[str] = None,
|
20
|
-
description: Optional[str] = None,
|
21
|
-
auto_error: bool = True,
|
22
|
-
):
|
23
|
-
self.model: APIKey = APIKey(
|
24
|
-
**{"in": APIKeyIn.query}, # type: ignore[arg-type]
|
25
|
-
name=name,
|
26
|
-
description=description,
|
27
|
-
)
|
28
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
29
|
-
self.auto_error = auto_error
|
30
|
-
|
31
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
32
|
-
api_key = request.query_params.get(self.model.name)
|
33
|
-
if not api_key:
|
34
|
-
if self.auto_error:
|
35
|
-
raise HTTPException(
|
36
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
37
|
-
)
|
38
|
-
else:
|
39
|
-
return None
|
40
|
-
return api_key
|
41
|
-
|
42
|
-
|
43
|
-
class APIKeyHeader(APIKeyBase):
|
44
|
-
def __init__(
|
45
|
-
self,
|
46
|
-
*,
|
47
|
-
name: str,
|
48
|
-
scheme_name: Optional[str] = None,
|
49
|
-
description: Optional[str] = None,
|
50
|
-
auto_error: bool = True,
|
51
|
-
):
|
52
|
-
self.model: APIKey = APIKey(
|
53
|
-
**{"in": APIKeyIn.header}, # type: ignore[arg-type]
|
54
|
-
name=name,
|
55
|
-
description=description,
|
56
|
-
)
|
57
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
58
|
-
self.auto_error = auto_error
|
59
|
-
|
60
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
61
|
-
api_key = request.headers.get(self.model.name)
|
62
|
-
if not api_key:
|
63
|
-
if self.auto_error:
|
64
|
-
raise HTTPException(
|
65
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
66
|
-
)
|
67
|
-
else:
|
68
|
-
return None
|
69
|
-
return api_key
|
70
|
-
|
71
|
-
|
72
|
-
class APIKeyCookie(APIKeyBase):
|
73
|
-
def __init__(
|
74
|
-
self,
|
75
|
-
*,
|
76
|
-
name: str,
|
77
|
-
scheme_name: Optional[str] = None,
|
78
|
-
description: Optional[str] = None,
|
79
|
-
auto_error: bool = True,
|
80
|
-
):
|
81
|
-
self.model: APIKey = APIKey(
|
82
|
-
**{"in": APIKeyIn.cookie}, # type: ignore[arg-type]
|
83
|
-
name=name,
|
84
|
-
description=description,
|
85
|
-
)
|
86
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
87
|
-
self.auto_error = auto_error
|
88
|
-
|
89
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
90
|
-
api_key = request.cookies.get(self.model.name)
|
91
|
-
if not api_key:
|
92
|
-
if self.auto_error:
|
93
|
-
raise HTTPException(
|
94
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
95
|
-
)
|
96
|
-
else:
|
97
|
-
return None
|
98
|
-
return api_key
|
@@ -1,172 +0,0 @@
|
|
1
|
-
import binascii
|
2
|
-
from base64 import b64decode
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from prefect._vendor.fastapi.exceptions import HTTPException
|
6
|
-
from prefect._vendor.fastapi.openapi.models import HTTPBase as HTTPBaseModel
|
7
|
-
from prefect._vendor.fastapi.openapi.models import HTTPBearer as HTTPBearerModel
|
8
|
-
from prefect._vendor.fastapi.security.base import SecurityBase
|
9
|
-
from prefect._vendor.fastapi.security.utils import get_authorization_scheme_param
|
10
|
-
|
11
|
-
from prefect._internal.pydantic import HAS_PYDANTIC_V2
|
12
|
-
|
13
|
-
if HAS_PYDANTIC_V2:
|
14
|
-
from pydantic.v1 import BaseModel
|
15
|
-
else:
|
16
|
-
from pydantic import BaseModel
|
17
|
-
|
18
|
-
from prefect._vendor.starlette.requests import Request
|
19
|
-
from prefect._vendor.starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN
|
20
|
-
|
21
|
-
|
22
|
-
class HTTPBasicCredentials(BaseModel):
|
23
|
-
username: str
|
24
|
-
password: str
|
25
|
-
|
26
|
-
|
27
|
-
class HTTPAuthorizationCredentials(BaseModel):
|
28
|
-
scheme: str
|
29
|
-
credentials: str
|
30
|
-
|
31
|
-
|
32
|
-
class HTTPBase(SecurityBase):
|
33
|
-
def __init__(
|
34
|
-
self,
|
35
|
-
*,
|
36
|
-
scheme: str,
|
37
|
-
scheme_name: Optional[str] = None,
|
38
|
-
description: Optional[str] = None,
|
39
|
-
auto_error: bool = True,
|
40
|
-
):
|
41
|
-
self.model = HTTPBaseModel(scheme=scheme, description=description)
|
42
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
43
|
-
self.auto_error = auto_error
|
44
|
-
|
45
|
-
async def __call__(
|
46
|
-
self, request: Request
|
47
|
-
) -> Optional[HTTPAuthorizationCredentials]:
|
48
|
-
authorization = request.headers.get("Authorization")
|
49
|
-
scheme, credentials = get_authorization_scheme_param(authorization)
|
50
|
-
if not (authorization and scheme and credentials):
|
51
|
-
if self.auto_error:
|
52
|
-
raise HTTPException(
|
53
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
54
|
-
)
|
55
|
-
else:
|
56
|
-
return None
|
57
|
-
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
|
58
|
-
|
59
|
-
|
60
|
-
class HTTPBasic(HTTPBase):
|
61
|
-
def __init__(
|
62
|
-
self,
|
63
|
-
*,
|
64
|
-
scheme_name: Optional[str] = None,
|
65
|
-
realm: Optional[str] = None,
|
66
|
-
description: Optional[str] = None,
|
67
|
-
auto_error: bool = True,
|
68
|
-
):
|
69
|
-
self.model = HTTPBaseModel(scheme="basic", description=description)
|
70
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
71
|
-
self.realm = realm
|
72
|
-
self.auto_error = auto_error
|
73
|
-
|
74
|
-
async def __call__( # type: ignore
|
75
|
-
self, request: Request
|
76
|
-
) -> Optional[HTTPBasicCredentials]:
|
77
|
-
authorization = request.headers.get("Authorization")
|
78
|
-
scheme, param = get_authorization_scheme_param(authorization)
|
79
|
-
if self.realm:
|
80
|
-
unauthorized_headers = {"WWW-Authenticate": f'Basic realm="{self.realm}"'}
|
81
|
-
else:
|
82
|
-
unauthorized_headers = {"WWW-Authenticate": "Basic"}
|
83
|
-
if not authorization or scheme.lower() != "basic":
|
84
|
-
if self.auto_error:
|
85
|
-
raise HTTPException(
|
86
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
87
|
-
detail="Not authenticated",
|
88
|
-
headers=unauthorized_headers,
|
89
|
-
)
|
90
|
-
else:
|
91
|
-
return None
|
92
|
-
invalid_user_credentials_exc = HTTPException(
|
93
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
94
|
-
detail="Invalid authentication credentials",
|
95
|
-
headers=unauthorized_headers,
|
96
|
-
)
|
97
|
-
try:
|
98
|
-
data = b64decode(param).decode("ascii")
|
99
|
-
except (ValueError, UnicodeDecodeError, binascii.Error):
|
100
|
-
raise invalid_user_credentials_exc
|
101
|
-
username, separator, password = data.partition(":")
|
102
|
-
if not separator:
|
103
|
-
raise invalid_user_credentials_exc
|
104
|
-
return HTTPBasicCredentials(username=username, password=password)
|
105
|
-
|
106
|
-
|
107
|
-
class HTTPBearer(HTTPBase):
|
108
|
-
def __init__(
|
109
|
-
self,
|
110
|
-
*,
|
111
|
-
bearerFormat: Optional[str] = None,
|
112
|
-
scheme_name: Optional[str] = None,
|
113
|
-
description: Optional[str] = None,
|
114
|
-
auto_error: bool = True,
|
115
|
-
):
|
116
|
-
self.model = HTTPBearerModel(bearerFormat=bearerFormat, description=description)
|
117
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
118
|
-
self.auto_error = auto_error
|
119
|
-
|
120
|
-
async def __call__(
|
121
|
-
self, request: Request
|
122
|
-
) -> Optional[HTTPAuthorizationCredentials]:
|
123
|
-
authorization = request.headers.get("Authorization")
|
124
|
-
scheme, credentials = get_authorization_scheme_param(authorization)
|
125
|
-
if not (authorization and scheme and credentials):
|
126
|
-
if self.auto_error:
|
127
|
-
raise HTTPException(
|
128
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
129
|
-
)
|
130
|
-
else:
|
131
|
-
return None
|
132
|
-
if scheme.lower() != "bearer":
|
133
|
-
if self.auto_error:
|
134
|
-
raise HTTPException(
|
135
|
-
status_code=HTTP_403_FORBIDDEN,
|
136
|
-
detail="Invalid authentication credentials",
|
137
|
-
)
|
138
|
-
else:
|
139
|
-
return None
|
140
|
-
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
|
141
|
-
|
142
|
-
|
143
|
-
class HTTPDigest(HTTPBase):
|
144
|
-
def __init__(
|
145
|
-
self,
|
146
|
-
*,
|
147
|
-
scheme_name: Optional[str] = None,
|
148
|
-
description: Optional[str] = None,
|
149
|
-
auto_error: bool = True,
|
150
|
-
):
|
151
|
-
self.model = HTTPBaseModel(scheme="digest", description=description)
|
152
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
153
|
-
self.auto_error = auto_error
|
154
|
-
|
155
|
-
async def __call__(
|
156
|
-
self, request: Request
|
157
|
-
) -> Optional[HTTPAuthorizationCredentials]:
|
158
|
-
authorization = request.headers.get("Authorization")
|
159
|
-
scheme, credentials = get_authorization_scheme_param(authorization)
|
160
|
-
if not (authorization and scheme and credentials):
|
161
|
-
if self.auto_error:
|
162
|
-
raise HTTPException(
|
163
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
164
|
-
)
|
165
|
-
else:
|
166
|
-
return None
|
167
|
-
if scheme.lower() != "digest":
|
168
|
-
raise HTTPException(
|
169
|
-
status_code=HTTP_403_FORBIDDEN,
|
170
|
-
detail="Invalid authentication credentials",
|
171
|
-
)
|
172
|
-
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
|
@@ -1,227 +0,0 @@
|
|
1
|
-
from typing import Any, Dict, List, Optional, Union, cast
|
2
|
-
|
3
|
-
from prefect._vendor.fastapi.exceptions import HTTPException
|
4
|
-
from prefect._vendor.fastapi.openapi.models import OAuth2 as OAuth2Model
|
5
|
-
from prefect._vendor.fastapi.openapi.models import OAuthFlows as OAuthFlowsModel
|
6
|
-
from prefect._vendor.fastapi.param_functions import Form
|
7
|
-
from prefect._vendor.fastapi.security.base import SecurityBase
|
8
|
-
from prefect._vendor.fastapi.security.utils import get_authorization_scheme_param
|
9
|
-
from prefect._vendor.starlette.requests import Request
|
10
|
-
from prefect._vendor.starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN
|
11
|
-
|
12
|
-
|
13
|
-
class OAuth2PasswordRequestForm:
|
14
|
-
"""
|
15
|
-
This is a dependency class, use it like:
|
16
|
-
|
17
|
-
@app.post("/login")
|
18
|
-
def login(form_data: OAuth2PasswordRequestForm = Depends()):
|
19
|
-
data = form_data.parse()
|
20
|
-
print(data.username)
|
21
|
-
print(data.password)
|
22
|
-
for scope in data.scopes:
|
23
|
-
print(scope)
|
24
|
-
if data.client_id:
|
25
|
-
print(data.client_id)
|
26
|
-
if data.client_secret:
|
27
|
-
print(data.client_secret)
|
28
|
-
return data
|
29
|
-
|
30
|
-
|
31
|
-
It creates the following Form request parameters in your endpoint:
|
32
|
-
|
33
|
-
grant_type: the OAuth2 spec says it is required and MUST be the fixed string "password".
|
34
|
-
Nevertheless, this dependency class is permissive and allows not passing it. If you want to enforce it,
|
35
|
-
use instead the OAuth2PasswordRequestFormStrict dependency.
|
36
|
-
username: username string. The OAuth2 spec requires the exact field name "username".
|
37
|
-
password: password string. The OAuth2 spec requires the exact field name "password".
|
38
|
-
scope: Optional string. Several scopes (each one a string) separated by spaces. E.g.
|
39
|
-
"items:read items:write users:read profile openid"
|
40
|
-
client_id: optional string. OAuth2 recommends sending the client_id and client_secret (if any)
|
41
|
-
using HTTP Basic auth, as: client_id:client_secret
|
42
|
-
client_secret: optional string. OAuth2 recommends sending the client_id and client_secret (if any)
|
43
|
-
using HTTP Basic auth, as: client_id:client_secret
|
44
|
-
"""
|
45
|
-
|
46
|
-
def __init__(
|
47
|
-
self,
|
48
|
-
grant_type: str = Form(default=None, regex="password"),
|
49
|
-
username: str = Form(),
|
50
|
-
password: str = Form(),
|
51
|
-
scope: str = Form(default=""),
|
52
|
-
client_id: Optional[str] = Form(default=None),
|
53
|
-
client_secret: Optional[str] = Form(default=None),
|
54
|
-
):
|
55
|
-
self.grant_type = grant_type
|
56
|
-
self.username = username
|
57
|
-
self.password = password
|
58
|
-
self.scopes = scope.split()
|
59
|
-
self.client_id = client_id
|
60
|
-
self.client_secret = client_secret
|
61
|
-
|
62
|
-
|
63
|
-
class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm):
|
64
|
-
"""
|
65
|
-
This is a dependency class, use it like:
|
66
|
-
|
67
|
-
@app.post("/login")
|
68
|
-
def login(form_data: OAuth2PasswordRequestFormStrict = Depends()):
|
69
|
-
data = form_data.parse()
|
70
|
-
print(data.username)
|
71
|
-
print(data.password)
|
72
|
-
for scope in data.scopes:
|
73
|
-
print(scope)
|
74
|
-
if data.client_id:
|
75
|
-
print(data.client_id)
|
76
|
-
if data.client_secret:
|
77
|
-
print(data.client_secret)
|
78
|
-
return data
|
79
|
-
|
80
|
-
|
81
|
-
It creates the following Form request parameters in your endpoint:
|
82
|
-
|
83
|
-
grant_type: the OAuth2 spec says it is required and MUST be the fixed string "password".
|
84
|
-
This dependency is strict about it. If you want to be permissive, use instead the
|
85
|
-
OAuth2PasswordRequestForm dependency class.
|
86
|
-
username: username string. The OAuth2 spec requires the exact field name "username".
|
87
|
-
password: password string. The OAuth2 spec requires the exact field name "password".
|
88
|
-
scope: Optional string. Several scopes (each one a string) separated by spaces. E.g.
|
89
|
-
"items:read items:write users:read profile openid"
|
90
|
-
client_id: optional string. OAuth2 recommends sending the client_id and client_secret (if any)
|
91
|
-
using HTTP Basic auth, as: client_id:client_secret
|
92
|
-
client_secret: optional string. OAuth2 recommends sending the client_id and client_secret (if any)
|
93
|
-
using HTTP Basic auth, as: client_id:client_secret
|
94
|
-
"""
|
95
|
-
|
96
|
-
def __init__(
|
97
|
-
self,
|
98
|
-
grant_type: str = Form(regex="password"),
|
99
|
-
username: str = Form(),
|
100
|
-
password: str = Form(),
|
101
|
-
scope: str = Form(default=""),
|
102
|
-
client_id: Optional[str] = Form(default=None),
|
103
|
-
client_secret: Optional[str] = Form(default=None),
|
104
|
-
):
|
105
|
-
super().__init__(
|
106
|
-
grant_type=grant_type,
|
107
|
-
username=username,
|
108
|
-
password=password,
|
109
|
-
scope=scope,
|
110
|
-
client_id=client_id,
|
111
|
-
client_secret=client_secret,
|
112
|
-
)
|
113
|
-
|
114
|
-
|
115
|
-
class OAuth2(SecurityBase):
|
116
|
-
def __init__(
|
117
|
-
self,
|
118
|
-
*,
|
119
|
-
flows: Union[OAuthFlowsModel, Dict[str, Dict[str, Any]]] = OAuthFlowsModel(),
|
120
|
-
scheme_name: Optional[str] = None,
|
121
|
-
description: Optional[str] = None,
|
122
|
-
auto_error: bool = True,
|
123
|
-
):
|
124
|
-
self.model = OAuth2Model(
|
125
|
-
flows=cast(OAuthFlowsModel, flows), description=description
|
126
|
-
)
|
127
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
128
|
-
self.auto_error = auto_error
|
129
|
-
|
130
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
131
|
-
authorization = request.headers.get("Authorization")
|
132
|
-
if not authorization:
|
133
|
-
if self.auto_error:
|
134
|
-
raise HTTPException(
|
135
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
136
|
-
)
|
137
|
-
else:
|
138
|
-
return None
|
139
|
-
return authorization
|
140
|
-
|
141
|
-
|
142
|
-
class OAuth2PasswordBearer(OAuth2):
|
143
|
-
def __init__(
|
144
|
-
self,
|
145
|
-
tokenUrl: str,
|
146
|
-
scheme_name: Optional[str] = None,
|
147
|
-
scopes: Optional[Dict[str, str]] = None,
|
148
|
-
description: Optional[str] = None,
|
149
|
-
auto_error: bool = True,
|
150
|
-
):
|
151
|
-
if not scopes:
|
152
|
-
scopes = {}
|
153
|
-
flows = OAuthFlowsModel(
|
154
|
-
password=cast(Any, {"tokenUrl": tokenUrl, "scopes": scopes})
|
155
|
-
)
|
156
|
-
super().__init__(
|
157
|
-
flows=flows,
|
158
|
-
scheme_name=scheme_name,
|
159
|
-
description=description,
|
160
|
-
auto_error=auto_error,
|
161
|
-
)
|
162
|
-
|
163
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
164
|
-
authorization = request.headers.get("Authorization")
|
165
|
-
scheme, param = get_authorization_scheme_param(authorization)
|
166
|
-
if not authorization or scheme.lower() != "bearer":
|
167
|
-
if self.auto_error:
|
168
|
-
raise HTTPException(
|
169
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
170
|
-
detail="Not authenticated",
|
171
|
-
headers={"WWW-Authenticate": "Bearer"},
|
172
|
-
)
|
173
|
-
else:
|
174
|
-
return None
|
175
|
-
return param
|
176
|
-
|
177
|
-
|
178
|
-
class OAuth2AuthorizationCodeBearer(OAuth2):
|
179
|
-
def __init__(
|
180
|
-
self,
|
181
|
-
authorizationUrl: str,
|
182
|
-
tokenUrl: str,
|
183
|
-
refreshUrl: Optional[str] = None,
|
184
|
-
scheme_name: Optional[str] = None,
|
185
|
-
scopes: Optional[Dict[str, str]] = None,
|
186
|
-
description: Optional[str] = None,
|
187
|
-
auto_error: bool = True,
|
188
|
-
):
|
189
|
-
if not scopes:
|
190
|
-
scopes = {}
|
191
|
-
flows = OAuthFlowsModel(
|
192
|
-
authorizationCode=cast(
|
193
|
-
Any,
|
194
|
-
{
|
195
|
-
"authorizationUrl": authorizationUrl,
|
196
|
-
"tokenUrl": tokenUrl,
|
197
|
-
"refreshUrl": refreshUrl,
|
198
|
-
"scopes": scopes,
|
199
|
-
},
|
200
|
-
)
|
201
|
-
)
|
202
|
-
super().__init__(
|
203
|
-
flows=flows,
|
204
|
-
scheme_name=scheme_name,
|
205
|
-
description=description,
|
206
|
-
auto_error=auto_error,
|
207
|
-
)
|
208
|
-
|
209
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
210
|
-
authorization = request.headers.get("Authorization")
|
211
|
-
scheme, param = get_authorization_scheme_param(authorization)
|
212
|
-
if not authorization or scheme.lower() != "bearer":
|
213
|
-
if self.auto_error:
|
214
|
-
raise HTTPException(
|
215
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
216
|
-
detail="Not authenticated",
|
217
|
-
headers={"WWW-Authenticate": "Bearer"},
|
218
|
-
)
|
219
|
-
else:
|
220
|
-
return None # pragma: nocover
|
221
|
-
return param
|
222
|
-
|
223
|
-
|
224
|
-
class SecurityScopes:
|
225
|
-
def __init__(self, scopes: Optional[List[str]] = None):
|
226
|
-
self.scopes = scopes or []
|
227
|
-
self.scope_str = " ".join(self.scopes)
|
@@ -1,34 +0,0 @@
|
|
1
|
-
from typing import Optional
|
2
|
-
|
3
|
-
from prefect._vendor.fastapi.openapi.models import OpenIdConnect as OpenIdConnectModel
|
4
|
-
from prefect._vendor.fastapi.security.base import SecurityBase
|
5
|
-
from prefect._vendor.starlette.exceptions import HTTPException
|
6
|
-
from prefect._vendor.starlette.requests import Request
|
7
|
-
from prefect._vendor.starlette.status import HTTP_403_FORBIDDEN
|
8
|
-
|
9
|
-
|
10
|
-
class OpenIdConnect(SecurityBase):
|
11
|
-
def __init__(
|
12
|
-
self,
|
13
|
-
*,
|
14
|
-
openIdConnectUrl: str,
|
15
|
-
scheme_name: Optional[str] = None,
|
16
|
-
description: Optional[str] = None,
|
17
|
-
auto_error: bool = True,
|
18
|
-
):
|
19
|
-
self.model = OpenIdConnectModel(
|
20
|
-
openIdConnectUrl=openIdConnectUrl, description=description
|
21
|
-
)
|
22
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
23
|
-
self.auto_error = auto_error
|
24
|
-
|
25
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
26
|
-
authorization = request.headers.get("Authorization")
|
27
|
-
if not authorization:
|
28
|
-
if self.auto_error:
|
29
|
-
raise HTTPException(
|
30
|
-
status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
|
31
|
-
)
|
32
|
-
else:
|
33
|
-
return None
|
34
|
-
return authorization
|
@@ -1,10 +0,0 @@
|
|
1
|
-
from typing import Optional, Tuple
|
2
|
-
|
3
|
-
|
4
|
-
def get_authorization_scheme_param(
|
5
|
-
authorization_header_value: Optional[str],
|
6
|
-
) -> Tuple[str, str]:
|
7
|
-
if not authorization_header_value:
|
8
|
-
return "", ""
|
9
|
-
scheme, _, param = authorization_header_value.partition(" ")
|
10
|
-
return scheme, param
|
@@ -1 +0,0 @@
|
|
1
|
-
from prefect._vendor.starlette.staticfiles import StaticFiles as StaticFiles # noqa
|
@@ -1 +0,0 @@
|
|
1
|
-
from prefect._vendor.starlette.testclient import TestClient as TestClient # noqa
|
prefect/_vendor/fastapi/types.py
DELETED