prefect-client 2.19.3__py3-none-any.whl → 3.0.0rc1__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.
Files changed (239) hide show
  1. prefect/__init__.py +8 -56
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/concurrency/api.py +0 -34
  5. prefect/_internal/concurrency/calls.py +0 -6
  6. prefect/_internal/concurrency/cancellation.py +0 -3
  7. prefect/_internal/concurrency/event_loop.py +0 -20
  8. prefect/_internal/concurrency/inspection.py +3 -3
  9. prefect/_internal/concurrency/threads.py +35 -0
  10. prefect/_internal/concurrency/waiters.py +0 -28
  11. prefect/_internal/pydantic/__init__.py +0 -45
  12. prefect/_internal/pydantic/v1_schema.py +21 -22
  13. prefect/_internal/pydantic/v2_schema.py +0 -2
  14. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  15. prefect/_internal/schemas/bases.py +44 -177
  16. prefect/_internal/schemas/fields.py +1 -43
  17. prefect/_internal/schemas/validators.py +60 -158
  18. prefect/artifacts.py +161 -14
  19. prefect/automations.py +39 -4
  20. prefect/blocks/abstract.py +1 -1
  21. prefect/blocks/core.py +268 -148
  22. prefect/blocks/fields.py +2 -57
  23. prefect/blocks/kubernetes.py +8 -12
  24. prefect/blocks/notifications.py +40 -20
  25. prefect/blocks/system.py +22 -11
  26. prefect/blocks/webhook.py +2 -9
  27. prefect/client/base.py +4 -4
  28. prefect/client/cloud.py +8 -13
  29. prefect/client/orchestration.py +347 -341
  30. prefect/client/schemas/actions.py +92 -86
  31. prefect/client/schemas/filters.py +20 -40
  32. prefect/client/schemas/objects.py +147 -145
  33. prefect/client/schemas/responses.py +16 -24
  34. prefect/client/schemas/schedules.py +47 -35
  35. prefect/client/subscriptions.py +2 -2
  36. prefect/client/utilities.py +5 -2
  37. prefect/concurrency/asyncio.py +3 -1
  38. prefect/concurrency/events.py +1 -1
  39. prefect/concurrency/services.py +6 -3
  40. prefect/context.py +195 -27
  41. prefect/deployments/__init__.py +5 -6
  42. prefect/deployments/base.py +7 -5
  43. prefect/deployments/flow_runs.py +185 -0
  44. prefect/deployments/runner.py +50 -45
  45. prefect/deployments/schedules.py +28 -23
  46. prefect/deployments/steps/__init__.py +0 -1
  47. prefect/deployments/steps/core.py +1 -0
  48. prefect/deployments/steps/pull.py +7 -21
  49. prefect/engine.py +12 -2422
  50. prefect/events/actions.py +17 -23
  51. prefect/events/cli/automations.py +19 -6
  52. prefect/events/clients.py +14 -37
  53. prefect/events/filters.py +14 -18
  54. prefect/events/related.py +2 -2
  55. prefect/events/schemas/__init__.py +0 -5
  56. prefect/events/schemas/automations.py +55 -46
  57. prefect/events/schemas/deployment_triggers.py +7 -197
  58. prefect/events/schemas/events.py +34 -65
  59. prefect/events/schemas/labelling.py +10 -14
  60. prefect/events/utilities.py +2 -3
  61. prefect/events/worker.py +2 -3
  62. prefect/filesystems.py +6 -517
  63. prefect/{new_flow_engine.py → flow_engine.py} +313 -72
  64. prefect/flow_runs.py +377 -5
  65. prefect/flows.py +248 -165
  66. prefect/futures.py +186 -345
  67. prefect/infrastructure/__init__.py +0 -27
  68. prefect/infrastructure/provisioners/__init__.py +5 -3
  69. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  70. prefect/infrastructure/provisioners/container_instance.py +11 -7
  71. prefect/infrastructure/provisioners/ecs.py +6 -4
  72. prefect/infrastructure/provisioners/modal.py +8 -5
  73. prefect/input/actions.py +2 -4
  74. prefect/input/run_input.py +5 -7
  75. prefect/logging/formatters.py +0 -2
  76. prefect/logging/handlers.py +3 -11
  77. prefect/logging/loggers.py +2 -2
  78. prefect/manifests.py +2 -1
  79. prefect/records/__init__.py +1 -0
  80. prefect/records/result_store.py +42 -0
  81. prefect/records/store.py +9 -0
  82. prefect/results.py +43 -39
  83. prefect/runner/runner.py +9 -9
  84. prefect/runner/server.py +6 -10
  85. prefect/runner/storage.py +3 -8
  86. prefect/runner/submit.py +2 -2
  87. prefect/runner/utils.py +2 -2
  88. prefect/serializers.py +24 -35
  89. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  90. prefect/settings.py +70 -133
  91. prefect/states.py +17 -47
  92. prefect/task_engine.py +697 -58
  93. prefect/task_runners.py +269 -301
  94. prefect/task_server.py +53 -34
  95. prefect/tasks.py +327 -337
  96. prefect/transactions.py +220 -0
  97. prefect/types/__init__.py +61 -82
  98. prefect/utilities/asyncutils.py +195 -136
  99. prefect/utilities/callables.py +121 -41
  100. prefect/utilities/collections.py +23 -38
  101. prefect/utilities/dispatch.py +11 -3
  102. prefect/utilities/dockerutils.py +4 -0
  103. prefect/utilities/engine.py +140 -20
  104. prefect/utilities/importtools.py +26 -27
  105. prefect/utilities/pydantic.py +128 -38
  106. prefect/utilities/schema_tools/hydration.py +5 -1
  107. prefect/utilities/templating.py +12 -2
  108. prefect/variables.py +78 -61
  109. prefect/workers/__init__.py +0 -1
  110. prefect/workers/base.py +15 -17
  111. prefect/workers/process.py +3 -8
  112. prefect/workers/server.py +2 -2
  113. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
  114. prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
  115. prefect/_internal/pydantic/_base_model.py +0 -51
  116. prefect/_internal/pydantic/_compat.py +0 -82
  117. prefect/_internal/pydantic/_flags.py +0 -20
  118. prefect/_internal/pydantic/_types.py +0 -8
  119. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  120. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  121. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  122. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  123. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  124. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  125. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  126. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  127. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  128. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  129. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  130. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  131. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  132. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  133. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  134. prefect/_vendor/__init__.py +0 -0
  135. prefect/_vendor/fastapi/__init__.py +0 -25
  136. prefect/_vendor/fastapi/applications.py +0 -946
  137. prefect/_vendor/fastapi/background.py +0 -3
  138. prefect/_vendor/fastapi/concurrency.py +0 -44
  139. prefect/_vendor/fastapi/datastructures.py +0 -58
  140. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  141. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  142. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  143. prefect/_vendor/fastapi/encoders.py +0 -177
  144. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  145. prefect/_vendor/fastapi/exceptions.py +0 -46
  146. prefect/_vendor/fastapi/logger.py +0 -3
  147. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  148. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  149. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  150. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  151. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  152. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  153. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  154. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  155. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  156. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  157. prefect/_vendor/fastapi/openapi/models.py +0 -480
  158. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  159. prefect/_vendor/fastapi/param_functions.py +0 -340
  160. prefect/_vendor/fastapi/params.py +0 -453
  161. prefect/_vendor/fastapi/requests.py +0 -4
  162. prefect/_vendor/fastapi/responses.py +0 -40
  163. prefect/_vendor/fastapi/routing.py +0 -1331
  164. prefect/_vendor/fastapi/security/__init__.py +0 -15
  165. prefect/_vendor/fastapi/security/api_key.py +0 -98
  166. prefect/_vendor/fastapi/security/base.py +0 -6
  167. prefect/_vendor/fastapi/security/http.py +0 -172
  168. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  169. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  170. prefect/_vendor/fastapi/security/utils.py +0 -10
  171. prefect/_vendor/fastapi/staticfiles.py +0 -1
  172. prefect/_vendor/fastapi/templating.py +0 -3
  173. prefect/_vendor/fastapi/testclient.py +0 -1
  174. prefect/_vendor/fastapi/types.py +0 -3
  175. prefect/_vendor/fastapi/utils.py +0 -235
  176. prefect/_vendor/fastapi/websockets.py +0 -7
  177. prefect/_vendor/starlette/__init__.py +0 -1
  178. prefect/_vendor/starlette/_compat.py +0 -28
  179. prefect/_vendor/starlette/_exception_handler.py +0 -80
  180. prefect/_vendor/starlette/_utils.py +0 -88
  181. prefect/_vendor/starlette/applications.py +0 -261
  182. prefect/_vendor/starlette/authentication.py +0 -159
  183. prefect/_vendor/starlette/background.py +0 -43
  184. prefect/_vendor/starlette/concurrency.py +0 -59
  185. prefect/_vendor/starlette/config.py +0 -151
  186. prefect/_vendor/starlette/convertors.py +0 -87
  187. prefect/_vendor/starlette/datastructures.py +0 -707
  188. prefect/_vendor/starlette/endpoints.py +0 -130
  189. prefect/_vendor/starlette/exceptions.py +0 -60
  190. prefect/_vendor/starlette/formparsers.py +0 -276
  191. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  192. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  193. prefect/_vendor/starlette/middleware/base.py +0 -220
  194. prefect/_vendor/starlette/middleware/cors.py +0 -176
  195. prefect/_vendor/starlette/middleware/errors.py +0 -265
  196. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  197. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  198. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  199. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  200. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  201. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  202. prefect/_vendor/starlette/requests.py +0 -328
  203. prefect/_vendor/starlette/responses.py +0 -347
  204. prefect/_vendor/starlette/routing.py +0 -933
  205. prefect/_vendor/starlette/schemas.py +0 -154
  206. prefect/_vendor/starlette/staticfiles.py +0 -248
  207. prefect/_vendor/starlette/status.py +0 -199
  208. prefect/_vendor/starlette/templating.py +0 -231
  209. prefect/_vendor/starlette/testclient.py +0 -804
  210. prefect/_vendor/starlette/types.py +0 -30
  211. prefect/_vendor/starlette/websockets.py +0 -193
  212. prefect/agent.py +0 -698
  213. prefect/deployments/deployments.py +0 -1042
  214. prefect/deprecated/__init__.py +0 -0
  215. prefect/deprecated/data_documents.py +0 -350
  216. prefect/deprecated/packaging/__init__.py +0 -12
  217. prefect/deprecated/packaging/base.py +0 -96
  218. prefect/deprecated/packaging/docker.py +0 -146
  219. prefect/deprecated/packaging/file.py +0 -92
  220. prefect/deprecated/packaging/orion.py +0 -80
  221. prefect/deprecated/packaging/serializers.py +0 -171
  222. prefect/events/instrument.py +0 -135
  223. prefect/infrastructure/base.py +0 -323
  224. prefect/infrastructure/container.py +0 -818
  225. prefect/infrastructure/kubernetes.py +0 -920
  226. prefect/infrastructure/process.py +0 -289
  227. prefect/new_task_engine.py +0 -423
  228. prefect/pydantic/__init__.py +0 -76
  229. prefect/pydantic/main.py +0 -39
  230. prefect/software/__init__.py +0 -2
  231. prefect/software/base.py +0 -50
  232. prefect/software/conda.py +0 -199
  233. prefect/software/pip.py +0 -122
  234. prefect/software/python.py +0 -52
  235. prefect/workers/block.py +0 -218
  236. prefect_client-2.19.3.dist-info/RECORD +0 -292
  237. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
  238. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
  239. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.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,6 +0,0 @@
1
- from prefect._vendor.fastapi.openapi.models import SecurityBase as SecurityBaseModel
2
-
3
-
4
- class SecurityBase:
5
- model: SecurityBaseModel
6
- scheme_name: str
@@ -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,3 +0,0 @@
1
- from prefect._vendor.starlette.templating import (
2
- Jinja2Templates as Jinja2Templates,
3
- )
@@ -1 +0,0 @@
1
- from prefect._vendor.starlette.testclient import TestClient as TestClient # noqa
@@ -1,3 +0,0 @@
1
- from typing import Any, Callable, TypeVar
2
-
3
- DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any])