polyaxon 2.5.3__py3-none-any.whl → 2.6.0.post1__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 (201) hide show
  1. polyaxon/_auxiliaries/default_scheduling.py +17 -7
  2. polyaxon/_auxiliaries/init.py +14 -6
  3. polyaxon/_auxiliaries/sidecar.py +10 -8
  4. polyaxon/_compiler/resolver/agent.py +10 -9
  5. polyaxon/_deploy/schemas/auth.py +3 -3
  6. polyaxon/_deploy/schemas/celery.py +10 -8
  7. polyaxon/_deploy/schemas/deployment.py +148 -115
  8. polyaxon/_deploy/schemas/email.py +8 -8
  9. polyaxon/_deploy/schemas/ingress.py +7 -7
  10. polyaxon/_deploy/schemas/intervals.py +3 -1
  11. polyaxon/_deploy/schemas/operators.py +8 -8
  12. polyaxon/_deploy/schemas/proxy.py +9 -9
  13. polyaxon/_deploy/schemas/rbac.py +1 -1
  14. polyaxon/_deploy/schemas/root_user.py +5 -5
  15. polyaxon/_deploy/schemas/security_context.py +25 -15
  16. polyaxon/_deploy/schemas/service.py +73 -69
  17. polyaxon/_deploy/schemas/ssl.py +3 -3
  18. polyaxon/_deploy/schemas/ui.py +10 -8
  19. polyaxon/_docker/builder/builder.py +4 -1
  20. polyaxon/_docker/converter/base/containers.py +4 -7
  21. polyaxon/_docker/converter/base/env_vars.py +5 -5
  22. polyaxon/_docker/converter/base/mounts.py +2 -2
  23. polyaxon/_docker/docker_types.py +57 -30
  24. polyaxon/_flow/__init__.py +3 -2
  25. polyaxon/_flow/builds/__init__.py +8 -8
  26. polyaxon/_flow/cache/__init__.py +4 -4
  27. polyaxon/_flow/component/base.py +25 -18
  28. polyaxon/_flow/component/component.py +4 -3
  29. polyaxon/_flow/early_stopping/__init__.py +1 -1
  30. polyaxon/_flow/early_stopping/policies.py +12 -10
  31. polyaxon/_flow/environment/__init__.py +42 -24
  32. polyaxon/_flow/hooks/__init__.py +11 -11
  33. polyaxon/_flow/init/__init__.py +41 -25
  34. polyaxon/_flow/io/io.py +59 -47
  35. polyaxon/_flow/joins/__init__.py +5 -5
  36. polyaxon/_flow/matrix/bayes.py +23 -17
  37. polyaxon/_flow/matrix/grid_search.py +16 -7
  38. polyaxon/_flow/matrix/hyperband.py +10 -10
  39. polyaxon/_flow/matrix/hyperopt.py +14 -9
  40. polyaxon/_flow/matrix/iterative.py +14 -8
  41. polyaxon/_flow/matrix/mapping.py +4 -4
  42. polyaxon/_flow/matrix/params.py +138 -77
  43. polyaxon/_flow/matrix/random_search.py +10 -5
  44. polyaxon/_flow/matrix/tuner.py +4 -4
  45. polyaxon/_flow/mounts/artifacts_mounts.py +1 -1
  46. polyaxon/_flow/notifications/__init__.py +1 -1
  47. polyaxon/_flow/operations/base.py +10 -8
  48. polyaxon/_flow/operations/compiled_operation.py +5 -4
  49. polyaxon/_flow/operations/operation.py +30 -22
  50. polyaxon/_flow/optimization/__init__.py +2 -2
  51. polyaxon/_flow/params/params.py +11 -10
  52. polyaxon/_flow/plugins/__init__.py +19 -13
  53. polyaxon/_flow/run/dag.py +12 -9
  54. polyaxon/_flow/run/dask/dask.py +4 -4
  55. polyaxon/_flow/run/dask/replica.py +17 -11
  56. polyaxon/_flow/run/job.py +17 -11
  57. polyaxon/_flow/run/kubeflow/mpi_job.py +10 -5
  58. polyaxon/_flow/run/kubeflow/mx_job.py +25 -9
  59. polyaxon/_flow/run/kubeflow/paddle_job.py +16 -9
  60. polyaxon/_flow/run/kubeflow/pytorch_job.py +24 -17
  61. polyaxon/_flow/run/kubeflow/replica.py +17 -11
  62. polyaxon/_flow/run/kubeflow/scheduling_policy.py +7 -5
  63. polyaxon/_flow/run/kubeflow/tf_job.py +15 -8
  64. polyaxon/_flow/run/kubeflow/xgboost_job.py +9 -4
  65. polyaxon/_flow/run/ray/ray.py +9 -6
  66. polyaxon/_flow/run/ray/replica.py +25 -16
  67. polyaxon/_flow/run/resources.py +14 -13
  68. polyaxon/_flow/run/service.py +4 -4
  69. polyaxon/_flow/schedules/cron.py +4 -4
  70. polyaxon/_flow/schedules/interval.py +4 -4
  71. polyaxon/_flow/templates/__init__.py +3 -3
  72. polyaxon/_flow/termination/__init__.py +3 -3
  73. polyaxon/_fs/watcher.py +26 -27
  74. polyaxon/_k8s/k8s_validation.py +1 -1
  75. polyaxon/_local_process/converter/base/containers.py +4 -7
  76. polyaxon/_local_process/converter/base/env_vars.py +5 -5
  77. polyaxon/_local_process/process_types.py +15 -12
  78. polyaxon/_polyaxonfile/specs/compiled_operation.py +1 -1
  79. polyaxon/_polyaxonfile/specs/libs/validator.py +1 -1
  80. polyaxon/_polyaxonfile/specs/operation.py +1 -1
  81. polyaxon/_runner/agent/sync_agent.py +1 -1
  82. polyaxon/_runner/converter/converter.py +1 -1
  83. polyaxon/_schemas/agent.py +69 -37
  84. polyaxon/_schemas/authentication.py +4 -4
  85. polyaxon/_schemas/base.py +26 -2
  86. polyaxon/_schemas/checks.py +3 -3
  87. polyaxon/_schemas/cli.py +4 -6
  88. polyaxon/_schemas/client.py +20 -18
  89. polyaxon/_schemas/compatibility.py +4 -4
  90. polyaxon/_schemas/container_resources.py +1 -1
  91. polyaxon/_schemas/home.py +3 -3
  92. polyaxon/_schemas/installation.py +8 -8
  93. polyaxon/_schemas/lifecycle.py +21 -21
  94. polyaxon/_schemas/log_handler.py +2 -2
  95. polyaxon/_schemas/services.py +26 -14
  96. polyaxon/_schemas/types/artifacts.py +3 -3
  97. polyaxon/_schemas/types/dockerfile.py +14 -12
  98. polyaxon/_schemas/types/event.py +2 -2
  99. polyaxon/_schemas/types/file.py +3 -3
  100. polyaxon/_schemas/types/git.py +12 -4
  101. polyaxon/_schemas/types/tensorboard.py +14 -8
  102. polyaxon/_schemas/user.py +3 -3
  103. polyaxon/_schemas/version.py +2 -2
  104. polyaxon/_sdk/api/agents_v1_api.py +45 -45
  105. polyaxon/_sdk/api/artifacts_stores_v1_api.py +3 -3
  106. polyaxon/_sdk/api/auth_v1_api.py +13 -13
  107. polyaxon/_sdk/api/connections_v1_api.py +15 -15
  108. polyaxon/_sdk/api/dashboards_v1_api.py +15 -15
  109. polyaxon/_sdk/api/organizations_v1_api.py +77 -77
  110. polyaxon/_sdk/api/presets_v1_api.py +15 -15
  111. polyaxon/_sdk/api/project_dashboards_v1_api.py +17 -17
  112. polyaxon/_sdk/api/project_searches_v1_api.py +17 -17
  113. polyaxon/_sdk/api/projects_v1_api.py +65 -65
  114. polyaxon/_sdk/api/queues_v1_api.py +19 -19
  115. polyaxon/_sdk/api/runs_v1_api.py +127 -127
  116. polyaxon/_sdk/api/searches_v1_api.py +15 -15
  117. polyaxon/_sdk/api/service_accounts_v1_api.py +27 -27
  118. polyaxon/_sdk/api/tags_v1_api.py +17 -17
  119. polyaxon/_sdk/api/teams_v1_api.py +51 -51
  120. polyaxon/_sdk/api/users_v1_api.py +25 -25
  121. polyaxon/_sdk/api/versions_v1_api.py +7 -7
  122. polyaxon/_sdk/schemas/v1_activity.py +8 -8
  123. polyaxon/_sdk/schemas/v1_agent.py +17 -17
  124. polyaxon/_sdk/schemas/v1_agent_state_response.py +4 -4
  125. polyaxon/_sdk/schemas/v1_agent_state_response_agent_state.py +10 -10
  126. polyaxon/_sdk/schemas/v1_agent_status_body_request.py +3 -3
  127. polyaxon/_sdk/schemas/v1_analytics_spec.py +4 -4
  128. polyaxon/_sdk/schemas/v1_artifact_tree.py +3 -3
  129. polyaxon/_sdk/schemas/v1_auth.py +1 -1
  130. polyaxon/_sdk/schemas/v1_cloning.py +3 -3
  131. polyaxon/_sdk/schemas/v1_connection_response.py +9 -9
  132. polyaxon/_sdk/schemas/v1_dashboard.py +9 -9
  133. polyaxon/_sdk/schemas/v1_dashboard_spec.py +5 -5
  134. polyaxon/_sdk/schemas/v1_entities_tags.py +2 -2
  135. polyaxon/_sdk/schemas/v1_entities_transfer.py +2 -2
  136. polyaxon/_sdk/schemas/v1_entity_notification_body.py +7 -7
  137. polyaxon/_sdk/schemas/v1_entity_stage_body_request.py +5 -5
  138. polyaxon/_sdk/schemas/v1_entity_status_body_request.py +5 -5
  139. polyaxon/_sdk/schemas/v1_events_response.py +2 -2
  140. polyaxon/_sdk/schemas/v1_list_activities_response.py +4 -4
  141. polyaxon/_sdk/schemas/v1_list_agents_response.py +4 -4
  142. polyaxon/_sdk/schemas/v1_list_bookmarks_response.py +4 -4
  143. polyaxon/_sdk/schemas/v1_list_connections_response.py +4 -4
  144. polyaxon/_sdk/schemas/v1_list_dashboards_response.py +4 -4
  145. polyaxon/_sdk/schemas/v1_list_organization_members_response.py +4 -4
  146. polyaxon/_sdk/schemas/v1_list_organizations_response.py +4 -4
  147. polyaxon/_sdk/schemas/v1_list_presets_response.py +4 -4
  148. polyaxon/_sdk/schemas/v1_list_project_versions_response.py +4 -4
  149. polyaxon/_sdk/schemas/v1_list_projects_response.py +4 -4
  150. polyaxon/_sdk/schemas/v1_list_queues_response.py +4 -4
  151. polyaxon/_sdk/schemas/v1_list_run_artifacts_response.py +4 -4
  152. polyaxon/_sdk/schemas/v1_list_run_connections_response.py +4 -4
  153. polyaxon/_sdk/schemas/v1_list_run_edges_response.py +4 -4
  154. polyaxon/_sdk/schemas/v1_list_runs_response.py +4 -4
  155. polyaxon/_sdk/schemas/v1_list_searches_response.py +4 -4
  156. polyaxon/_sdk/schemas/v1_list_service_accounts_response.py +4 -4
  157. polyaxon/_sdk/schemas/v1_list_tags_response.py +4 -4
  158. polyaxon/_sdk/schemas/v1_list_team_members_response.py +4 -4
  159. polyaxon/_sdk/schemas/v1_list_teams_response.py +4 -4
  160. polyaxon/_sdk/schemas/v1_list_token_response.py +4 -4
  161. polyaxon/_sdk/schemas/v1_operation_body.py +8 -8
  162. polyaxon/_sdk/schemas/v1_organization.py +16 -16
  163. polyaxon/_sdk/schemas/v1_organization_member.py +6 -6
  164. polyaxon/_sdk/schemas/v1_password_change.py +3 -3
  165. polyaxon/_sdk/schemas/v1_pipeline.py +3 -3
  166. polyaxon/_sdk/schemas/v1_preset.py +11 -11
  167. polyaxon/_sdk/schemas/v1_project.py +17 -17
  168. polyaxon/_sdk/schemas/v1_project_settings.py +11 -11
  169. polyaxon/_sdk/schemas/v1_project_version.py +20 -20
  170. polyaxon/_sdk/schemas/v1_queue.py +12 -12
  171. polyaxon/_sdk/schemas/v1_run.py +38 -38
  172. polyaxon/_sdk/schemas/v1_run_connection.py +3 -3
  173. polyaxon/_sdk/schemas/v1_run_edge.py +5 -5
  174. polyaxon/_sdk/schemas/v1_run_edge_lineage.py +3 -3
  175. polyaxon/_sdk/schemas/v1_run_edges_graph.py +1 -1
  176. polyaxon/_sdk/schemas/v1_run_reference_catalog.py +4 -4
  177. polyaxon/_sdk/schemas/v1_run_settings.py +9 -9
  178. polyaxon/_sdk/schemas/v1_search.py +10 -10
  179. polyaxon/_sdk/schemas/v1_search_spec.py +14 -14
  180. polyaxon/_sdk/schemas/v1_section_spec.py +12 -12
  181. polyaxon/_sdk/schemas/v1_service_account.py +9 -9
  182. polyaxon/_sdk/schemas/v1_settings_catalog.py +4 -4
  183. polyaxon/_sdk/schemas/v1_tag.py +6 -6
  184. polyaxon/_sdk/schemas/v1_team.py +11 -11
  185. polyaxon/_sdk/schemas/v1_team_member.py +6 -6
  186. polyaxon/_sdk/schemas/v1_team_settings.py +2 -2
  187. polyaxon/_sdk/schemas/v1_token.py +10 -10
  188. polyaxon/_sdk/schemas/v1_trial_start.py +6 -6
  189. polyaxon/_sdk/schemas/v1_user.py +6 -6
  190. polyaxon/_sdk/schemas/v1_user_access.py +7 -7
  191. polyaxon/_sdk/schemas/v1_user_email.py +1 -1
  192. polyaxon/_sdk/schemas/v1_user_singup.py +5 -5
  193. polyaxon/_sdk/schemas/v1_uuids.py +1 -1
  194. polyaxon/_utils/test_utils.py +2 -1
  195. polyaxon/pkg.py +1 -1
  196. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/METADATA +10 -10
  197. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/RECORD +201 -201
  198. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/LICENSE +0 -0
  199. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/WHEEL +0 -0
  200. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/entry_points.txt +0 -0
  201. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/top_level.txt +0 -0
