-
Notifications
You must be signed in to change notification settings - Fork 0
Add arun_deployment and replace @sync_compatible with @async_dispatch
#173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: qodo_claude_vs_qodo_base_add_arun_deployment_and_replace_sync_compatible_with_async_dispatch_pr6
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,14 +8,14 @@ | |
| import prefect | ||
| from prefect._result_records import ResultRecordMetadata | ||
| from prefect.client.schemas import FlowRun, TaskRunResult | ||
| from prefect.client.utilities import inject_client | ||
| from prefect.client.utilities import get_or_create_client | ||
| from prefect.context import FlowRunContext, TaskRunContext | ||
| from prefect.logging import get_logger | ||
| from prefect.states import Pending, Scheduled | ||
| from prefect.tasks import Task | ||
| from prefect.telemetry.run_telemetry import LABELS_TRACEPARENT_KEY, RunTelemetry | ||
| from prefect.types._datetime import now | ||
| from prefect.utilities.asyncutils import sync_compatible | ||
| from prefect.utilities._engine import dynamic_key_for_task_run | ||
| from prefect.utilities.slugify import slugify | ||
|
|
||
|
|
||
|
|
@@ -45,9 +45,7 @@ def _is_instrumentation_enabled() -> bool: | |
| logger: "logging.Logger" = get_logger(__name__) | ||
|
|
||
|
|
||
| @sync_compatible | ||
| @inject_client | ||
| async def run_deployment( | ||
| async def arun_deployment( | ||
| name: Union[str, UUID], | ||
| client: Optional["PrefectClient"] = None, | ||
| parameters: Optional[dict[str, Any]] = None, | ||
|
|
@@ -62,7 +60,7 @@ async def run_deployment( | |
| job_variables: Optional[dict[str, Any]] = None, | ||
| ) -> "FlowRun": | ||
| """ | ||
| Create a flow run for a deployment and return it after completion or a timeout. | ||
| Asynchronously create a flow run for a deployment and return it after completion or a timeout. | ||
|
|
||
| By default, this function blocks until the flow run finishes executing. | ||
| Specify a timeout (in seconds) to wait for the flow run to execute before | ||
|
|
@@ -79,6 +77,7 @@ async def run_deployment( | |
| Args: | ||
| name: The deployment id or deployment name in the form: | ||
| `"flow name/deployment name"` | ||
| client: An optional PrefectClient to use for API requests. | ||
| parameters: Parameter overrides for this flow run. Merged with the deployment | ||
| defaults. | ||
| scheduled_time: The time to schedule the flow run for, defaults to scheduling | ||
|
|
@@ -100,6 +99,18 @@ async def run_deployment( | |
| job_variables: A dictionary of dot delimited infrastructure overrides that | ||
| will be applied at runtime; for example `env.CONFIG_KEY=config_value` or | ||
| `namespace='prefect'` | ||
|
|
||
| Example: | ||
| ```python | ||
| import asyncio | ||
| from prefect.deployments import arun_deployment | ||
|
|
||
| async def main(): | ||
| flow_run = await arun_deployment("my-flow/my-deployment") | ||
| print(flow_run.state) | ||
|
|
||
| asyncio.run(main()) | ||
| ``` | ||
| """ | ||
| if timeout is not None and timeout < 0: | ||
| raise ValueError("`timeout` cannot be negative") | ||
|
|
@@ -119,6 +130,8 @@ async def run_deployment( | |
| except ValueError: | ||
| pass | ||
|
|
||
| client, _ = get_or_create_client(client) | ||
|
|
||
|
Comment on lines
+133
to
+134
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 6. Unclosed created client arun_deployment uses get_or_create_client but ignores the returned "inferred" flag and never context-manages/close the client when it had to create a new one. Agent Prompt
|
||
| if deployment_id: | ||
| deployment = await client.read_deployment(deployment_id=deployment_id) | ||
| else: | ||
|
|
@@ -133,7 +146,7 @@ async def run_deployment( | |
|
|
||
| # This was called from a flow. Link the flow run as a subflow. | ||
| task_inputs = { | ||
| k: await collect_task_run_inputs(v) for k, v in parameters.items() | ||
| k: collect_task_run_inputs(v) for k, v in parameters.items() | ||
| } | ||
|
Comment on lines
146
to
150
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 5. Missing await task inputs When linking a subflow, task_inputs uses collect_task_run_inputs(v) without await even though collect_task_run_inputs is async, resulting in coroutine objects being passed as task inputs. Agent Prompt
|
||
|
|
||
| # Track parent task if this is being called from within a task | ||
|
|
@@ -196,7 +209,7 @@ async def run_deployment( | |
| trace_labels = {LABELS_TRACEPARENT_KEY: traceparent} if traceparent else {} | ||
|
|
||
| flow_run = await client.create_flow_run_from_deployment( | ||
| deployment.id, | ||
| deployment_id, | ||
| parameters=parameters, | ||
|
Comment on lines
211
to
213
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 4. None deployment_id passed arun_deployment calls client.create_flow_run_from_deployment(deployment_id, ...) even when name is a non-UUID deployment name, leaving deployment_id=None and causing an invalid required UUID argument at runtime. Agent Prompt
|
||
| state=Scheduled(scheduled_time=scheduled_time), | ||
| name=flow_run_name, | ||
|
|
@@ -215,10 +228,14 @@ async def run_deployment( | |
|
|
||
| with anyio.move_on_after(timeout): | ||
| while True: | ||
| await anyio.sleep(poll_interval) | ||
| flow_run = await client.read_flow_run(flow_run_id) | ||
| flow_state = flow_run.state | ||
| if flow_state and flow_state.is_final(): | ||
| return flow_run | ||
| await anyio.sleep(poll_interval) | ||
|
|
||
| return flow_run | ||
|
|
||
|
|
||
| # Alias for backwards compatibility | ||
| run_deployment = arun_deployment | ||
|
Comment on lines
+240
to
+241
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 2. run_deployment lacks sync wrapper run_deployment is now just an alias to the async arun_deployment, so there is no true sync-compatible wrapper. This violates the requirement that public async user-facing APIs provide sync compatibility. Agent Prompt
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1. flow_runs.py missing future annotations
📘 Rule violation✓ CorrectnessAgent Prompt
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools