acryl-datahub-cloud 0.3.10rc4__py3-none-any.whl → 0.3.16.1rc0__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.

Potentially problematic release.


This version of acryl-datahub-cloud might be problematic. Click here for more details.

Files changed (243) hide show
  1. acryl_datahub_cloud/_codegen_config.json +1 -1
  2. acryl_datahub_cloud/acryl_cs_issues/acryl_customer.py +1 -1
  3. acryl_datahub_cloud/acryl_cs_issues/models.py +5 -3
  4. acryl_datahub_cloud/action_request/action_request_owner_source.py +37 -8
  5. acryl_datahub_cloud/datahub_forms_notifications/__init__.py +0 -0
  6. acryl_datahub_cloud/datahub_forms_notifications/forms_notifications_source.py +569 -0
  7. acryl_datahub_cloud/datahub_forms_notifications/get_feature_flag.gql +7 -0
  8. acryl_datahub_cloud/datahub_forms_notifications/get_search_results_total.gql +14 -0
  9. acryl_datahub_cloud/datahub_forms_notifications/query.py +17 -0
  10. acryl_datahub_cloud/datahub_forms_notifications/scroll_forms_for_notification.gql +29 -0
  11. acryl_datahub_cloud/datahub_forms_notifications/send_form_notification_request.gql +5 -0
  12. acryl_datahub_cloud/datahub_reporting/datahub_dataset.py +39 -19
  13. acryl_datahub_cloud/datahub_reporting/datahub_form_reporting.py +60 -25
  14. acryl_datahub_cloud/datahub_reporting/extract_graph.py +9 -3
  15. acryl_datahub_cloud/datahub_reporting/extract_sql.py +248 -52
  16. acryl_datahub_cloud/datahub_reporting/forms.py +1 -1
  17. acryl_datahub_cloud/datahub_reporting/forms_config.py +3 -2
  18. acryl_datahub_cloud/datahub_restore/source.py +3 -2
  19. acryl_datahub_cloud/datahub_usage_reporting/excluded.py +94 -0
  20. acryl_datahub_cloud/datahub_usage_reporting/query_builder.py +48 -8
  21. acryl_datahub_cloud/datahub_usage_reporting/usage_feature_reporter.py +532 -109
  22. acryl_datahub_cloud/elasticsearch/graph_service.py +76 -14
  23. acryl_datahub_cloud/graphql_utils.py +64 -0
  24. acryl_datahub_cloud/lineage_features/source.py +555 -49
  25. acryl_datahub_cloud/metadata/_urns/urn_defs.py +2390 -1938
  26. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/actionworkflow/__init__.py +53 -0
  27. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/anomaly/__init__.py +2 -0
  28. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/application/__init__.py +19 -0
  29. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/assertion/__init__.py +6 -2
  30. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/common/__init__.py +6 -0
  31. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/conversation/__init__.py +29 -0
  32. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/event/notification/settings/__init__.py +2 -0
  33. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/execution/__init__.py +2 -0
  34. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/file/__init__.py +19 -0
  35. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/form/__init__.py +8 -0
  36. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/identity/__init__.py +8 -0
  37. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/knowledge/__init__.py +33 -0
  38. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/logical/__init__.py +15 -0
  39. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/metadata/key/__init__.py +14 -0
  40. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/metadata/search/features/__init__.py +2 -0
  41. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/module/__init__.py +31 -0
  42. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/monitor/__init__.py +6 -0
  43. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/notification/__init__.py +19 -0
  44. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/platform/event/v1/__init__.py +4 -0
  45. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/role/__init__.py +2 -0
  46. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/settings/asset/__init__.py +19 -0
  47. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/settings/global/__init__.py +28 -0
  48. acryl_datahub_cloud/metadata/com/linkedin/pegasus2avro/template/__init__.py +31 -0
  49. acryl_datahub_cloud/metadata/schema.avsc +27843 -23200
  50. acryl_datahub_cloud/metadata/schema_classes.py +29901 -24310
  51. acryl_datahub_cloud/metadata/schemas/ActionRequestInfo.avsc +235 -2
  52. acryl_datahub_cloud/metadata/schemas/ActionWorkflowInfo.avsc +683 -0
  53. acryl_datahub_cloud/metadata/schemas/ActionWorkflowKey.avsc +21 -0
  54. acryl_datahub_cloud/metadata/schemas/Actors.avsc +38 -1
  55. acryl_datahub_cloud/metadata/schemas/ApplicationKey.avsc +31 -0
  56. acryl_datahub_cloud/metadata/schemas/ApplicationProperties.avsc +75 -0
  57. acryl_datahub_cloud/metadata/schemas/Applications.avsc +38 -0
  58. acryl_datahub_cloud/metadata/schemas/AssertionAnalyticsRunEvent.avsc +375 -212
  59. acryl_datahub_cloud/metadata/schemas/AssertionInfo.avsc +147 -20
  60. acryl_datahub_cloud/metadata/schemas/AssertionKey.avsc +1 -1
  61. acryl_datahub_cloud/metadata/schemas/AssertionRunEvent.avsc +191 -21
  62. acryl_datahub_cloud/metadata/schemas/{AssertionSummary.avsc → AssertionRunSummary.avsc} +15 -2
  63. acryl_datahub_cloud/metadata/schemas/AssertionsSummary.avsc +54 -0
  64. acryl_datahub_cloud/metadata/schemas/AssetSettings.avsc +63 -0
  65. acryl_datahub_cloud/metadata/schemas/BusinessAttributeInfo.avsc +7 -3
  66. acryl_datahub_cloud/metadata/schemas/ChartInfo.avsc +20 -6
  67. acryl_datahub_cloud/metadata/schemas/ChartKey.avsc +1 -0
  68. acryl_datahub_cloud/metadata/schemas/ConstraintInfo.avsc +12 -1
  69. acryl_datahub_cloud/metadata/schemas/ContainerKey.avsc +1 -0
  70. acryl_datahub_cloud/metadata/schemas/ContainerProperties.avsc +16 -5
  71. acryl_datahub_cloud/metadata/schemas/CorpGroupEditableInfo.avsc +2 -1
  72. acryl_datahub_cloud/metadata/schemas/CorpGroupInfo.avsc +7 -3
  73. acryl_datahub_cloud/metadata/schemas/CorpGroupKey.avsc +2 -1
  74. acryl_datahub_cloud/metadata/schemas/CorpGroupSettings.avsc +127 -2
  75. acryl_datahub_cloud/metadata/schemas/CorpUserEditableInfo.avsc +1 -1
  76. acryl_datahub_cloud/metadata/schemas/CorpUserInfo.avsc +18 -2
  77. acryl_datahub_cloud/metadata/schemas/CorpUserInvitationStatus.avsc +106 -0
  78. acryl_datahub_cloud/metadata/schemas/CorpUserKey.avsc +4 -1
  79. acryl_datahub_cloud/metadata/schemas/CorpUserSettings.avsc +304 -2
  80. acryl_datahub_cloud/metadata/schemas/CorpUserUsageFeatures.avsc +86 -0
  81. acryl_datahub_cloud/metadata/schemas/DashboardInfo.avsc +11 -5
  82. acryl_datahub_cloud/metadata/schemas/DashboardKey.avsc +1 -0
  83. acryl_datahub_cloud/metadata/schemas/DataContractKey.avsc +2 -1
  84. acryl_datahub_cloud/metadata/schemas/DataFlowInfo.avsc +15 -5
  85. acryl_datahub_cloud/metadata/schemas/DataFlowKey.avsc +1 -0
  86. acryl_datahub_cloud/metadata/schemas/DataHubAiConversationInfo.avsc +256 -0
  87. acryl_datahub_cloud/metadata/schemas/DataHubAiConversationKey.avsc +22 -0
  88. acryl_datahub_cloud/metadata/schemas/DataHubFileInfo.avsc +234 -0
  89. acryl_datahub_cloud/metadata/schemas/DataHubFileKey.avsc +22 -0
  90. acryl_datahub_cloud/metadata/schemas/DataHubIngestionSourceKey.avsc +2 -1
  91. acryl_datahub_cloud/metadata/schemas/DataHubOpenAPISchemaKey.avsc +22 -0
  92. acryl_datahub_cloud/metadata/schemas/DataHubPageModuleKey.avsc +21 -0
  93. acryl_datahub_cloud/metadata/schemas/DataHubPageModuleProperties.avsc +308 -0
  94. acryl_datahub_cloud/metadata/schemas/DataHubPageTemplateKey.avsc +21 -0
  95. acryl_datahub_cloud/metadata/schemas/DataHubPageTemplateProperties.avsc +251 -0
  96. acryl_datahub_cloud/metadata/schemas/DataHubPolicyInfo.avsc +12 -1
  97. acryl_datahub_cloud/metadata/schemas/DataJobInfo.avsc +13 -4
  98. acryl_datahub_cloud/metadata/schemas/DataJobInputOutput.avsc +8 -0
  99. acryl_datahub_cloud/metadata/schemas/DataJobKey.avsc +1 -0
  100. acryl_datahub_cloud/metadata/schemas/DataPlatformInfo.avsc +3 -1
  101. acryl_datahub_cloud/metadata/schemas/DataPlatformInstanceProperties.avsc +5 -2
  102. acryl_datahub_cloud/metadata/schemas/DataProcessKey.avsc +4 -0
  103. acryl_datahub_cloud/metadata/schemas/DataProductKey.avsc +2 -0
  104. acryl_datahub_cloud/metadata/schemas/DataProductProperties.avsc +6 -3
  105. acryl_datahub_cloud/metadata/schemas/DataTransformLogic.avsc +4 -2
  106. acryl_datahub_cloud/metadata/schemas/DataTypeInfo.avsc +5 -0
  107. acryl_datahub_cloud/metadata/schemas/DatasetKey.avsc +10 -2
  108. acryl_datahub_cloud/metadata/schemas/DatasetProperties.avsc +12 -5
  109. acryl_datahub_cloud/metadata/schemas/DatasetUsageStatistics.avsc +8 -0
  110. acryl_datahub_cloud/metadata/schemas/DocumentInfo.avsc +407 -0
  111. acryl_datahub_cloud/metadata/schemas/DocumentKey.avsc +35 -0
  112. acryl_datahub_cloud/metadata/schemas/DocumentSettings.avsc +79 -0
  113. acryl_datahub_cloud/metadata/schemas/DomainKey.avsc +2 -0
  114. acryl_datahub_cloud/metadata/schemas/DomainProperties.avsc +7 -3
  115. acryl_datahub_cloud/metadata/schemas/EditableContainerProperties.avsc +2 -1
  116. acryl_datahub_cloud/metadata/schemas/EditableDashboardProperties.avsc +2 -1
  117. acryl_datahub_cloud/metadata/schemas/EditableDataFlowProperties.avsc +2 -1
  118. acryl_datahub_cloud/metadata/schemas/EditableDataJobProperties.avsc +2 -1
  119. acryl_datahub_cloud/metadata/schemas/EditableDatasetProperties.avsc +2 -1
  120. acryl_datahub_cloud/metadata/schemas/EditableERModelRelationshipProperties.avsc +2 -1
  121. acryl_datahub_cloud/metadata/schemas/EditableMLFeatureProperties.avsc +2 -1
  122. acryl_datahub_cloud/metadata/schemas/EditableMLFeatureTableProperties.avsc +2 -1
  123. acryl_datahub_cloud/metadata/schemas/EditableMLModelGroupProperties.avsc +2 -1
  124. acryl_datahub_cloud/metadata/schemas/EditableMLModelProperties.avsc +2 -1
  125. acryl_datahub_cloud/metadata/schemas/EditableNotebookProperties.avsc +2 -1
  126. acryl_datahub_cloud/metadata/schemas/EditableSchemaMetadata.avsc +4 -2
  127. acryl_datahub_cloud/metadata/schemas/EntityTypeInfo.avsc +5 -0
  128. acryl_datahub_cloud/metadata/schemas/ExecutionRequestArtifactsLocation.avsc +16 -0
  129. acryl_datahub_cloud/metadata/schemas/ExecutionRequestKey.avsc +2 -1
  130. acryl_datahub_cloud/metadata/schemas/FormAssignmentStatus.avsc +36 -0
  131. acryl_datahub_cloud/metadata/schemas/FormInfo.avsc +6 -0
  132. acryl_datahub_cloud/metadata/schemas/FormKey.avsc +3 -1
  133. acryl_datahub_cloud/metadata/schemas/FormNotifications.avsc +69 -0
  134. acryl_datahub_cloud/metadata/schemas/FormSettings.avsc +30 -0
  135. acryl_datahub_cloud/metadata/schemas/GlobalSettingsInfo.avsc +416 -0
  136. acryl_datahub_cloud/metadata/schemas/GlobalTags.avsc +2 -1
  137. acryl_datahub_cloud/metadata/schemas/GlossaryNodeInfo.avsc +3 -1
  138. acryl_datahub_cloud/metadata/schemas/GlossaryNodeKey.avsc +1 -0
  139. acryl_datahub_cloud/metadata/schemas/GlossaryTermInfo.avsc +3 -1
  140. acryl_datahub_cloud/metadata/schemas/GlossaryTermKey.avsc +2 -0
  141. acryl_datahub_cloud/metadata/schemas/IcebergWarehouseInfo.avsc +4 -0
  142. acryl_datahub_cloud/metadata/schemas/IncidentActivityEvent.avsc +3 -3
  143. acryl_datahub_cloud/metadata/schemas/IncidentInfo.avsc +3 -3
  144. acryl_datahub_cloud/metadata/schemas/InferredMetadata.avsc +71 -1
  145. acryl_datahub_cloud/metadata/schemas/InputFields.avsc +2 -1
  146. acryl_datahub_cloud/metadata/schemas/InviteToken.avsc +26 -0
  147. acryl_datahub_cloud/metadata/schemas/LineageFeatures.avsc +67 -42
  148. acryl_datahub_cloud/metadata/schemas/LogicalParent.avsc +145 -0
  149. acryl_datahub_cloud/metadata/schemas/MLFeatureKey.avsc +4 -1
  150. acryl_datahub_cloud/metadata/schemas/MLFeatureTableKey.avsc +4 -1
  151. acryl_datahub_cloud/metadata/schemas/MLModelDeploymentKey.avsc +7 -1
  152. acryl_datahub_cloud/metadata/schemas/MLModelDeploymentProperties.avsc +3 -0
  153. acryl_datahub_cloud/metadata/schemas/MLModelGroupKey.avsc +9 -1
  154. acryl_datahub_cloud/metadata/schemas/MLModelKey.avsc +9 -1
  155. acryl_datahub_cloud/metadata/schemas/MLModelProperties.avsc +4 -2
  156. acryl_datahub_cloud/metadata/schemas/MLPrimaryKeyKey.avsc +4 -1
  157. acryl_datahub_cloud/metadata/schemas/MetadataChangeEvent.avsc +424 -97
  158. acryl_datahub_cloud/metadata/schemas/MetadataChangeLog.avsc +65 -44
  159. acryl_datahub_cloud/metadata/schemas/MetadataChangeProposal.avsc +64 -0
  160. acryl_datahub_cloud/metadata/schemas/MonitorAnomalyEvent.avsc +84 -29
  161. acryl_datahub_cloud/metadata/schemas/MonitorInfo.avsc +221 -23
  162. acryl_datahub_cloud/metadata/schemas/MonitorKey.avsc +9 -1
  163. acryl_datahub_cloud/metadata/schemas/MonitorSuiteInfo.avsc +128 -3
  164. acryl_datahub_cloud/metadata/schemas/NotebookInfo.avsc +5 -2
  165. acryl_datahub_cloud/metadata/schemas/NotebookKey.avsc +1 -0
  166. acryl_datahub_cloud/metadata/schemas/NotificationRequest.avsc +91 -4
  167. acryl_datahub_cloud/metadata/schemas/Operation.avsc +17 -0
  168. acryl_datahub_cloud/metadata/schemas/Ownership.avsc +71 -1
  169. acryl_datahub_cloud/metadata/schemas/QueryProperties.avsc +4 -2
  170. acryl_datahub_cloud/metadata/schemas/QuerySubjects.avsc +2 -13
  171. acryl_datahub_cloud/metadata/schemas/RelationshipChangeEvent.avsc +215 -0
  172. acryl_datahub_cloud/metadata/schemas/RoleProperties.avsc +3 -1
  173. acryl_datahub_cloud/metadata/schemas/SchemaFieldInfo.avsc +3 -1
  174. acryl_datahub_cloud/metadata/schemas/SchemaFieldKey.avsc +3 -0
  175. acryl_datahub_cloud/metadata/schemas/SchemaMetadata.avsc +2 -1
  176. acryl_datahub_cloud/metadata/schemas/SemanticContent.avsc +123 -0
  177. acryl_datahub_cloud/metadata/schemas/StructuredProperties.avsc +69 -0
  178. acryl_datahub_cloud/metadata/schemas/StructuredPropertyDefinition.avsc +15 -4
  179. acryl_datahub_cloud/metadata/schemas/StructuredPropertySettings.avsc +9 -0
  180. acryl_datahub_cloud/metadata/schemas/SubscriptionInfo.avsc +136 -5
  181. acryl_datahub_cloud/metadata/schemas/SubscriptionKey.avsc +2 -1
  182. acryl_datahub_cloud/metadata/schemas/SystemMetadata.avsc +147 -0
  183. acryl_datahub_cloud/metadata/schemas/TagProperties.avsc +3 -1
  184. acryl_datahub_cloud/metadata/schemas/TestInfo.avsc +2 -1
  185. acryl_datahub_cloud/metadata/schemas/UpstreamLineage.avsc +9 -0
  186. acryl_datahub_cloud/metadata/schemas/UsageFeatures.avsc +10 -0
  187. acryl_datahub_cloud/metadata/schemas/__init__.py +3 -3
  188. acryl_datahub_cloud/notifications/__init__.py +0 -0
  189. acryl_datahub_cloud/notifications/notification_recipient_builder.py +399 -0
  190. acryl_datahub_cloud/sdk/__init__.py +69 -0
  191. acryl_datahub_cloud/sdk/assertion/__init__.py +58 -0
  192. acryl_datahub_cloud/sdk/assertion/assertion_base.py +779 -0
  193. acryl_datahub_cloud/sdk/assertion/column_metric_assertion.py +191 -0
  194. acryl_datahub_cloud/sdk/assertion/column_value_assertion.py +431 -0
  195. acryl_datahub_cloud/sdk/assertion/freshness_assertion.py +201 -0
  196. acryl_datahub_cloud/sdk/assertion/schema_assertion.py +268 -0
  197. acryl_datahub_cloud/sdk/assertion/smart_column_metric_assertion.py +212 -0
  198. acryl_datahub_cloud/sdk/assertion/smart_freshness_assertion.py +165 -0
  199. acryl_datahub_cloud/sdk/assertion/smart_sql_assertion.py +156 -0
  200. acryl_datahub_cloud/sdk/assertion/smart_volume_assertion.py +162 -0
  201. acryl_datahub_cloud/sdk/assertion/sql_assertion.py +273 -0
  202. acryl_datahub_cloud/sdk/assertion/types.py +20 -0
  203. acryl_datahub_cloud/sdk/assertion/volume_assertion.py +156 -0
  204. acryl_datahub_cloud/sdk/assertion_client/__init__.py +0 -0
  205. acryl_datahub_cloud/sdk/assertion_client/column_metric.py +545 -0
  206. acryl_datahub_cloud/sdk/assertion_client/column_value.py +617 -0
  207. acryl_datahub_cloud/sdk/assertion_client/freshness.py +371 -0
  208. acryl_datahub_cloud/sdk/assertion_client/helpers.py +166 -0
  209. acryl_datahub_cloud/sdk/assertion_client/schema.py +358 -0
  210. acryl_datahub_cloud/sdk/assertion_client/smart_column_metric.py +540 -0
  211. acryl_datahub_cloud/sdk/assertion_client/smart_freshness.py +373 -0
  212. acryl_datahub_cloud/sdk/assertion_client/smart_sql.py +411 -0
  213. acryl_datahub_cloud/sdk/assertion_client/smart_volume.py +380 -0
  214. acryl_datahub_cloud/sdk/assertion_client/sql.py +410 -0
  215. acryl_datahub_cloud/sdk/assertion_client/volume.py +446 -0
  216. acryl_datahub_cloud/sdk/assertion_input/__init__.py +0 -0
  217. acryl_datahub_cloud/sdk/assertion_input/assertion_input.py +1470 -0
  218. acryl_datahub_cloud/sdk/assertion_input/column_assertion_constants.py +114 -0
  219. acryl_datahub_cloud/sdk/assertion_input/column_assertion_utils.py +284 -0
  220. acryl_datahub_cloud/sdk/assertion_input/column_metric_assertion_input.py +759 -0
  221. acryl_datahub_cloud/sdk/assertion_input/column_metric_constants.py +109 -0
  222. acryl_datahub_cloud/sdk/assertion_input/column_value_assertion_input.py +810 -0
  223. acryl_datahub_cloud/sdk/assertion_input/freshness_assertion_input.py +305 -0
  224. acryl_datahub_cloud/sdk/assertion_input/schema_assertion_input.py +413 -0
  225. acryl_datahub_cloud/sdk/assertion_input/smart_column_metric_assertion_input.py +793 -0
  226. acryl_datahub_cloud/sdk/assertion_input/smart_freshness_assertion_input.py +218 -0
  227. acryl_datahub_cloud/sdk/assertion_input/smart_sql_assertion_input.py +181 -0
  228. acryl_datahub_cloud/sdk/assertion_input/smart_volume_assertion_input.py +189 -0
  229. acryl_datahub_cloud/sdk/assertion_input/sql_assertion_input.py +320 -0
  230. acryl_datahub_cloud/sdk/assertion_input/volume_assertion_input.py +635 -0
  231. acryl_datahub_cloud/sdk/assertions_client.py +1074 -0
  232. acryl_datahub_cloud/sdk/entities/__init__.py +0 -0
  233. acryl_datahub_cloud/sdk/entities/assertion.py +439 -0
  234. acryl_datahub_cloud/sdk/entities/monitor.py +291 -0
  235. acryl_datahub_cloud/sdk/entities/subscription.py +100 -0
  236. acryl_datahub_cloud/sdk/errors.py +34 -0
  237. acryl_datahub_cloud/sdk/resolver_client.py +42 -0
  238. acryl_datahub_cloud/sdk/subscription_client.py +737 -0
  239. {acryl_datahub_cloud-0.3.10rc4.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/METADATA +49 -43
  240. {acryl_datahub_cloud-0.3.10rc4.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/RECORD +243 -145
  241. {acryl_datahub_cloud-0.3.10rc4.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/WHEEL +1 -1
  242. {acryl_datahub_cloud-0.3.10rc4.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/entry_points.txt +1 -0
  243. {acryl_datahub_cloud-0.3.10rc4.dist-info → acryl_datahub_cloud-0.3.16.1rc0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,410 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from datetime import datetime, timezone
5
+ from typing import TYPE_CHECKING, Optional, Union
6
+
7
+ from acryl_datahub_cloud.sdk.assertion.assertion_base import (
8
+ AssertionMode,
9
+ SqlAssertion,
10
+ )
11
+ from acryl_datahub_cloud.sdk.assertion_client.helpers import (
12
+ DEFAULT_CREATED_BY,
13
+ _merge_field,
14
+ _print_experimental_warning,
15
+ _validate_required_field,
16
+ resolve_updated_by,
17
+ retrieve_assertion_and_monitor_by_urn,
18
+ )
19
+ from acryl_datahub_cloud.sdk.assertion_input.assertion_input import (
20
+ AssertionIncidentBehaviorInputTypes,
21
+ )
22
+ from acryl_datahub_cloud.sdk.assertion_input.sql_assertion_input import (
23
+ SqlAssertionCondition,
24
+ SqlAssertionCriteria,
25
+ _SqlAssertionInput,
26
+ )
27
+ from acryl_datahub_cloud.sdk.entities.assertion import Assertion, TagsInputType
28
+ from acryl_datahub_cloud.sdk.entities.monitor import Monitor
29
+ from acryl_datahub_cloud.sdk.errors import SDKUsageError
30
+ from datahub.metadata import schema_classes as models
31
+ from datahub.metadata.urns import AssertionUrn, CorpUserUrn, DatasetUrn, MonitorUrn
32
+
33
+ if TYPE_CHECKING:
34
+ from datahub.sdk.main_client import DataHubClient
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ class SqlAssertionClient:
40
+ """Client for managing SQL assertions."""
41
+
42
+ def __init__(self, client: "DataHubClient"):
43
+ self.client = client
44
+
45
+ def _validate_sql_assertion_creation_params(
46
+ self,
47
+ statement: Optional[str],
48
+ criteria_condition: Optional[Union[SqlAssertionCondition, str]],
49
+ criteria_parameters: Optional[
50
+ Union[Union[float, int], tuple[Union[float, int], Union[float, int]]]
51
+ ],
52
+ ) -> None:
53
+ """Validate required parameters for SQL assertion creation."""
54
+ _validate_required_field(
55
+ statement,
56
+ "statement",
57
+ "when creating a new assertion (urn is None). Provide a SQL query like 'SELECT COUNT(*) FROM table'",
58
+ )
59
+ _validate_required_field(
60
+ criteria_condition,
61
+ "criteria_condition",
62
+ "when creating a new assertion (urn is None). Must be one of: IS_EQUAL_TO, IS_GREATER_THAN, IS_LESS_THAN, IS_WITHIN_A_RANGE, etc.",
63
+ )
64
+ _validate_required_field(
65
+ criteria_parameters,
66
+ "criteria_parameters",
67
+ "when creating a new assertion (urn is None). Provide a single value (e.g., 100) or a range (e.g., (10, 100))",
68
+ )
69
+
70
+ def sync_sql_assertion(
71
+ self,
72
+ *,
73
+ dataset_urn: Union[str, DatasetUrn],
74
+ urn: Optional[Union[str, AssertionUrn]] = None,
75
+ display_name: Optional[str] = None,
76
+ enabled: Optional[bool] = None,
77
+ statement: Optional[str] = None,
78
+ criteria_condition: Optional[Union[SqlAssertionCondition, str]] = None,
79
+ criteria_parameters: Optional[
80
+ Union[Union[float, int], tuple[Union[float, int], Union[float, int]]]
81
+ ] = None,
82
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes] = None,
83
+ tags: Optional[TagsInputType] = None,
84
+ updated_by: Optional[Union[str, CorpUserUrn]] = None,
85
+ schedule: Optional[Union[str, models.CronScheduleClass]] = None,
86
+ ) -> SqlAssertion:
87
+ _print_experimental_warning()
88
+ now_utc = datetime.now(timezone.utc)
89
+
90
+ resolved_updated_by = resolve_updated_by(updated_by)
91
+
92
+ # Validate that criteria_condition and criteria_parameters are both provided or both omitted
93
+ if (criteria_condition is None) != (criteria_parameters is None):
94
+ raise SDKUsageError(
95
+ "criteria_condition and criteria_parameters must both be provided or both omitted"
96
+ )
97
+
98
+ # Validate required params for new assertions upfront, since we can't fetch them from an existing one
99
+ if urn is None:
100
+ logger.info("URN is not set, creating a new assertion")
101
+ self._validate_sql_assertion_creation_params(
102
+ statement, criteria_condition, criteria_parameters
103
+ )
104
+
105
+ # Build criteria if condition and parameters are provided
106
+ criteria: Optional[SqlAssertionCriteria] = None
107
+ if criteria_condition is not None and criteria_parameters is not None:
108
+ criteria = SqlAssertionCriteria(
109
+ condition=criteria_condition,
110
+ parameters=criteria_parameters,
111
+ )
112
+
113
+ merged_assertion_input = self._retrieve_and_merge_sql_assertion_and_monitor(
114
+ dataset_urn=dataset_urn,
115
+ urn=urn,
116
+ display_name=display_name,
117
+ enabled=enabled,
118
+ criteria=criteria,
119
+ statement=statement,
120
+ incident_behavior=incident_behavior,
121
+ tags=tags,
122
+ updated_by=resolved_updated_by,
123
+ now_utc=now_utc,
124
+ schedule=schedule,
125
+ )
126
+
127
+ # Validate after merge to catch two scenarios:
128
+ # 1. Developer forgot required fields when creating new assertion (caught earlier)
129
+ # 2. Developer provided a URN that doesn't exist or points to invalid assertion
130
+ if merged_assertion_input.statement is None:
131
+ raise SDKUsageError(
132
+ f"statement is required but was not provided and not found in existing assertion {urn}. "
133
+ "The existing assertion may be invalid or corrupted."
134
+ )
135
+ if merged_assertion_input.criteria is None:
136
+ raise SDKUsageError(
137
+ f"criteria (condition and parameters) is required but was not provided and not found in existing assertion {urn}. "
138
+ "The existing assertion may be invalid or corrupted."
139
+ )
140
+
141
+ assertion_entity, monitor_entity = (
142
+ merged_assertion_input.to_assertion_and_monitor_entities()
143
+ )
144
+ # Upsert assertion first to fail fast if there's an issue before touching the monitor
145
+ self.client.entities.upsert(assertion_entity)
146
+ self.client.entities.upsert(monitor_entity)
147
+
148
+ return SqlAssertion._from_entities(assertion_entity, monitor_entity)
149
+
150
+ def _build_sql_assertion_input(
151
+ self,
152
+ *,
153
+ dataset_urn: Union[str, DatasetUrn],
154
+ urn: Optional[Union[str, AssertionUrn]],
155
+ display_name: Optional[str],
156
+ enabled: Optional[bool],
157
+ criteria: Optional[SqlAssertionCriteria],
158
+ statement: Optional[str],
159
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
160
+ tags: Optional[TagsInputType],
161
+ updated_by: Union[str, CorpUserUrn],
162
+ now_utc: datetime,
163
+ schedule: Optional[Union[str, models.CronScheduleClass]],
164
+ ) -> _SqlAssertionInput:
165
+ """Build a SqlAssertionInput from the given parameters."""
166
+ return _SqlAssertionInput(
167
+ urn=urn,
168
+ entity_client=self.client.entities,
169
+ dataset_urn=dataset_urn,
170
+ display_name=display_name,
171
+ enabled=enabled if enabled is not None else True,
172
+ criteria=criteria,
173
+ statement=statement,
174
+ incident_behavior=incident_behavior,
175
+ tags=tags,
176
+ created_by=updated_by,
177
+ created_at=now_utc,
178
+ updated_by=updated_by,
179
+ updated_at=now_utc,
180
+ schedule=schedule,
181
+ )
182
+
183
+ # TODO: Refactoring planned - See https://github.com/acryldata/datahub-fork/pull/7585
184
+ # This method (lines 187-290) contains duplicated orchestration logic that exists
185
+ # in 7 other assertion client files. A future PR will extract this into a
186
+ # BaseAssertionClient with template method pattern. See PR #7585 for details.
187
+ def _retrieve_and_merge_sql_assertion_and_monitor(
188
+ self,
189
+ dataset_urn: Union[str, DatasetUrn],
190
+ urn: Optional[Union[str, AssertionUrn]],
191
+ display_name: Optional[str],
192
+ enabled: Optional[bool],
193
+ criteria: Optional[SqlAssertionCriteria],
194
+ statement: Optional[str],
195
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
196
+ tags: Optional[TagsInputType],
197
+ updated_by: Union[str, CorpUserUrn],
198
+ now_utc: datetime,
199
+ schedule: Optional[Union[str, models.CronScheduleClass]],
200
+ ) -> _SqlAssertionInput:
201
+ if urn is None:
202
+ logger.info("URN is not set, building a new assertion input")
203
+ return self._build_sql_assertion_input(
204
+ dataset_urn=dataset_urn,
205
+ urn=None,
206
+ display_name=display_name,
207
+ enabled=enabled,
208
+ criteria=criteria,
209
+ statement=statement,
210
+ incident_behavior=incident_behavior,
211
+ tags=tags,
212
+ updated_by=updated_by,
213
+ now_utc=now_utc,
214
+ schedule=schedule,
215
+ )
216
+
217
+ assertion_input = self._build_sql_assertion_input(
218
+ dataset_urn=dataset_urn,
219
+ urn=urn,
220
+ display_name=display_name,
221
+ enabled=enabled,
222
+ criteria=criteria,
223
+ statement=statement,
224
+ incident_behavior=incident_behavior,
225
+ tags=tags,
226
+ updated_by=updated_by,
227
+ now_utc=now_utc,
228
+ schedule=schedule,
229
+ )
230
+
231
+ maybe_assertion_entity, monitor_urn, maybe_monitor_entity = (
232
+ self._retrieve_assertion_and_monitor(assertion_input)
233
+ )
234
+
235
+ existing_assertion: Optional[SqlAssertion] = None
236
+
237
+ if maybe_assertion_entity and maybe_monitor_entity:
238
+ existing_assertion = SqlAssertion._from_entities(
239
+ maybe_assertion_entity, maybe_monitor_entity
240
+ )
241
+ elif maybe_assertion_entity and not maybe_monitor_entity:
242
+ monitor_mode = "INACTIVE" if enabled is False else "ACTIVE"
243
+ existing_assertion = SqlAssertion._from_entities(
244
+ maybe_assertion_entity,
245
+ Monitor(id=monitor_urn, info=("ASSERTION", monitor_mode)),
246
+ )
247
+ elif not maybe_assertion_entity:
248
+ logger.info(
249
+ f"No existing assertion entity found for assertion urn {urn}, building a new assertion input"
250
+ )
251
+ return self._build_sql_assertion_input(
252
+ dataset_urn=dataset_urn,
253
+ urn=urn,
254
+ display_name=display_name,
255
+ enabled=enabled,
256
+ criteria=criteria,
257
+ statement=statement,
258
+ incident_behavior=incident_behavior,
259
+ tags=tags,
260
+ updated_by=updated_by,
261
+ now_utc=now_utc,
262
+ schedule=schedule,
263
+ )
264
+
265
+ # At this point, existing_assertion must be set (we return early if not maybe_assertion_entity)
266
+ assert existing_assertion is not None
267
+
268
+ # Validate dataset URN hasn't changed to prevent assertion corruption
269
+ if existing_assertion.dataset_urn != assertion_input.dataset_urn:
270
+ raise SDKUsageError(
271
+ f"Dataset URN mismatch, existing assertion: {existing_assertion.dataset_urn} != new assertion: {dataset_urn}"
272
+ )
273
+
274
+ merged_assertion_input = self._merge_sql_input(
275
+ dataset_urn=dataset_urn,
276
+ urn=urn,
277
+ display_name=display_name,
278
+ enabled=enabled,
279
+ incident_behavior=incident_behavior,
280
+ tags=tags,
281
+ now_utc=now_utc,
282
+ assertion_input=assertion_input,
283
+ maybe_assertion_entity=maybe_assertion_entity,
284
+ existing_assertion=existing_assertion,
285
+ schedule=schedule,
286
+ criteria=criteria,
287
+ statement=statement,
288
+ )
289
+
290
+ return merged_assertion_input
291
+
292
+ def _retrieve_assertion_and_monitor(
293
+ self,
294
+ assertion_input: _SqlAssertionInput,
295
+ ) -> tuple[Optional[Assertion], MonitorUrn, Optional[Monitor]]:
296
+ """Retrieve the assertion and monitor entities from the DataHub instance.
297
+
298
+ Args:
299
+ assertion_input: The validated input to the function.
300
+
301
+ Returns:
302
+ The assertion and monitor entities.
303
+ """
304
+ assert assertion_input.urn is not None, "URN is required"
305
+ return retrieve_assertion_and_monitor_by_urn(
306
+ self.client, assertion_input.urn, assertion_input.dataset_urn
307
+ )
308
+
309
+ def _merge_sql_input(
310
+ self,
311
+ dataset_urn: Union[str, DatasetUrn],
312
+ urn: Union[str, AssertionUrn],
313
+ display_name: Optional[str],
314
+ enabled: Optional[bool],
315
+ criteria: Optional[SqlAssertionCriteria],
316
+ statement: Optional[str],
317
+ incident_behavior: Optional[AssertionIncidentBehaviorInputTypes],
318
+ tags: Optional[TagsInputType],
319
+ now_utc: datetime,
320
+ assertion_input: _SqlAssertionInput,
321
+ maybe_assertion_entity: Optional[Assertion],
322
+ existing_assertion: SqlAssertion,
323
+ schedule: Optional[Union[str, models.CronScheduleClass]],
324
+ ) -> _SqlAssertionInput:
325
+ """Merge the input with the existing assertion and monitor entities.
326
+
327
+ Args:
328
+ dataset_urn: The urn of the dataset to be monitored.
329
+ urn: The urn of the assertion.
330
+ display_name: The display name of the assertion.
331
+ enabled: Whether the assertion is enabled.
332
+ criteria: The criteria of the assertion.
333
+ statement: The statement of the assertion.
334
+ incident_behavior: The incident behavior to be applied to the assertion.
335
+ tags: The tags to be applied to the assertion.
336
+ now_utc: The current UTC time from when the function is called.
337
+ assertion_input: The validated input to the function.
338
+ maybe_assertion_entity: The existing assertion entity from the DataHub instance.
339
+ existing_assertion: The existing assertion from the DataHub instance.
340
+ schedule: The schedule to be applied to the assertion.
341
+
342
+ Returns:
343
+ The merged assertion input.
344
+ """
345
+ merged_assertion_input = _SqlAssertionInput(
346
+ urn=urn,
347
+ entity_client=self.client.entities,
348
+ dataset_urn=dataset_urn,
349
+ display_name=_merge_field(
350
+ display_name,
351
+ "display_name",
352
+ assertion_input,
353
+ existing_assertion,
354
+ maybe_assertion_entity.description if maybe_assertion_entity else None,
355
+ ),
356
+ enabled=_merge_field(
357
+ enabled,
358
+ "enabled",
359
+ assertion_input,
360
+ existing_assertion,
361
+ existing_assertion.mode == AssertionMode.ACTIVE
362
+ if existing_assertion
363
+ else None,
364
+ ),
365
+ schedule=_merge_field(
366
+ schedule,
367
+ "schedule",
368
+ assertion_input,
369
+ existing_assertion,
370
+ # Note: existing_assertion.schedule is already derived from the monitor via _get_schedule()
371
+ existing_assertion.schedule if existing_assertion else None,
372
+ ),
373
+ criteria=_merge_field(
374
+ criteria,
375
+ "criteria",
376
+ assertion_input,
377
+ existing_assertion,
378
+ existing_assertion.criteria if existing_assertion else None,
379
+ ),
380
+ statement=_merge_field(
381
+ statement,
382
+ "statement",
383
+ assertion_input,
384
+ existing_assertion,
385
+ existing_assertion.statement if existing_assertion else None,
386
+ ),
387
+ incident_behavior=_merge_field(
388
+ incident_behavior,
389
+ "incident_behavior",
390
+ assertion_input,
391
+ existing_assertion,
392
+ SqlAssertion._get_incident_behavior(maybe_assertion_entity)
393
+ if maybe_assertion_entity
394
+ else None,
395
+ ),
396
+ tags=_merge_field(
397
+ tags,
398
+ "tags",
399
+ assertion_input,
400
+ existing_assertion,
401
+ maybe_assertion_entity.tags if maybe_assertion_entity else None,
402
+ ),
403
+ created_by=existing_assertion.created_by
404
+ or DEFAULT_CREATED_BY, # Override with the existing assertion's created_by or the default created_by if not set
405
+ created_at=existing_assertion.created_at
406
+ or now_utc, # Override with the existing assertion's created_at or now if not set
407
+ updated_by=assertion_input.updated_by, # Override with the input's updated_by
408
+ updated_at=assertion_input.updated_at, # Override with the input's updated_at (now)
409
+ )
410
+ return merged_assertion_input