@@ -13,9 +13,9 @@ class V1MedianStoppingPolicy(BaseSchemaModel):
13
13
  _USE_DISCRIMINATOR = True
14
14
 
15
15
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
16
- evaluation_interval: IntOrRef = Field(alias="evaluationInterval")
17
- min_interval: Optional[IntOrRef] = Field(alias="minInterval")
18
- min_samples: Optional[IntOrRef] = Field(alias="minSamples")
16
+ evaluation_interval: IntOrRef = Field(alias="evaluationInterval", default=None)
17
+ min_interval: Optional[IntOrRef] = Field(alias="minInterval", default=None)
18
+ min_samples: Optional[IntOrRef] = Field(alias="minSamples", default=None)
19
19
 
20
20
 
21
21
  class V1TruncationStoppingPolicy(BaseSchemaModel):
@@ -24,9 +24,11 @@ class V1TruncationStoppingPolicy(BaseSchemaModel):
24
24
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
25
25
  percent: FloatOrRef
26
26
  evaluation_interval: IntOrRef = Field(alias="evaluationInterval")
27
- min_interval: Optional[IntOrRef] = Field(alias="minInterval")
28
- min_samples: Optional[IntOrRef] = Field(alias="minSamples")
29
- include_succeeded: Optional[BoolOrRef] = Field(alias="includeSucceeded")
27
+ min_interval: Optional[IntOrRef] = Field(alias="minInterval", default=None)
28
+ min_samples: Optional[IntOrRef] = Field(alias="minSamples", default=None)
29
+ include_succeeded: Optional[BoolOrRef] = Field(
30
+ alias="includeSucceeded", default=None
31
+ )
30
32
 
