acceldata-sdk-python 26.7.0__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.
- acceldata/__init__.py +7 -0
- acceldata/client/__init__.py +0 -0
- acceldata/client/adoc_client.py +666 -0
- acceldata/client/http_client.py +346 -0
- acceldata/client/transient_retry.py +142 -0
- acceldata/constants/__init__.py +1 -0
- acceldata/constants/constants.py +13 -0
- acceldata/exceptions/__init__.py +52 -0
- acceldata/exceptions/api_errors.py +85 -0
- acceldata/exceptions/exceptions.py +174 -0
- acceldata/exceptions/sdk_exceptions.py +98 -0
- acceldata/mappers/__init__.py +21 -0
- acceldata/mappers/catalog_executions.py +107 -0
- acceldata/models/__init__.py +0 -0
- acceldata/models/api/catalog/above_configs.py +99 -0
- acceldata/models/api/catalog/above_configs_success.py +138 -0
- acceldata/models/api/catalog/absolute_configs.py +197 -0
- acceldata/models/api/catalog/absolute_configs_fallback.py +101 -0
- acceldata/models/api/catalog/absolute_threshold_config.py +105 -0
- acceldata/models/api/catalog/analysis_job_context.py +102 -0
- acceldata/models/api/catalog/analytics_pipeline.py +385 -0
- acceldata/models/api/catalog/analytics_pipeline_endpoint.py +136 -0
- acceldata/models/api/catalog/anomaly_config.py +95 -0
- acceldata/models/api/catalog/anomaly_details.py +119 -0
- acceldata/models/api/catalog/anomaly_threshold_config.py +105 -0
- acceldata/models/api/catalog/artifact.py +92 -0
- acceldata/models/api/catalog/assembly.py +171 -0
- acceldata/models/api/catalog/asset.py +162 -0
- acceldata/models/api/catalog/asset_catalog_listing.py +159 -0
- acceldata/models/api/catalog/asset_catalog_listing_response.py +102 -0
- acceldata/models/api/catalog/asset_label_request.py +96 -0
- acceldata/models/api/catalog/asset_progress.py +96 -0
- acceldata/models/api/catalog/asset_progress_details.py +117 -0
- acceldata/models/api/catalog/asset_tag.py +124 -0
- acceldata/models/api/catalog/asset_tag_info.py +140 -0
- acceldata/models/api/catalog/asset_tag_request.py +95 -0
- acceldata/models/api/catalog/asset_tag_response.py +96 -0
- acceldata/models/api/catalog/asset_tags_response.py +102 -0
- acceldata/models/api/catalog/asset_type.py +96 -0
- acceldata/models/api/catalog/auto_anomaly_feature_analysis.py +160 -0
- acceldata/models/api/catalog/auto_anomaly_item_execution.py +133 -0
- acceldata/models/api/catalog/auto_anomaly_meta_data.py +162 -0
- acceldata/models/api/catalog/auto_anomaly_rule_execution.py +102 -0
- acceldata/models/api/catalog/auto_anomaly_summary.py +124 -0
- acceldata/models/api/catalog/backing_asset.py +126 -0
- acceldata/models/api/catalog/below_configs.py +99 -0
- acceldata/models/api/catalog/big_decimal.py +100 -0
- acceldata/models/api/catalog/big_integer.py +98 -0
- acceldata/models/api/catalog/bounds_date_time_marker_config.py +110 -0
- acceldata/models/api/catalog/bounds_file_event_marker_config.py +108 -0
- acceldata/models/api/catalog/bounds_id_marker_config.py +96 -0
- acceldata/models/api/catalog/catalog_asset_meta_data.py +128 -0
- acceldata/models/api/catalog/changes_by_config.py +105 -0
- acceldata/models/api/catalog/column_mapping.py +139 -0
- acceldata/models/api/catalog/column_metadata.py +90 -0
- acceldata/models/api/catalog/column_metric_with_anomaly_details.py +119 -0
- acceldata/models/api/catalog/column_variable.py +111 -0
- acceldata/models/api/catalog/composite_policy_execution.py +102 -0
- acceldata/models/api/catalog/composite_policy_item_execution.py +104 -0
- acceldata/models/api/catalog/connection.py +118 -0
- acceldata/models/api/catalog/connection_test_result.py +106 -0
- acceldata/models/api/catalog/connection_type.py +90 -0
- acceldata/models/api/catalog/connection_types_response.py +96 -0
- acceldata/models/api/catalog/crawler.py +88 -0
- acceldata/models/api/catalog/crawler_action_response.py +90 -0
- acceldata/models/api/catalog/crawler_execution.py +147 -0
- acceldata/models/api/catalog/crawler_execution_response.py +102 -0
- acceldata/models/api/catalog/crawler_status_response.py +90 -0
- acceldata/models/api/catalog/create_profile.py +194 -0
- acceldata/models/api/catalog/custom_sql_config.py +121 -0
- acceldata/models/api/catalog/data_bricks_spark_resource_config.py +104 -0
- acceldata/models/api/catalog/data_cadence_rule.py +236 -0
- acceldata/models/api/catalog/data_cadence_rule_details.py +125 -0
- acceldata/models/api/catalog/data_cadence_rule_execution.py +102 -0
- acceldata/models/api/catalog/data_cadence_rule_item.py +104 -0
- acceldata/models/api/catalog/data_cadence_rule_item_execution.py +158 -0
- acceldata/models/api/catalog/data_cadence_rule_response.py +98 -0
- acceldata/models/api/catalog/data_drift_execution.py +102 -0
- acceldata/models/api/catalog/data_drift_item_execution.py +121 -0
- acceldata/models/api/catalog/data_quality_engine.py +90 -0
- acceldata/models/api/catalog/data_quality_execution.py +106 -0
- acceldata/models/api/catalog/data_quality_rule.py +323 -0
- acceldata/models/api/catalog/data_quality_rule_details.py +186 -0
- acceldata/models/api/catalog/data_quality_rule_response.py +120 -0
- acceldata/models/api/catalog/data_quality_rules_response.py +102 -0
- acceldata/models/api/catalog/databricks_compute_config.py +113 -0
- acceldata/models/api/catalog/dataplane_engine.py +105 -0
- acceldata/models/api/catalog/dataplane_health_metrics.py +101 -0
- acceldata/models/api/catalog/dataplane_job.py +216 -0
- acceldata/models/api/catalog/dataplane_job_status.py +113 -0
- acceldata/models/api/catalog/dataplane_request.py +96 -0
- acceldata/models/api/catalog/dataproc_compute_config.py +106 -0
- acceldata/models/api/catalog/dataproc_spark_resource_config.py +104 -0
- acceldata/models/api/catalog/date_based_partition_marker_config.py +116 -0
- acceldata/models/api/catalog/date_partitioning_marker_config.py +113 -0
- acceldata/models/api/catalog/date_time_marker_config.py +109 -0
- acceldata/models/api/catalog/day_month_year_based_partition_marker_config.py +124 -0
- acceldata/models/api/catalog/decreased_by_config.py +105 -0
- acceldata/models/api/catalog/delete_artifact_response.py +88 -0
- acceldata/models/api/catalog/dq_rule_execution.py +248 -0
- acceldata/models/api/catalog/drift.py +121 -0
- acceldata/models/api/catalog/enable_rule_request.py +88 -0
- acceldata/models/api/catalog/engine.py +90 -0
- acceldata/models/api/catalog/execution_cancellation_response.py +92 -0
- acceldata/models/api/catalog/execution_response.py +144 -0
- acceldata/models/api/catalog/execution_result.py +126 -0
- acceldata/models/api/catalog/executions_response.py +102 -0
- acceldata/models/api/catalog/failed_asset_detail.py +90 -0
- acceldata/models/api/catalog/failed_summary.py +98 -0
- acceldata/models/api/catalog/file.py +94 -0
- acceldata/models/api/catalog/file_marker_config.py +99 -0
- acceldata/models/api/catalog/generic_config_fallback.py +101 -0
- acceldata/models/api/catalog/generic_execution.py +221 -0
- acceldata/models/api/catalog/generic_rule_execution.py +137 -0
- acceldata/models/api/catalog/global_storage_config_dto.py +172 -0
- acceldata/models/api/catalog/hosted_dp_deployment_response.py +98 -0
- acceldata/models/api/catalog/id_marker_config.py +94 -0
- acceldata/models/api/catalog/increased_by_config.py +105 -0
- acceldata/models/api/catalog/item.py +160 -0
- acceldata/models/api/catalog/item_execution.py +192 -0
- acceldata/models/api/catalog/item_segment.py +131 -0
- acceldata/models/api/catalog/job_schedule.py +118 -0
- acceldata/models/api/catalog/job_spec.py +96 -0
- acceldata/models/api/catalog/kubernetes_metrics.py +91 -0
- acceldata/models/api/catalog/label.py +97 -0
- acceldata/models/api/catalog/livy_compute_config.py +103 -0
- acceldata/models/api/catalog/livy_spark_resource_config.py +106 -0
- acceldata/models/api/catalog/look_back_config.py +90 -0
- acceldata/models/api/catalog/manual_tag_request.py +92 -0
- acceldata/models/api/catalog/mapping.py +97 -0
- acceldata/models/api/catalog/marker.py +88 -0
- acceldata/models/api/catalog/marker_config.py +349 -0
- acceldata/models/api/catalog/marker_config_fallback.py +101 -0
- acceldata/models/api/catalog/meta.py +92 -0
- acceldata/models/api/catalog/meta_data.py +92 -0
- acceldata/models/api/catalog/meta_data_item.py +94 -0
- acceldata/models/api/catalog/mini_profile_request.py +112 -0
- acceldata/models/api/catalog/notification_payload.py +114 -0
- acceldata/models/api/catalog/offset_based_marker_config.py +97 -0
- acceldata/models/api/catalog/operational_config.py +92 -0
- acceldata/models/api/catalog/pattern_configuration.py +90 -0
- acceldata/models/api/catalog/pipe_line_request.py +92 -0
- acceldata/models/api/catalog/pipeline_compute_config.py +110 -0
- acceldata/models/api/catalog/policy_execution_marker_config.py +94 -0
- acceldata/models/api/catalog/policy_execution_request.py +229 -0
- acceldata/models/api/catalog/policy_group.py +114 -0
- acceldata/models/api/catalog/policy_transform_udf.py +113 -0
- acceldata/models/api/catalog/process_metrics.py +91 -0
- acceldata/models/api/catalog/profile_anomaly_details_response.py +109 -0
- acceldata/models/api/catalog/profile_anomaly_item_execution.py +127 -0
- acceldata/models/api/catalog/profile_anomaly_rule_execution.py +102 -0
- acceldata/models/api/catalog/profile_anomaly_rule_item.py +109 -0
- acceldata/models/api/catalog/profile_cancellation_response.py +92 -0
- acceldata/models/api/catalog/profile_request.py +211 -0
- acceldata/models/api/catalog/profile_request_response.py +92 -0
- acceldata/models/api/catalog/property_template.py +178 -0
- acceldata/models/api/catalog/property_templates.py +123 -0
- acceldata/models/api/catalog/pub_sub_lookback_marker_config.py +96 -0
- acceldata/models/api/catalog/pub_sub_timestamp_marker_config.py +108 -0
- acceldata/models/api/catalog/quality_rule.py +381 -0
- acceldata/models/api/catalog/quality_rule_execution_metrics.py +114 -0
- acceldata/models/api/catalog/quality_rule_with_latest_execution.py +115 -0
- acceldata/models/api/catalog/range_configs.py +109 -0
- acceldata/models/api/catalog/reconciliation_item.py +102 -0
- acceldata/models/api/catalog/reconciliation_item_execution.py +157 -0
- acceldata/models/api/catalog/reconciliation_rule.py +339 -0
- acceldata/models/api/catalog/reconciliation_rule_details.py +225 -0
- acceldata/models/api/catalog/reconciliation_rule_execution.py +102 -0
- acceldata/models/api/catalog/reconciliation_rule_response.py +98 -0
- acceldata/models/api/catalog/reconciliation_rules_response.py +102 -0
- acceldata/models/api/catalog/relative_config.py +197 -0
- acceldata/models/api/catalog/relative_config_fallback.py +101 -0
- acceldata/models/api/catalog/relative_threshold_config.py +111 -0
- acceldata/models/api/catalog/root_cause_analysis.py +108 -0
- acceldata/models/api/catalog/rule_execution.py +327 -0
- acceldata/models/api/catalog/rule_execution_result.py +90 -0
- acceldata/models/api/catalog/rule_item_result.py +125 -0
- acceldata/models/api/catalog/rule_meta_data.py +94 -0
- acceldata/models/api/catalog/rule_spark_sql_dynamic_filter_variable_mapping.py +100 -0
- acceldata/models/api/catalog/rule_tag.py +101 -0
- acceldata/models/api/catalog/rule_threshold_configuration.py +236 -0
- acceldata/models/api/catalog/rule_threshold_configuration_fallback.py +101 -0
- acceldata/models/api/catalog/rules_with_latest_execution_response.py +102 -0
- acceldata/models/api/catalog/sample_data_api_response.py +122 -0
- acceldata/models/api/catalog/schema_drift_item_execution.py +131 -0
- acceldata/models/api/catalog/schema_drift_rule_execution.py +102 -0
- acceldata/models/api/catalog/secret_manager_configuration.py +90 -0
- acceldata/models/api/catalog/secret_manager_configuration_with_option.py +98 -0
- acceldata/models/api/catalog/security_config.py +90 -0
- acceldata/models/api/catalog/segment_metric_json.py +142 -0
- acceldata/models/api/catalog/segments_analysis.py +145 -0
- acceldata/models/api/catalog/short_segment.py +97 -0
- acceldata/models/api/catalog/simple_quality_rule_response.py +92 -0
- acceldata/models/api/catalog/snapshot_data.py +117 -0
- acceldata/models/api/catalog/source_model.py +90 -0
- acceldata/models/api/catalog/source_type.py +100 -0
- acceldata/models/api/catalog/source_types_response.py +102 -0
- acceldata/models/api/catalog/spark_job_status.py +113 -0
- acceldata/models/api/catalog/spark_resource_config.py +114 -0
- acceldata/models/api/catalog/standard_response_assembly.py +92 -0
- acceldata/models/api/catalog/standard_response_crawler_action_response.py +92 -0
- acceldata/models/api/catalog/standard_response_crawler_status_response.py +92 -0
- acceldata/models/api/catalog/standard_response_delete_artifact_response.py +92 -0
- acceldata/models/api/catalog/standard_response_list.py +96 -0
- acceldata/models/api/catalog/standard_response_map.py +88 -0
- acceldata/models/api/catalog/standard_response_meta_data.py +92 -0
- acceldata/models/api/catalog/standard_response_mini_profile_request.py +92 -0
- acceldata/models/api/catalog/standard_response_profile_request.py +92 -0
- acceldata/models/api/catalog/start_profiling_request.py +92 -0
- acceldata/models/api/catalog/tag_domain.py +116 -0
- acceldata/models/api/catalog/threshold_breach_details.py +101 -0
- acceldata/models/api/catalog/time_based_config.py +92 -0
- acceldata/models/api/catalog/time_based_threshold_config.py +105 -0
- acceldata/models/api/catalog/timestamp_based_marker_config.py +115 -0
- acceldata/models/api/catalog/udf_variable.py +97 -0
- acceldata/models/api/catalog/yunikorn_compute_config.py +133 -0
- acceldata/models/api/catalog/yunikorn_spark_resource_config.py +154 -0
- acceldata/models/api/pipeline/big_decimal.py +100 -0
- acceldata/models/api/pipeline/big_integer.py +98 -0
- acceldata/models/api/pipeline/child_span_response.py +96 -0
- acceldata/models/api/pipeline/create_span_event.py +109 -0
- acceldata/models/api/pipeline/edge.py +108 -0
- acceldata/models/api/pipeline/event_alert_object.py +95 -0
- acceldata/models/api/pipeline/generic_config_fallback.py +101 -0
- acceldata/models/api/pipeline/identifier.py +146 -0
- acceldata/models/api/pipeline/job_request.py +130 -0
- acceldata/models/api/pipeline/meta.py +107 -0
- acceldata/models/api/pipeline/meta_data.py +92 -0
- acceldata/models/api/pipeline/metric.py +103 -0
- acceldata/models/api/pipeline/node.py +201 -0
- acceldata/models/api/pipeline/node_response.py +92 -0
- acceldata/models/api/pipeline/notification_payload.py +114 -0
- acceldata/models/api/pipeline/pipeline.py +152 -0
- acceldata/models/api/pipeline/pipeline_baseline_metric.py +92 -0
- acceldata/models/api/pipeline/pipeline_details.py +118 -0
- acceldata/models/api/pipeline/pipeline_details_response.py +102 -0
- acceldata/models/api/pipeline/pipeline_input_request.py +92 -0
- acceldata/models/api/pipeline/pipeline_listing_info.py +118 -0
- acceldata/models/api/pipeline/pipeline_response.py +92 -0
- acceldata/models/api/pipeline/pipeline_run.py +136 -0
- acceldata/models/api/pipeline/pipeline_run_request.py +92 -0
- acceldata/models/api/pipeline/pipeline_runs_response.py +102 -0
- acceldata/models/api/pipeline/pipeline_summary.py +98 -0
- acceldata/models/api/pipeline/pipelines_listing_response.py +102 -0
- acceldata/models/api/pipeline/policy_summary.py +102 -0
- acceldata/models/api/pipeline/span.py +115 -0
- acceldata/models/api/pipeline/span_event.py +114 -0
- acceldata/models/api/pipeline/span_event_request.py +92 -0
- acceldata/models/api/pipeline/span_event_response.py +92 -0
- acceldata/models/api/pipeline/span_request.py +94 -0
- acceldata/models/api/pipeline/spans_response.py +96 -0
- acceldata/models/api/pipeline/tag.py +97 -0
- acceldata/models/sdk/__init__.py +0 -0
- acceldata/models/sdk/catalog/__init__.py +105 -0
- acceldata/models/sdk/catalog/asset_resource.py +112 -0
- acceldata/models/sdk/catalog/asset_source_type.py +59 -0
- acceldata/models/sdk/catalog/custom_asset_metadata.py +11 -0
- acceldata/models/sdk/catalog/datasource_resource.py +88 -0
- acceldata/models/sdk/catalog/executor.py +524 -0
- acceldata/models/sdk/catalog/policy_execution_request.py +114 -0
- acceldata/models/sdk/catalog/policy_execution_type.py +16 -0
- acceldata/models/sdk/catalog/policy_filter.py +94 -0
- acceldata/models/sdk/catalog/policy_rule_resources.py +388 -0
- acceldata/models/sdk/catalog/profile_request_resource.py +77 -0
- acceldata/models/sdk/catalog/profiling.py +82 -0
- acceldata/models/sdk/catalog/profiling_configuration_error.py +5 -0
- acceldata/models/sdk/pipeline/__init__.py +62 -0
- acceldata/models/sdk/pipeline/create_job_input.py +108 -0
- acceldata/models/sdk/pipeline/create_pipeline_input_request.py +72 -0
- acceldata/models/sdk/pipeline/events/__init__.py +5 -0
- acceldata/models/sdk/pipeline/events/generic_event.py +31 -0
- acceldata/models/sdk/pipeline/events/log_event.py +34 -0
- acceldata/models/sdk/pipeline/events/span_event.py +8 -0
- acceldata/models/sdk/pipeline/pipeline_resource.py +171 -0
- acceldata/models/sdk/pipeline/pipeline_run_input.py +84 -0
- acceldata/models/sdk/pipeline/pipeline_run_resource.py +208 -0
- acceldata/models/sdk/pipeline/pipeline_source_type.py +20 -0
- acceldata/models/sdk/pipeline/span_resource.py +327 -0
- acceldata/openapi_deserialization_patches.py +161 -0
- acceldata/openapi_repr_patches.py +62 -0
- acceldata/services/__init__.py +0 -0
- acceldata/services/api_timestamp.py +31 -0
- acceldata/services/asset_service.py +651 -0
- acceldata/services/datasource_service.py +120 -0
- acceldata/services/generic_service.py +132 -0
- acceldata/services/marker_config.py +232 -0
- acceldata/services/pipeline_big_decimal_api.py +102 -0
- acceldata/services/pipeline_response_parse.py +209 -0
- acceldata/services/pipeline_service.py +494 -0
- acceldata/services/rule_service.py +620 -0
- acceldata/urls/__init__.py +1 -0
- acceldata/urls/catalog_urls.py +137 -0
- acceldata/urls/pipeline_urls.py +55 -0
- acceldata/utils/__init__.py +6 -0
- acceldata/utils/datetime_utils.py +16 -0
- acceldata/utils/operation_ack.py +22 -0
- acceldata/utils/span_helpers.py +95 -0
- acceldata/utils/time_range_utils.py +90 -0
- acceldata_sdk_python-26.7.0.dist-info/METADATA +26 -0
- acceldata_sdk_python-26.7.0.dist-info/RECORD +303 -0
- acceldata_sdk_python-26.7.0.dist-info/WHEEL +5 -0
- acceldata_sdk_python-26.7.0.dist-info/licenses/LICENSE +22 -0
- acceldata_sdk_python-26.7.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Parse create/get pipeline API payloads for Pydantic v2 without fixing generated nested ``from_dict``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Optional
|
|
6
|
+
|
|
7
|
+
from acceldata.services.pipeline_big_decimal_api import parse_optional_big_decimal_from_api
|
|
8
|
+
from acceldata.models.api.pipeline.meta import Meta
|
|
9
|
+
from acceldata.models.api.pipeline.notification_payload import NotificationPayload
|
|
10
|
+
from acceldata.models.api.pipeline.pipeline import Pipeline
|
|
11
|
+
from acceldata.models.api.pipeline.pipeline_baseline_metric import PipelineBaselineMetric
|
|
12
|
+
from acceldata.models.api.pipeline.pipeline_response import PipelineResponse
|
|
13
|
+
from acceldata.models.api.pipeline.span import Span
|
|
14
|
+
from acceldata.models.api.pipeline.span_request import SpanRequest
|
|
15
|
+
from acceldata.models.api.pipeline.spans_response import SpansResponse
|
|
16
|
+
from acceldata.models.api.pipeline.tag import Tag
|
|
17
|
+
from acceldata.services.api_timestamp import coerce_api_timestamp_to_datetime
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _first_present(obj: dict[str, Any], *keys: str) -> Any:
|
|
21
|
+
"""Return ``obj[k]`` for the first *k* in *keys* that exists in *obj* (including ``None`` values)."""
|
|
22
|
+
for k in keys:
|
|
23
|
+
if k in obj:
|
|
24
|
+
return obj[k]
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _coerce_pipeline_context(ctx: Any) -> Any:
|
|
29
|
+
"""Map ``additionalProperties: Any`` payloads to the generated model shape ``Dict[str, Dict[str, Any]]``."""
|
|
30
|
+
if ctx is None:
|
|
31
|
+
return None
|
|
32
|
+
if not isinstance(ctx, dict):
|
|
33
|
+
return None
|
|
34
|
+
out: dict[str, Any] = {}
|
|
35
|
+
for key, val in ctx.items():
|
|
36
|
+
if isinstance(val, dict):
|
|
37
|
+
out[key] = val
|
|
38
|
+
else:
|
|
39
|
+
out[key] = {"value": val}
|
|
40
|
+
return out
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def tag_from_api_dict(obj: Any) -> Optional[Tag]:
|
|
44
|
+
"""Parse pipeline :class:`~acceldata.models.api.pipeline.tag.Tag` wire JSON (object or plain name string)."""
|
|
45
|
+
if obj is None:
|
|
46
|
+
return None
|
|
47
|
+
if isinstance(obj, str):
|
|
48
|
+
name = obj.strip()
|
|
49
|
+
if not name:
|
|
50
|
+
return None
|
|
51
|
+
return Tag.model_validate({"name": name, "displayName": name})
|
|
52
|
+
if not isinstance(obj, dict):
|
|
53
|
+
return Tag.model_validate(obj)
|
|
54
|
+
|
|
55
|
+
name = obj.get("name")
|
|
56
|
+
if not name:
|
|
57
|
+
return None
|
|
58
|
+
display = _first_present(obj, "displayName", "display_name") or name
|
|
59
|
+
return Tag.model_validate(
|
|
60
|
+
{
|
|
61
|
+
"createdAt": coerce_api_timestamp_to_datetime(_first_present(obj, "createdAt", "created_at")),
|
|
62
|
+
"displayName": display,
|
|
63
|
+
"id": obj.get("id"),
|
|
64
|
+
"name": name,
|
|
65
|
+
"updatedAt": coerce_api_timestamp_to_datetime(_first_present(obj, "updatedAt", "updated_at")),
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def pipeline_baseline_metric_from_api_dict(obj: dict[str, Any]) -> PipelineBaselineMetric:
|
|
71
|
+
"""Validate baseline metric using JSON alias keys (generated ``from_dict`` uses snake_case and fails on v2)."""
|
|
72
|
+
inc = obj.get("includeSuccessfulRunsOnly")
|
|
73
|
+
if inc is None:
|
|
74
|
+
inc = obj.get("include_successful_runs_only")
|
|
75
|
+
return PipelineBaselineMetric.model_validate(
|
|
76
|
+
{
|
|
77
|
+
"includeSuccessfulRunsOnly": inc,
|
|
78
|
+
"metrics": obj.get("metrics"),
|
|
79
|
+
"unit": obj.get("unit"),
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def pipeline_from_api_dict(obj: dict[str, Any]) -> Pipeline:
|
|
85
|
+
"""Same logic as :meth:`Pipeline.from_dict` but with fixed baseline metric parsing."""
|
|
86
|
+
if obj is None:
|
|
87
|
+
raise TypeError("pipeline object is required")
|
|
88
|
+
if not isinstance(obj, dict):
|
|
89
|
+
return Pipeline.model_validate(obj)
|
|
90
|
+
|
|
91
|
+
sch = _first_present(obj, "schedulerType", "scheduler_type")
|
|
92
|
+
if sch is None:
|
|
93
|
+
sch = "INTERNAL"
|
|
94
|
+
src = _first_present(obj, "sourceType", "source_type")
|
|
95
|
+
if src is None:
|
|
96
|
+
src = "OTHERS"
|
|
97
|
+
nc = _first_present(obj, "notificationChannels", "notification_channels")
|
|
98
|
+
pbm = _first_present(obj, "pipelineBaselineMetric", "pipeline_baseline_metric")
|
|
99
|
+
|
|
100
|
+
# camelCase keys for aliased fields — Pydantic v2 model_validate ignores v1-style populate_by_name (see pipeline_run_from_api_dict).
|
|
101
|
+
return Pipeline.model_validate(
|
|
102
|
+
{
|
|
103
|
+
"context": obj.get("context"),
|
|
104
|
+
"createdAt": coerce_api_timestamp_to_datetime(_first_present(obj, "createdAt", "created_at")),
|
|
105
|
+
"description": obj.get("description"),
|
|
106
|
+
"enabled": obj.get("enabled") if obj.get("enabled") is not None else True,
|
|
107
|
+
"id": obj.get("id"),
|
|
108
|
+
"interrupt": obj.get("interrupt") if obj.get("interrupt") is not None else False,
|
|
109
|
+
"latestRunId": _first_present(obj, "latestRunId", "latest_run_id"),
|
|
110
|
+
"meta": Meta.from_dict(obj.get("meta")) if obj.get("meta") is not None else None,
|
|
111
|
+
"name": obj.get("name"),
|
|
112
|
+
"notificationChannels": NotificationPayload.from_dict(nc) if nc is not None else None,
|
|
113
|
+
"pipelineBaselineMetric": pipeline_baseline_metric_from_api_dict(pbm) if pbm is not None else None,
|
|
114
|
+
"schedule": obj.get("schedule"),
|
|
115
|
+
"scheduled": obj.get("scheduled") if obj.get("scheduled") is not None else False,
|
|
116
|
+
"schedulerType": sch,
|
|
117
|
+
"sourceType": src,
|
|
118
|
+
"tags": [
|
|
119
|
+
_t
|
|
120
|
+
for _item in (obj.get("tags") or [])
|
|
121
|
+
for _t in [tag_from_api_dict(_item)]
|
|
122
|
+
if _t is not None
|
|
123
|
+
]
|
|
124
|
+
if obj.get("tags") is not None
|
|
125
|
+
else None,
|
|
126
|
+
"uid": obj.get("uid"),
|
|
127
|
+
"updatedAt": coerce_api_timestamp_to_datetime(_first_present(obj, "updatedAt", "updated_at")),
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def span_from_api_dict(obj: dict[str, Any]) -> Optional[Span]:
|
|
133
|
+
"""Like :meth:`Span.from_dict` but accepts ``avgExecutionTime`` as a JSON number (float/int)."""
|
|
134
|
+
if obj is None:
|
|
135
|
+
return None
|
|
136
|
+
if not isinstance(obj, dict):
|
|
137
|
+
return Span.model_validate(obj)
|
|
138
|
+
|
|
139
|
+
avg_et = parse_optional_big_decimal_from_api(obj.get("avgExecutionTime"))
|
|
140
|
+
|
|
141
|
+
return Span.model_validate(
|
|
142
|
+
{
|
|
143
|
+
"avgExecutionTime": avg_et,
|
|
144
|
+
"errorEvents": obj.get("errorEvents") if obj.get("errorEvents") is not None else 0,
|
|
145
|
+
"finishedAt": obj.get("finishedAt"),
|
|
146
|
+
"id": obj.get("id"),
|
|
147
|
+
"parentSpanId": obj.get("parentSpanId"),
|
|
148
|
+
"pipelineRunId": obj.get("pipelineRunId"),
|
|
149
|
+
"startedAt": obj.get("startedAt"),
|
|
150
|
+
"status": obj.get("status") if obj.get("status") is not None else "INITIALIZED",
|
|
151
|
+
"successEvents": obj.get("successEvents") if obj.get("successEvents") is not None else 0,
|
|
152
|
+
"totalTime": obj.get("totalTime"),
|
|
153
|
+
"uid": obj.get("uid"),
|
|
154
|
+
"warningEvents": obj.get("warningEvents") if obj.get("warningEvents") is not None else 0,
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def span_request_from_api_dict(obj: dict[str, Any]) -> Optional[SpanRequest]:
|
|
160
|
+
"""Parse span envelope when nested ``span`` may include numeric ``avgExecutionTime``."""
|
|
161
|
+
if obj is None:
|
|
162
|
+
return None
|
|
163
|
+
if not isinstance(obj, dict):
|
|
164
|
+
return SpanRequest.model_validate(obj)
|
|
165
|
+
|
|
166
|
+
span_raw = obj.get("span")
|
|
167
|
+
span_parsed = span_from_api_dict(span_raw) if isinstance(span_raw, dict) else None
|
|
168
|
+
|
|
169
|
+
return SpanRequest.model_validate(
|
|
170
|
+
{
|
|
171
|
+
"associatedJobUids": obj.get("associatedJobUids"),
|
|
172
|
+
"span": span_parsed,
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def spans_response_from_api_dict(obj: dict[str, Any]) -> SpansResponse:
|
|
178
|
+
"""Like :meth:`SpansResponse.from_dict` but tolerates numeric ``avgExecutionTime`` on each span."""
|
|
179
|
+
if obj is None:
|
|
180
|
+
raise TypeError("spans response object is required")
|
|
181
|
+
if not isinstance(obj, dict):
|
|
182
|
+
return SpansResponse.model_validate(obj)
|
|
183
|
+
|
|
184
|
+
raw_spans = obj.get("spans")
|
|
185
|
+
if raw_spans is None:
|
|
186
|
+
spans_list: list[Span] = []
|
|
187
|
+
elif not isinstance(raw_spans, list):
|
|
188
|
+
raise TypeError("spans must be a list when present")
|
|
189
|
+
else:
|
|
190
|
+
spans_list = []
|
|
191
|
+
for item in raw_spans:
|
|
192
|
+
if not isinstance(item, dict):
|
|
193
|
+
raise TypeError("Each span must be an object")
|
|
194
|
+
s = span_from_api_dict(item)
|
|
195
|
+
if s is not None:
|
|
196
|
+
spans_list.append(s)
|
|
197
|
+
|
|
198
|
+
return SpansResponse.model_validate({"spans": spans_list})
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def pipeline_response_from_api_dict(obj: dict[str, Any]) -> PipelineResponse:
|
|
202
|
+
if obj is None:
|
|
203
|
+
raise TypeError("response object is required")
|
|
204
|
+
if not isinstance(obj, dict):
|
|
205
|
+
return PipelineResponse.model_validate(obj)
|
|
206
|
+
p = obj.get("pipeline")
|
|
207
|
+
if not isinstance(p, dict):
|
|
208
|
+
raise TypeError("Create pipeline response must include a 'pipeline' object")
|
|
209
|
+
return PipelineResponse.model_validate({"pipeline": pipeline_from_api_dict(p)})
|