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,161 @@
|
|
|
1
|
+
"""Runtime deserialization fixes for selected generated OpenAPI DTOs.
|
|
2
|
+
|
|
3
|
+
OpenAPI Generator emits strict discriminator checks that reject wire JSON when Kotlin/Jackson
|
|
4
|
+
omits ``type`` on nested configs (e.g. relative threshold ``config`` with only ``direction``).
|
|
5
|
+
Generated model files under ``acceldata.models.api`` are not edited; this module patches
|
|
6
|
+
``from_json`` / ``from_dict`` at package import time.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from typing import Any, Callable, Type
|
|
13
|
+
|
|
14
|
+
_applied = False
|
|
15
|
+
|
|
16
|
+
_RELATIVE_DIRECTION_TO_TYPE: dict[str, str] = {
|
|
17
|
+
"CHANGES_BY": "io.ad.catalog.api.model.quality.ChangesByConfig",
|
|
18
|
+
"DECREASED_BY": "io.ad.catalog.api.model.quality.DecreasedByConfig",
|
|
19
|
+
"INCREASED_BY": "io.ad.catalog.api.model.quality.IncreasedByConfig",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
_ROOT_CAUSE_FRACTION_FIELDS = ("badFraction", "goodFraction", "totalFraction")
|
|
23
|
+
|
|
24
|
+
_ASSET_TAG_DEFAULTS: dict[str, Any] = {
|
|
25
|
+
"accelDataDefined": False,
|
|
26
|
+
"assets": 0,
|
|
27
|
+
"classification": "USER",
|
|
28
|
+
"createdAt": "1970-01-01T00:00:00Z",
|
|
29
|
+
"domains": [],
|
|
30
|
+
"enabled": True,
|
|
31
|
+
"processingStatus": "PROCESSED",
|
|
32
|
+
"strategy": "MANUAL",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _inject_relative_config_type(parsed: dict[str, Any]) -> dict[str, Any]:
|
|
37
|
+
if parsed.get("type"):
|
|
38
|
+
return parsed
|
|
39
|
+
direction = parsed.get("direction")
|
|
40
|
+
inferred = _RELATIVE_DIRECTION_TO_TYPE.get(direction)
|
|
41
|
+
if not inferred:
|
|
42
|
+
return parsed
|
|
43
|
+
out = dict(parsed)
|
|
44
|
+
out["type"] = inferred
|
|
45
|
+
return out
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _infer_rule_threshold_type(parsed: dict[str, Any]) -> str | None:
|
|
49
|
+
if parsed.get("type"):
|
|
50
|
+
return parsed.get("type")
|
|
51
|
+
if "operationalConfig" in parsed:
|
|
52
|
+
return "RELATIVE"
|
|
53
|
+
config = parsed.get("config")
|
|
54
|
+
if not isinstance(config, dict):
|
|
55
|
+
return None
|
|
56
|
+
if "successSensitivityLevel" in config:
|
|
57
|
+
return "ANOMALY"
|
|
58
|
+
if any(key in config for key in ("window", "windowType", "lookBackWindowType")):
|
|
59
|
+
return "TIME_BASED"
|
|
60
|
+
if "direction" in config:
|
|
61
|
+
return "ABSOLUTE"
|
|
62
|
+
nested_type = config.get("type")
|
|
63
|
+
if isinstance(nested_type, str):
|
|
64
|
+
if "RelativeThresholdConfig" in nested_type or "RelativeConfig" in nested_type:
|
|
65
|
+
return "RELATIVE"
|
|
66
|
+
if "AbsoluteThresholdConfig" in nested_type or "AbsoluteConfig" in nested_type:
|
|
67
|
+
return "ABSOLUTE"
|
|
68
|
+
if "AnomalyThresholdConfig" in nested_type:
|
|
69
|
+
return "ANOMALY"
|
|
70
|
+
if "TimeBasedThresholdConfig" in nested_type:
|
|
71
|
+
return "TIME_BASED"
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _inject_rule_threshold_type(parsed: dict[str, Any]) -> dict[str, Any]:
|
|
76
|
+
inferred = _infer_rule_threshold_type(parsed)
|
|
77
|
+
if not inferred:
|
|
78
|
+
return parsed
|
|
79
|
+
out = dict(parsed)
|
|
80
|
+
out["type"] = inferred
|
|
81
|
+
return out
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _coerce_quoted_decimal_strings(obj: dict[str, Any], fields: tuple[str, ...]) -> dict[str, Any]:
|
|
85
|
+
out = dict(obj)
|
|
86
|
+
for key in fields:
|
|
87
|
+
val = out.get(key)
|
|
88
|
+
if isinstance(val, str):
|
|
89
|
+
try:
|
|
90
|
+
out[key] = float(val)
|
|
91
|
+
except ValueError:
|
|
92
|
+
pass
|
|
93
|
+
return out
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _normalize_root_cause_analysis_dict(obj: dict[str, Any]) -> dict[str, Any]:
|
|
97
|
+
return _coerce_quoted_decimal_strings(obj, _ROOT_CAUSE_FRACTION_FIELDS)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _normalize_asset_tag_dict(obj: dict[str, Any]) -> dict[str, Any]:
|
|
101
|
+
out = dict(obj)
|
|
102
|
+
for key, default in _ASSET_TAG_DEFAULTS.items():
|
|
103
|
+
if out.get(key) is None:
|
|
104
|
+
out[key] = default
|
|
105
|
+
if out.get("domains") is None:
|
|
106
|
+
out["domains"] = []
|
|
107
|
+
return out
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _patch_json_loader(
|
|
111
|
+
cls: Type[Any],
|
|
112
|
+
*,
|
|
113
|
+
normalizer: Callable[[dict[str, Any]], dict[str, Any]],
|
|
114
|
+
) -> None:
|
|
115
|
+
original = cls.from_json.__func__ # type: ignore[attr-defined]
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def from_json_patched(subcls: Type[Any], json_str: str) -> Any:
|
|
119
|
+
parsed = json.loads(json_str)
|
|
120
|
+
if isinstance(parsed, dict):
|
|
121
|
+
parsed = normalizer(parsed)
|
|
122
|
+
json_str = json.dumps(parsed)
|
|
123
|
+
return original(subcls, json_str)
|
|
124
|
+
|
|
125
|
+
cls.from_json = from_json_patched # type: ignore[method-assign, assignment]
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _patch_dict_loader(
|
|
129
|
+
cls: Type[Any],
|
|
130
|
+
*,
|
|
131
|
+
normalizer: Callable[[dict[str, Any]], dict[str, Any]],
|
|
132
|
+
) -> None:
|
|
133
|
+
original = cls.from_dict.__func__ # type: ignore[attr-defined]
|
|
134
|
+
|
|
135
|
+
@classmethod
|
|
136
|
+
def from_dict_patched(subcls: Type[Any], obj: Any) -> Any:
|
|
137
|
+
if isinstance(obj, dict):
|
|
138
|
+
obj = normalizer(obj)
|
|
139
|
+
return original(subcls, obj)
|
|
140
|
+
|
|
141
|
+
cls.from_dict = from_dict_patched # type: ignore[method-assign, assignment]
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def apply_openapi_deserialization_patches() -> None:
|
|
145
|
+
"""Idempotently patch selected generated models for real catalog wire JSON."""
|
|
146
|
+
global _applied
|
|
147
|
+
if _applied:
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
from acceldata.models.api.catalog.asset_tag_info import AssetTagInfo
|
|
151
|
+
from acceldata.models.api.catalog.relative_config import RelativeConfig
|
|
152
|
+
from acceldata.models.api.catalog.root_cause_analysis import RootCauseAnalysis
|
|
153
|
+
from acceldata.models.api.catalog.rule_threshold_configuration import RuleThresholdConfiguration
|
|
154
|
+
|
|
155
|
+
_patch_json_loader(RelativeConfig, normalizer=_inject_relative_config_type)
|
|
156
|
+
_patch_json_loader(RuleThresholdConfiguration, normalizer=_inject_rule_threshold_type)
|
|
157
|
+
_patch_dict_loader(AssetTagInfo, normalizer=_normalize_asset_tag_dict)
|
|
158
|
+
_patch_dict_loader(RootCauseAnalysis, normalizer=_normalize_root_cause_analysis_dict)
|
|
159
|
+
_patch_json_loader(RootCauseAnalysis, normalizer=_normalize_root_cause_analysis_dict)
|
|
160
|
+
|
|
161
|
+
_applied = True
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Compact ``repr`` / ``str`` for selected generated polymorphic DTOs.
|
|
2
|
+
|
|
3
|
+
The OpenAPI client emits wrapper types whose default Pydantic representation is dominated
|
|
4
|
+
by internal discriminator fields. This module replaces ``__repr__`` / ``__str__`` on those
|
|
5
|
+
classes so logs and interactive use show the resolved payload instead. Generated model
|
|
6
|
+
files under ``acceldata.models.api`` are not edited.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import importlib
|
|
12
|
+
from typing import Any, Callable, Type
|
|
13
|
+
|
|
14
|
+
_applied = False
|
|
15
|
+
|
|
16
|
+
# (module, class) pairs for polymorphic oneOf / anyOf wrappers. Missing modules are skipped so a
|
|
17
|
+
# partial or in-progress model regen (after ``--clear-sdk-api-models``) does not break package import.
|
|
18
|
+
_REPR_PATCH_TARGETS: tuple[tuple[str, str], ...] = (
|
|
19
|
+
("acceldata.models.api.catalog.absolute_configs", "AbsoluteConfigs"),
|
|
20
|
+
("acceldata.models.api.catalog.generic_execution", "GenericExecution"),
|
|
21
|
+
("acceldata.models.api.catalog.generic_rule_execution", "GenericRuleExecution"),
|
|
22
|
+
("acceldata.models.api.catalog.marker_config", "MarkerConfig"),
|
|
23
|
+
("acceldata.models.api.catalog.relative_config", "RelativeConfig"),
|
|
24
|
+
("acceldata.models.api.catalog.rule_threshold_configuration", "RuleThresholdConfiguration"),
|
|
25
|
+
("acceldata.models.api.catalog.above_configs_success", "AboveConfigsSuccess"),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _compact_polymorphic_wrapper_repr(self: Any) -> str:
|
|
30
|
+
inner = self.actual_instance
|
|
31
|
+
name = type(self).__name__
|
|
32
|
+
if inner is not None:
|
|
33
|
+
return f"{name}({inner!r})"
|
|
34
|
+
return f"{name}(actual_instance=None)"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _load_repr_patch_class(module_path: str, class_name: str) -> Type[Any] | None:
|
|
38
|
+
try:
|
|
39
|
+
module = importlib.import_module(module_path)
|
|
40
|
+
return getattr(module, class_name)
|
|
41
|
+
except (ImportError, AttributeError):
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def apply_openapi_repr_patches() -> None:
|
|
46
|
+
"""Idempotently replace ``__repr__`` / ``__str__`` on selected wrapper classes."""
|
|
47
|
+
global _applied
|
|
48
|
+
if _applied:
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
# Catalog/pipeline ``Any`` JSON wrappers are omitted here: importing them pulls in
|
|
52
|
+
# legacy ``Field(..., const=True)`` models that fail under Pydantic v2 at import time.
|
|
53
|
+
|
|
54
|
+
fn: Callable[[Any], str] = _compact_polymorphic_wrapper_repr
|
|
55
|
+
for module_path, class_name in _REPR_PATCH_TARGETS:
|
|
56
|
+
cls = _load_repr_patch_class(module_path, class_name)
|
|
57
|
+
if cls is None:
|
|
58
|
+
continue
|
|
59
|
+
cls.__repr__ = fn # type: ignore[method-assign, assignment]
|
|
60
|
+
cls.__str__ = fn # type: ignore[method-assign, assignment]
|
|
61
|
+
|
|
62
|
+
_applied = True
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Normalize API timestamp payloads to ``datetime`` for Pydantic v2 API models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def coerce_api_timestamp_to_datetime(val: Any) -> datetime | None:
|
|
10
|
+
"""Map epoch ms int, ``epochMillis`` dict, or ISO string to timezone-aware UTC ``datetime``."""
|
|
11
|
+
if val is None:
|
|
12
|
+
return None
|
|
13
|
+
if isinstance(val, datetime):
|
|
14
|
+
return val
|
|
15
|
+
if isinstance(val, dict):
|
|
16
|
+
ms = val.get("epochMillis")
|
|
17
|
+
if ms is None:
|
|
18
|
+
ms = val.get("epoch_millis")
|
|
19
|
+
if ms is not None:
|
|
20
|
+
return datetime.fromtimestamp(int(ms) / 1000.0, tz=timezone.utc)
|
|
21
|
+
return None
|
|
22
|
+
if isinstance(val, (int, float)):
|
|
23
|
+
n = int(val)
|
|
24
|
+
sec = n / 1000.0 if n > 10**12 else float(n)
|
|
25
|
+
return datetime.fromtimestamp(sec, tz=timezone.utc)
|
|
26
|
+
if isinstance(val, str):
|
|
27
|
+
try:
|
|
28
|
+
return datetime.fromisoformat(val.replace("Z", "+00:00"))
|
|
29
|
+
except ValueError:
|
|
30
|
+
return None
|
|
31
|
+
return None
|