31
33
 
32
34
  class V1DiffStoppingPolicy(BaseSchemaModel):
@@ -35,13 +37,13 @@ class V1DiffStoppingPolicy(BaseSchemaModel):
35
37
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
36
38
  percent: FloatOrRef
37
39
  evaluation_interval: IntOrRef = Field(alias="evaluationInterval")
38
- min_interval: Optional[IntOrRef] = Field(alias="minInterval")
39
- min_samples: Optional[IntOrRef] = Field(alias="minSamples")
40
+ min_interval: Optional[IntOrRef] = Field(alias="minInterval", default=None)
41
+ min_samples: Optional[IntOrRef] = Field(alias="minSamples", default=None)
40
42
 
41
43
 
42
44
  V1EarlyStoppingPolicy = Annotated[
43
45
  Union[V1MedianStoppingPolicy, V1TruncationStoppingPolicy, V1DiffStoppingPolicy],
44
- Field(discriminator="kind", alias="earlyStopping"),
46
+ Field(discriminator="kind"),
45
47
  ]
46
48
 
47
49
 
@@ -150,7 +152,7 @@ class V1MetricEarlyStopping(BaseSchemaModel):
150
152
  metric: StrictStr
151
153
  value: FloatOrRef
152
154
  optimization: Union[StrictFloat, V1Optimization]
153
- policy: Optional[V1EarlyStoppingPolicy]
155
+ policy: Optional[V1EarlyStoppingPolicy] = None
154
156
 
