prefect 3.6.5__py3-none-any.whl → 3.6.5.dev2__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 (124) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/blocks/notifications.py +0 -71
  3. prefect/cli/deploy/_models.py +2 -3
  4. prefect/concurrency/services.py +6 -71
  5. prefect/flows.py +1 -1
  6. prefect/results.py +1 -1
  7. prefect/server/database/dependencies.py +2 -2
  8. prefect/server/events/services/event_persister.py +0 -1
  9. prefect/server/events/services/triggers.py +1 -4
  10. prefect/server/models/task_runs.py +9 -30
  11. prefect/server/schemas/filters.py +5 -8
  12. prefect/server/schemas/sorting.py +23 -37
  13. prefect/server/services/task_run_recorder.py +0 -1
  14. prefect/server/ui/assets/404-U2KQOqzV.js +2 -0
  15. prefect/server/ui/assets/{404-cNTfarkM.js.map → 404-U2KQOqzV.js.map} +1 -1
  16. prefect/server/ui/assets/AppRouterView-DnlTfFmZ.js +2 -0
  17. prefect/server/ui/assets/AppRouterView-DnlTfFmZ.js.map +1 -0
  18. prefect/server/ui/assets/{Artifact-D9pQzQmC.js → Artifact-C_GJ_Wwg.js} +2 -2
  19. prefect/server/ui/assets/{Artifact-D9pQzQmC.js.map → Artifact-C_GJ_Wwg.js.map} +1 -1
  20. prefect/server/ui/assets/{ArtifactKey-Dci9S885.js → ArtifactKey-CJu4-81M.js} +2 -2
  21. prefect/server/ui/assets/{ArtifactKey-Dci9S885.js.map → ArtifactKey-CJu4-81M.js.map} +1 -1
  22. prefect/server/ui/assets/{Artifacts-3_tnsqcP.js → Artifacts-DBLGdr0r.js} +2 -2
  23. prefect/server/ui/assets/{Artifacts-3_tnsqcP.js.map → Artifacts-DBLGdr0r.js.map} +1 -1
  24. prefect/server/ui/assets/{Automation-WWzefaIP.js → Automation-CHjqUyhY.js} +2 -2
  25. prefect/server/ui/assets/{Automation-WWzefaIP.js.map → Automation-CHjqUyhY.js.map} +1 -1
  26. prefect/server/ui/assets/{AutomationCreate-BXntaZwK.js → AutomationCreate-B9suteEb.js} +2 -2
  27. prefect/server/ui/assets/{AutomationCreate-BXntaZwK.js.map → AutomationCreate-B9suteEb.js.map} +1 -1
  28. prefect/server/ui/assets/{AutomationEdit-Nmj5pgV7.js → AutomationEdit-0LbdV6Ww.js} +2 -2
  29. prefect/server/ui/assets/{AutomationEdit-Nmj5pgV7.js.map → AutomationEdit-0LbdV6Ww.js.map} +1 -1
  30. prefect/server/ui/assets/{AutomationWizard.vue_vue_type_script_setup_true_lang-C0eUtYtR.js → AutomationWizard.vue_vue_type_script_setup_true_lang-BKawaUBD.js} +2 -2
  31. prefect/server/ui/assets/{AutomationWizard.vue_vue_type_script_setup_true_lang-C0eUtYtR.js.map → AutomationWizard.vue_vue_type_script_setup_true_lang-BKawaUBD.js.map} +1 -1
  32. prefect/server/ui/assets/{Automations-BTByQSIa.js → Automations-Bx2GWCSi.js} +2 -2
  33. prefect/server/ui/assets/{Automations-BTByQSIa.js.map → Automations-Bx2GWCSi.js.map} +1 -1
  34. prefect/server/ui/assets/{BlockEdit-TXsu808p.js → BlockEdit-D0ze825D.js} +2 -2
  35. prefect/server/ui/assets/{BlockEdit-TXsu808p.js.map → BlockEdit-D0ze825D.js.map} +1 -1
  36. prefect/server/ui/assets/{BlockView-ClO3cjvJ.js → BlockView-Bd1J8dbH.js} +2 -2
  37. prefect/server/ui/assets/{BlockView-ClO3cjvJ.js.map → BlockView-Bd1J8dbH.js.map} +1 -1
  38. prefect/server/ui/assets/{Blocks-BkExfYYT.js → Blocks-BfGokvlq.js} +2 -2
  39. prefect/server/ui/assets/{Blocks-BkExfYYT.js.map → Blocks-BfGokvlq.js.map} +1 -1
  40. prefect/server/ui/assets/{BlocksCatalog-EKrfg03a.js → BlocksCatalog-DIoY03PO.js} +2 -2
  41. prefect/server/ui/assets/{BlocksCatalog-EKrfg03a.js.map → BlocksCatalog-DIoY03PO.js.map} +1 -1
  42. prefect/server/ui/assets/{BlocksCatalogCreate-BkEaFm81.js → BlocksCatalogCreate-KGE2Eauv.js} +2 -2
  43. prefect/server/ui/assets/{BlocksCatalogCreate-BkEaFm81.js.map → BlocksCatalogCreate-KGE2Eauv.js.map} +1 -1
  44. prefect/server/ui/assets/{BlocksCatalogView-Dra7rjpU.js → BlocksCatalogView-qlD5J9Xo.js} +2 -2
  45. prefect/server/ui/assets/{BlocksCatalogView-Dra7rjpU.js.map → BlocksCatalogView-qlD5J9Xo.js.map} +1 -1
  46. prefect/server/ui/assets/{ConcurrencyLimit-Dja_e7Qi.js → ConcurrencyLimit-CV4LJtq0.js} +2 -2
  47. prefect/server/ui/assets/{ConcurrencyLimit-Dja_e7Qi.js.map → ConcurrencyLimit-CV4LJtq0.js.map} +1 -1
  48. prefect/server/ui/assets/{ConcurrencyLimits-BhgfLozN.js → ConcurrencyLimits-DdzVXpyn.js} +2 -2
  49. prefect/server/ui/assets/{ConcurrencyLimits-BhgfLozN.js.map → ConcurrencyLimits-DdzVXpyn.js.map} +1 -1
  50. prefect/server/ui/assets/{Dashboard-DU4NaIUe.js → Dashboard-Bhe8HF89.js} +2 -2
  51. prefect/server/ui/assets/{Dashboard-DU4NaIUe.js.map → Dashboard-Bhe8HF89.js.map} +1 -1
  52. prefect/server/ui/assets/{Deployment-26av4B2n.js → Deployment-Dy6W3fmS.js} +2 -2
  53. prefect/server/ui/assets/{Deployment-26av4B2n.js.map → Deployment-Dy6W3fmS.js.map} +1 -1
  54. prefect/server/ui/assets/{DeploymentDuplicate-DrHdbfGO.js → DeploymentDuplicate-D--6CH0b.js} +2 -2
  55. prefect/server/ui/assets/{DeploymentDuplicate-DrHdbfGO.js.map → DeploymentDuplicate-D--6CH0b.js.map} +1 -1
  56. prefect/server/ui/assets/{DeploymentEdit-CTlfod0i.js → DeploymentEdit-CCWux4XP.js} +2 -2
  57. prefect/server/ui/assets/{DeploymentEdit-CTlfod0i.js.map → DeploymentEdit-CCWux4XP.js.map} +1 -1
  58. prefect/server/ui/assets/{Deployments-BqQB3LD3.js → Deployments-DV03_V2d.js} +2 -2
  59. prefect/server/ui/assets/{Deployments-BqQB3LD3.js.map → Deployments-DV03_V2d.js.map} +1 -1
  60. prefect/server/ui/assets/{Event-Ddqkp5Eb.js → Event-CR8eAMth.js} +2 -2
  61. prefect/server/ui/assets/{Event-Ddqkp5Eb.js.map → Event-CR8eAMth.js.map} +1 -1
  62. prefect/server/ui/assets/{Events-DVhuODUR.js → Events-73DIQpjK.js} +2 -2
  63. prefect/server/ui/assets/{Events-DVhuODUR.js.map → Events-73DIQpjK.js.map} +1 -1
  64. prefect/server/ui/assets/{Flow-CAl7lKeq.js → Flow-Dj94GRjt.js} +2 -2
  65. prefect/server/ui/assets/{Flow-CAl7lKeq.js.map → Flow-Dj94GRjt.js.map} +1 -1
  66. prefect/server/ui/assets/{FlowRun-h0x5CxKG.js → FlowRun-Difiqz5F.js} +2 -2
  67. prefect/server/ui/assets/{FlowRun-h0x5CxKG.js.map → FlowRun-Difiqz5F.js.map} +1 -1
  68. prefect/server/ui/assets/{FlowRunCreate-DLYa_njJ.js → FlowRunCreate-C15hcUnz.js} +2 -2
  69. prefect/server/ui/assets/{FlowRunCreate-DLYa_njJ.js.map → FlowRunCreate-C15hcUnz.js.map} +1 -1
  70. prefect/server/ui/assets/{Flows-DJ-cJREs.js → Flows-y-EKyQtq.js} +2 -2
  71. prefect/server/ui/assets/{Flows-DJ-cJREs.js.map → Flows-y-EKyQtq.js.map} +1 -1
  72. prefect/server/ui/assets/{Runs-rPCeL6qJ.js → Runs-ChDNmYZa.js} +2 -2
  73. prefect/server/ui/assets/{Runs-rPCeL6qJ.js.map → Runs-ChDNmYZa.js.map} +1 -1
  74. prefect/server/ui/assets/{RunsPageWithDefaultFilter-CceYGNey-BtMS3SJk.js → RunsPageWithDefaultFilter-CceYGNey-Ca54l1eH.js} +2 -2
  75. prefect/server/ui/assets/{RunsPageWithDefaultFilter-CceYGNey-BtMS3SJk.js.map → RunsPageWithDefaultFilter-CceYGNey-Ca54l1eH.js.map} +1 -1
  76. prefect/server/ui/assets/{Settings-w2bn-3ns.js → Settings-DKQCv00B.js} +2 -2
  77. prefect/server/ui/assets/{Settings-w2bn-3ns.js.map → Settings-DKQCv00B.js.map} +1 -1
  78. prefect/server/ui/assets/{TaskRun-CPjqF2yp.js → TaskRun-U9jCz08z.js} +2 -2
  79. prefect/server/ui/assets/{TaskRun-CPjqF2yp.js.map → TaskRun-U9jCz08z.js.map} +1 -1
  80. prefect/server/ui/assets/{Unauthenticated-Yg8XqjIn.js → Unauthenticated-DNxb3CVl.js} +2 -2
  81. prefect/server/ui/assets/{Unauthenticated-Yg8XqjIn.js.map → Unauthenticated-DNxb3CVl.js.map} +1 -1
  82. prefect/server/ui/assets/{Variables-CaD3bA0b.js → Variables-Db73bUnI.js} +2 -2
  83. prefect/server/ui/assets/{Variables-CaD3bA0b.js.map → Variables-Db73bUnI.js.map} +1 -1
  84. prefect/server/ui/assets/{WorkPool-BCBo-n5K.js → WorkPool-DvcSLUL2.js} +2 -2
  85. prefect/server/ui/assets/{WorkPool-BCBo-n5K.js.map → WorkPool-DvcSLUL2.js.map} +1 -1
  86. prefect/server/ui/assets/{WorkPoolCreate-DZbqjYpg.js → WorkPoolCreate-Ba51_j6H.js} +2 -2
  87. prefect/server/ui/assets/{WorkPoolCreate-DZbqjYpg.js.map → WorkPoolCreate-Ba51_j6H.js.map} +1 -1
  88. prefect/server/ui/assets/{WorkPoolEdit-BNqs1-RP.js → WorkPoolEdit-BX6sq21G.js} +2 -2
  89. prefect/server/ui/assets/{WorkPoolEdit-BNqs1-RP.js.map → WorkPoolEdit-BX6sq21G.js.map} +1 -1
  90. prefect/server/ui/assets/{WorkPoolQueue-CpbBSFRw.js → WorkPoolQueue-CrhLOB9z.js} +2 -2
  91. prefect/server/ui/assets/{WorkPoolQueue-CpbBSFRw.js.map → WorkPoolQueue-CrhLOB9z.js.map} +1 -1
  92. prefect/server/ui/assets/{WorkPoolQueueCreate-DavJ3kww.js → WorkPoolQueueCreate-NBYMDZiu.js} +2 -2
  93. prefect/server/ui/assets/{WorkPoolQueueCreate-DavJ3kww.js.map → WorkPoolQueueCreate-NBYMDZiu.js.map} +1 -1
  94. prefect/server/ui/assets/{WorkPoolQueueEdit-B-UNXtv9.js → WorkPoolQueueEdit-aDYoZnft.js} +2 -2
  95. prefect/server/ui/assets/{WorkPoolQueueEdit-B-UNXtv9.js.map → WorkPoolQueueEdit-aDYoZnft.js.map} +1 -1
  96. prefect/server/ui/assets/{WorkPools-8Aq4RA_W.js → WorkPools-A1onpvmM.js} +2 -2
  97. prefect/server/ui/assets/{WorkPools-8Aq4RA_W.js.map → WorkPools-A1onpvmM.js.map} +1 -1
  98. prefect/server/ui/assets/{WorkQueueToWorkPoolQueueRedirect-C9AtKf4r-ByNdkwZz.js → WorkQueueToWorkPoolQueueRedirect-C9AtKf4r-DpZf1FHA.js} +2 -2
  99. prefect/server/ui/assets/{WorkQueueToWorkPoolQueueRedirect-C9AtKf4r-ByNdkwZz.js.map → WorkQueueToWorkPoolQueueRedirect-C9AtKf4r-DpZf1FHA.js.map} +1 -1
  100. prefect/server/ui/assets/{index-B2Mqn-oh.js → index-BRrm8IYN.js} +4 -4
  101. prefect/server/ui/assets/{index-B2Mqn-oh.js.map → index-BRrm8IYN.js.map} +1 -1
  102. prefect/server/ui/assets/{mapper-Dc-EvePY.js → mapper-DJ53lQ_S.js} +2 -2
  103. prefect/server/ui/assets/{mapper-Dc-EvePY.js.map → mapper-DJ53lQ_S.js.map} +1 -1
  104. prefect/server/ui/assets/useCan-BidbvPHp.js +2 -0
  105. prefect/server/ui/assets/{useCan-UjdHjQ2R.js.map → useCan-BidbvPHp.js.map} +1 -1
  106. prefect/server/ui/assets/{usePageTitle-CuMQMQX5.js → usePageTitle-D8ThwtpL.js} +2 -2
  107. prefect/server/ui/assets/{usePageTitle-CuMQMQX5.js.map → usePageTitle-D8ThwtpL.js.map} +1 -1
  108. prefect/server/ui/assets/{usePrefectApi-CVNyESB6.js → usePrefectApi-CPise1aa.js} +2 -2
  109. prefect/server/ui/assets/{usePrefectApi-CVNyESB6.js.map → usePrefectApi-CPise1aa.js.map} +1 -1
  110. prefect/server/ui/index.html +1 -1
  111. prefect/settings/models/server/services.py +0 -23
  112. prefect/task_engine.py +32 -138
  113. prefect/tasks.py +1 -2
  114. prefect/workers/base.py +1 -23
  115. {prefect-3.6.5.dist-info → prefect-3.6.5.dev2.dist-info}/METADATA +1 -1
  116. {prefect-3.6.5.dist-info → prefect-3.6.5.dev2.dist-info}/RECORD +119 -120
  117. {prefect-3.6.5.dist-info → prefect-3.6.5.dev2.dist-info}/WHEEL +1 -1
  118. prefect/_states.py +0 -292
  119. prefect/server/ui/assets/404-cNTfarkM.js +0 -2
  120. prefect/server/ui/assets/AppRouterView-CsqzqHZP.js +0 -2
  121. prefect/server/ui/assets/AppRouterView-CsqzqHZP.js.map +0 -1
  122. prefect/server/ui/assets/useCan-UjdHjQ2R.js +0 -2
  123. {prefect-3.6.5.dist-info → prefect-3.6.5.dev2.dist-info}/entry_points.txt +0 -0
  124. {prefect-3.6.5.dist-info → prefect-3.6.5.dev2.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Generated by versioningit
2
- __version__ = "3.6.5"
3
- __build_date__ = "2025-12-04 20:01:33.150516+00:00"
4
- __git_commit__ = "857c60b5d64cdfad7db0a045b0ed22ff83379a3e"
2
+ __version__ = "3.6.5.dev2"
3
+ __build_date__ = "2025-11-25 08:10:27.957449+00:00"
4
+ __git_commit__ = "32a33d737df7ebeec964f3a3d38773100119ea6d"
5
5
  __dirty__ = False
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- import re
5
4
  from abc import ABC
6
5
  from typing import Any, Optional, cast
7
6
 
@@ -106,9 +105,6 @@ class SlackWebhook(AppriseNotificationBlock):
106
105
  """
107
106
  Enables sending notifications via a provided Slack webhook.
108
107
 
109
- Supports both standard Slack webhooks (hooks.slack.com) and Slack GovCloud
110
- webhooks (hooks.slack-gov.com).
111
-
112
108
  Examples:
113
109
  Load a saved Slack webhook and send a message:
114
110
  ```python
@@ -134,73 +130,6 @@ class SlackWebhook(AppriseNotificationBlock):
134
130
  examples=["https://hooks.slack.com/XXX"],
135
131
  )
136
132
 
137
- _SLACK_WEBHOOK_URL_PATTERN: re.Pattern[str] = re.compile(
138
- r"^https?://(?P<host>hooks\.slack(?:-gov)?\.com)/services/"
139
- r"(?P<token_a>[A-Z0-9]+)/"
140
- r"(?P<token_b>[A-Z0-9]+)/"
141
- r"(?P<token_c>[A-Z0-9]+)/?$",
142
- re.I,
143
- )
144
-
145
- def block_initialization(self) -> None:
146
- """Initialize the Slack webhook client.
147
-
148
- This method handles both standard Slack webhooks and Slack GovCloud webhooks.
149
- Apprise's built-in Slack plugin only supports hooks.slack.com, so we need to
150
- manually construct the NotifySlack instance for slack-gov.com URLs to ensure
151
- notifications are sent to the correct host.
152
-
153
- See: https://github.com/caronc/apprise/issues/XXXX (upstream issue)
154
- """
155
- webhook_url = self.url.get_secret_value()
156
- match = self._SLACK_WEBHOOK_URL_PATTERN.match(webhook_url)
157
-
158
- # If it's not a recognized Slack webhook shape, delegate to the base behavior.
159
- # This lets restricted-URL checks and existing Apprise validation run as before.
160
- if not match:
161
- self._start_apprise_client(self.url)
162
- return
163
-
164
- host = match.group("host")
165
-
166
- # Standard Slack: let Apprise handle it like it always has.
167
- if host == "hooks.slack.com":
168
- self._start_apprise_client(self.url)
169
- return
170
-
171
- # GovCloud: we know it's a valid Slack webhook and host is hooks.slack-gov.com
172
- # We must add the NotifySlack instance directly to the apprise client
173
- # (rather than passing slack_instance.url()) because the webhook_url
174
- # override is an instance attribute that would be lost if apprise
175
- # re-parsed the URL string.
176
- from apprise import Apprise, AppriseAsset
177
-
178
- try:
179
- from apprise.plugins.slack import NotifySlack
180
- except ImportError:
181
- from apprise.plugins.NotifySlack import (
182
- NotifySlack, # pyright: ignore[reportMissingImports]
183
- )
184
-
185
- token_a = match.group("token_a")
186
- token_b = match.group("token_b")
187
- token_c = match.group("token_c")
188
-
189
- slack_instance = NotifySlack(
190
- token_a=token_a,
191
- token_b=token_b,
192
- token_c=token_c,
193
- )
194
- slack_instance.webhook_url = f"https://{host}/services"
195
-
196
- prefect_app_data = AppriseAsset(
197
- app_id="Prefect Notifications",
198
- app_desc="Prefect Notifications",
199
- app_url="https://prefect.io",
200
- )
201
- self._apprise_client = Apprise(asset=prefect_app_data)
202
- self._apprise_client.add(slack_instance)
203
-
204
133
 
205
134
  class MicrosoftTeamsWebhook(AppriseNotificationBlock):
206
135
  """
@@ -7,6 +7,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_valida
7
7
  from prefect._experimental.sla.objects import SlaTypes
8
8
  from prefect.client.schemas.actions import DeploymentScheduleCreate
9
9
  from prefect.client.schemas.schedules import SCHEDULE_TYPES
10
+ from prefect.events import DeploymentTriggerTypes
10
11
 
11
12
 
12
13
  class WorkPoolConfig(BaseModel):
@@ -51,9 +52,7 @@ class DeploymentConfig(BaseModel):
51
52
  work_pool: Optional[WorkPoolConfig] = None
52
53
 
53
54
  # automations metadata
54
- # Triggers are stored as raw dicts to allow Jinja templating (e.g., enabled: "{{ prefect.variables.is_prod }}")
55
- # Strict validation happens later in _initialize_deployment_triggers after template resolution
56
- triggers: Optional[List[Dict[str, Any]]] = None
55
+ triggers: Optional[List[DeploymentTriggerTypes]] = None
57
56
  sla: Optional[List[SlaTypes]] = None
58
57
 
59
58
 
@@ -1,12 +1,8 @@
1
1
  import asyncio
2
- import json
3
2
  from collections.abc import AsyncGenerator
4
3
  from contextlib import asynccontextmanager
5
- from threading import Lock
6
4
  from typing import TYPE_CHECKING, Literal, Optional
7
- from uuid import uuid4
8
5
 
9
- import cachetools
10
6
  import httpx
11
7
  from starlette import status
12
8
  from typing_extensions import TypeAlias, Unpack
@@ -20,14 +16,6 @@ if TYPE_CHECKING:
20
16
  from prefect.client.orchestration import PrefectClient
21
17
  from prefect.client.schemas.objects import ConcurrencyLeaseHolder
22
18
 
23
- # Shared cache for tags with no concurrency limits.
24
- # When a set of tags is known to have no limits, we cache that result
25
- # to avoid unnecessary API calls.
26
- _no_limits_cache: cachetools.TTLCache[frozenset[str], bool] = cachetools.TTLCache(
27
- maxsize=1000, ttl=5.0
28
- )
29
- _cache_lock = Lock()
30
-
31
19
  _Item: TypeAlias = tuple[
32
20
  int, Literal["concurrency", "rate_limit"], Optional[float], Optional[int]
33
21
  ]
@@ -139,37 +127,16 @@ class ConcurrencySlotAcquisitionWithLeaseService(
139
127
  httpx.HTTPStatusError: If the server returns an error other than 423 LOCKED
140
128
  TimeoutError: If acquisition times out
141
129
  """
142
- use_cache = _should_use_cache(self.concurrency_limit_names, holder)
143
- cache_key = frozenset(self.concurrency_limit_names)
144
-
145
130
  with timeout_async(seconds=timeout_seconds):
146
131
  while True:
147
132
  try:
148
- if use_cache:
149
- with _cache_lock:
150
- if _no_limits_cache.get(cache_key, False):
151
- return _create_empty_limits_response()
152
-
153
- response = (
154
- await self._client.increment_concurrency_slots_with_lease(
155
- names=self.concurrency_limit_names,
156
- slots=slots,
157
- mode=mode,
158
- lease_duration=lease_duration,
159
- holder=holder,
160
- )
133
+ return await self._client.increment_concurrency_slots_with_lease(
134
+ names=self.concurrency_limit_names,
135
+ slots=slots,
136
+ mode=mode,
137
+ lease_duration=lease_duration,
138
+ holder=holder,
161
139
  )
162
-
163
- if use_cache:
164
- try:
165
- response_data = response.json()
166
- if not response_data.get("limits"):
167
- with _cache_lock:
168
- _no_limits_cache[cache_key] = True
169
- except Exception:
170
- pass
171
-
172
- return response
173
140
  except httpx.HTTPStatusError as exc:
174
141
  if exc.response.status_code != status.HTTP_423_LOCKED:
175
142
  raise
@@ -184,35 +151,3 @@ class ConcurrencySlotAcquisitionWithLeaseService(
184
151
  await asyncio.sleep(retry_after)
185
152
  if max_retries is not None:
186
153
  max_retries -= 1
187
-
188
-
189
- def _should_use_cache(
190
- names: list[str], holder: Optional["ConcurrencyLeaseHolder"]
191
- ) -> bool:
192
- """Determine if caching should be used for this concurrency acquisition.
193
-
194
- Caching is only enabled for task-run tag-based concurrency checks to avoid
195
- unnecessary API calls when no limits exist for those tags. This specifically
196
- targets the task engine path that uses names like "tag:..." with a task_run holder.
197
- """
198
- if holder is None:
199
- return False
200
- if getattr(holder, "type", None) != "task_run":
201
- return False
202
- if not names:
203
- return False
204
- return all(name.startswith("tag:") for name in names)
205
-
206
-
207
- def _create_empty_limits_response() -> httpx.Response:
208
- """Create a synthetic httpx.Response indicating no concurrency limits exist.
209
-
210
- This is used when we've cached that a set of tags has no limits,
211
- allowing us to skip the API call entirely.
212
- """
213
- response_data = {"lease_id": str(uuid4()), "limits": []}
214
- return httpx.Response(
215
- status_code=200,
216
- content=json.dumps(response_data).encode(),
217
- headers={"content-type": "application/json"},
218
- )
prefect/flows.py CHANGED
@@ -372,7 +372,7 @@ class Flow(Generic[P, R]):
372
372
  persist_result = True
373
373
 
374
374
  self.persist_result = persist_result
375
- if result_storage and not isinstance(result_storage, (str, Path)):
375
+ if result_storage and not isinstance(result_storage, str):
376
376
  if getattr(result_storage, "_block_document_id", None) is None:
377
377
  raise TypeError(
378
378
  "Result storage configuration must be persisted server-side."
prefect/results.py CHANGED
@@ -61,7 +61,7 @@ if TYPE_CHECKING:
61
61
  from prefect.transactions import IsolationLevel
62
62
 
63
63
 
64
- ResultStorage = Union[WritableFileSystem, str, Path]
64
+ ResultStorage = Union[WritableFileSystem, str]
65
65
  ResultSerializer = Union[Serializer, str]
66
66
  LITERAL_TYPES: set[type] = {type(None), bool, UUID}
67
67
 
@@ -31,12 +31,12 @@ from prefect.server.database.configurations import (
31
31
  AsyncPostgresConfiguration,
32
32
  BaseDatabaseConfiguration,
33
33
  )
34
- from prefect.server.database.interface import PrefectDBInterface
35
34
  from prefect.server.utilities.database import get_dialect
36
35
  from prefect.server.utilities.schemas import PrefectDescriptorBase
37
36
  from prefect.settings import PREFECT_API_DATABASE_CONNECTION_URL
38
37
 
39
38
  if TYPE_CHECKING:
39
+ from prefect.server.database.interface import PrefectDBInterface
40
40
  from prefect.server.database.orm_models import BaseORMConfiguration
41
41
  from prefect.server.database.query_components import BaseQueryComponents
42
42
 
@@ -65,7 +65,7 @@ MODELS_DEPENDENCIES: _ModelDependencies = {
65
65
  }
66
66
 
67
67
 
68
- def provide_database_interface() -> PrefectDBInterface:
68
+ def provide_database_interface() -> "PrefectDBInterface":
69
69
  """
70
70
  Get the current Prefect REST API database interface.
71
71
 
@@ -109,7 +109,6 @@ class EventPersister(RunInEphemeralServers, Service):
109
109
  "events",
110
110
  group="event-persister",
111
111
  name=generate_unique_consumer_name("event-persister"),
112
- read_batch_size=self.service_settings().read_batch_size,
113
112
  )
114
113
 
115
114
  async with create_handler(
@@ -37,10 +37,7 @@ class ReactiveTriggers(RunInEphemeralServers, Service):
37
37
  f"ReactiveTriggers starting with unique consumer name: {consumer_name}"
38
38
  )
39
39
  self.consumer: Consumer = create_consumer(
40
- "events",
41
- group="reactive-triggers",
42
- name=consumer_name,
43
- read_batch_size=self.service_settings().read_batch_size,
40
+ "events", group="reactive-triggers", name=consumer_name
44
41
  )
45
42
 
46
43
  async with triggers.consumer() as handler:
@@ -379,36 +379,16 @@ async def count_task_runs(
379
379
  int: count of task runs
380
380
  """
381
381
 
382
- if flow_filter or flow_run_filter or deployment_filter:
383
- query = select(sa.func.count(None)).select_from(db.TaskRun)
384
- query = query.join(db.FlowRun, db.TaskRun.flow_run_id == db.FlowRun.id)
382
+ query = select(sa.func.count(None)).select_from(db.TaskRun)
385
383
 
386
- if flow_run_filter:
387
- query = query.where(flow_run_filter.as_sql_filter())
388
-
389
- if flow_filter:
390
- query = query.join(db.Flow, db.Flow.id == db.FlowRun.flow_id)
391
- query = query.where(flow_filter.as_sql_filter())
392
-
393
- if deployment_filter:
394
- query = query.join(
395
- db.Deployment, db.Deployment.id == db.FlowRun.deployment_id
396
- )
397
- query = query.where(deployment_filter.as_sql_filter())
398
-
399
- if task_run_filter:
400
- query = query.where(task_run_filter.as_sql_filter())
401
- else:
402
- query = select(sa.func.count(None)).select_from(db.TaskRun)
403
-
404
- query = await _apply_task_run_filters(
405
- db,
406
- query,
407
- flow_filter=flow_filter,
408
- flow_run_filter=flow_run_filter,
409
- task_run_filter=task_run_filter,
410
- deployment_filter=deployment_filter,
411
- )
384
+ query = await _apply_task_run_filters(
385
+ db,
386
+ query,
387
+ flow_filter=flow_filter,
388
+ flow_run_filter=flow_run_filter,
389
+ task_run_filter=task_run_filter,
390
+ deployment_filter=deployment_filter,
391
+ )
412
392
 
413
393
  result = await session.execute(query)
414
394
  return result.scalar_one()
@@ -440,7 +420,6 @@ async def count_task_runs_by_state(
440
420
  select(db.TaskRun.state_type, sa.func.count(None).label("count"))
441
421
  .select_from(db.TaskRun)
442
422
  .group_by(db.TaskRun.state_type)
443
- .where(db.TaskRun.state_type.isnot(None))
444
423
  )
445
424
 
446
425
  query = await _apply_task_run_filters(
@@ -12,6 +12,7 @@ from pydantic import ConfigDict, Field
12
12
  from sqlalchemy.sql.functions import coalesce
13
13
 
14
14
  import prefect.server.schemas as schemas
15
+ from prefect.server.utilities.database import db_injector
15
16
  from prefect.server.utilities.schemas.bases import PrefectBaseModel
16
17
  from prefect.server.utilities.text_search_parser import (
17
18
  parse_text_search_query,
@@ -51,11 +52,9 @@ class PrefectFilterBaseModel(PrefectBaseModel):
51
52
 
52
53
  model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
53
54
 
54
- def as_sql_filter(self) -> sa.ColumnElement[bool]:
55
+ @db_injector
56
+ def as_sql_filter(self, db: "PrefectDBInterface") -> sa.ColumnElement[bool]:
55
57
  """Generate SQL filter from provided filter parameters. If no filters parameters are available, return a TRUE filter."""
56
- from prefect.server.database.dependencies import provide_database_interface
57
-
58
- db = provide_database_interface()
59
58
  filters = self._get_filter_list(db)
60
59
  if not filters:
61
60
  return sa.true()
@@ -76,10 +75,8 @@ class PrefectOperatorFilterBaseModel(PrefectFilterBaseModel):
76
75
  description="Operator for combining filter criteria. Defaults to 'and_'.",
77
76
  )
78
77
 
79
- def as_sql_filter(self) -> sa.ColumnElement[bool]:
80
- from prefect.server.database.dependencies import provide_database_interface
81
-
82
- db = provide_database_interface()
78
+ @db_injector
79
+ def as_sql_filter(self, db: "PrefectDBInterface") -> sa.ColumnElement[bool]:
83
80
  filters = self._get_filter_list(db)
84
81
  if not filters:
85
82
  return sa.true()
@@ -3,12 +3,16 @@ Schemas for sorting Prefect REST API objects.
3
3
  """
4
4
 
5
5
  from collections.abc import Iterable
6
- from typing import Any
6
+ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  import sqlalchemy as sa
9
9
 
10
+ from prefect.server.utilities.database import db_injector
10
11
  from prefect.utilities.collections import AutoEnum
11
12
 
13
+ if TYPE_CHECKING:
14
+ from prefect.server.database import PrefectDBInterface
15
+
12
16
  # TODO: Consider moving the `as_sql_sort` functions out of here since they are a
13
17
  # database model level function and do not properly separate concerns when
14
18
  # present in the schemas module
@@ -27,11 +31,9 @@ class FlowRunSort(AutoEnum):
27
31
  NEXT_SCHEDULED_START_TIME_ASC = AutoEnum.auto()
28
32
  END_TIME_DESC = AutoEnum.auto()
29
33
 
30
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
34
+ @db_injector
35
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
31
36
  """Return an expression used to sort flow runs"""
32
- from prefect.server.database.dependencies import provide_database_interface
33
-
34
- db = provide_database_interface()
35
37
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
36
38
  "ID_DESC": [db.FlowRun.id.desc()],
37
39
  "START_TIME_ASC": [
@@ -67,11 +69,9 @@ class TaskRunSort(AutoEnum):
67
69
  NEXT_SCHEDULED_START_TIME_ASC = AutoEnum.auto()
68
70
  END_TIME_DESC = AutoEnum.auto()
69
71
 
70
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
72
+ @db_injector
73
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
71
74
  """Return an expression used to sort task runs"""
72
- from prefect.server.database.dependencies import provide_database_interface
73
-
74
- db = provide_database_interface()
75
75
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
76
76
  "ID_DESC": [db.TaskRun.id.desc()],
77
77
  "EXPECTED_START_TIME_ASC": [db.TaskRun.expected_start_time.asc()],
@@ -92,11 +92,9 @@ class LogSort(AutoEnum):
92
92
  TIMESTAMP_ASC = AutoEnum.auto()
93
93
  TIMESTAMP_DESC = AutoEnum.auto()
94
94
 
95
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
95
+ @db_injector
96
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
96
97
  """Return an expression used to sort task runs"""
97
- from prefect.server.database.dependencies import provide_database_interface
98
-
99
- db = provide_database_interface()
100
98
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
101
99
  "TIMESTAMP_ASC": [db.Log.timestamp.asc()],
102
100
  "TIMESTAMP_DESC": [db.Log.timestamp.desc()],
@@ -112,11 +110,9 @@ class FlowSort(AutoEnum):
112
110
  NAME_ASC = AutoEnum.auto()
113
111
  NAME_DESC = AutoEnum.auto()
114
112
 
115
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
113
+ @db_injector
114
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
116
115
  """Return an expression used to sort task runs"""
117
- from prefect.server.database.dependencies import provide_database_interface
118
-
119
- db = provide_database_interface()
120
116
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
121
117
  "CREATED_DESC": [db.Flow.created.desc()],
122
118
  "UPDATED_DESC": [db.Flow.updated.desc()],
@@ -134,11 +130,9 @@ class DeploymentSort(AutoEnum):
134
130
  NAME_ASC = AutoEnum.auto()
135
131
  NAME_DESC = AutoEnum.auto()
136
132
 
137
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
133
+ @db_injector
134
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
138
135
  """Return an expression used to sort task runs"""
139
- from prefect.server.database.dependencies import provide_database_interface
140
-
141
- db = provide_database_interface()
142
136
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
143
137
  "CREATED_DESC": [db.Deployment.created.desc()],
144
138
  "UPDATED_DESC": [db.Deployment.updated.desc()],
@@ -157,11 +151,9 @@ class ArtifactSort(AutoEnum):
157
151
  KEY_DESC = AutoEnum.auto()
158
152
  KEY_ASC = AutoEnum.auto()
159
153
 
160
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
154
+ @db_injector
155
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
161
156
  """Return an expression used to sort task runs"""
162
- from prefect.server.database.dependencies import provide_database_interface
163
-
164
- db = provide_database_interface()
165
157
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
166
158
  "CREATED_DESC": [db.Artifact.created.desc()],
167
159
  "UPDATED_DESC": [db.Artifact.updated.desc()],
@@ -181,11 +173,9 @@ class ArtifactCollectionSort(AutoEnum):
181
173
  KEY_DESC = AutoEnum.auto()
182
174
  KEY_ASC = AutoEnum.auto()
183
175
 
184
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
176
+ @db_injector
177
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
185
178
  """Return an expression used to sort task runs"""
186
- from prefect.server.database.dependencies import provide_database_interface
187
-
188
- db = provide_database_interface()
189
179
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
190
180
  "CREATED_DESC": [db.ArtifactCollection.created.desc()],
191
181
  "UPDATED_DESC": [db.ArtifactCollection.updated.desc()],
@@ -204,11 +194,9 @@ class VariableSort(AutoEnum):
204
194
  NAME_DESC = "NAME_DESC"
205
195
  NAME_ASC = "NAME_ASC"
206
196
 
207
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
197
+ @db_injector
198
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
208
199
  """Return an expression used to sort task runs"""
209
- from prefect.server.database.dependencies import provide_database_interface
210
-
211
- db = provide_database_interface()
212
200
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
213
201
  "CREATED_DESC": [db.Variable.created.desc()],
214
202
  "UPDATED_DESC": [db.Variable.updated.desc()],
@@ -225,11 +213,9 @@ class BlockDocumentSort(AutoEnum):
225
213
  NAME_ASC = "NAME_ASC"
226
214
  BLOCK_TYPE_AND_NAME_ASC = "BLOCK_TYPE_AND_NAME_ASC"
227
215
 
228
- def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
216
+ @db_injector
217
+ def as_sql_sort(self, db: "PrefectDBInterface") -> Iterable[sa.ColumnElement[Any]]:
229
218
  """Return an expression used to sort task runs"""
230
- from prefect.server.database.dependencies import provide_database_interface
231
-
232
- db = provide_database_interface()
233
219
  sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
234
220
  "NAME_DESC": [db.BlockDocument.name.desc()],
235
221
  "NAME_ASC": [db.BlockDocument.name.asc()],
@@ -270,7 +270,6 @@ class TaskRunRecorder(RunInEphemeralServers, Service):
270
270
  "events",
271
271
  group="task-run-recorder",
272
272
  name=generate_unique_consumer_name("task-run-recorder"),
273
- read_batch_size=self.service_settings().read_batch_size,
274
273
  )
275
274
 
276
275
  async with consumer() as handler:
@@ -0,0 +1,2 @@
1
+ import{d as e,c as o,o as a,m as t,dz as r}from"./index-BRrm8IYN.js";import{u as s}from"./usePageTitle-D8ThwtpL.js";const _=e({__name:"404",setup(n){return s("Page Not Found"),(c,m)=>(a(),o(t(r)))}});export{_ as default};
2
+ //# sourceMappingURL=404-U2KQOqzV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"404-cNTfarkM.js","sources":["../../src/pages/404.vue"],"sourcesContent":["<template>\n <FourZeroFour />\n</template>\n\n<script lang=\"ts\" setup>\n import { FourZeroFour } from '@prefecthq/prefect-ui-library'\n import { usePageTitle } from '@/compositions/usePageTitle'\n usePageTitle('Page Not Found')\n</script>"],"names":["usePageTitle","_createBlock","_unref","FourZeroFour"],"mappings":"qJAOE,OAAAA,EAAa,gBAAgB,cAN7BC,EAAgBC,EAAAC,CAAA,CAAA"}
1
+ {"version":3,"file":"404-U2KQOqzV.js","sources":["../../src/pages/404.vue"],"sourcesContent":["<template>\n <FourZeroFour />\n</template>\n\n<script lang=\"ts\" setup>\n import { FourZeroFour } from '@prefecthq/prefect-ui-library'\n import { usePageTitle } from '@/compositions/usePageTitle'\n usePageTitle('Page Not Found')\n</script>"],"names":["usePageTitle","_createBlock","_unref","FourZeroFour"],"mappings":"qJAOE,OAAAA,EAAa,gBAAgB,cAN7BC,EAAgBC,EAAAC,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{d as B,M as O,ae as U,V as R,h as c,c as w,o as p,i as n,k as t,D as S,l as V,a as y,n as D,m as e,t as q,L as j,de as K,df as L,K as F,g as J,cB as W,dg as z,dh as Q,di as l,bg as i,I as Y,dj as G,j as H,dk as Z,dl as X,c9 as E,aJ as $,by as ee,dm as te,dn as oe,dp as ne,r as se,aw as ae,dq as le,aS as x,dr as ie,ds as re,dt as ue,du as ce}from"./index-BRrm8IYN.js";import{u as me,c as pe}from"./useCan-BidbvPHp.js";import{u as de,U as _e,a as fe,c as ve,p as ge}from"./usePrefectApi-CPise1aa.js";import"./mapper-DJ53lQ_S.js";const we={class:"flex gap-x-2 items-center"},ye={key:0,class:"text-sm italic"},he="http://prefect.io/slack?utm_source=oss&utm_medium=oss&utm_campaign=oss_popup&utm_term=none&utm_content=none",T="join-the-community-modal",ke="https://getform.io/f/eapderva",be=B({__name:"JoinTheCommunityModal",props:{showModal:{type:Boolean},showModalModifiers:{}},emits:["update:showModal"],setup(a){const s=O(a,"showModal"),u=U(!1),r=U(),{validate:h,state:d}=R(r,[K("Email"),L("Email")]),v=U(!1),f=U("");async function k(){if(await h()){f.value="",v.value=!0;try{await fetch(ke,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:r.value}),redirect:"manual"}),s.value=!1,j("Successfully subscribed","success")}catch(b){f.value="An error occurred. Please try again.",console.error(b)}finally{v.value=!1}}}return(b,o)=>{const m=c("p-button"),g=c("p-divider"),_=c("p-text-input"),M=c("p-label"),P=c("p-form"),A=c("p-message"),I=c("p-modal");return p(),w(I,{"show-modal":s.value,"onUpdate:showModal":o[2]||(o[2]=C=>s.value=C),title:"Join the Prefect Community"},{header:n(()=>[...o[3]||(o[3]=[V("h2",null,"Join the Community",-1)])]),default:n(()=>[o[5]||(o[5]=V("p",null," Connect with 25k+ engineers scaling Python with Prefect. Show us your work and be the first to know about new Prefect features. ",-1)),V("div",we,[t(m,{primary:"",icon:"Slack",to:he,target:"_blank",onClick:o[0]||(o[0]=C=>u.value=!0)},{default:n(()=>[...o[4]||(o[4]=[S(" Join us on Slack ",-1)])]),_:1}),u.value?(p(),D("span",ye," Thanks for joining our community! ")):y("",!0)]),t(g,{class:"-my-3"}),t(P,{id:T,onSubmit:k},{default:n(()=>[t(M,{label:"Notify me about Prefect updates",state:e(d),message:e(d).error},{default:n(({id:C})=>[t(_,{id:C,modelValue:r.value,"onUpdate:modelValue":o[1]||(o[1]=N=>r.value=N),placeholder:"hello@prefect.io",state:e(d)},null,8,["id","modelValue","state"])]),_:1},8,["state","message"])]),_:1}),f.value?(p(),w(A,{key:0,error:""},{default:n(()=>[S(q(f.value),1)]),_:1})):y("",!0)]),cancel:n(C=>[t(m,{class:"sm:order-first",onClick:C.close},{default:n(()=>[...o[6]||(o[6]=[S(" Skip ",-1)])]),_:1},8,["onClick"])]),actions:n(()=>[t(m,{primary:"",type:"submit",form:T,loading:v.value},{default:n(()=>[...o[7]||(o[7]=[S(" Sign up ",-1)])]),_:1},8,["loading"])]),_:1},8,["show-modal"])}}}),Ce={key:0,href:"https://www.prefect.io/cloud-vs-oss?utm_source=oss&utm_medium=oss&utm_campaign=oss&utm_term=none&utm_content=none",target:"_blank"},Se=B({__name:"ContextSidebar",async setup(a){let s,u;const r=me(),h=de(),d=([s,u]=F(()=>h.admin.getSettings()),s=await s,u(),s),v=J(()=>d.server.ui.show_promotional_content);localStorage.setItem("prefect-show-promotional-content",String(v.value));const f=J(()=>r.read.work_pool),{showModal:k,open:b}=W(),{value:o}=z("local","join-the-community-modal-dismissed",!1);function m(g){k.value=g,g||(o.value=!0)}return(g,_)=>{const M=c("p-icon"),P=c("router-link"),A=c("p-button");return p(),w(e(Q),{class:"context-sidebar"},{header:n(()=>[t(P,{to:e(i).root(),class:"context-sidebar__logo-link"},{default:n(()=>[t(M,{icon:"Prefect",class:"context-sidebar__logo-icon"})]),_:1},8,["to"])]),footer:n(()=>[v.value?(p(),D("a",Ce,[t(e(l),null,{default:n(()=>[_[1]||(_[1]=V("div",null," Ready to scale? ",-1)),t(A,{primary:"",small:"",class:"context-sidebar__upgade-button"},{default:n(()=>[..._[0]||(_[0]=[S(" Upgrade ",-1)])]),_:1})]),_:1})])):y("",!0),t(e(l),{onClick:e(b)},{default:n(()=>[_[2]||(_[2]=S(" Join the Community ",-1)),t(be,{"show-modal":e(k)||!e(o),"onUpdate:showModal":m},null,8,["show-modal"])]),_:1},8,["onClick"]),t(e(l),{title:"Settings",to:e(i).settings()},null,8,["to"])]),default:n(()=>[t(e(l),{title:"Dashboard",to:e(i).dashboard()},null,8,["to"]),t(e(l),{title:"Runs",to:e(i).runs()},null,8,["to"]),t(e(l),{title:"Flows",to:e(i).flows()},null,8,["to"]),t(e(l),{title:"Deployments",to:e(i).deployments()},null,8,["to"]),f.value?(p(),w(e(l),{key:0,title:"Work Pools",to:e(i).workPools()},null,8,["to"])):y("",!0),f.value?y("",!0):(p(),w(e(l),{key:1,title:"Work Queues",to:e(i).workQueues()},null,8,["to"])),t(e(l),{title:"Blocks",to:e(i).blocks()},null,8,["to"]),t(e(l),{title:e(Y).info.variables,to:e(i).variables()},null,8,["title","to"]),t(e(l),{title:"Automations",to:e(i).automations()},null,8,["to"]),t(e(l),{title:"Event Feed",to:e(i).events()},null,8,["to"]),t(e(l),{title:"Concurrency",to:e(i).concurrencyLimits()},null,8,["to"])]),_:1})}}});async function Me(){const a=await _e.get("apiUrl"),s={baseUrl:a};return a.startsWith("/")&&G(),{config:s}}function Pe(){const a=H(fe.getFeatureFlags,[]),s=J(()=>[...Z,...a.response??[]]),u=X(s),r=J(()=>a.loading);return{can:u,pending:r}}function xe(){const a=U(!1);function s(){a.value=!a.value}function u(){a.value=!0}function r(){a.value=!1}return{mobileMenuOpen:a,open:u,close:r,toggle:s}}const Ue={class:"app-router-view"},$e=B({__name:"AppRouterView",async setup(a){let s,u;const{can:r}=Pe(),{config:h}=([s,u]=F(()=>Me()),s=await s,u(),s),d=ve(h),v=ue();x(pe,r),x(ie,r),x(ge,d),x(re,d),x(ce,v),d.admin.authCheck().then(m=>{m==401?E.currentRoute.value.name!=="login"&&(j("Authentication failed.","error",{timeout:!1}),E.push({name:"login",query:{redirect:E.currentRoute.value.fullPath}})):d.health.isHealthy().then(g=>{g||j(`Can't connect to Server API at ${h.baseUrl}. Check that it's accessible from your machine.`,"error",{timeout:!1})})});const{mobileMenuOpen:f,toggle:k,close:b}=xe(),o=J(()=>$.lg||f.value);return ee(()=>document.body.classList.toggle("body-scrolling-disabled",o.value&&!$.lg)),(m,g)=>{const _=c("router-link"),M=c("p-button");return p(),D("div",Ue,[!e($).lg&&!m.$route.meta.public?(p(),w(e(oe),{key:0,class:"app-router-view__mobile-menu"},{"upper-links":n(()=>[t(_,{to:e(i).root()},{default:n(()=>[t(e(te),{icon:"Prefect",class:"app-router-view__prefect-icon"})]),_:1},8,["to"])]),"bottom-links":n(()=>[t(M,{small:"",icon:"Bars3Icon",class:"app-router-view__menu-icon",onClick:e(k)},null,8,["onClick"])]),_:1})):y("",!0),o.value&&!m.$route.meta.public?(p(),w(Se,{key:1,class:"app-router-view__sidebar",onClick:e(b)},null,8,["onClick"])):y("",!0),t(e(le),{class:ae(["app-router-view__view",{"app-router-view__view--public":m.$route.meta.public}])},{default:n(({Component:P})=>[t(ne,{name:"app-router-view-fade",mode:"out-in"},{default:n(()=>[(p(),w(se(P)))]),_:2},1024)]),_:1},8,["class"])])}}});export{$e as default};
2
+ //# sourceMappingURL=AppRouterView-DnlTfFmZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppRouterView-DnlTfFmZ.js","sources":["../../src/components/JoinTheCommunityModal.vue","../../src/components/ContextSidebar.vue","../../src/compositions/useApiConfig.ts","../../src/compositions/useCreateCan.ts","../../src/compositions/useMobileMenuOpen.ts","../../src/pages/AppRouterView.vue"],"sourcesContent":["<template>\n <p-modal v-model:show-modal=\"showModal\" title=\"Join the Prefect Community\">\n <template #header>\n <h2>Join the Community</h2>\n </template>\n\n <template #default>\n <p>\n Connect with 25k+ engineers scaling Python with Prefect. Show us your work and be the first to know about new Prefect features.\n </p>\n\n <div class=\"flex gap-x-2 items-center\">\n <p-button primary icon=\"Slack\" :to=\"joinSlackUrl\" target=\"_blank\" @click=\"showJoinSlackThankYouMessage = true\">\n Join us on Slack\n </p-button>\n\n <span v-if=\"showJoinSlackThankYouMessage\" class=\"text-sm italic\">\n Thanks for joining our community!\n </span>\n </div>\n\n <p-divider class=\"-my-3\" />\n\n <p-form :id=\"formId\" @submit=\"signUpForEmailUpdates\">\n <p-label v-slot=\"{ id }\" label=\"Notify me about Prefect updates\" :state :message=\"state.error\">\n <p-text-input\n :id\n v-model=\"email\"\n placeholder=\"hello@prefect.io\"\n :state\n />\n </p-label>\n </p-form>\n\n <p-message v-if=\"error\" error>\n {{ error }}\n </p-message>\n </template>\n\n <template #cancel=\"scope\">\n <p-button class=\"sm:order-first\" @click=\"scope.close\">\n Skip\n </p-button>\n </template>\n\n <template #actions>\n <p-button primary type=\"submit\" :form=\"formId\" :loading>\n Sign up\n </p-button>\n </template>\n </p-modal>\n</template>\n\n<script setup lang=\"ts\">\n import { showToast } from '@prefecthq/prefect-design'\n import { isEmail, isRequired } from '@prefecthq/prefect-ui-library'\n import { useValidation } from '@prefecthq/vue-compositions'\n import { ref } from 'vue'\n\n const showModal = defineModel<boolean>('showModal')\n\n const joinSlackUrl = 'http://prefect.io/slack?utm_source=oss&utm_medium=oss&utm_campaign=oss_popup&utm_term=none&utm_content=none'\n const showJoinSlackThankYouMessage = ref(false)\n\n const formId = 'join-the-community-modal'\n const email = ref<string>()\n const { validate, state } = useValidation(email, [isRequired('Email'), isEmail('Email')])\n\n const loading = ref(false)\n const error = ref('')\n\n const formEndpoint = 'https://getform.io/f/eapderva'\n async function signUpForEmailUpdates(): Promise<void> {\n if (!await validate()) {\n return\n }\n\n error.value = ''\n loading.value = true\n try {\n await fetch(formEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email: email.value }),\n // getform redirects to a thank-you page so this cancels that additional request\n redirect: 'manual',\n })\n\n showModal.value = false\n showToast('Successfully subscribed', 'success')\n } catch (err) {\n error.value = 'An error occurred. Please try again.'\n console.error(err)\n } finally {\n loading.value = false\n }\n }\n</script>","<template>\n <p-context-sidebar class=\"context-sidebar\">\n <template #header>\n <router-link :to=\"routes.root()\" class=\"context-sidebar__logo-link\">\n <p-icon icon=\"Prefect\" class=\"context-sidebar__logo-icon\" />\n </router-link>\n </template>\n <p-context-nav-item title=\"Dashboard\" :to=\"routes.dashboard()\" />\n <p-context-nav-item title=\"Runs\" :to=\"routes.runs()\" />\n <p-context-nav-item title=\"Flows\" :to=\"routes.flows()\" />\n <p-context-nav-item title=\"Deployments\" :to=\"routes.deployments()\" />\n <p-context-nav-item v-if=\"canSeeWorkPools\" title=\"Work Pools\" :to=\"routes.workPools()\" />\n <p-context-nav-item v-if=\"!canSeeWorkPools\" title=\"Work Queues\" :to=\"routes.workQueues()\" />\n <p-context-nav-item title=\"Blocks\" :to=\"routes.blocks()\" />\n <p-context-nav-item :title=\"localization.info.variables\" :to=\"routes.variables()\" />\n <p-context-nav-item title=\"Automations\" :to=\"routes.automations()\" />\n <p-context-nav-item title=\"Event Feed\" :to=\"routes.events()\" />\n <p-context-nav-item title=\"Concurrency\" :to=\"routes.concurrencyLimits()\" />\n\n <template #footer>\n <a v-if=\"showPromotionalContent\" href=\"https://www.prefect.io/cloud-vs-oss?utm_source=oss&utm_medium=oss&utm_campaign=oss&utm_term=none&utm_content=none\" target=\"_blank\">\n <p-context-nav-item>\n <div>\n Ready to scale?\n </div>\n <p-button primary small class=\"context-sidebar__upgade-button\">\n Upgrade\n </p-button>\n </p-context-nav-item>\n </a>\n\n <p-context-nav-item @click=\"openJoinCommunityModal\">\n Join the Community\n <JoinTheCommunityModal :show-modal=\"showJoinCommunityModal || !joinTheCommunityModalDismissed\" @update:show-modal=\"updateShowModal\" />\n </p-context-nav-item>\n\n <p-context-nav-item title=\"Settings\" :to=\"routes.settings()\" />\n </template>\n </p-context-sidebar>\n</template>\n\n<script lang=\"ts\" setup>\n import JoinTheCommunityModal from '@/components/JoinTheCommunityModal.vue'\n import { useCan } from '@/compositions/useCan'\n import { usePrefectApi } from '@/compositions/usePrefectApi'\n import { routes } from '@/router'\n import { PContextNavItem, PContextSidebar } from '@prefecthq/prefect-design'\n import { localization, useShowModal } from '@prefecthq/prefect-ui-library'\n import { useStorage } from '@prefecthq/vue-compositions'\n import { computed } from 'vue'\n\n const can = useCan()\n const api = usePrefectApi()\n const serverSettings = await api.admin.getSettings()\n const showPromotionalContent = computed(() => serverSettings.server.ui.show_promotional_content)\n\n // Cache to localStorage for use in error toasts\n localStorage.setItem('prefect-show-promotional-content', String(showPromotionalContent.value))\n const canSeeWorkPools = computed(() => can.read.work_pool)\n\n const { showModal: showJoinCommunityModal, open: openJoinCommunityModal } = useShowModal()\n const { value: joinTheCommunityModalDismissed } = useStorage('local', 'join-the-community-modal-dismissed', false)\n function updateShowModal(updatedShowModal: boolean): void {\n showJoinCommunityModal.value = updatedShowModal\n if (!updatedShowModal) {\n joinTheCommunityModalDismissed.value = true\n }\n }\n</script>\n\n<style>\n.context-sidebar__logo-link { @apply\n outline-none\n rounded-md\n focus:ring-spacing-focus-ring\n focus:ring-focus-ring\n}\n\n.context-sidebar__logo-link:focus:not(:focus-visible) { @apply\n ring-transparent\n}\n\n.context-sidebar__logo-icon { @apply\n !w-[42px]\n !h-[42px]\n}\n\n.context-sidebar__upgade-button { @apply\n ml-auto\n}\n</style>","import { PrefectConfig } from '@prefecthq/prefect-ui-library'\nimport { UiSettings } from '@/services/uiSettings'\nimport { MODE } from '@/utilities/meta'\n\nexport type UseWorkspaceApiConfig = {\n config: PrefectConfig,\n}\nexport async function useApiConfig(): Promise<UseWorkspaceApiConfig> {\n const baseUrl = await UiSettings.get('apiUrl')\n const config: PrefectConfig = { baseUrl }\n\n if (baseUrl.startsWith('/') && MODE() === 'development') {\n config.baseUrl = `http://127.0.0.1:4200${baseUrl}`\n }\n\n return { config }\n}","import { Can, createCan, workspacePermissions } from '@prefecthq/prefect-ui-library'\nimport { useSubscription } from '@prefecthq/vue-compositions'\nimport { computed, Ref } from 'vue'\nimport { uiSettings } from '@/services/uiSettings'\nimport { Permission } from '@/utilities/permissions'\n\ntype UseCreateCan = {\n can: Can<Permission>,\n pending: Ref<boolean>,\n}\n\nexport function useCreateCan(): UseCreateCan {\n const flagsSubscription = useSubscription(uiSettings.getFeatureFlags, [])\n\n const permissions = computed<Permission[]>(() => [\n ...workspacePermissions,\n ...flagsSubscription.response ?? [],\n ])\n\n const can = createCan(permissions)\n const pending = computed(() => flagsSubscription.loading)\n\n return {\n can,\n pending,\n }\n}","import { Ref, ref } from 'vue'\n\nexport type UseMobileMenuOpen = {\n mobileMenuOpen: Ref<boolean>,\n open: () => void,\n close: () => void,\n toggle: () => void,\n}\n\nexport function useMobileMenuOpen(): UseMobileMenuOpen {\n const mobileMenuOpen = ref(false)\n\n function toggle(): void {\n mobileMenuOpen.value = !mobileMenuOpen.value\n }\n\n function open(): void {\n mobileMenuOpen.value = true\n }\n\n function close(): void {\n mobileMenuOpen.value = false\n }\n\n return {\n mobileMenuOpen,\n open,\n close,\n toggle,\n }\n}","<template>\n <div class=\"app-router-view\">\n <template v-if=\"!media.lg && !$route.meta.public\">\n <PGlobalSidebar class=\"app-router-view__mobile-menu\">\n <template #upper-links>\n <router-link :to=\"appRoutes.root()\">\n <p-icon icon=\"Prefect\" class=\"app-router-view__prefect-icon\" />\n </router-link>\n </template>\n <template #bottom-links>\n <p-button small icon=\"Bars3Icon\" class=\"app-router-view__menu-icon\" @click=\"toggle\" />\n </template>\n </PGlobalSidebar>\n </template>\n <ContextSidebar v-if=\"showMenu && !$route.meta.public\" class=\"app-router-view__sidebar\" @click=\"close\" />\n <router-view :class=\"['app-router-view__view', { 'app-router-view__view--public': $route.meta.public }]\">\n <template #default=\"{ Component }\">\n <transition name=\"app-router-view-fade\" mode=\"out-in\">\n <component :is=\"Component\" />\n </transition>\n </template>\n </router-view>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { PGlobalSidebar, PIcon, media, showToast } from '@prefecthq/prefect-design'\n import { workspaceApiKey, canKey as designCanKey, createWorkspaceRoutes, workspaceRoutesKey } from '@prefecthq/prefect-ui-library'\n import { computed, provide, watchEffect } from 'vue'\n import { RouterView } from 'vue-router'\n import ContextSidebar from '@/components/ContextSidebar.vue'\n import { useApiConfig } from '@/compositions/useApiConfig'\n import { useCreateCan } from '@/compositions/useCreateCan'\n import { useMobileMenuOpen } from '@/compositions/useMobileMenuOpen'\n import router, { routes as appRoutes } from '@/router'\n import { createPrefectApi, prefectApiKey } from '@/utilities/api'\n import { canKey } from '@/utilities/permissions'\n import { UiSettings } from '@/services/uiSettings'\n\n const { can } = useCreateCan()\n const { config } = await useApiConfig()\n const api = createPrefectApi(config)\n const routes = createWorkspaceRoutes()\n\n provide(canKey, can)\n provide(designCanKey, can)\n provide(prefectApiKey, api)\n provide(workspaceApiKey, api)\n provide(workspaceRoutesKey, routes)\n\n\n api.admin.authCheck().then(status_code => {\n if (status_code == 401) {\n if (router.currentRoute.value.name !== 'login') {\n showToast('Authentication failed.', 'error', { timeout: false })\n router.push({\n name: 'login', \n query: { redirect: router.currentRoute.value.fullPath }\n })\n }\n } else {\n api.health.isHealthy().then(healthy => {\n if (!healthy) {\n showToast(`Can't connect to Server API at ${config.baseUrl}. Check that it's accessible from your machine.`, 'error', { timeout: false })\n }\n })\n }\n })\n\n const { mobileMenuOpen, toggle, close } = useMobileMenuOpen()\n const showMenu = computed(() => media.lg || mobileMenuOpen.value)\n\n watchEffect(() => document.body.classList.toggle('body-scrolling-disabled', showMenu.value && !media.lg))\n</script>\n\n<style>\n.body-scrolling-disabled { @apply\n overflow-hidden\n}\n\n.app-router-view { @apply\n flex\n flex-col\n bg-no-repeat\n overflow-auto;\n --prefect-scroll-margin: theme('spacing.20');\n height: 100vh;\n background-image: url('/decorative_iso-pixel-grid_light.svg');\n background-attachment: fixed;\n background-position: bottom -140px left -140px;\n}\n\n.dark .app-router-view {\n background-image: url('/decorative_iso-pixel-grid_dark.svg');\n}\n\n.app-router-view__prefect-icon { @apply\n w-7\n h-7\n}\n\n.app-router-view__mobile-menu { @apply\n h-auto\n py-3\n}\n\n.app-router-view__sidebar { @apply\n bg-floating\n top-[54px]\n lg:bg-transparent\n lg:top-0\n}\n\n.app-router-view__sidebar .p-context-sidebar__header { @apply\n hidden\n lg:block\n}\n\n.app-router-view__view {\n /* The 1px flex-basis is important because it allows us to use height: 100% without additional flexing */\n flex: 1 0 1px;\n height: 100%;\n}\n\n.app-router-view__view--public { @apply\n flex\n items-center\n justify-center;\n grid-column: 1 / -1;\n}\n\n@screen lg {\n .app-router-view {\n --prefect-scroll-margin: theme('spacing.2');\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n }\n}\n\n.app-router-view-fade-enter-active,\n.app-router-view-fade-leave-active {\n transition: opacity 0.25s ease;\n}\n\n.app-router-view-fade-enter-from,\n.app-router-view-fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":["joinSlackUrl","formId","formEndpoint","showModal","_useModel","__props","showJoinSlackThankYouMessage","ref","email","validate","state","useValidation","isRequired","isEmail","loading","error","signUpForEmailUpdates","showToast","err","_createBlock","_component_p_modal","$event","_cache","_createElementVNode","_hoisted_1","_createVNode","_component_p_button","_createElementBlock","_hoisted_2","_component_p_divider","_component_p_form","_component_p_label","_unref","_withCtx","id","_component_p_text_input","_component_p_message","scope","can","useCan","api","usePrefectApi","serverSettings","__temp","__restore","_withAsyncContext","showPromotionalContent","computed","canSeeWorkPools","showJoinCommunityModal","openJoinCommunityModal","useShowModal","joinTheCommunityModalDismissed","useStorage","updateShowModal","updatedShowModal","PContextSidebar","_component_router_link","routes","_component_p_icon","_openBlock","PContextNavItem","JoinTheCommunityModal","localization","useApiConfig","baseUrl","UiSettings","config","MODE","useCreateCan","flagsSubscription","useSubscription","uiSettings","permissions","workspacePermissions","createCan","pending","useMobileMenuOpen","mobileMenuOpen","toggle","open","close","createPrefectApi","createWorkspaceRoutes","provide","canKey","designCanKey","prefectApiKey","workspaceApiKey","workspaceRoutesKey","status_code","router","healthy","showMenu","media","watchEffect","$route","PGlobalSidebar","appRoutes","PIcon","ContextSidebar","RouterView","_normalizeClass","Component","_Transition","_resolveDynamicComponent"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as D,S as I,v as R,j as h,g as p,ae as B,al as T,I as d,aH as V,h as c,c as n,o as l,i as e,n as $,a as i,k as s,m as t,aI as j,aJ as H,aK as _,D as z,t as E,aL as v,a6 as J,aM as m,aN as K}from"./index-B2Mqn-oh.js";import{u as L}from"./usePageTitle-CuMQMQX5.js";const M={key:0},G=D({__name:"Artifact",setup(P){const b=I(),k=R("artifactId"),w=h(b.artifacts.getArtifact,[k]),a=p(()=>w.response),r=B(!1),y=[{label:"Artifact"},{label:"Details"},{label:"Raw"}],u=T("tab","Artifact"),N=p(()=>a.value?`${d.info.artifact}: ${a.value.key??V(a.value.type)}`:d.info.artifact);return L(N),(U,o)=>{const g=c("p-divider"),x=c("p-button"),C=c("p-content"),S=c("p-tabs"),A=c("p-layout-well");return l(),n(A,{class:"artifact"},{header:e(()=>[a.value?(l(),n(t(K),{key:0,artifact:a.value},null,8,["artifact"])):i("",!0)]),well:e(()=>[a.value?(l(),n(t(m),{key:0,artifact:a.value,alternate:""},null,8,["artifact"])):i("",!0)]),default:e(()=>[a.value?(l(),$("section",M,[s(t(j),{artifact:a.value},null,8,["artifact"]),s(g),t(H).xl?(l(),n(C,{key:0},{default:e(()=>[s(t(_),{artifact:a.value},null,8,["artifact"]),s(x,{class:"artifact__raw-data-button",small:"",onClick:o[0]||(o[0]=f=>r.value=!r.value)},{default:e(()=>[z(E(r.value?"Hide":"Show")+" raw data ",1)]),_:1}),r.value?(l(),n(t(v),{key:0,artifact:a.value},null,8,["artifact"])):i("",!0)]),_:1})):(l(),n(S,{key:1,selected:t(u),"onUpdate:selected":o[1]||(o[1]=f=>J(u)?u.value=f:null),tabs:y},{artifact:e(()=>[s(t(_),{artifact:a.value},null,8,["artifact"])]),details:e(()=>[s(t(m),{artifact:a.value},null,8,["artifact"])]),raw:e(()=>[s(t(v),{artifact:a.value},null,8,["artifact"])]),_:1},8,["selected"]))])):i("",!0)]),_:1})}}});export{G as default};
2
- //# sourceMappingURL=Artifact-D9pQzQmC.js.map
1
+ import{d as D,S as I,v as R,j as h,g as p,ae as B,al as T,I as d,aH as V,h as c,c as n,o as l,i as e,n as $,a as i,k as s,m as t,aI as j,aJ as H,aK as _,D as z,t as E,aL as v,a6 as J,aM as m,aN as K}from"./index-BRrm8IYN.js";import{u as L}from"./usePageTitle-D8ThwtpL.js";const M={key:0},G=D({__name:"Artifact",setup(P){const b=I(),k=R("artifactId"),w=h(b.artifacts.getArtifact,[k]),a=p(()=>w.response),r=B(!1),y=[{label:"Artifact"},{label:"Details"},{label:"Raw"}],u=T("tab","Artifact"),N=p(()=>a.value?`${d.info.artifact}: ${a.value.key??V(a.value.type)}`:d.info.artifact);return L(N),(U,o)=>{const g=c("p-divider"),x=c("p-button"),C=c("p-content"),S=c("p-tabs"),A=c("p-layout-well");return l(),n(A,{class:"artifact"},{header:e(()=>[a.value?(l(),n(t(K),{key:0,artifact:a.value},null,8,["artifact"])):i("",!0)]),well:e(()=>[a.value?(l(),n(t(m),{key:0,artifact:a.value,alternate:""},null,8,["artifact"])):i("",!0)]),default:e(()=>[a.value?(l(),$("section",M,[s(t(j),{artifact:a.value},null,8,["artifact"]),s(g),t(H).xl?(l(),n(C,{key:0},{default:e(()=>[s(t(_),{artifact:a.value},null,8,["artifact"]),s(x,{class:"artifact__raw-data-button",small:"",onClick:o[0]||(o[0]=f=>r.value=!r.value)},{default:e(()=>[z(E(r.value?"Hide":"Show")+" raw data ",1)]),_:1}),r.value?(l(),n(t(v),{key:0,artifact:a.value},null,8,["artifact"])):i("",!0)]),_:1})):(l(),n(S,{key:1,selected:t(u),"onUpdate:selected":o[1]||(o[1]=f=>J(u)?u.value=f:null),tabs:y},{artifact:e(()=>[s(t(_),{artifact:a.value},null,8,["artifact"])]),details:e(()=>[s(t(m),{artifact:a.value},null,8,["artifact"])]),raw:e(()=>[s(t(v),{artifact:a.value},null,8,["artifact"])]),_:1},8,["selected"]))])):i("",!0)]),_:1})}}});export{G as default};
2
+ //# sourceMappingURL=Artifact-C_GJ_Wwg.js.map