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.
Files changed (303) hide show
  1. acceldata/__init__.py +7 -0
  2. acceldata/client/__init__.py +0 -0
  3. acceldata/client/adoc_client.py +666 -0
  4. acceldata/client/http_client.py +346 -0
  5. acceldata/client/transient_retry.py +142 -0
  6. acceldata/constants/__init__.py +1 -0
  7. acceldata/constants/constants.py +13 -0
  8. acceldata/exceptions/__init__.py +52 -0
  9. acceldata/exceptions/api_errors.py +85 -0
  10. acceldata/exceptions/exceptions.py +174 -0
  11. acceldata/exceptions/sdk_exceptions.py +98 -0
  12. acceldata/mappers/__init__.py +21 -0
  13. acceldata/mappers/catalog_executions.py +107 -0
  14. acceldata/models/__init__.py +0 -0
  15. acceldata/models/api/catalog/above_configs.py +99 -0
  16. acceldata/models/api/catalog/above_configs_success.py +138 -0
  17. acceldata/models/api/catalog/absolute_configs.py +197 -0
  18. acceldata/models/api/catalog/absolute_configs_fallback.py +101 -0
  19. acceldata/models/api/catalog/absolute_threshold_config.py +105 -0
  20. acceldata/models/api/catalog/analysis_job_context.py +102 -0
  21. acceldata/models/api/catalog/analytics_pipeline.py +385 -0
  22. acceldata/models/api/catalog/analytics_pipeline_endpoint.py +136 -0
  23. acceldata/models/api/catalog/anomaly_config.py +95 -0
  24. acceldata/models/api/catalog/anomaly_details.py +119 -0
  25. acceldata/models/api/catalog/anomaly_threshold_config.py +105 -0
  26. acceldata/models/api/catalog/artifact.py +92 -0
  27. acceldata/models/api/catalog/assembly.py +171 -0
  28. acceldata/models/api/catalog/asset.py +162 -0
  29. acceldata/models/api/catalog/asset_catalog_listing.py +159 -0
  30. acceldata/models/api/catalog/asset_catalog_listing_response.py +102 -0
  31. acceldata/models/api/catalog/asset_label_request.py +96 -0
  32. acceldata/models/api/catalog/asset_progress.py +96 -0
  33. acceldata/models/api/catalog/asset_progress_details.py +117 -0
  34. acceldata/models/api/catalog/asset_tag.py +124 -0
  35. acceldata/models/api/catalog/asset_tag_info.py +140 -0
  36. acceldata/models/api/catalog/asset_tag_request.py +95 -0
  37. acceldata/models/api/catalog/asset_tag_response.py +96 -0
  38. acceldata/models/api/catalog/asset_tags_response.py +102 -0
  39. acceldata/models/api/catalog/asset_type.py +96 -0
  40. acceldata/models/api/catalog/auto_anomaly_feature_analysis.py +160 -0
  41. acceldata/models/api/catalog/auto_anomaly_item_execution.py +133 -0
  42. acceldata/models/api/catalog/auto_anomaly_meta_data.py +162 -0
  43. acceldata/models/api/catalog/auto_anomaly_rule_execution.py +102 -0
  44. acceldata/models/api/catalog/auto_anomaly_summary.py +124 -0
  45. acceldata/models/api/catalog/backing_asset.py +126 -0
  46. acceldata/models/api/catalog/below_configs.py +99 -0
  47. acceldata/models/api/catalog/big_decimal.py +100 -0
  48. acceldata/models/api/catalog/big_integer.py +98 -0
  49. acceldata/models/api/catalog/bounds_date_time_marker_config.py +110 -0
  50. acceldata/models/api/catalog/bounds_file_event_marker_config.py +108 -0
  51. acceldata/models/api/catalog/bounds_id_marker_config.py +96 -0
  52. acceldata/models/api/catalog/catalog_asset_meta_data.py +128 -0
  53. acceldata/models/api/catalog/changes_by_config.py +105 -0
  54. acceldata/models/api/catalog/column_mapping.py +139 -0
  55. acceldata/models/api/catalog/column_metadata.py +90 -0
  56. acceldata/models/api/catalog/column_metric_with_anomaly_details.py +119 -0
  57. acceldata/models/api/catalog/column_variable.py +111 -0
  58. acceldata/models/api/catalog/composite_policy_execution.py +102 -0
  59. acceldata/models/api/catalog/composite_policy_item_execution.py +104 -0
  60. acceldata/models/api/catalog/connection.py +118 -0
  61. acceldata/models/api/catalog/connection_test_result.py +106 -0
  62. acceldata/models/api/catalog/connection_type.py +90 -0
  63. acceldata/models/api/catalog/connection_types_response.py +96 -0
  64. acceldata/models/api/catalog/crawler.py +88 -0
  65. acceldata/models/api/catalog/crawler_action_response.py +90 -0
  66. acceldata/models/api/catalog/crawler_execution.py +147 -0
  67. acceldata/models/api/catalog/crawler_execution_response.py +102 -0
  68. acceldata/models/api/catalog/crawler_status_response.py +90 -0
  69. acceldata/models/api/catalog/create_profile.py +194 -0
  70. acceldata/models/api/catalog/custom_sql_config.py +121 -0
  71. acceldata/models/api/catalog/data_bricks_spark_resource_config.py +104 -0
  72. acceldata/models/api/catalog/data_cadence_rule.py +236 -0
  73. acceldata/models/api/catalog/data_cadence_rule_details.py +125 -0
  74. acceldata/models/api/catalog/data_cadence_rule_execution.py +102 -0
  75. acceldata/models/api/catalog/data_cadence_rule_item.py +104 -0
  76. acceldata/models/api/catalog/data_cadence_rule_item_execution.py +158 -0
  77. acceldata/models/api/catalog/data_cadence_rule_response.py +98 -0
  78. acceldata/models/api/catalog/data_drift_execution.py +102 -0
  79. acceldata/models/api/catalog/data_drift_item_execution.py +121 -0
  80. acceldata/models/api/catalog/data_quality_engine.py +90 -0
  81. acceldata/models/api/catalog/data_quality_execution.py +106 -0
  82. acceldata/models/api/catalog/data_quality_rule.py +323 -0
  83. acceldata/models/api/catalog/data_quality_rule_details.py +186 -0
  84. acceldata/models/api/catalog/data_quality_rule_response.py +120 -0
  85. acceldata/models/api/catalog/data_quality_rules_response.py +102 -0
  86. acceldata/models/api/catalog/databricks_compute_config.py +113 -0
  87. acceldata/models/api/catalog/dataplane_engine.py +105 -0
  88. acceldata/models/api/catalog/dataplane_health_metrics.py +101 -0
  89. acceldata/models/api/catalog/dataplane_job.py +216 -0
  90. acceldata/models/api/catalog/dataplane_job_status.py +113 -0
  91. acceldata/models/api/catalog/dataplane_request.py +96 -0
  92. acceldata/models/api/catalog/dataproc_compute_config.py +106 -0
  93. acceldata/models/api/catalog/dataproc_spark_resource_config.py +104 -0
  94. acceldata/models/api/catalog/date_based_partition_marker_config.py +116 -0
  95. acceldata/models/api/catalog/date_partitioning_marker_config.py +113 -0
  96. acceldata/models/api/catalog/date_time_marker_config.py +109 -0
  97. acceldata/models/api/catalog/day_month_year_based_partition_marker_config.py +124 -0
  98. acceldata/models/api/catalog/decreased_by_config.py +105 -0
  99. acceldata/models/api/catalog/delete_artifact_response.py +88 -0
  100. acceldata/models/api/catalog/dq_rule_execution.py +248 -0
  101. acceldata/models/api/catalog/drift.py +121 -0
  102. acceldata/models/api/catalog/enable_rule_request.py +88 -0
  103. acceldata/models/api/catalog/engine.py +90 -0
  104. acceldata/models/api/catalog/execution_cancellation_response.py +92 -0
  105. acceldata/models/api/catalog/execution_response.py +144 -0
  106. acceldata/models/api/catalog/execution_result.py +126 -0
  107. acceldata/models/api/catalog/executions_response.py +102 -0
  108. acceldata/models/api/catalog/failed_asset_detail.py +90 -0
  109. acceldata/models/api/catalog/failed_summary.py +98 -0
  110. acceldata/models/api/catalog/file.py +94 -0
  111. acceldata/models/api/catalog/file_marker_config.py +99 -0
  112. acceldata/models/api/catalog/generic_config_fallback.py +101 -0
  113. acceldata/models/api/catalog/generic_execution.py +221 -0
  114. acceldata/models/api/catalog/generic_rule_execution.py +137 -0
  115. acceldata/models/api/catalog/global_storage_config_dto.py +172 -0
  116. acceldata/models/api/catalog/hosted_dp_deployment_response.py +98 -0
  117. acceldata/models/api/catalog/id_marker_config.py +94 -0
  118. acceldata/models/api/catalog/increased_by_config.py +105 -0
  119. acceldata/models/api/catalog/item.py +160 -0
  120. acceldata/models/api/catalog/item_execution.py +192 -0
  121. acceldata/models/api/catalog/item_segment.py +131 -0
  122. acceldata/models/api/catalog/job_schedule.py +118 -0
  123. acceldata/models/api/catalog/job_spec.py +96 -0
  124. acceldata/models/api/catalog/kubernetes_metrics.py +91 -0
  125. acceldata/models/api/catalog/label.py +97 -0
  126. acceldata/models/api/catalog/livy_compute_config.py +103 -0
  127. acceldata/models/api/catalog/livy_spark_resource_config.py +106 -0
  128. acceldata/models/api/catalog/look_back_config.py +90 -0
  129. acceldata/models/api/catalog/manual_tag_request.py +92 -0
  130. acceldata/models/api/catalog/mapping.py +97 -0
  131. acceldata/models/api/catalog/marker.py +88 -0
  132. acceldata/models/api/catalog/marker_config.py +349 -0
  133. acceldata/models/api/catalog/marker_config_fallback.py +101 -0
  134. acceldata/models/api/catalog/meta.py +92 -0
  135. acceldata/models/api/catalog/meta_data.py +92 -0
  136. acceldata/models/api/catalog/meta_data_item.py +94 -0
  137. acceldata/models/api/catalog/mini_profile_request.py +112 -0
  138. acceldata/models/api/catalog/notification_payload.py +114 -0
  139. acceldata/models/api/catalog/offset_based_marker_config.py +97 -0
  140. acceldata/models/api/catalog/operational_config.py +92 -0
  141. acceldata/models/api/catalog/pattern_configuration.py +90 -0
  142. acceldata/models/api/catalog/pipe_line_request.py +92 -0
  143. acceldata/models/api/catalog/pipeline_compute_config.py +110 -0
  144. acceldata/models/api/catalog/policy_execution_marker_config.py +94 -0
  145. acceldata/models/api/catalog/policy_execution_request.py +229 -0
  146. acceldata/models/api/catalog/policy_group.py +114 -0
  147. acceldata/models/api/catalog/policy_transform_udf.py +113 -0
  148. acceldata/models/api/catalog/process_metrics.py +91 -0
  149. acceldata/models/api/catalog/profile_anomaly_details_response.py +109 -0
  150. acceldata/models/api/catalog/profile_anomaly_item_execution.py +127 -0
  151. acceldata/models/api/catalog/profile_anomaly_rule_execution.py +102 -0
  152. acceldata/models/api/catalog/profile_anomaly_rule_item.py +109 -0
  153. acceldata/models/api/catalog/profile_cancellation_response.py +92 -0
  154. acceldata/models/api/catalog/profile_request.py +211 -0
  155. acceldata/models/api/catalog/profile_request_response.py +92 -0
  156. acceldata/models/api/catalog/property_template.py +178 -0
  157. acceldata/models/api/catalog/property_templates.py +123 -0
  158. acceldata/models/api/catalog/pub_sub_lookback_marker_config.py +96 -0
  159. acceldata/models/api/catalog/pub_sub_timestamp_marker_config.py +108 -0
  160. acceldata/models/api/catalog/quality_rule.py +381 -0
  161. acceldata/models/api/catalog/quality_rule_execution_metrics.py +114 -0
  162. acceldata/models/api/catalog/quality_rule_with_latest_execution.py +115 -0
  163. acceldata/models/api/catalog/range_configs.py +109 -0
  164. acceldata/models/api/catalog/reconciliation_item.py +102 -0
  165. acceldata/models/api/catalog/reconciliation_item_execution.py +157 -0
  166. acceldata/models/api/catalog/reconciliation_rule.py +339 -0
  167. acceldata/models/api/catalog/reconciliation_rule_details.py +225 -0
  168. acceldata/models/api/catalog/reconciliation_rule_execution.py +102 -0
  169. acceldata/models/api/catalog/reconciliation_rule_response.py +98 -0
  170. acceldata/models/api/catalog/reconciliation_rules_response.py +102 -0
  171. acceldata/models/api/catalog/relative_config.py +197 -0
  172. acceldata/models/api/catalog/relative_config_fallback.py +101 -0
  173. acceldata/models/api/catalog/relative_threshold_config.py +111 -0
  174. acceldata/models/api/catalog/root_cause_analysis.py +108 -0
  175. acceldata/models/api/catalog/rule_execution.py +327 -0
  176. acceldata/models/api/catalog/rule_execution_result.py +90 -0
  177. acceldata/models/api/catalog/rule_item_result.py +125 -0
  178. acceldata/models/api/catalog/rule_meta_data.py +94 -0
  179. acceldata/models/api/catalog/rule_spark_sql_dynamic_filter_variable_mapping.py +100 -0
  180. acceldata/models/api/catalog/rule_tag.py +101 -0
  181. acceldata/models/api/catalog/rule_threshold_configuration.py +236 -0
  182. acceldata/models/api/catalog/rule_threshold_configuration_fallback.py +101 -0
  183. acceldata/models/api/catalog/rules_with_latest_execution_response.py +102 -0
  184. acceldata/models/api/catalog/sample_data_api_response.py +122 -0
  185. acceldata/models/api/catalog/schema_drift_item_execution.py +131 -0
  186. acceldata/models/api/catalog/schema_drift_rule_execution.py +102 -0
  187. acceldata/models/api/catalog/secret_manager_configuration.py +90 -0
  188. acceldata/models/api/catalog/secret_manager_configuration_with_option.py +98 -0
  189. acceldata/models/api/catalog/security_config.py +90 -0
  190. acceldata/models/api/catalog/segment_metric_json.py +142 -0
  191. acceldata/models/api/catalog/segments_analysis.py +145 -0
  192. acceldata/models/api/catalog/short_segment.py +97 -0
  193. acceldata/models/api/catalog/simple_quality_rule_response.py +92 -0
  194. acceldata/models/api/catalog/snapshot_data.py +117 -0
  195. acceldata/models/api/catalog/source_model.py +90 -0
  196. acceldata/models/api/catalog/source_type.py +100 -0
  197. acceldata/models/api/catalog/source_types_response.py +102 -0
  198. acceldata/models/api/catalog/spark_job_status.py +113 -0
  199. acceldata/models/api/catalog/spark_resource_config.py +114 -0
  200. acceldata/models/api/catalog/standard_response_assembly.py +92 -0
  201. acceldata/models/api/catalog/standard_response_crawler_action_response.py +92 -0
  202. acceldata/models/api/catalog/standard_response_crawler_status_response.py +92 -0
  203. acceldata/models/api/catalog/standard_response_delete_artifact_response.py +92 -0
  204. acceldata/models/api/catalog/standard_response_list.py +96 -0
  205. acceldata/models/api/catalog/standard_response_map.py +88 -0
  206. acceldata/models/api/catalog/standard_response_meta_data.py +92 -0
  207. acceldata/models/api/catalog/standard_response_mini_profile_request.py +92 -0
  208. acceldata/models/api/catalog/standard_response_profile_request.py +92 -0
  209. acceldata/models/api/catalog/start_profiling_request.py +92 -0
  210. acceldata/models/api/catalog/tag_domain.py +116 -0
  211. acceldata/models/api/catalog/threshold_breach_details.py +101 -0
  212. acceldata/models/api/catalog/time_based_config.py +92 -0
  213. acceldata/models/api/catalog/time_based_threshold_config.py +105 -0
  214. acceldata/models/api/catalog/timestamp_based_marker_config.py +115 -0
  215. acceldata/models/api/catalog/udf_variable.py +97 -0
  216. acceldata/models/api/catalog/yunikorn_compute_config.py +133 -0
  217. acceldata/models/api/catalog/yunikorn_spark_resource_config.py +154 -0
  218. acceldata/models/api/pipeline/big_decimal.py +100 -0
  219. acceldata/models/api/pipeline/big_integer.py +98 -0
  220. acceldata/models/api/pipeline/child_span_response.py +96 -0
  221. acceldata/models/api/pipeline/create_span_event.py +109 -0
  222. acceldata/models/api/pipeline/edge.py +108 -0
  223. acceldata/models/api/pipeline/event_alert_object.py +95 -0
  224. acceldata/models/api/pipeline/generic_config_fallback.py +101 -0
  225. acceldata/models/api/pipeline/identifier.py +146 -0
  226. acceldata/models/api/pipeline/job_request.py +130 -0
  227. acceldata/models/api/pipeline/meta.py +107 -0
  228. acceldata/models/api/pipeline/meta_data.py +92 -0
  229. acceldata/models/api/pipeline/metric.py +103 -0
  230. acceldata/models/api/pipeline/node.py +201 -0
  231. acceldata/models/api/pipeline/node_response.py +92 -0
  232. acceldata/models/api/pipeline/notification_payload.py +114 -0
  233. acceldata/models/api/pipeline/pipeline.py +152 -0
  234. acceldata/models/api/pipeline/pipeline_baseline_metric.py +92 -0
  235. acceldata/models/api/pipeline/pipeline_details.py +118 -0
  236. acceldata/models/api/pipeline/pipeline_details_response.py +102 -0
  237. acceldata/models/api/pipeline/pipeline_input_request.py +92 -0
  238. acceldata/models/api/pipeline/pipeline_listing_info.py +118 -0
  239. acceldata/models/api/pipeline/pipeline_response.py +92 -0
  240. acceldata/models/api/pipeline/pipeline_run.py +136 -0
  241. acceldata/models/api/pipeline/pipeline_run_request.py +92 -0
  242. acceldata/models/api/pipeline/pipeline_runs_response.py +102 -0
  243. acceldata/models/api/pipeline/pipeline_summary.py +98 -0
  244. acceldata/models/api/pipeline/pipelines_listing_response.py +102 -0
  245. acceldata/models/api/pipeline/policy_summary.py +102 -0
  246. acceldata/models/api/pipeline/span.py +115 -0
  247. acceldata/models/api/pipeline/span_event.py +114 -0
  248. acceldata/models/api/pipeline/span_event_request.py +92 -0
  249. acceldata/models/api/pipeline/span_event_response.py +92 -0
  250. acceldata/models/api/pipeline/span_request.py +94 -0
  251. acceldata/models/api/pipeline/spans_response.py +96 -0
  252. acceldata/models/api/pipeline/tag.py +97 -0
  253. acceldata/models/sdk/__init__.py +0 -0
  254. acceldata/models/sdk/catalog/__init__.py +105 -0
  255. acceldata/models/sdk/catalog/asset_resource.py +112 -0
  256. acceldata/models/sdk/catalog/asset_source_type.py +59 -0
  257. acceldata/models/sdk/catalog/custom_asset_metadata.py +11 -0
  258. acceldata/models/sdk/catalog/datasource_resource.py +88 -0
  259. acceldata/models/sdk/catalog/executor.py +524 -0
  260. acceldata/models/sdk/catalog/policy_execution_request.py +114 -0
  261. acceldata/models/sdk/catalog/policy_execution_type.py +16 -0
  262. acceldata/models/sdk/catalog/policy_filter.py +94 -0
  263. acceldata/models/sdk/catalog/policy_rule_resources.py +388 -0
  264. acceldata/models/sdk/catalog/profile_request_resource.py +77 -0
  265. acceldata/models/sdk/catalog/profiling.py +82 -0
  266. acceldata/models/sdk/catalog/profiling_configuration_error.py +5 -0
  267. acceldata/models/sdk/pipeline/__init__.py +62 -0
  268. acceldata/models/sdk/pipeline/create_job_input.py +108 -0
  269. acceldata/models/sdk/pipeline/create_pipeline_input_request.py +72 -0
  270. acceldata/models/sdk/pipeline/events/__init__.py +5 -0
  271. acceldata/models/sdk/pipeline/events/generic_event.py +31 -0
  272. acceldata/models/sdk/pipeline/events/log_event.py +34 -0
  273. acceldata/models/sdk/pipeline/events/span_event.py +8 -0
  274. acceldata/models/sdk/pipeline/pipeline_resource.py +171 -0
  275. acceldata/models/sdk/pipeline/pipeline_run_input.py +84 -0
  276. acceldata/models/sdk/pipeline/pipeline_run_resource.py +208 -0
  277. acceldata/models/sdk/pipeline/pipeline_source_type.py +20 -0
  278. acceldata/models/sdk/pipeline/span_resource.py +327 -0
  279. acceldata/openapi_deserialization_patches.py +161 -0
  280. acceldata/openapi_repr_patches.py +62 -0
  281. acceldata/services/__init__.py +0 -0
  282. acceldata/services/api_timestamp.py +31 -0
  283. acceldata/services/asset_service.py +651 -0
  284. acceldata/services/datasource_service.py +120 -0
  285. acceldata/services/generic_service.py +132 -0
  286. acceldata/services/marker_config.py +232 -0
  287. acceldata/services/pipeline_big_decimal_api.py +102 -0
  288. acceldata/services/pipeline_response_parse.py +209 -0
  289. acceldata/services/pipeline_service.py +494 -0
  290. acceldata/services/rule_service.py +620 -0
  291. acceldata/urls/__init__.py +1 -0
  292. acceldata/urls/catalog_urls.py +137 -0
  293. acceldata/urls/pipeline_urls.py +55 -0
  294. acceldata/utils/__init__.py +6 -0
  295. acceldata/utils/datetime_utils.py +16 -0
  296. acceldata/utils/operation_ack.py +22 -0
  297. acceldata/utils/span_helpers.py +95 -0
  298. acceldata/utils/time_range_utils.py +90 -0
  299. acceldata_sdk_python-26.7.0.dist-info/METADATA +26 -0
  300. acceldata_sdk_python-26.7.0.dist-info/RECORD +303 -0
  301. acceldata_sdk_python-26.7.0.dist-info/WHEEL +5 -0
  302. acceldata_sdk_python-26.7.0.dist-info/licenses/LICENSE +22 -0
  303. 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