155
157
 
156
158
  class V1FailureEarlyStopping(BaseSchemaModel):
@@ -1,7 +1,13 @@
1
1
  from typing import Dict, List, Optional, Union
2
2
  from typing_extensions import Literal
3
3
 
4
- from clipped.compact.pydantic import Field, StrictStr, validator
4
+ from clipped.compact.pydantic import (
5
+ Field,
6
+ StrictStr,
7
+ field_validator,
8
+ validation_always,
9
+ validation_before,
10
+ )
5
11
 
6
12
  from polyaxon._k8s import k8s_schemas, k8s_validation
7
13
  from polyaxon._schemas.base import BaseSchemaModel
@@ -389,52 +395,64 @@ class V1Environment(BaseSchemaModel):
389
395
  "dnsConfig",
390
396
  ]
391
397
 
392
- labels: Optional[Dict[StrictStr, StrictStr]]
393
- annotations: Optional[Dict[StrictStr, StrictStr]]
394
- node_selector: Optional[Dict[StrictStr, StrictStr]] = Field(alias="nodeSelector")
395
- affinity: Optional[Union[k8s_schemas.V1Affinity, Dict]]
396
- tolerations: Optional[List[Union[k8s_schemas.V1Toleration, Dict]]]
397
- node_name: Optional[StrictStr] = Field(alias="nodeName")
398
- service_account_name: Optional[StrictStr] = Field(alias="serviceAccountName")
399
- host_aliases: Optional[List[k8s_schemas.V1HostAlias]] = Field(alias="hostAliases")
398
+ labels: Optional[Dict[StrictStr, StrictStr]] = None
399
+ annotations: Optional[Dict[StrictStr, StrictStr]] = None
400
+ node_selector: Optional[Dict[StrictStr, StrictStr]] = Field(
401
+ alias="nodeSelector", default=None
402
+ )
403
+ affinity: Optional[Union[k8s_schemas.V1Affinity, Dict]] = None
404
+ tolerations: Optional[List[Union[k8s_schemas.V1Toleration, Dict]]] = None
405
+ node_name: Optional[StrictStr] = Field(alias="nodeName", default=None)
406
+ service_account_name: Optional[StrictStr] = Field(
407
+ alias="serviceAccountName", default=None
408
+ )
409
+ host_aliases: Optional[List[k8s_schemas.V1HostAlias]] = Field(
410
+ alias="hostAliases", default=None
411
+ )
400
412
  security_context: Optional[Union[k8s_schemas.V1SecurityContext, Dict]] = Field(
401
- alias="securityContext"
413
+ alias="securityContext", default=None
414
+ )
415
+ image_pull_secrets: Optional[List[StrictStr]] = Field(
416
+ alias="imagePullSecrets", default=None
417
+ )
418
+ host_network: Optional[bool] = Field(alias="hostNetwork", default=None)
419
+ host_pid: Optional[bool] = Field(alias="hostPID", default=None)
420
+ dns_policy: Optional[StrictStr] = Field(alias="dnsPolicy", default=None)
421
+ dns_config: Optional[k8s_schemas.V1PodDNSConfig] = Field(
422
+ alias="dnsConfig", default=None
423
+ )
424
+ scheduler_name: Optional[StrictStr] = Field(alias="schedulerName", default=None)
425
+ priority_class_name: Optional[StrictStr] = Field(
426
+ alias="priorityClassName", default=None
402
427
  )
403
- image_pull_secrets: Optional[List[StrictStr]] = Field(alias="imagePullSecrets")
404
- host_network: Optional[bool] = Field(alias="hostNetwork")
405
- host_pid: Optional[bool] = Field(alias="hostPID")
406
- dns_policy: Optional[StrictStr] = Field(alias="dnsPolicy")
407
- dns_config: Optional[k8s_schemas.V1PodDNSConfig] = Field(alias="dnsConfig")
408
- scheduler_name: Optional[StrictStr] = Field(alias="schedulerName")
409
- priority_class_name: Optional[StrictStr] = Field(alias="priorityClassName")
410
- priority: Optional[int]
428
+ priority: Optional[int] = None
411
429
  restart_policy: Optional[
412
430
  Literal["Always", "OnFailure", "Never", "ExitCode"]
413
- ] = Field(alias="restartPolicy")
431
+ ] = Field(alias="restartPolicy", default=None)
414
432
 
415
- @validator("affinity", always=True, pre=True)
433
+ @field_validator("affinity", **validation_always, **validation_before)
416
434
  def validate_affinity(cls, v):
417
435
  return k8s_validation.validate_k8s_affinity(v)
418
436
 
419
- @validator("tolerations", always=True, pre=True)
437
+ @field_validator("tolerations", **validation_always, **validation_before)
420
438
  def validate_tolerations(cls, v):
421
439
  if not v:
422
440
  return v
423
441
  return [k8s_validation.validate_k8s_toleration(vi) for vi in v]
424
442
 
425
- @validator("host_aliases", always=True, pre=True)
443
+ @field_validator("host_aliases", **validation_always, **validation_before)
426
444
  def validate_host_aliases(cls, v):
427
445
  if not v:
428
446
  return v
429
447
  return [k8s_validation.validate_k8s_host_alias(vi) for vi in v]
430
448
 
431
- @validator("security_context", always=True, pre=True)
449
+ @field_validator("security_context", **validation_always, **validation_before)
432
450
  def validate_security_context(cls, v):
433
451
  if not v:
434
452
  return v
435
453
  return k8s_validation.validate_k8s_security_context(v)
436
454
 
437
- @validator("dns_config", always=True, pre=True)
455
+ @field_validator("dns_config", **validation_always, **validation_before)
438
456
  def validate_dns_config(cls, v):
439
457
  if not v:
440
458
  return v
@@ -1,6 +1,6 @@
1
1
  from typing import Dict, List, Optional, Union
2
2
 
3
- from clipped.compact.pydantic import Field, StrictStr, validator
3
+ from clipped.compact.pydantic import Field, StrictStr, field_validator
4
4
  from clipped.types.ref_or_obj import BoolOrRef, RefField
