zenml-nightly 0.81.0.dev20250429__py3-none-any.whl → 0.81.0.dev20250430__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 (149) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/model.py +2 -7
  3. zenml/client.py +17 -2
  4. zenml/config/docker_settings.py +1 -1
  5. zenml/config/resource_settings.py +1 -1
  6. zenml/config/strict_base_model.py +1 -1
  7. zenml/environment.py +36 -4
  8. zenml/integrations/evidently/metrics.py +1 -1
  9. zenml/integrations/evidently/tests.py +1 -1
  10. zenml/integrations/pandas/materializers/pandas_materializer.py +118 -22
  11. zenml/models/v2/core/model_version.py +28 -33
  12. zenml/models/v2/core/pipeline_deployment.py +4 -4
  13. zenml/models/v2/core/pipeline_run.py +5 -12
  14. zenml/models/v2/core/user.py +1 -1
  15. zenml/secret/base_secret.py +1 -1
  16. zenml/stack/stack_component.py +1 -1
  17. zenml/stack/utils.py +1 -1
  18. zenml/zen_server/dashboard/assets/{404-o3nB5iwI.js → 404-D4aYbspS.js} +1 -1
  19. zenml/zen_server/dashboard/assets/{@react-router-BGgzhn5D.js → @react-router-CNP6g_RL.js} +1 -1
  20. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-C_qWs-4u.js → AlertDialogDropdownItem-CRZjthRL.js} +1 -1
  21. zenml/zen_server/dashboard/assets/{CodeSnippet-nRnOvbOJ.js → CodeSnippet-Di-loaZu.js} +1 -1
  22. zenml/zen_server/dashboard/assets/CollapsibleCard-Dr5zb5T5.js +1 -0
  23. zenml/zen_server/dashboard/assets/{Commands-BwBzFj-5.js → Commands-CD9Y7FOE.js} +1 -1
  24. zenml/zen_server/dashboard/assets/{ComponentBadge-CMx2DbsV.js → ComponentBadge-BgGnzcLu.js} +1 -1
  25. zenml/zen_server/dashboard/assets/{ComponentIcon-CSxdApv8.js → ComponentIcon-B_7Y_oV-.js} +1 -1
  26. zenml/zen_server/dashboard/assets/{CsvVizualization-lxB2iyEh.js → CsvVizualization-CDrjL6bW.js} +1 -1
  27. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-Bp0o-UXZ.js → DeleteAlertDialog-9RTDnEx3.js} +1 -1
  28. zenml/zen_server/dashboard/assets/DialogItem-0fWTH7ki.js +1 -0
  29. zenml/zen_server/dashboard/assets/{Error-DRhVeVHQ.js → Error-vBjUYjb-.js} +1 -1
  30. zenml/zen_server/dashboard/assets/{ExecutionStatus-HnZXi9bW.js → ExecutionStatus-B-ysY113.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{Helpbox-Dsr3ZYcL.js → Helpbox-Dt3q7NGd.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{Infobox-C4Op55B8.js → Infobox-Bai0JtFs.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{InlineAvatar-CrAwe7Pl.js → InlineAvatar-Cpj0lVRQ.js} +1 -1
  34. zenml/zen_server/dashboard/assets/NestedCollapsible-DbhKdWx-.js +1 -0
  35. zenml/zen_server/dashboard/assets/{Partials-DjTM0Oe-.js → Partials-BNBtCjuT.js} +1 -1
  36. zenml/zen_server/dashboard/assets/ProBadge-3vtouJQf.js +1 -0
  37. zenml/zen_server/dashboard/assets/{ProCta-BYSSivgY.js → ProCta-BoTLdAdV.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{ProviderIcon-B8W7AGNk.js → ProviderIcon-kkODO9tx.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{ProviderRadio-BWFJPEY2.js → ProviderRadio-26EB5tY-.js} +1 -1
  40. zenml/zen_server/dashboard/assets/RunSelector-j0C_TPVp.js +1 -0
  41. zenml/zen_server/dashboard/assets/RunsBody-DexNouV4.js +1 -0
  42. zenml/zen_server/dashboard/assets/SearchField-DMCywawn.js +1 -0
  43. zenml/zen_server/dashboard/assets/{SecretTooltip-CCn9HfEh.js → SecretTooltip-LLGP7AIC.js} +1 -1
  44. zenml/zen_server/dashboard/assets/{SetPassword-BDFVwnNB.js → SetPassword-CBHW-Su8.js} +1 -1
  45. zenml/zen_server/dashboard/assets/StackList-S-9I1R4n.js +1 -0
  46. zenml/zen_server/dashboard/assets/Tabs-C2ufJX4t.js +1 -0
  47. zenml/zen_server/dashboard/assets/Tick-ay3Bgtro.js +1 -0
  48. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-3gg2tC-H.js → UpdatePasswordSchemas-p3RX0P-Q.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{UsageReason-DOMAzO02.js → UsageReason-C8sD2bOU.js} +1 -1
  50. zenml/zen_server/dashboard/assets/{Wizard-BSH_lIfi.js → Wizard-DIllc07n.js} +1 -1
  51. zenml/zen_server/dashboard/assets/{WizardFooter-CnM-50jL.js → WizardFooter-dNDpuero.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D9XfZpmV.js → all-pipeline-runs-query-BUT1PiTp.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{configuration-form-Ci_QlfZC.js → configuration-form-DBZSb0FV.js} +1 -1
  54. zenml/zen_server/dashboard/assets/{create-stack-CoQ5SEJL.js → create-stack-BXLyjE58.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{delete-run-B5xUZwdP.js → delete-run-DzcYxUnd.js} +1 -1
  56. zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +1 -0
  57. zenml/zen_server/dashboard/assets/{flavor-select-DOLAl-S4.js → flavor-select-BTEwByv6.js} +1 -1
  58. zenml/zen_server/dashboard/assets/{form-schemas-BaEJ1z87.js → form-schemas-BJN_25Ua.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{index-e8udi7QT.js → index-8uhUi12k.js} +1 -1
  60. zenml/zen_server/dashboard/assets/{index-hsSXyS3H.js → index-BygJE88j.js} +8 -8
  61. zenml/zen_server/dashboard/assets/{index-ojAuWXMf.js → index-D9-ukAem.js} +1 -1
  62. zenml/zen_server/dashboard/assets/index-DmTFrHJm.css +1 -0
  63. zenml/zen_server/dashboard/assets/{index-BoWZ9rXk.js → index-wYtmKLnQ.js} +1 -1
  64. zenml/zen_server/dashboard/assets/{login-mutation-CwraNa5G.js → login-mutation-DywLqguW.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{not-found-BuK1QrF2.js → not-found-BOoklIG4.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{page-0AIX3VK8.js → page--hSXKqyG.js} +1 -1
  67. zenml/zen_server/dashboard/assets/{page-CIDo1Ajk.js → page-2BsNK_sZ.js} +1 -1
  68. zenml/zen_server/dashboard/assets/page-4nVakAEl.js +1 -0
  69. zenml/zen_server/dashboard/assets/{page-CjRoKEQs.js → page-8AzB83Py.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{page-BQVPbNps.js → page-B0r9dBEU.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{page-hVng6ANV.js → page-B1Uq1S1Q.js} +1 -1
  72. zenml/zen_server/dashboard/assets/page-B3DscprQ.js +1 -0
  73. zenml/zen_server/dashboard/assets/{page-KRP_w5zH.js → page-B7Aj2XbV.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{page-CZgeF_wQ.js → page-BE8jdyaM.js} +1 -1
  75. zenml/zen_server/dashboard/assets/page-BIYqUwTI.js +1 -0
  76. zenml/zen_server/dashboard/assets/page-BTzhAVEn.js +1 -0
  77. zenml/zen_server/dashboard/assets/{page-_Zt6UwiG.js → page-ByXQN8A-.js} +1 -1
  78. zenml/zen_server/dashboard/assets/page-CI4a9CXs.js +1 -0
  79. zenml/zen_server/dashboard/assets/page-CPLlVRXx.js +6 -0
  80. zenml/zen_server/dashboard/assets/page-CSQOpvvK.js +3 -0
  81. zenml/zen_server/dashboard/assets/{page-DwIlrsF0.js → page-Ccnk_5ji.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{page-C-6XUKSp.js → page-Ci_n_x3a.js} +1 -1
  83. zenml/zen_server/dashboard/assets/page-D-ry_oLs.js +1 -0
  84. zenml/zen_server/dashboard/assets/{page-DbEn9V9E.js → page-D2TtSfnb.js} +1 -1
  85. zenml/zen_server/dashboard/assets/page-DHnkTzqs.js +1 -0
  86. zenml/zen_server/dashboard/assets/{page-B5clbTo4.js → page-DP2Ed-2m.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{page-C30HZCTR.js → page-D_5R6E7b.js} +1 -1
  88. zenml/zen_server/dashboard/assets/page-DfTsntQI.js +1 -0
  89. zenml/zen_server/dashboard/assets/page-DkY7AIhj.js +1 -0
  90. zenml/zen_server/dashboard/assets/page-DmteSSj6.js +1 -0
  91. zenml/zen_server/dashboard/assets/page-Dt3wHeWX.js +1 -0
  92. zenml/zen_server/dashboard/assets/page-EXvws1ss.js +1 -0
  93. zenml/zen_server/dashboard/assets/{page-Czj8fu8q.js → page-K9yjbnd4.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{page-DHDeVaMO.js → page-RV8wpZ_4.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{page-DLVtrRa5.js → page-bUVHi7DE.js} +1 -1
  96. zenml/zen_server/dashboard/assets/page-cOEvFs_l.js +1 -0
  97. zenml/zen_server/dashboard/assets/page-kzSGEVUs.js +1 -0
  98. zenml/zen_server/dashboard/assets/{page-C7buw8xJ.js → page-uDGvpa5g.js} +2 -2
  99. zenml/zen_server/dashboard/assets/{page-BbygQpf-.js → page-uN0n_DE2.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{page-CgJcperk.js → page-xa1EAPcI.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{persist-xOAq24Bm.js → persist-CEeDYHW5.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{persist-DLvsEXh0.js → persist-SSTTV5q0.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{service-MHyqhRgp.js → service-BRoAA1Kq.js} +1 -1
  104. zenml/zen_server/dashboard/assets/sharedSchema-BACERDat.js +14 -0
  105. zenml/zen_server/dashboard/assets/{stack-detail-query-C1GoxBeK.js → stack-detail-query-ihiJr6nq.js} +1 -1
  106. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-DduehrZn.js → update-server-settings-mutation-CK6COmw9.js} +1 -1
  107. zenml/zen_server/dashboard/index.html +4 -4
  108. zenml/zen_server/deploy/daemon/daemon_zen_server.py +1 -1
  109. zenml/zen_server/deploy/docker/docker_zen_server.py +1 -1
  110. zenml/zen_server/routers/model_versions_endpoints.py +10 -19
  111. zenml/zen_server/routers/runs_endpoints.py +7 -1
  112. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +20 -3
  113. zenml/zen_stores/schemas/pipeline_run_schemas.py +21 -1
  114. zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +1 -1
  115. zenml/zen_stores/secrets_stores/sql_secrets_store.py +1 -1
  116. zenml/zen_stores/sql_zen_store.py +10 -34
  117. {zenml_nightly-0.81.0.dev20250429.dist-info → zenml_nightly-0.81.0.dev20250430.dist-info}/METADATA +1 -1
  118. {zenml_nightly-0.81.0.dev20250429.dist-info → zenml_nightly-0.81.0.dev20250430.dist-info}/RECORD +121 -120
  119. zenml/zen_server/dashboard/assets/CollapsibleCard-9sSz7n1R.js +0 -1
  120. zenml/zen_server/dashboard/assets/DialogItem-DHw2ihTx.js +0 -1
  121. zenml/zen_server/dashboard/assets/NestedCollapsible-Ce1bmT8N.js +0 -1
  122. zenml/zen_server/dashboard/assets/ProBadge-CDEqgzh8.js +0 -1
  123. zenml/zen_server/dashboard/assets/RunSelector-DoL_gMHJ.js +0 -1
  124. zenml/zen_server/dashboard/assets/RunsBody-B6mBjv-_.js +0 -1
  125. zenml/zen_server/dashboard/assets/SearchField-DHl5flXv.js +0 -1
  126. zenml/zen_server/dashboard/assets/StackList-dhdUtky3.js +0 -1
  127. zenml/zen_server/dashboard/assets/Tabs-BuZG8ft1.js +0 -1
  128. zenml/zen_server/dashboard/assets/Tick-C4gtED35.js +0 -1
  129. zenml/zen_server/dashboard/assets/index-6mLFgFwe.css +0 -1
  130. zenml/zen_server/dashboard/assets/page-3lW9eIer.js +0 -1
  131. zenml/zen_server/dashboard/assets/page-9PzQok8O.js +0 -1
  132. zenml/zen_server/dashboard/assets/page-BEibNYiA.js +0 -6
  133. zenml/zen_server/dashboard/assets/page-BOE2XBFy.js +0 -1
  134. zenml/zen_server/dashboard/assets/page-Bki79xdd.js +0 -1
  135. zenml/zen_server/dashboard/assets/page-BnKwJnOb.js +0 -1
  136. zenml/zen_server/dashboard/assets/page-CBGeo-7W.js +0 -2
  137. zenml/zen_server/dashboard/assets/page-Co-FJ5ds.js +0 -1
  138. zenml/zen_server/dashboard/assets/page-Cu8vuohQ.js +0 -1
  139. zenml/zen_server/dashboard/assets/page-D0QcEBi1.js +0 -1
  140. zenml/zen_server/dashboard/assets/page-DKY_U5Sz.js +0 -1
  141. zenml/zen_server/dashboard/assets/page-DQHU5o_C.js +0 -1
  142. zenml/zen_server/dashboard/assets/page-DpY1koQY.js +0 -1
  143. zenml/zen_server/dashboard/assets/page-DrS4WOup.js +0 -1
  144. zenml/zen_server/dashboard/assets/page-HIAPXq4w.js +0 -1
  145. zenml/zen_server/dashboard/assets/page-Jw2QAdxa.js +0 -1
  146. zenml/zen_server/dashboard/assets/sharedSchema-CQA5lnlU.js +0 -14
  147. {zenml_nightly-0.81.0.dev20250429.dist-info → zenml_nightly-0.81.0.dev20250430.dist-info}/LICENSE +0 -0
  148. {zenml_nightly-0.81.0.dev20250429.dist-info → zenml_nightly-0.81.0.dev20250430.dist-info}/WHEEL +0 -0
  149. {zenml_nightly-0.81.0.dev20250429.dist-info → zenml_nightly-0.81.0.dev20250430.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.81.0.dev20250429
1
+ 0.81.0.dev20250430
zenml/cli/model.py CHANGED
@@ -398,18 +398,13 @@ def version() -> None:
398
398
 
399
399
  @cli_utils.list_options(ModelVersionFilter)
400
400
  @version.command("list", help="List model versions with filter.")
401
- @click.argument("model_name_or_id")
402
- def list_model_versions(model_name_or_id: str, **kwargs: Any) -> None:
401
+ def list_model_versions(**kwargs: Any) -> None:
403
402
  """List model versions with filter in the Model Control Plane.
404
403
 
405
404
  Args:
406
- model_name_or_id: The name or ID of the parent model.
407
405
  **kwargs: Keyword arguments to filter models.
408
406
  """
409
- model_versions = Client().list_model_versions(
410
- model_name_or_id=model_name_or_id,
411
- **kwargs,
412
- )
407
+ model_versions = Client().list_model_versions(**kwargs)
413
408
 
414
409
  if not model_versions:
415
410
  cli_utils.declare("No model versions found.")
zenml/client.py CHANGED
@@ -6504,7 +6504,8 @@ class Client(metaclass=ClientMetaClass):
6504
6504
 
6505
6505
  def list_model_versions(
6506
6506
  self,
6507
- model_name_or_id: Union[str, UUID],
6507
+ model: Optional[Union[str, UUID]] = None,
6508
+ model_name_or_id: Optional[Union[str, UUID]] = None,
6508
6509
  sort_by: str = "number",
6509
6510
  page: int = PAGINATION_STARTING_PAGE,
6510
6511
  size: int = PAGE_SIZE_DEFAULT,
@@ -6525,6 +6526,7 @@ class Client(metaclass=ClientMetaClass):
6525
6526
  """Get model versions by filter from Model Control Plane.
6526
6527
 
6527
6528
  Args:
6529
+ model: The model to filter by.
6528
6530
  model_name_or_id: name or id of the model containing the model
6529
6531
  version.
6530
6532
  sort_by: The column to sort by
@@ -6548,6 +6550,19 @@ class Client(metaclass=ClientMetaClass):
6548
6550
  Returns:
6549
6551
  A page object with all model versions.
6550
6552
  """
6553
+ if model_name_or_id:
6554
+ logger.warning(
6555
+ "The `model_name_or_id` argument is deprecated. "
6556
+ "Please use the `model` argument instead."
6557
+ )
6558
+ if model is None:
6559
+ model = model_name_or_id
6560
+ else:
6561
+ logger.warning(
6562
+ "Ignoring `model_name_or_id` argument as `model` argument "
6563
+ "was also provided."
6564
+ )
6565
+
6551
6566
  model_version_filter_model = ModelVersionFilter(
6552
6567
  page=page,
6553
6568
  size=size,
@@ -6563,7 +6578,7 @@ class Client(metaclass=ClientMetaClass):
6563
6578
  tag=tag,
6564
6579
  tags=tags,
6565
6580
  user=user,
6566
- model=model_name_or_id,
6581
+ model=model,
6567
6582
  project=project or self.active_project.id,
6568
6583
  )
6569
6584
 
@@ -309,5 +309,5 @@ class DockerSettings(BaseSettings):
309
309
  # public attributes are immutable
310
310
  frozen=True,
311
311
  # prevent extra attributes during model initialization
312
- extra="forbid",
312
+ extra="ignore",
313
313
  )
@@ -119,5 +119,5 @@ class ResourceSettings(BaseSettings):
119
119
  # public attributes are immutable
120
120
  frozen=True,
121
121
  # prevent extra attributes during model initialization
122
- extra="forbid",
122
+ extra="ignore",
123
123
  )
@@ -19,4 +19,4 @@ from pydantic import BaseModel, ConfigDict
19
19
  class StrictBaseModel(BaseModel):
20
20
  """Immutable pydantic model which prevents extra attributes."""
21
21
 
22
- model_config = ConfigDict(frozen=True, extra="forbid")
22
+ model_config = ConfigDict(frozen=True, extra="ignore")
zenml/environment.py CHANGED
@@ -15,7 +15,8 @@
15
15
 
16
16
  import os
17
17
  import platform
18
- from typing import Dict
18
+ import subprocess
19
+ from typing import Any, Dict, List
19
20
 
20
21
  import distro
21
22
 
@@ -27,7 +28,7 @@ from zenml.utils.singleton import SingletonMetaClass
27
28
  logger = get_logger(__name__)
28
29
 
29
30
 
30
- def get_run_environment_dict() -> Dict[str, str]:
31
+ def get_run_environment_dict() -> Dict[str, Any]:
31
32
  """Returns a dictionary of the current run environment.
32
33
 
33
34
  Everything that is returned here will be saved in the DB as
@@ -38,12 +39,24 @@ def get_run_environment_dict() -> Dict[str, str]:
38
39
  Returns:
39
40
  A dictionary of the current run environment.
40
41
  """
41
- return {
42
- "environment": get_environment(),
42
+ env_dict: Dict[str, Any] = {
43
+ "environment": str(get_environment()),
43
44
  **Environment.get_system_info(),
44
45
  "python_version": Environment.python_version(),
45
46
  }
46
47
 
48
+ try:
49
+ python_packages = Environment.get_python_packages()
50
+ except RuntimeError:
51
+ logger.warning("Failed to get list of installed Python packages")
52
+ else:
53
+ # TODO: We send the python packages as a string right now to keep
54
+ # backwards compatibility with old versions. We should update this to
55
+ # be a list of strings eventually.
56
+ env_dict["python_packages"] = "\n".join(python_packages)
57
+
58
+ return env_dict
59
+
47
60
 
48
61
  def get_environment() -> str:
49
62
  """Returns a string representing the execution environment of the pipeline.
@@ -337,3 +350,22 @@ class Environment(metaclass=SingletonMetaClass):
337
350
  "LIGHTNING_CLOUD_URL" in os.environ
338
351
  and "LIGHTNING_CLOUDSPACE_HOST" in os.environ
339
352
  )
353
+
354
+ @staticmethod
355
+ def get_python_packages() -> List[str]:
356
+ """Returns a list of installed Python packages.
357
+
358
+ Raises:
359
+ RuntimeError: If the process to get the list of installed packages
360
+ fails.
361
+
362
+ Returns:
363
+ List of installed packages in pip freeze format.
364
+ """
365
+ try:
366
+ output = subprocess.check_output(["pip", "freeze"]).decode()
367
+ return output.strip().split("\n")
368
+ except subprocess.CalledProcessError:
369
+ raise RuntimeError(
370
+ "Failed to get list of installed Python packages"
371
+ )
@@ -361,4 +361,4 @@ class EvidentlyMetricConfig(BaseModel):
361
361
  f"`{self.class_path}`: {str(e)}"
362
362
  )
363
363
 
364
- model_config = ConfigDict(extra="forbid")
364
+ model_config = ConfigDict(extra="ignore")
@@ -345,4 +345,4 @@ class EvidentlyTestConfig(BaseModel):
345
345
  f"`{self.class_path}`: {str(e)}"
346
346
  )
347
347
 
348
- model_config = ConfigDict(extra="forbid")
348
+ model_config = ConfigDict(extra="ignore")
@@ -15,6 +15,11 @@
15
15
 
16
16
  This materializer handles pandas DataFrame and Series objects.
17
17
 
18
+ Special features:
19
+ - Handles pandas DataFrames and Series with various data types
20
+ - Provides helpful error messages for custom data type errors
21
+ - Warns when custom data types are detected that might need additional libraries
22
+
18
23
  Environment Variables:
19
24
  ZENML_PANDAS_SAMPLE_ROWS: Controls the number of sample rows to include in
20
25
  visualizations. Defaults to 10 if not set.
@@ -41,6 +46,32 @@ CSV_FILENAME = "df.csv"
41
46
  # Default number of sample rows to display in visualizations
42
47
  DEFAULT_SAMPLE_ROWS = 10
43
48
 
49
+ # List of standard pandas/numpy dtype prefixes for type checking
50
+ STANDARD_DTYPE_PREFIXES = [
51
+ "int",
52
+ "float",
53
+ "bool",
54
+ "datetime",
55
+ "timedelta",
56
+ "object",
57
+ "category",
58
+ "string",
59
+ "complex",
60
+ ]
61
+
62
+
63
+ def is_standard_dtype(dtype_str: str) -> bool:
64
+ """Check if a dtype string represents a standard pandas/numpy dtype.
65
+
66
+ Args:
67
+ dtype_str: String representation of the dtype
68
+
69
+ Returns:
70
+ bool: True if it's a standard dtype, False otherwise
71
+ """
72
+ dtype_str = dtype_str.lower()
73
+ return any(prefix in dtype_str for prefix in STANDARD_DTYPE_PREFIXES)
74
+
44
75
 
45
76
  class PandasMaterializer(BaseMaterializer):
46
77
  """Materializer to read data to and from pandas."""
@@ -86,27 +117,60 @@ class PandasMaterializer(BaseMaterializer):
86
117
 
87
118
  Raises:
88
119
  ImportError: If pyarrow or fastparquet is not installed.
120
+ TypeError: Raised if there is an error when reading parquet files.
121
+ zenml_type_error: If the data type is a custom data type.
89
122
 
90
123
  Returns:
91
124
  The pandas dataframe or series.
92
125
  """
93
- if self.artifact_store.exists(self.parquet_path):
94
- if self.pyarrow_exists:
95
- with self.artifact_store.open(
96
- self.parquet_path, mode="rb"
97
- ) as f:
98
- df = pd.read_parquet(f)
126
+ try:
127
+ # First try normal loading
128
+ if self.artifact_store.exists(self.parquet_path):
129
+ if self.pyarrow_exists:
130
+ with self.artifact_store.open(
131
+ self.parquet_path, mode="rb"
132
+ ) as f:
133
+ df = pd.read_parquet(f)
134
+ else:
135
+ raise ImportError(
136
+ "You have an old version of a `PandasMaterializer` "
137
+ "data artifact stored in the artifact store "
138
+ "as a `.parquet` file, which requires `pyarrow` "
139
+ "for reading, You can install `pyarrow` by running "
140
+ "'`pip install pyarrow fastparquet`'."
141
+ )
99
142
  else:
100
- raise ImportError(
101
- "You have an old version of a `PandasMaterializer` "
102
- "data artifact stored in the artifact store "
103
- "as a `.parquet` file, which requires `pyarrow` "
104
- "for reading, You can install `pyarrow` by running "
105
- "'`pip install pyarrow fastparquet`'."
143
+ with self.artifact_store.open(self.csv_path, mode="rb") as f:
144
+ df = pd.read_csv(f, index_col=0, parse_dates=True)
145
+ except TypeError as e:
146
+ # Check for common data type error patterns
147
+ error_str = str(e).lower()
148
+ is_dtype_error = (
149
+ "not understood" in error_str
150
+ or "no type" in error_str
151
+ or "cannot deserialize" in error_str
152
+ or "data type" in error_str
153
+ )
154
+
155
+ if is_dtype_error:
156
+ # If the error is due to a custom data type, raise a ZenML TypeError
157
+ # This is to avoid the original error from being swallowed
158
+ # and to provide a more helpful error message
159
+ zenml_type_error = TypeError(
160
+ "Encountered an error with custom data types. This may be due to "
161
+ "missing libraries that were used when the data was originally created. "
162
+ "For example, you might need to install libraries like 'geopandas' for "
163
+ "GeoPandas data types, 'pandas-gbq' for BigQuery data types, or "
164
+ "'pyarrow' for Arrow data types. Make sure to import these libraries "
165
+ "in your step code as well as adding them to your step requirements, "
166
+ "even if you're not directly using them in your code. Pandas needs "
167
+ "these libraries to be imported to properly load the custom data types. "
168
+ "Try installing any packages that were used in previous pipeline steps "
169
+ "but might not be available in the current environment."
106
170
  )
107
- else:
108
- with self.artifact_store.open(self.csv_path, mode="rb") as f:
109
- df = pd.read_csv(f, index_col=0, parse_dates=True)
171
+ raise zenml_type_error from e
172
+ # We don't know how to handle this error, so re-raise the original error
173
+ raise e
110
174
 
111
175
  # validate the type of the data.
112
176
  def is_dataframe_or_series(
@@ -204,14 +268,46 @@ class PandasMaterializer(BaseMaterializer):
204
268
  Returns:
205
269
  The extracted metadata as a dictionary.
206
270
  """
207
- pandas_metadata: Dict[str, "MetadataType"] = {"shape": df.shape}
271
+ # Store whether it's a Series for later reference
272
+ is_series = isinstance(df, pd.Series)
208
273
 
209
- if isinstance(df, pd.Series):
210
- pandas_metadata["dtype"] = DType(df.dtype.type)
211
- pandas_metadata["mean"] = float(df.mean().item())
212
- pandas_metadata["std"] = float(df.std().item())
213
- pandas_metadata["min"] = float(df.min().item())
214
- pandas_metadata["max"] = float(df.max().item())
274
+ # Store original shape before conversion
275
+ original_shape = df.shape
276
+
277
+ # Convert Series to DataFrame for consistent handling of dtypes
278
+ if is_series:
279
+ series_obj = df # Keep original Series for some calculations
280
+ df = df.to_frame(name="series")
281
+
282
+ pandas_metadata: Dict[str, "MetadataType"] = {"shape": original_shape}
283
+
284
+ # Add information about custom data types to metadata
285
+ custom_types = {}
286
+ try:
287
+ for col, dtype in df.dtypes.items():
288
+ dtype_str = str(dtype)
289
+ if not is_standard_dtype(dtype_str):
290
+ col_name = "series" if is_series else str(col)
291
+ custom_types[col_name] = dtype_str
292
+ # Try to get module information if available
293
+ try:
294
+ module_name = dtype.type.__module__
295
+ custom_types[f"{col_name}_module"] = module_name
296
+ except (AttributeError, TypeError):
297
+ pass
298
+
299
+ if custom_types:
300
+ pandas_metadata["custom_types"] = custom_types
301
+ except Exception as e:
302
+ logger.debug(f"Error extracting custom type metadata: {e}")
303
+
304
+ if is_series:
305
+ # For Series, use the original series object for statistics
306
+ pandas_metadata["dtype"] = DType(series_obj.dtype.type)
307
+ pandas_metadata["mean"] = float(series_obj.mean().item())
308
+ pandas_metadata["std"] = float(series_obj.std().item())
309
+ pandas_metadata["min"] = float(series_obj.min().item())
310
+ pandas_metadata["max"] = float(series_obj.max().item())
215
311
 
216
312
  else:
217
313
  pandas_metadata["dtype"] = {
@@ -31,7 +31,6 @@ from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
31
31
  from zenml.enums import ArtifactType, ModelStages
32
32
  from zenml.metadata.metadata_types import MetadataType
33
33
  from zenml.models.v2.base.base import BaseUpdate
34
- from zenml.models.v2.base.filter import AnyQuery
35
34
  from zenml.models.v2.base.page import Page
36
35
  from zenml.models.v2.base.scoped import (
37
36
  ProjectScopedFilter,
@@ -47,11 +46,15 @@ from zenml.models.v2.core.service import ServiceResponse
47
46
  from zenml.models.v2.core.tag import TagResponse
48
47
 
49
48
  if TYPE_CHECKING:
49
+ from sqlalchemy.sql.elements import ColumnElement
50
+
50
51
  from zenml.model.model import Model
51
52
  from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
52
53
  from zenml.models.v2.core.model import ModelResponse
53
54
  from zenml.models.v2.core.pipeline_run import PipelineRunResponse
54
- from zenml.zen_stores.schemas import BaseSchema
55
+ from zenml.zen_stores.schemas import (
56
+ BaseSchema,
57
+ )
55
58
 
56
59
  AnySchema = TypeVar("AnySchema", bound=BaseSchema)
57
60
 
@@ -585,7 +588,6 @@ class ModelVersionFilter(
585
588
  *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
586
589
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
587
590
  *RunMetadataFilterMixin.CLI_EXCLUDE_FIELDS,
588
- "model",
589
591
  ]
590
592
  API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
591
593
  *ProjectScopedFilter.API_MULTI_INPUT_PARAMS,
@@ -615,41 +617,34 @@ class ModelVersionFilter(
615
617
  union_mode="left_to_right",
616
618
  )
617
619
 
618
- def apply_filter(
619
- self,
620
- query: AnyQuery,
621
- table: Type["AnySchema"],
622
- ) -> AnyQuery:
623
- """Applies the filter to a query.
620
+ def get_custom_filters(
621
+ self, table: Type["AnySchema"]
622
+ ) -> List[Union["ColumnElement[bool]"]]:
623
+ """Get custom filters.
624
624
 
625
625
  Args:
626
- query: The query to which to apply the filter.
627
626
  table: The query table.
628
627
 
629
628
  Returns:
630
- The query with filter applied.
631
-
632
- Raises:
633
- ValueError: if the filter is not scoped to a model.
629
+ A list of custom filters.
634
630
  """
635
- query = super().apply_filter(query=query, table=table)
636
-
637
- # The model scope must always be set and must be a UUID. If the
638
- # client sets this to a string, the server will try to resolve it to a
639
- # model ID.
640
- #
641
- # If not set by the client, the server will raise a ValueError.
642
- #
643
- # See: SqlZenStore._set_filter_model_id
644
-
645
- if not self.model:
646
- raise ValueError("Model scope missing from the filter.")
647
-
648
- if not isinstance(self.model, UUID):
649
- raise ValueError(
650
- f"Model scope must be a UUID, got {type(self.model)}."
651
- )
631
+ from sqlalchemy import and_
632
+
633
+ from zenml.zen_stores.schemas import (
634
+ ModelSchema,
635
+ ModelVersionSchema,
636
+ )
652
637
 
653
- query = query.where(getattr(table, "model_id") == self.model)
638
+ custom_filters = super().get_custom_filters(table)
639
+
640
+ if self.model:
641
+ value, operator = self._resolve_operator(self.model)
642
+ model_filter = and_(
643
+ ModelVersionSchema.model_id == ModelSchema.id, # type: ignore[arg-type]
644
+ self.generate_name_or_id_query_conditions(
645
+ value=self.model, table=ModelSchema
646
+ ),
647
+ )
648
+ custom_filters.append(model_filter)
654
649
 
655
- return query
650
+ return custom_filters
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Models representing pipeline deployments."""
15
15
 
16
- from typing import Dict, Optional, TypeVar, Union
16
+ from typing import Any, Dict, Optional, TypeVar, Union
17
17
  from uuid import UUID
18
18
 
19
19
  from pydantic import Field
@@ -60,7 +60,7 @@ class PipelineDeploymentBase(BaseZenModel):
60
60
  step_configurations: Dict[str, Step] = Field(
61
61
  default={}, title="The step configurations for this deployment."
62
62
  )
63
- client_environment: Dict[str, str] = Field(
63
+ client_environment: Dict[str, Any] = Field(
64
64
  default={}, title="The client environment for this deployment."
65
65
  )
66
66
  client_version: Optional[str] = Field(
@@ -143,7 +143,7 @@ class PipelineDeploymentResponseMetadata(ProjectScopedResponseMetadata):
143
143
  step_configurations: Dict[str, Step] = Field(
144
144
  default={}, title="The step configurations for this deployment."
145
145
  )
146
- client_environment: Dict[str, str] = Field(
146
+ client_environment: Dict[str, Any] = Field(
147
147
  default={}, title="The client environment for this deployment."
148
148
  )
149
149
  client_version: Optional[str] = Field(
@@ -242,7 +242,7 @@ class PipelineDeploymentResponse(
242
242
  return self.get_metadata().step_configurations
243
243
 
244
244
  @property
245
- def client_environment(self) -> Dict[str, str]:
245
+ def client_environment(self) -> Dict[str, Any]:
246
246
  """The `client_environment` property.
247
247
 
248
248
  Returns:
@@ -104,14 +104,7 @@ class PipelineRunRequest(ProjectScopedRequest):
104
104
  status: ExecutionStatus = Field(
105
105
  title="The status of the pipeline run.",
106
106
  )
107
- client_environment: Dict[str, str] = Field(
108
- default={},
109
- title=(
110
- "Environment of the client that initiated this pipeline run "
111
- "(OS, Python version, etc.)."
112
- ),
113
- )
114
- orchestrator_environment: Dict[str, str] = Field(
107
+ orchestrator_environment: Dict[str, Any] = Field(
115
108
  default={},
116
109
  title=(
117
110
  "Environment of the orchestrator that executed this pipeline run "
@@ -214,14 +207,14 @@ class PipelineRunResponseMetadata(ProjectScopedResponseMetadata):
214
207
  title="The end time of the pipeline run.",
215
208
  default=None,
216
209
  )
217
- client_environment: Dict[str, str] = Field(
210
+ client_environment: Dict[str, Any] = Field(
218
211
  default={},
219
212
  title=(
220
213
  "Environment of the client that initiated this pipeline run "
221
214
  "(OS, Python version, etc.)."
222
215
  ),
223
216
  )
224
- orchestrator_environment: Dict[str, str] = Field(
217
+ orchestrator_environment: Dict[str, Any] = Field(
225
218
  default={},
226
219
  title=(
227
220
  "Environment of the orchestrator that executed this pipeline run "
@@ -509,7 +502,7 @@ class PipelineRunResponse(
509
502
  return self.get_metadata().end_time
510
503
 
511
504
  @property
512
- def client_environment(self) -> Dict[str, str]:
505
+ def client_environment(self) -> Dict[str, Any]:
513
506
  """The `client_environment` property.
514
507
 
515
508
  Returns:
@@ -518,7 +511,7 @@ class PipelineRunResponse(
518
511
  return self.get_metadata().client_environment
519
512
 
520
513
  @property
521
- def orchestrator_environment(self) -> Dict[str, str]:
514
+ def orchestrator_environment(self) -> Dict[str, Any]:
522
515
  """The `orchestrator_environment` property.
523
516
 
524
517
  Returns:
@@ -169,7 +169,7 @@ class UserRequest(UserBase, BaseRequest):
169
169
  # Validate attributes when assigning them
170
170
  validate_assignment=True,
171
171
  # Forbid extra attributes to prevent unexpected behavior
172
- extra="forbid",
172
+ extra="ignore",
173
173
  )
174
174
 
175
175
 
@@ -45,5 +45,5 @@ class BaseSecretSchema(BaseModel):
45
45
  # validate attribute assignments
46
46
  validate_assignment=True,
47
47
  # report extra attributes as validation failures
48
- extra="forbid",
48
+ extra="ignore",
49
49
  )
@@ -318,7 +318,7 @@ class StackComponentConfig(BaseModel, ABC):
318
318
  # public attributes are immutable
319
319
  frozen=True,
320
320
  # prevent extra attributes during model initialization
321
- extra="forbid",
321
+ extra="ignore",
322
322
  )
323
323
 
324
324
 
zenml/stack/utils.py CHANGED
@@ -85,7 +85,7 @@ def validate_stack_component_config(
85
85
  validation_config_class: Type[StackComponentConfig] = type(
86
86
  config_class.__name__,
87
87
  (config_class,),
88
- {"model_config": {"extra": "forbid"}},
88
+ {"model_config": {"extra": "ignore"}},
89
89
  )
90
90
  configuration = validation_config_class(**configuration_dict)
91
91
 
@@ -1 +1 @@
1
- import{j as e}from"./@radix-C7hRs6Kx.js";import{h as s,r as t}from"./index-hsSXyS3H.js";import{E as r}from"./EmptyState-M1jafpg6.js";import{S as a}from"./help-DyMolRxD.js";import{L as o}from"./@react-router-BGgzhn5D.js";import"./@tanstack-CSxjHCME.js";import"./@reactflow-CQi1Z1Wq.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
1
+ import{j as e}from"./@radix-C7hRs6Kx.js";import{h as s,r as t}from"./index-BygJE88j.js";import{E as r}from"./EmptyState-M1jafpg6.js";import{S as a}from"./help-DyMolRxD.js";import{L as o}from"./@react-router-CNP6g_RL.js";import"./@tanstack-CSxjHCME.js";import"./@reactflow-CQi1Z1Wq.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
@@ -26,4 +26,4 @@ import{r as v,R as Gr,a as Xr}from"./@radix-C7hRs6Kx.js";/**
26
26
  * LICENSE.md file in the root directory of this source tree.
27
27
  *
28
28
  * @license MIT
29
- */function ze(){return ze=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ze.apply(this,arguments)}function Tr(e,t){if(e==null)return{};var r={},n=Object.keys(e),a,l;for(l=0;l<n.length;l++)a=n[l],!(t.indexOf(a)>=0)&&(r[a]=e[a]);return r}function ha(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function pa(e,t){return e.button===0&&(!t||t==="_self")&&!ha(e)}function Mt(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,r)=>{let n=e[r];return t.concat(Array.isArray(n)?n.map(a=>[r,a]):[[r,n]])},[]))}function ma(e,t){let r=Mt(e);return t&&t.forEach((n,a)=>{r.has(a)||t.getAll(a).forEach(l=>{r.append(a,l)})}),r}const va=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],ga=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],ya="6";try{window.__reactRouterVersion=ya}catch{}function Aa(e,t){return Dn({basename:void 0,future:ze({},void 0,{v7_prependBasename:!0}),history:Qr({window:void 0}),hydrationData:wa(),routes:e,mapRouteProperties:fa,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function wa(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=ze({},t,{errors:ba(t.errors)})),t}function ba(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,a]of t)if(a&&a.__type==="RouteErrorResponse")r[n]=new ht(a.status,a.statusText,a.data,a.internal===!0);else if(a&&a.__type==="Error"){if(a.__subType){let l=window[a.__subType];if(typeof l=="function")try{let o=new l(a.message);o.stack="",r[n]=o}catch{}}if(r[n]==null){let l=new Error(a.message);l.stack="",r[n]=l}}else r[n]=a;return r}const Fr=v.createContext({isTransitioning:!1}),Ra=v.createContext(new Map),Ea="startTransition",hr=Gr[Ea],xa="flushSync",pr=Xr[xa];function Sa(e){hr?hr(e):e()}function Xe(e){pr?pr(e):e()}class Pa{constructor(){this.status="pending",this.promise=new Promise((t,r)=>{this.resolve=n=>{this.status==="pending"&&(this.status="resolved",t(n))},this.reject=n=>{this.status==="pending"&&(this.status="rejected",r(n))}})}}function Ba(e){let{fallbackElement:t,router:r,future:n}=e,[a,l]=v.useState(r.state),[o,c]=v.useState(),[u,f]=v.useState({isTransitioning:!1}),[h,p]=v.useState(),[y,w]=v.useState(),[P,b]=v.useState(),M=v.useRef(new Map),{v7_startTransition:I}=n||{},L=v.useCallback(U=>{I?Sa(U):U()},[I]),j=v.useCallback((U,_)=>{let{deletedFetchers:k,flushSync:Q,viewTransitionOpts:Z}=_;k.forEach(q=>M.current.delete(q)),U.fetchers.forEach((q,Fe)=>{q.data!==void 0&&M.current.set(Fe,q.data)});let ne=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!Z||ne){Q?Xe(()=>l(U)):L(()=>l(U));return}if(Q){Xe(()=>{y&&(h&&h.resolve(),y.skipTransition()),f({isTransitioning:!0,flushSync:!0,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation})});let q=r.window.document.startViewTransition(()=>{Xe(()=>l(U))});q.finished.finally(()=>{Xe(()=>{p(void 0),w(void 0),c(void 0),f({isTransitioning:!1})})}),Xe(()=>w(q));return}y?(h&&h.resolve(),y.skipTransition(),b({state:U,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation})):(c(U),f({isTransitioning:!0,flushSync:!1,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation}))},[r.window,y,h,M,L]);v.useLayoutEffect(()=>r.subscribe(j),[r,j]),v.useEffect(()=>{u.isTransitioning&&!u.flushSync&&p(new Pa)},[u]),v.useEffect(()=>{if(h&&o&&r.window){let U=o,_=h.promise,k=r.window.document.startViewTransition(async()=>{L(()=>l(U)),await _});k.finished.finally(()=>{p(void 0),w(void 0),c(void 0),f({isTransitioning:!1})}),w(k)}},[L,o,h,r.window]),v.useEffect(()=>{h&&o&&a.location.key===o.location.key&&h.resolve()},[h,y,a.location,o]),v.useEffect(()=>{!u.isTransitioning&&P&&(c(P.state),f({isTransitioning:!0,flushSync:!1,currentLocation:P.currentLocation,nextLocation:P.nextLocation}),b(void 0))},[u.isTransitioning,P]),v.useEffect(()=>{},[]);let O=v.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:U=>r.navigate(U),push:(U,_,k)=>r.navigate(U,{state:_,preventScrollReset:k==null?void 0:k.preventScrollReset}),replace:(U,_,k)=>r.navigate(U,{replace:!0,state:_,preventScrollReset:k==null?void 0:k.preventScrollReset})}),[r]),G=r.basename||"/",m=v.useMemo(()=>({router:r,navigator:O,static:!1,basename:G}),[r,O,G]),X=v.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return v.createElement(v.Fragment,null,v.createElement(qe.Provider,{value:m},v.createElement(_t.Provider,{value:a},v.createElement(Ra.Provider,{value:M.current},v.createElement(Fr.Provider,{value:u},v.createElement(da,{basename:G,location:a.location,navigationType:a.historyAction,navigator:O,future:X},a.initialized||r.future.v7_partialHydration?v.createElement(La,{routes:r.routes,future:r.future,state:a}):t))))),null)}const La=v.memo(Ca);function Ca(e){let{routes:t,future:r,state:n}=e;return Zn(t,void 0,n,r)}const Da=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ma=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ta=v.forwardRef(function(t,r){let{onClick:n,relative:a,reloadDocument:l,replace:o,state:c,target:u,to:f,preventScrollReset:h,viewTransition:p}=t,y=Tr(t,va),{basename:w}=v.useContext(me),P,b=!1;if(typeof f=="string"&&Ma.test(f)&&(P=f,Da))try{let j=new URL(window.location.href),O=f.startsWith("//")?new URL(j.protocol+f):new URL(f),G=pe(O.pathname,w);O.origin===j.origin&&G!=null?f=G+O.search+O.hash:b=!0}catch{}let M=Yn(f,{relative:a}),I=Ua(f,{replace:o,state:c,target:u,preventScrollReset:h,relative:a,viewTransition:p});function L(j){n&&n(j),j.defaultPrevented||I(j)}return v.createElement("a",ze({},y,{href:P||M,onClick:b||l?n:L,ref:r,target:u}))}),za=v.forwardRef(function(t,r){let{"aria-current":n="page",caseSensitive:a=!1,className:l="",end:o=!1,style:c,to:u,viewTransition:f,children:h}=t,p=Tr(t,ga),y=yt(u,{relative:p.relative}),w=Te(),P=v.useContext(_t),{navigator:b,basename:M}=v.useContext(me),I=P!=null&&Oa(y)&&f===!0,L=b.encodeLocation?b.encodeLocation(y).pathname:y.pathname,j=w.pathname,O=P&&P.navigation&&P.navigation.location?P.navigation.location.pathname:null;a||(j=j.toLowerCase(),O=O?O.toLowerCase():null,L=L.toLowerCase()),O&&M&&(O=pe(O,M)||O);const G=L!=="/"&&L.endsWith("/")?L.length-1:L.length;let m=j===L||!o&&j.startsWith(L)&&j.charAt(G)==="/",X=O!=null&&(O===L||!o&&O.startsWith(L)&&O.charAt(L.length)==="/"),U={isActive:m,isPending:X,isTransitioning:I},_=m?n:void 0,k;typeof l=="function"?k=l(U):k=[l,m?"active":null,X?"pending":null,I?"transitioning":null].filter(Boolean).join(" ");let Q=typeof c=="function"?c(U):c;return v.createElement(Ta,ze({},p,{"aria-current":_,className:k,ref:r,style:Q,to:u,viewTransition:f}),typeof h=="function"?h(U):h)});var Tt;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Tt||(Tt={}));var mr;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(mr||(mr={}));function Fa(e){let t=v.useContext(qe);return t||F(!1),t}function Ua(e,t){let{target:r,replace:n,state:a,preventScrollReset:l,relative:o,viewTransition:c}=t===void 0?{}:t,u=jt(),f=Te(),h=yt(e,{relative:o});return v.useCallback(p=>{if(pa(p,r)){p.preventDefault();let y=n!==void 0?n:Me(f)===Me(h);u(e,{replace:y,state:a,preventScrollReset:l,relative:o,viewTransition:c})}},[f,u,h,n,a,r,e,l,o,c])}function ka(e){let t=v.useRef(Mt(e)),r=v.useRef(!1),n=Te(),a=v.useMemo(()=>ma(n.search,r.current?null:t.current),[n.search]),l=jt(),o=v.useCallback((c,u)=>{const f=Mt(typeof c=="function"?c(a):c);r.current=!0,l("?"+f,u)},[l,a]);return[a,o]}function Oa(e,t){t===void 0&&(t={});let r=v.useContext(Fr);r==null&&F(!1);let{basename:n}=Fa(Tt.useViewTransitionState),a=yt(e,{relative:t.relative});if(!r.isTransitioning)return!1;let l=pe(r.currentLocation.pathname,n)||r.currentLocation.pathname,o=pe(r.nextLocation.pathname,n)||r.nextLocation.pathname;return ft(a.pathname,o)!=null||ft(a.pathname,l)!=null}export{Ta as L,ja as N,Ia as O,ca as R,jt as a,Na as b,la as c,ka as d,Aa as e,fr as f,Ba as g,za as h,ft as m,Te as u};
29
+ */function ze(){return ze=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ze.apply(this,arguments)}function Tr(e,t){if(e==null)return{};var r={},n=Object.keys(e),a,l;for(l=0;l<n.length;l++)a=n[l],!(t.indexOf(a)>=0)&&(r[a]=e[a]);return r}function ha(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function pa(e,t){return e.button===0&&(!t||t==="_self")&&!ha(e)}function Mt(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,r)=>{let n=e[r];return t.concat(Array.isArray(n)?n.map(a=>[r,a]):[[r,n]])},[]))}function ma(e,t){let r=Mt(e);return t&&t.forEach((n,a)=>{r.has(a)||t.getAll(a).forEach(l=>{r.append(a,l)})}),r}const va=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],ga=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],ya="6";try{window.__reactRouterVersion=ya}catch{}function Aa(e,t){return Dn({basename:void 0,future:ze({},void 0,{v7_prependBasename:!0}),history:Qr({window:void 0}),hydrationData:wa(),routes:e,mapRouteProperties:fa,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function wa(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=ze({},t,{errors:ba(t.errors)})),t}function ba(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,a]of t)if(a&&a.__type==="RouteErrorResponse")r[n]=new ht(a.status,a.statusText,a.data,a.internal===!0);else if(a&&a.__type==="Error"){if(a.__subType){let l=window[a.__subType];if(typeof l=="function")try{let o=new l(a.message);o.stack="",r[n]=o}catch{}}if(r[n]==null){let l=new Error(a.message);l.stack="",r[n]=l}}else r[n]=a;return r}const Fr=v.createContext({isTransitioning:!1}),Ra=v.createContext(new Map),Ea="startTransition",hr=Gr[Ea],xa="flushSync",pr=Xr[xa];function Sa(e){hr?hr(e):e()}function Xe(e){pr?pr(e):e()}class Pa{constructor(){this.status="pending",this.promise=new Promise((t,r)=>{this.resolve=n=>{this.status==="pending"&&(this.status="resolved",t(n))},this.reject=n=>{this.status==="pending"&&(this.status="rejected",r(n))}})}}function Ba(e){let{fallbackElement:t,router:r,future:n}=e,[a,l]=v.useState(r.state),[o,c]=v.useState(),[u,f]=v.useState({isTransitioning:!1}),[h,p]=v.useState(),[y,w]=v.useState(),[P,b]=v.useState(),M=v.useRef(new Map),{v7_startTransition:I}=n||{},L=v.useCallback(U=>{I?Sa(U):U()},[I]),j=v.useCallback((U,_)=>{let{deletedFetchers:k,flushSync:Q,viewTransitionOpts:Z}=_;k.forEach(q=>M.current.delete(q)),U.fetchers.forEach((q,Fe)=>{q.data!==void 0&&M.current.set(Fe,q.data)});let ne=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!Z||ne){Q?Xe(()=>l(U)):L(()=>l(U));return}if(Q){Xe(()=>{y&&(h&&h.resolve(),y.skipTransition()),f({isTransitioning:!0,flushSync:!0,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation})});let q=r.window.document.startViewTransition(()=>{Xe(()=>l(U))});q.finished.finally(()=>{Xe(()=>{p(void 0),w(void 0),c(void 0),f({isTransitioning:!1})})}),Xe(()=>w(q));return}y?(h&&h.resolve(),y.skipTransition(),b({state:U,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation})):(c(U),f({isTransitioning:!0,flushSync:!1,currentLocation:Z.currentLocation,nextLocation:Z.nextLocation}))},[r.window,y,h,M,L]);v.useLayoutEffect(()=>r.subscribe(j),[r,j]),v.useEffect(()=>{u.isTransitioning&&!u.flushSync&&p(new Pa)},[u]),v.useEffect(()=>{if(h&&o&&r.window){let U=o,_=h.promise,k=r.window.document.startViewTransition(async()=>{L(()=>l(U)),await _});k.finished.finally(()=>{p(void 0),w(void 0),c(void 0),f({isTransitioning:!1})}),w(k)}},[L,o,h,r.window]),v.useEffect(()=>{h&&o&&a.location.key===o.location.key&&h.resolve()},[h,y,a.location,o]),v.useEffect(()=>{!u.isTransitioning&&P&&(c(P.state),f({isTransitioning:!0,flushSync:!1,currentLocation:P.currentLocation,nextLocation:P.nextLocation}),b(void 0))},[u.isTransitioning,P]),v.useEffect(()=>{},[]);let O=v.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:U=>r.navigate(U),push:(U,_,k)=>r.navigate(U,{state:_,preventScrollReset:k==null?void 0:k.preventScrollReset}),replace:(U,_,k)=>r.navigate(U,{replace:!0,state:_,preventScrollReset:k==null?void 0:k.preventScrollReset})}),[r]),G=r.basename||"/",m=v.useMemo(()=>({router:r,navigator:O,static:!1,basename:G}),[r,O,G]),X=v.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return v.createElement(v.Fragment,null,v.createElement(qe.Provider,{value:m},v.createElement(_t.Provider,{value:a},v.createElement(Ra.Provider,{value:M.current},v.createElement(Fr.Provider,{value:u},v.createElement(da,{basename:G,location:a.location,navigationType:a.historyAction,navigator:O,future:X},a.initialized||r.future.v7_partialHydration?v.createElement(La,{routes:r.routes,future:r.future,state:a}):t))))),null)}const La=v.memo(Ca);function Ca(e){let{routes:t,future:r,state:n}=e;return Zn(t,void 0,n,r)}const Da=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ma=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ta=v.forwardRef(function(t,r){let{onClick:n,relative:a,reloadDocument:l,replace:o,state:c,target:u,to:f,preventScrollReset:h,viewTransition:p}=t,y=Tr(t,va),{basename:w}=v.useContext(me),P,b=!1;if(typeof f=="string"&&Ma.test(f)&&(P=f,Da))try{let j=new URL(window.location.href),O=f.startsWith("//")?new URL(j.protocol+f):new URL(f),G=pe(O.pathname,w);O.origin===j.origin&&G!=null?f=G+O.search+O.hash:b=!0}catch{}let M=Yn(f,{relative:a}),I=Ua(f,{replace:o,state:c,target:u,preventScrollReset:h,relative:a,viewTransition:p});function L(j){n&&n(j),j.defaultPrevented||I(j)}return v.createElement("a",ze({},y,{href:P||M,onClick:b||l?n:L,ref:r,target:u}))}),za=v.forwardRef(function(t,r){let{"aria-current":n="page",caseSensitive:a=!1,className:l="",end:o=!1,style:c,to:u,viewTransition:f,children:h}=t,p=Tr(t,ga),y=yt(u,{relative:p.relative}),w=Te(),P=v.useContext(_t),{navigator:b,basename:M}=v.useContext(me),I=P!=null&&Oa(y)&&f===!0,L=b.encodeLocation?b.encodeLocation(y).pathname:y.pathname,j=w.pathname,O=P&&P.navigation&&P.navigation.location?P.navigation.location.pathname:null;a||(j=j.toLowerCase(),O=O?O.toLowerCase():null,L=L.toLowerCase()),O&&M&&(O=pe(O,M)||O);const G=L!=="/"&&L.endsWith("/")?L.length-1:L.length;let m=j===L||!o&&j.startsWith(L)&&j.charAt(G)==="/",X=O!=null&&(O===L||!o&&O.startsWith(L)&&O.charAt(L.length)==="/"),U={isActive:m,isPending:X,isTransitioning:I},_=m?n:void 0,k;typeof l=="function"?k=l(U):k=[l,m?"active":null,X?"pending":null,I?"transitioning":null].filter(Boolean).join(" ");let Q=typeof c=="function"?c(U):c;return v.createElement(Ta,ze({},p,{"aria-current":_,className:k,ref:r,style:Q,to:u,viewTransition:f}),typeof h=="function"?h(U):h)});var Tt;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Tt||(Tt={}));var mr;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(mr||(mr={}));function Fa(e){let t=v.useContext(qe);return t||F(!1),t}function Ua(e,t){let{target:r,replace:n,state:a,preventScrollReset:l,relative:o,viewTransition:c}=t===void 0?{}:t,u=jt(),f=Te(),h=yt(e,{relative:o});return v.useCallback(p=>{if(pa(p,r)){p.preventDefault();let y=n!==void 0?n:Me(f)===Me(h);u(e,{replace:y,state:a,preventScrollReset:l,relative:o,viewTransition:c})}},[f,u,h,n,a,r,e,l,o,c])}function ka(e){let t=v.useRef(Mt(e)),r=v.useRef(!1),n=Te(),a=v.useMemo(()=>ma(n.search,r.current?null:t.current),[n.search]),l=jt(),o=v.useCallback((c,u)=>{const f=Mt(typeof c=="function"?c(a):c);r.current=!0,l("?"+f,u)},[l,a]);return[a,o]}function Oa(e,t){t===void 0&&(t={});let r=v.useContext(Fr);r==null&&F(!1);let{basename:n}=Fa(Tt.useViewTransitionState),a=yt(e,{relative:t.relative});if(!r.isTransitioning)return!1;let l=pe(r.currentLocation.pathname,n)||r.currentLocation.pathname,o=pe(r.nextLocation.pathname,n)||r.nextLocation.pathname;return ft(a.pathname,o)!=null||ft(a.pathname,l)!=null}export{Ta as L,ja as N,Ia as O,ca as R,Na as a,la as b,jt as c,ka as d,Aa as e,fr as f,Ba as g,za as h,ft as m,Te as u};
@@ -1 +1 @@
1
- import{r as m,j as e}from"./@radix-C7hRs6Kx.js";import{t as g,v as p,ah as d,aT as h}from"./index-hsSXyS3H.js";const x=m.forwardRef((r,t)=>{const{triggerChildren:a,children:i,onSelect:o,onOpenChange:l,icon:D,open:n,...s}=r;return e.jsxs(g,{open:n,onOpenChange:l,children:[e.jsx(p,{asChild:!0,children:e.jsx(d,{...s,className:"hover:cursor-pointer",icon:r.icon,ref:t,onSelect:c=>{c.preventDefault(),o&&o()},children:a})}),e.jsx(h,{children:i})]})});x.displayName="AlertDialogItem";export{x as A};
1
+ import{r as m,j as e}from"./@radix-C7hRs6Kx.js";import{t as g,v as p,af as d,aR as h}from"./index-BygJE88j.js";const x=m.forwardRef((r,t)=>{const{triggerChildren:a,children:i,onSelect:o,onOpenChange:l,icon:f,open:n,...s}=r;return e.jsxs(g,{open:n,onOpenChange:l,children:[e.jsx(p,{asChild:!0,children:e.jsx(d,{...s,className:"hover:cursor-pointer",icon:r.icon,ref:t,onSelect:c=>{c.preventDefault(),o&&o()},children:a})}),e.jsx(h,{children:i})]})});x.displayName="AlertDialogItem";export{x as A};
@@ -1,4 +1,4 @@
1
- import{aK as X,g as re,r as V,j as E}from"./@radix-C7hRs6Kx.js";import{m as Y,a7 as ie}from"./index-hsSXyS3H.js";var Z={exports:{}},J;function se(){return J||(J=1,function(A){var M=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/**
1
+ import{aK as X,g as re,r as V,j as E}from"./@radix-C7hRs6Kx.js";import{m as Y,a5 as ie}from"./index-BygJE88j.js";var Z={exports:{}},J;function se(){return J||(J=1,function(A){var M=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/**
2
2
  * Prism: Lightweight, robust, elegant syntax highlighting
3
3
  *
4
4
  * @license MIT <https://opensource.org/licenses/MIT>