5
5
 
6
6
  from polyaxon._flow.params import V1Param
@@ -208,16 +208,16 @@ class V1Hook(BaseSchemaModel):
208
208
  _IDENTIFIER = "hook"
209
209
 
210
210
  hub_ref: StrictStr = Field(alias="hubRef")
211
- connection: Optional[StrictStr]
212
- trigger: Optional[V1Statuses]
213
- conditions: Optional[StrictStr]
214
- presets: Optional[List[StrictStr]]
215
- queue: Optional[StrictStr]
216
- namespace: Optional[StrictStr]
217
- params: Optional[Union[Dict[str, V1Param], RefField]]
218
- disable_defaults: Optional[BoolOrRef] = Field(alias="disableDefaults")
219
-
220
- @validator("trigger")
211
+ connection: Optional[StrictStr] = None
212
+ trigger: Optional[V1Statuses] = None
213
+ conditions: Optional[StrictStr] = None
214
+ presets: Optional[List[StrictStr]] = None
215
+ queue: Optional[StrictStr] = None
216
+ namespace: Optional[StrictStr] = None
217
+ params: Optional[Union[Dict[str, V1Param], RefField]] = None
218
+ disable_defaults: Optional[BoolOrRef] = Field(alias="disableDefaults", default=None)
219
+
220
+ @field_validator("trigger")
221
221
  def validate_trigger(cls, v):
222
222
  if v and v not in V1Statuses.get_allowable_hook_values():
223
223
  raise ValueError(
@@ -1,6 +1,14 @@
1
1
  from typing import List, Optional, Union
2
2
 
3
- from clipped.compact.pydantic import Field, StrictStr, root_validator, validator
3
+ from clipped.compact.pydantic import (
4
+ Field,
5
+ StrictStr,
6
+ field_validator,
7
+ model_validator,
8
+ validation_after,
9
+ validation_always,
10
+ validation_before,
11
+ )
4
12
  from clipped.config.schema import skip_partial
5
13
  from clipped.types.ref_or_obj import RefField
6
14
 
@@ -202,32 +210,40 @@ class V1Init(BaseSchemaModel):
202
210
  _IDENTIFIER = "init"
203
211
  _SWAGGER_FIELDS = ["container"]
204
212
 
205
- artifacts: Optional[Union[V1ArtifactsType, RefField]]
206
- paths: Optional[Union[List[Union[List[StrictStr], StrictStr]], StrictStr, RefField]]
207
- git: Optional[Union[V1GitType, RefField]]
208
- dockerfile: Optional[Union[V1DockerfileType, RefField]]
209
- file: Optional[Union[V1FileType, RefField]]
210
- tensorboard: Optional[Union[V1TensorboardType, RefField]]
211
- lineage_ref: Optional[Union[StrictStr, RefField]] = Field(alias="lineageRef")
212
- model_ref: Optional[Union[StrictStr, RefField]] = Field(alias="modelRef")
213
- artifact_ref: Optional[Union[StrictStr, RefField]] = Field(alias="artifactRef")
214
- connection: Optional[StrictStr]
215
- path: Optional[StrictStr]
216
- container: Optional[Union[k8s_schemas.V1Container, RefField]]
213
+ artifacts: Optional[Union[V1ArtifactsType, RefField]] = None
214
+ paths: Optional[
215
+ Union[List[Union[List[StrictStr], StrictStr]], StrictStr, RefField]
216
+ ] = None
217
+ git: Optional[Union[V1GitType, RefField]] = None
218
+ dockerfile: Optional[Union[V1DockerfileType, RefField]] = None
219
+ file: Optional[Union[V1FileType, RefField]] = None
220
+ tensorboard: Optional[Union[V1TensorboardType, RefField]] = None
221
+ lineage_ref: Optional[Union[StrictStr, RefField]] = Field(
222
+ alias="lineageRef", default=None
223
+ )
224
+ model_ref: Optional[Union[StrictStr, RefField]] = Field(
225
+ alias="modelRef", default=None
226
+ )
227
+ artifact_ref: Optional[Union[StrictStr, RefField]] = Field(
228
+ alias="artifactRef", default=None
229
+ )
230
+ connection: Optional[StrictStr] = None
231
+ path: Optional[StrictStr] = None
232
+ container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
217
233
 
218
- @root_validator
234
+ @model_validator(**validation_after)
219
235
  @skip_partial
220
236
  def validate_init(cls, values):
221
- artifacts = values.get("artifacts")
222
- paths = values.get("paths")
223
- git = values.get("git")
224
- dockerfile = values.get("dockerfile")
225
- file = values.get("file")
226
- tensorboard = values.get("tensorboard")
227
- lineage_ref = values.get("lineage_ref")
228
- model_ref = values.get("model_ref")
229
- artifact_ref = values.get("artifact_ref")
230
- connection = values.get("connection")
237
+ artifacts = cls.get_value_for_key("artifacts", values)
238
+ paths = cls.get_value_for_key("paths", values)
239
+ git = cls.get_value_for_key("git", values)
240
+ dockerfile = cls.get_value_for_key("dockerfile", values)
241
+ file = cls.get_value_for_key("file", values)
242
+ tensorboard = cls.get_value_for_key("tensorboard", values)
243
+ lineage_ref = cls.get_value_for_key("lineage_ref", values)
244
+ model_ref = cls.get_value_for_key("model_ref", values)
245
+ artifact_ref = cls.get_value_for_key("artifact_ref", values)
246
+ connection = cls.get_value_for_key("connection", values)
231
247
  schemas = 0
232
248
  if artifacts:
233
249
  schemas += 1
@@ -258,7 +274,7 @@ class V1Init(BaseSchemaModel):
258
274
  )
259
275
  return values
260
276
 
261
- @validator("container", always=True, pre=True)
277
+ @field_validator("container", **validation_always, **validation_before)
262
278
  def validate_container(cls, v):
263
279
  return k8s_validation.validate_k8s_container(v)
264
280
 
polyaxon/_flow/io/io.py CHANGED
@@ -2,7 +2,15 @@ import re
2
2
 
3
3
  from typing import Any, Dict, List, Optional, Union
4
4
 
5
- from clipped.compact.pydantic import Field, StrictStr, root_validator, validator
5
+ from clipped.compact.pydantic import (
6
+ Field,
7
+ StrictStr,
8
+ field_validator,
9
+ model_validator,
10
+ validation_after,
11
+ validation_always,
12
+ validation_before,
13
+ )
6
14
  from clipped.config.schema import skip_partial
7
15
  from clipped.types.numbers import StrictIntOrFloat
8
16
  from clipped.types.ref_or_obj import BoolOrRef, IntOrRef, RefField
@@ -38,6 +46,8 @@ def validate_io_value(
38
46
  default=default,
39
47
  )
40
48
  if validation:
49
+ if isinstance(validation, dict):
50
+ validation = V1Validation(**validation)
41
51
  validation.run_validation(
42
52
  value=parsed_value, type=type, is_optional=is_optional
43
53
  )
@@ -86,7 +96,7 @@ def validate_io(
86
96
  )
87
97
 
88
98
  if is_flag and type != "bool":
89
- raise TypeError(
99
+ raise ValueError(
90
100
  "IO type `{}` cannot be a flag, it must be of type `{}`".format(
91
101
  type, "bool"
92
102
  )
@@ -241,29 +251,31 @@ class V1Validation(BaseSchemaModel):
241
251
  * maxItems - maximum number of items
242
252
  """
243
253
 
244
- delay: Optional[BoolOrRef]
245
- gt: Optional[Union[StrictIntOrFloat, RefField]]
246
- ge: Optional[Union[StrictIntOrFloat, RefField]]
247
- lt: Optional[Union[StrictIntOrFloat, RefField]]
248
- le: Optional[Union[StrictIntOrFloat, RefField]]
249
- multiple_of: Optional[Union[StrictIntOrFloat, RefField]] = Field(alias="multipleOf")
250
- min_digits: Optional[IntOrRef] = Field(alias="minDigits")
251
- max_digits: Optional[IntOrRef] = Field(alias="maxDigits")
252
- decimal_places: Optional[IntOrRef] = Field(alias="decimalPlaces")
253
- regex: Optional[StrictStr]
254
- min_length: Optional[IntOrRef] = Field(alias="minLength")
255
- max_length: Optional[IntOrRef] = Field(alias="maxLength")
256
- contains: Optional[Any]
257
- excludes: Optional[Any]
258
- options: Optional[Any]
259
- min_items: Optional[IntOrRef] = Field(alias="minItems")
260
- max_items: Optional[IntOrRef] = Field(alias="maxItems")
261
- keys: Optional[Union[List[StrictStr], RefField]]
254
+ delay: Optional[BoolOrRef] = None
255
+ gt: Optional[Union[StrictIntOrFloat, RefField]] = None
256
+ ge: Optional[Union[StrictIntOrFloat, RefField]] = None
257
+ lt: Optional[Union[StrictIntOrFloat, RefField]] = None
258
+ le: Optional[Union[StrictIntOrFloat, RefField]] = None
259
+ multiple_of: Optional[Union[StrictIntOrFloat, RefField]] = Field(
260
+ alias="multipleOf", default=None
261
+ )
262
+ min_digits: Optional[IntOrRef] = Field(alias="minDigits", default=None)
263
+ max_digits: Optional[IntOrRef] = Field(alias="maxDigits", default=None)
264
+ decimal_places: Optional[IntOrRef] = Field(alias="decimalPlaces", default=None)
265
+ regex: Optional[StrictStr] = None
266
+ min_length: Optional[IntOrRef] = Field(alias="minLength", default=None)
267
+ max_length: Optional[IntOrRef] = Field(alias="maxLength", default=None)
268
+ contains: Optional[Any] = None
269
+ excludes: Optional[Any] = None
270
+ options: Optional[Any] = None
271
+ min_items: Optional[IntOrRef] = Field(alias="minItems", default=None)
272
+ max_items: Optional[IntOrRef] = Field(alias="maxItems", default=None)
273
+ keys: Optional[Union[List[StrictStr], RefField]] = None
262
274
  contains_keys: Optional[Union[List[StrictStr], RefField]] = Field(
263
- alias="containsKeys"
275
+ alias="containsKeys", default=None
264
276
  )
265
277
  excludes_keys: Optional[Union[List[StrictStr], RefField]] = Field(
266
- alias="excludesKeys"
278
+ alias="excludesKeys", default=None
267
279
  )
268
280
 
269
281
  def _validate_gt(self, value):
@@ -891,27 +903,27 @@ class V1IO(BaseSchemaModel):
891
903
  _IDENTIFIER = "io"
892
904
 
893
905
  name: StrictStr
894
- description: Optional[StrictStr]
895
- type: Optional[StrictStr]
896
- is_optional: Optional[bool] = Field(alias="isOptional")
897
- is_list: Optional[bool] = Field(alias="isList")
898
- is_flag: Optional[bool] = Field(alias="isFlag")
899
- arg_format: Optional[StrictStr] = Field(alias="argFormat")
900
- connection: Optional[StrictStr]
901
- to_init: Optional[bool] = Field(alias="toInit")
902
- to_env: Optional[StrictStr] = Field(alias="toEnv")
903
- value: Optional[Any]
904
- validation: Optional[V1Validation]
905
- delay_validation: Optional[bool] = Field(alias="delayValidation")
906
- options: Optional[Any]
907
-
908
- @validator("name", always=True)
906
+ description: Optional[StrictStr] = None
907
+ type: Optional[StrictStr] = None
908
+ is_optional: Optional[bool] = Field(alias="isOptional", default=None)
909
+ is_list: Optional[bool] = Field(alias="isList", default=None)
910
+ is_flag: Optional[bool] = Field(alias="isFlag", default=None)
911
+ arg_format: Optional[StrictStr] = Field(alias="argFormat", default=None)
912
+ connection: Optional[StrictStr] = None
913
+ to_init: Optional[bool] = Field(alias="toInit", default=None)
914
+ to_env: Optional[StrictStr] = Field(alias="toEnv", default=None)
915
+ value: Optional[Any] = None
916
+ validation: Optional[V1Validation] = None
917
+ delay_validation: Optional[bool] = Field(alias="delayValidation", default=None)
918
+ options: Optional[Any] = None
919
+
920
+ @field_validator("name", **validation_always)
909
921
  def validate_name(cls, v):
910
922
  if v in IO_NAME_BLACK_LIST:
911
923
  raise ValueError(IO_NAME_ERROR)
912
924
  return v
913
925
 
914
- @root_validator(pre=True)
926
+ @model_validator(**validation_before)
915
927
  def handle_validation(cls, values):
916
928
  validation = values.get("validation")
917
929
  if not validation and (
@@ -926,20 +938,20 @@ class V1IO(BaseSchemaModel):
926
938
  if values.get("delay_validation") is not None:
927
939
  validation.delay = values.pop("delay_validation")
928
940
  if validation:
929
- values["validation"] = validation
941
+ values["validation"] = validation.to_dict()
930
942
  return values
931
943
 
932
- @root_validator
944
+ @model_validator(**validation_after)
933
945
  @skip_partial
934
946
  def validate_io(cls, values):
935
947
  validate_io(
936
- name=values.get("name"),
937
- type=values.get("type"),
938
- value=values.get("value"),
939
- is_list=values.get("is_list"),
940
- is_optional=values.get("is_optional"),
941
- is_flag=values.get("is_flag"),
942
- validation=values.get("validation"),
948
+ name=cls.get_value_for_key("name", values),
949
+ type=cls.get_value_for_key("type", values),
950
+ value=cls.get_value_for_key("value", values),
951
+ is_list=cls.get_value_for_key("is_list", values),
952
+ is_optional=cls.get_value_for_key("is_optional", values),
953
+ is_flag=cls.get_value_for_key("is_flag", values),
954
+ validation=cls.get_value_for_key("validation", values),
943
955
  )
944
956
  return values
945
957
 
@@ -205,9 +205,9 @@ class V1Join(BaseSchemaModel):
205
205
 
206
206
  _IDENTIFIER = "join"
207
207
 
208
- ref: Optional[StrictStr]
208
+ ref: Optional[StrictStr] = None
209
209
  query: StrictStr
210
- sort: Optional[StrictStr]
211
- limit: Optional[IntOrRef]
212
- offset: Optional[IntOrRef]
213
- params: Optional[Union[Dict[str, V1JoinParam], RefField]]
210
+ sort: Optional[StrictStr] = None
211
+ limit: Optional[IntOrRef] = None
212
+ offset: Optional[IntOrRef] = None
213
+ params: Optional[Union[Dict[str, V1JoinParam], RefField]] = None
@@ -5,8 +5,10 @@ from clipped.compact.pydantic import (
5
5
  Field,
6
6
  PositiveInt,
7
7
  StrictInt,
8
- root_validator,
9
- validator,
8
+ field_validator,
9
+ model_validator,
10
+ validation_after,
11
+ validation_always,
10
12
  )
11
13
  from clipped.config.schema import skip_partial
12
14
  from clipped.types.ref_or_obj import RefField
@@ -60,19 +62,21 @@ class UtilityFunctionConfig(BaseSchemaModel): # TODO: Rename to V1UtilityFuncti
60
62
  acquisition_function: Optional[AcquisitionFunctions] = Field(
61
63
  default=AcquisitionFunctions.UCB, alias="acquisitionFunction"
62
64
  )
63
- gaussian_process: Optional[GaussianProcessConfig] = Field(alias="gaussianProcess")
64
- kappa: Optional[float]
65
- eps: Optional[float]
66
- num_warmup: Optional[int] = Field(alias="numWarmup")
67
- num_iterations: Optional[int] = Field(alias="numIterations")
65
+ gaussian_process: Optional[GaussianProcessConfig] = Field(
66
+ alias="gaussianProcess", default=None
67
+ )
68
+ kappa: Optional[float] = None
69
+ eps: Optional[float] = None
70
+ num_warmup: Optional[int] = Field(alias="numWarmup", default=None)
71
+ num_iterations: Optional[int] = Field(alias="numIterations", default=None)
68
72
 
69
- @root_validator
73
+ @model_validator(**validation_after)
70
74
  @skip_partial
71
75
  def validate_utility_function(cls, values):
72
76
  validate_utility_function(
73
- acquisition_function=values.get("acquisition_function"),
74
- kappa=values.get("kappa"),
75
- eps=values.get("eps"),
77
+ acquisition_function=cls.get_value_for_key("acquisition_function", values),
78
+ kappa=cls.get_value_for_key("kappa", values),
79
+ eps=cls.get_value_for_key("eps", values),
76
80
  )
77
81
  return values
78
82
 
@@ -393,16 +397,18 @@ class V1Bayes(BaseSearchConfig):
393
397
  _IDENTIFIER = V1MatrixKind.BAYES
394
398
 
395
399
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
396
- utility_function: Optional[UtilityFunctionConfig] = Field(alias="utilityFunction")
400
+ utility_function: Optional[UtilityFunctionConfig] = Field(
401
+ alias="utilityFunction", default=None
402
+ )
397
403
  num_initial_runs: Union[PositiveInt, RefField] = Field(alias="numInitialRuns")
398
404
  max_iterations: Union[PositiveInt, RefField] = Field(alias="maxIterations")
399
405
  metric: V1OptimizationMetric
400
406
  params: Union[Dict[str, V1HpParam], RefField]
401
- seed: Optional[Union[StrictInt, RefField]]
402
- concurrency: Optional[Union[PositiveInt, RefField]]
403
- tuner: Optional[Union[V1Tuner, RefField]]
407
+ seed: Optional[Union[StrictInt, RefField]] = None
408
+ concurrency: Optional[Union[PositiveInt, RefField]] = None
409
+ tuner: Optional[Union[V1Tuner, RefField]] = None
404
410
  early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
405
- alias="earlyStopping"
411
+ alias="earlyStopping", default=None
406
412
  )
407
413
 
408
414
  def create_iteration(self, iteration: Optional[int] = None) -> int:
@@ -414,7 +420,7 @@ class V1Bayes(BaseSearchConfig):
414
420
  """Return a boolean to indicate if we need to reschedule another iteration."""
415
421
  return iteration < self.max_iterations
416
422
 
417
- @validator("params", always=True)
423
+ @field_validator("params", **validation_always)
418
424
  @skip_partial
419
425
  def validate_matrix(cls, params):
420
426
  return validate_matrix(params)
@@ -1,7 +1,13 @@
1
1
  from typing import Dict, List, Optional, Union
2
2
  from typing_extensions import Literal
3
3
 
4
- from clipped.compact.pydantic import Field, PositiveInt, validator
4
+ from clipped.compact.pydantic import (
5
+ Field,
6
+ PositiveInt,
7
+ field_validator,
8
+ validation_always,
9
+ validation_before,
10
+ )
5
11
  from clipped.config.schema import skip_partial
6
12
  from clipped.types.ref_or_obj import RefField
7
13
 
@@ -196,19 +202,22 @@ class V1GridSearch(BaseSearchConfig):
196
202
 
197
203
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
198
204
  params: Union[Dict[str, V1HpParam], RefField]
199
- num_runs: Optional[Union[PositiveInt, RefField]] = Field(alias="numRuns")
200
- concurrency: Optional[Union[PositiveInt, RefField]]
205
+ num_runs: Optional[Union[PositiveInt, RefField]] = Field(
206
+ alias="numRuns", default=None
207
+ )
208
+ concurrency: Optional[Union[PositiveInt, RefField]] = None
201
209
  early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
202
- alias="earlyStopping"
210
+ alias="earlyStopping", default=None
203
211
  )
204
212
 
205
- @validator("num_runs", "concurrency", pre=True)
213
+ @field_validator("num_runs", "concurrency", **validation_before)
206
214
  def check_values(cls, v, field):
215
+ key = cls.get_field_name(field)
207
216
  if v and v < 1:
208
- raise ValueError(f"{field} must be greater than 1, received `{v}` instead.")
217
+ raise ValueError(f"{key} must be greater than 1, received `{v}` instead.")
209
218
  return v
210
219
 
211
- @validator("params", always=True)
220
+ @field_validator("params", **validation_always)
212
221
  @skip_partial
213
222
  def validate_matrix(cls, params):
214
223
  return validate_matrix(params)
@@ -313,17 +313,17 @@ class V1Hyperband(BaseSearchConfig):
313
313
  _IDENTIFIER = V1MatrixKind.HYPERBAND
314
314
 
315
315
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
316
- params: Optional[Union[Dict[str, V1HpParam], RefField]]
317
- max_iterations: Optional[PositiveInt] = Field(alias="maxIterations")
318
- eta: Optional[Union[NonNegativeFloat, RefField]]
319
- resource: Optional[V1OptimizationResource]
320
- metric: Optional[V1OptimizationMetric]
321
- resume: Optional[BoolOrRef]
322
- seed: Optional[IntOrRef]
323
- concurrency: Optional[Union[PositiveInt, RefField]]
324
- tuner: Optional[V1Tuner]
316
+ params: Optional[Union[Dict[str, V1HpParam], RefField]] = None
317
+ max_iterations: Optional[PositiveInt] = Field(alias="maxIterations", default=None)
318
+ eta: Optional[Union[NonNegativeFloat, RefField]] = None
319
+ resource: Optional[V1OptimizationResource] = None
320
+ metric: Optional[V1OptimizationMetric] = None
321
+ resume: Optional[BoolOrRef] = None
322
+ seed: Optional[IntOrRef] = None
323
+ concurrency: Optional[Union[PositiveInt, RefField]] = None
324
+ tuner: Optional[V1Tuner] = None
325
325
  early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
326
- alias="earlyStopping"
326
+ alias="earlyStopping", default=None
327
327
  )
328
328
 
329
329
  _s_max: Optional[int] = PrivateAttr()
@@ -1,7 +1,12 @@
1
1
  from typing import Dict, List, Optional, Union
2
2
  from typing_extensions import Literal
3
3
 
4
- from clipped.compact.pydantic import Field, PositiveInt, validator
4
+ from clipped.compact.pydantic import (
5
+ Field,
6
+ PositiveInt,
7
+ field_validator,
8
+ validation_before,
9
+ )
5
10
  from clipped.types.ref_or_obj import IntOrRef, RefField
6
11
  from clipped.utils.enums import PEnum
7
12
 
@@ -212,19 +217,19 @@ class V1Hyperopt(BaseSearchConfig):
212
217
  _IDENTIFIER = V1MatrixKind.HYPEROPT
213
218
 
214
219
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
215
- max_iterations: Optional[IntOrRef] = Field(alias="maxIterations")
220
+ max_iterations: Optional[IntOrRef] = Field(alias="maxIterations", default=None)
216
221
  metric: V1OptimizationMetric
217
- algorithm: Optional[V1HyperoptAlgorithms]
222
+ algorithm: Optional[V1HyperoptAlgorithms] = None
218
223
  params: Union[Dict[str, V1HpParam], RefField]
219
- num_runs: Union[PositiveInt, RefField] = Field(alias="numRuns")
220
- seed: Optional[IntOrRef]
221
- concurrency: Optional[Union[PositiveInt, RefField]]
222
- tuner: Optional[V1Tuner]
224
+ num_runs: Union[PositiveInt, RefField] = Field(alias="numRuns", default=None)
225
+ seed: Optional[IntOrRef] = None
226
+ concurrency: Optional[Union[PositiveInt, RefField]] = None
227
+ tuner: Optional[V1Tuner] = None
223
228
  early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
224
- alias="earlyStopping"
229
+ alias="earlyStopping", default=None
225
230
  )
226
231
 
227
- @validator("num_runs", "concurrency", pre=True)
232
+ @field_validator("num_runs", "concurrency", **validation_before)
228
233
  def check_values(cls, v, field):
229
234
  if v and v < 1:
230
235
  raise ValueError(f"{field} must be greater than 1, received `{v}` instead.")