datacoolie-studio 0.1.1__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 datacoolie-studio might be problematic. Click here for more details.

Files changed (240) hide show
  1. datacoolie_studio/__init__.py +3 -0
  2. datacoolie_studio/__main__.py +4 -0
  3. datacoolie_studio/api/__init__.py +1 -0
  4. datacoolie_studio/api/v1/__init__.py +3 -0
  5. datacoolie_studio/api/v1/contracts/__init__.py +1 -0
  6. datacoolie_studio/api/v1/contracts/assets.py +332 -0
  7. datacoolie_studio/api/v1/contracts/credentials.py +47 -0
  8. datacoolie_studio/api/v1/contracts/lineage.py +116 -0
  9. datacoolie_studio/api/v1/contracts/metadata.py +63 -0
  10. datacoolie_studio/api/v1/contracts/modules.py +20 -0
  11. datacoolie_studio/api/v1/contracts/monitoring.py +115 -0
  12. datacoolie_studio/api/v1/contracts/overview.py +80 -0
  13. datacoolie_studio/api/v1/contracts/shared.py +15 -0
  14. datacoolie_studio/api/v1/contracts/sources.py +337 -0
  15. datacoolie_studio/api/v1/contracts/workspace.py +218 -0
  16. datacoolie_studio/api/v1/router.py +26 -0
  17. datacoolie_studio/api/v1/routes/__init__.py +1 -0
  18. datacoolie_studio/api/v1/routes/assets.py +192 -0
  19. datacoolie_studio/api/v1/routes/credentials.py +158 -0
  20. datacoolie_studio/api/v1/routes/lineage.py +20 -0
  21. datacoolie_studio/api/v1/routes/metadata.py +241 -0
  22. datacoolie_studio/api/v1/routes/modules.py +28 -0
  23. datacoolie_studio/api/v1/routes/monitoring.py +348 -0
  24. datacoolie_studio/api/v1/routes/overview.py +19 -0
  25. datacoolie_studio/api/v1/routes/sources.py +406 -0
  26. datacoolie_studio/api/v1/routes/workspace.py +441 -0
  27. datacoolie_studio/cli.py +39 -0
  28. datacoolie_studio/core/__init__.py +1 -0
  29. datacoolie_studio/core/config.py +92 -0
  30. datacoolie_studio/core/identity.py +10 -0
  31. datacoolie_studio/core/time.py +28 -0
  32. datacoolie_studio/db/__init__.py +1 -0
  33. datacoolie_studio/db/models.py +421 -0
  34. datacoolie_studio/db/session.py +913 -0
  35. datacoolie_studio/domains/__init__.py +1 -0
  36. datacoolie_studio/domains/analysis/__init__.py +4 -0
  37. datacoolie_studio/domains/analysis/models.py +48 -0
  38. datacoolie_studio/domains/analysis/python.py +577 -0
  39. datacoolie_studio/domains/analysis/service.py +37 -0
  40. datacoolie_studio/domains/analysis/sql.py +99 -0
  41. datacoolie_studio/domains/analysis/symbols.py +89 -0
  42. datacoolie_studio/domains/analytics/__init__.py +1 -0
  43. datacoolie_studio/domains/analytics/access.py +148 -0
  44. datacoolie_studio/domains/analytics/connections.py +85 -0
  45. datacoolie_studio/domains/analytics/errors.py +26 -0
  46. datacoolie_studio/domains/analytics/maintenance.py +169 -0
  47. datacoolie_studio/domains/analytics/schema.py +400 -0
  48. datacoolie_studio/domains/analytics/serving_facts.py +291 -0
  49. datacoolie_studio/domains/analytics/store.py +882 -0
  50. datacoolie_studio/domains/assets/__init__.py +1 -0
  51. datacoolie_studio/domains/assets/identifiers.py +194 -0
  52. datacoolie_studio/domains/assets/manual_mapping.py +26 -0
  53. datacoolie_studio/domains/assets/mapping_target.py +17 -0
  54. datacoolie_studio/domains/assets/project_reference_registry.py +286 -0
  55. datacoolie_studio/domains/assets/reference_identity.py +166 -0
  56. datacoolie_studio/domains/assets/reference_mappings.py +107 -0
  57. datacoolie_studio/domains/assets/reference_resolution.py +93 -0
  58. datacoolie_studio/domains/assets/reference_source.py +206 -0
  59. datacoolie_studio/domains/assets/registry.py +194 -0
  60. datacoolie_studio/domains/assets/resolver.py +203 -0
  61. datacoolie_studio/domains/assets/service.py +1698 -0
  62. datacoolie_studio/domains/cache_admin/__init__.py +1 -0
  63. datacoolie_studio/domains/cache_admin/service.py +169 -0
  64. datacoolie_studio/domains/code_artifacts/__init__.py +1 -0
  65. datacoolie_studio/domains/code_artifacts/indexer.py +360 -0
  66. datacoolie_studio/domains/code_artifacts/materializer.py +401 -0
  67. datacoolie_studio/domains/code_artifacts/service.py +529 -0
  68. datacoolie_studio/domains/credentials/__init__.py +1 -0
  69. datacoolie_studio/domains/credentials/health.py +25 -0
  70. datacoolie_studio/domains/credentials/service.py +512 -0
  71. datacoolie_studio/domains/credentials/store.py +91 -0
  72. datacoolie_studio/domains/environment_caches.py +23 -0
  73. datacoolie_studio/domains/freshness/service.py +525 -0
  74. datacoolie_studio/domains/lineage/__init__.py +1 -0
  75. datacoolie_studio/domains/lineage/graph.py +686 -0
  76. datacoolie_studio/domains/lineage/models.py +106 -0
  77. datacoolie_studio/domains/lineage/service.py +506 -0
  78. datacoolie_studio/domains/logs/__init__.py +1 -0
  79. datacoolie_studio/domains/logs/control.py +126 -0
  80. datacoolie_studio/domains/logs/discovery.py +298 -0
  81. datacoolie_studio/domains/logs/ingestion.py +1073 -0
  82. datacoolie_studio/domains/logs/partition.py +174 -0
  83. datacoolie_studio/domains/logs/planner.py +372 -0
  84. datacoolie_studio/domains/logs/reader.py +231 -0
  85. datacoolie_studio/domains/logs/source_config.py +175 -0
  86. datacoolie_studio/domains/logs/system_logs.py +137 -0
  87. datacoolie_studio/domains/metadata/__init__.py +1 -0
  88. datacoolie_studio/domains/metadata/editor.py +1739 -0
  89. datacoolie_studio/domains/metadata/normalizer.py +350 -0
  90. datacoolie_studio/domains/metadata/reader.py +170 -0
  91. datacoolie_studio/domains/metadata/service.py +464 -0
  92. datacoolie_studio/domains/metadata/storage_io.py +295 -0
  93. datacoolie_studio/domains/modules/__init__.py +0 -0
  94. datacoolie_studio/domains/modules/catalog.py +72 -0
  95. datacoolie_studio/domains/modules/service.py +90 -0
  96. datacoolie_studio/domains/monitoring/__init__.py +1 -0
  97. datacoolie_studio/domains/monitoring/context.py +25 -0
  98. datacoolie_studio/domains/monitoring/diagnostics_repository.py +827 -0
  99. datacoolie_studio/domains/monitoring/log_repository.py +681 -0
  100. datacoolie_studio/domains/monitoring/metrics/__init__.py +2 -0
  101. datacoolie_studio/domains/monitoring/metrics/common_projections.py +1110 -0
  102. datacoolie_studio/domains/monitoring/metrics/diagnostics_projections.py +765 -0
  103. datacoolie_studio/domains/monitoring/metrics/failure.py +223 -0
  104. datacoolie_studio/domains/monitoring/metrics/failure_taxonomy.py +112 -0
  105. datacoolie_studio/domains/monitoring/metrics/failures_projections.py +410 -0
  106. datacoolie_studio/domains/monitoring/metrics/freshness_projections.py +740 -0
  107. datacoolie_studio/domains/monitoring/metrics/health.py +102 -0
  108. datacoolie_studio/domains/monitoring/metrics/maintenance_projections.py +55 -0
  109. datacoolie_studio/domains/monitoring/metrics/overview_projections.py +1554 -0
  110. datacoolie_studio/domains/monitoring/metrics/performance_projections.py +941 -0
  111. datacoolie_studio/domains/monitoring/metrics/volume.py +21 -0
  112. datacoolie_studio/domains/monitoring/metrics/volume_projections.py +751 -0
  113. datacoolie_studio/domains/monitoring/page_service.py +1276 -0
  114. datacoolie_studio/domains/monitoring/query_service.py +339 -0
  115. datacoolie_studio/domains/monitoring/read_models/__init__.py +2 -0
  116. datacoolie_studio/domains/monitoring/read_models/common.py +217 -0
  117. datacoolie_studio/domains/monitoring/read_models/dataflows.py +227 -0
  118. datacoolie_studio/domains/monitoring/read_models/duration_distribution.py +291 -0
  119. datacoolie_studio/domains/monitoring/read_models/failures.py +346 -0
  120. datacoolie_studio/domains/monitoring/read_models/freshness.py +468 -0
  121. datacoolie_studio/domains/monitoring/read_models/jobs.py +274 -0
  122. datacoolie_studio/domains/monitoring/read_models/maintenance.py +367 -0
  123. datacoolie_studio/domains/monitoring/read_models/operation_windows.py +101 -0
  124. datacoolie_studio/domains/monitoring/read_models/overview.py +376 -0
  125. datacoolie_studio/domains/monitoring/read_models/performance.py +376 -0
  126. datacoolie_studio/domains/monitoring/read_models/runtime_phase.py +144 -0
  127. datacoolie_studio/domains/monitoring/read_models/volume.py +439 -0
  128. datacoolie_studio/domains/monitoring/repository.py +174 -0
  129. datacoolie_studio/domains/overview/__init__.py +1 -0
  130. datacoolie_studio/domains/overview/service.py +374 -0
  131. datacoolie_studio/domains/read_models/__init__.py +1 -0
  132. datacoolie_studio/domains/read_models/cache.py +135 -0
  133. datacoolie_studio/domains/read_models/contracts.py +84 -0
  134. datacoolie_studio/domains/read_models/coordinator.py +43 -0
  135. datacoolie_studio/domains/read_models/database.py +139 -0
  136. datacoolie_studio/domains/read_models/keys.py +8 -0
  137. datacoolie_studio/domains/read_models/provider.py +83 -0
  138. datacoolie_studio/domains/read_models/sqlite_store.py +419 -0
  139. datacoolie_studio/domains/source_observation/__init__.py +1 -0
  140. datacoolie_studio/domains/source_observation/contracts.py +31 -0
  141. datacoolie_studio/domains/source_observation/repository.py +431 -0
  142. datacoolie_studio/domains/sources/__init__.py +1 -0
  143. datacoolie_studio/domains/sources/discovery.py +382 -0
  144. datacoolie_studio/domains/sources/initialization.py +331 -0
  145. datacoolie_studio/domains/sources/registration.py +198 -0
  146. datacoolie_studio/domains/sources/scan_policy.py +18 -0
  147. datacoolie_studio/domains/sources/service.py +344 -0
  148. datacoolie_studio/domains/sources/storage_binding.py +175 -0
  149. datacoolie_studio/domains/storage/__init__.py +19 -0
  150. datacoolie_studio/domains/storage/adapters.py +232 -0
  151. datacoolie_studio/domains/storage/binding.py +131 -0
  152. datacoolie_studio/domains/storage/concurrency.py +73 -0
  153. datacoolie_studio/domains/storage/dbfs_adapter.py +391 -0
  154. datacoolie_studio/domains/storage/errors.py +48 -0
  155. datacoolie_studio/domains/storage/factory.py +612 -0
  156. datacoolie_studio/domains/storage/fsspec_adapter.py +298 -0
  157. datacoolie_studio/domains/storage/inventory.py +68 -0
  158. datacoolie_studio/domains/storage/onelake_adapter.py +385 -0
  159. datacoolie_studio/domains/storage/redaction.py +51 -0
  160. datacoolie_studio/domains/storage/uri.py +405 -0
  161. datacoolie_studio/domains/storage/writers.py +207 -0
  162. datacoolie_studio/domains/studio_settings/__init__.py +1 -0
  163. datacoolie_studio/domains/studio_settings/service.py +377 -0
  164. datacoolie_studio/domains/sync/__init__.py +1 -0
  165. datacoolie_studio/domains/sync/scheduler.py +437 -0
  166. datacoolie_studio/domains/sync/service.py +479 -0
  167. datacoolie_studio/domains/workspace/__init__.py +1 -0
  168. datacoolie_studio/domains/workspace/service.py +1811 -0
  169. datacoolie_studio/main.py +99 -0
  170. datacoolie_studio/openapi_export.py +61 -0
  171. datacoolie_studio/static/assets/AssetsView-vCuWkfcX.js +6 -0
  172. datacoolie_studio/static/assets/DataflowDetails-OjA7gsqR.js +1 -0
  173. datacoolie_studio/static/assets/DataflowsPage-DK1QOX26.js +2 -0
  174. datacoolie_studio/static/assets/DiagnosticsDetails-RxPFL4ym.js +1 -0
  175. datacoolie_studio/static/assets/DiagnosticsPage-Bf1NIOu2.js +1 -0
  176. datacoolie_studio/static/assets/FailurePage-2Eyc15EZ.js +6 -0
  177. datacoolie_studio/static/assets/FreshnessDetails-9M4X_DOi.js +4 -0
  178. datacoolie_studio/static/assets/FreshnessPage-BHNnIaqW.js +3 -0
  179. datacoolie_studio/static/assets/JobDetails-Bv53Hr_S.js +1 -0
  180. datacoolie_studio/static/assets/JobsPage-C_cdRY9h.js +1 -0
  181. datacoolie_studio/static/assets/LineageFormatIcon-rLhTbw0T.js +1 -0
  182. datacoolie_studio/static/assets/LineageView-Cwsm7vjw.js +7 -0
  183. datacoolie_studio/static/assets/MaintenanceDetails-C8Jc-b5D.js +6 -0
  184. datacoolie_studio/static/assets/MaintenancePage-3uGAkMo8.js +1 -0
  185. datacoolie_studio/static/assets/MetadataExplorer-V0caV9sd.css +1 -0
  186. datacoolie_studio/static/assets/MetadataExplorer-bSRRT0Ll.js +9 -0
  187. datacoolie_studio/static/assets/MetadataSourceSaveConfirmationDialog-C8ZJ_2e_.js +14 -0
  188. datacoolie_studio/static/assets/MonitoringCharts-CC7OCgoF.js +1 -0
  189. datacoolie_studio/static/assets/MonitoringDetailDrawer-4LvsRNks.js +3 -0
  190. datacoolie_studio/static/assets/MonitoringOverviewPage-QNCgxUIA.js +5 -0
  191. datacoolie_studio/static/assets/MonitoringView-D6MEWL63.css +1 -0
  192. datacoolie_studio/static/assets/MonitoringView-NoOUDiVg.js +2 -0
  193. datacoolie_studio/static/assets/OverviewPage-C0WSHYro.js +1 -0
  194. datacoolie_studio/static/assets/PerformancePage-CdNK9Bca.js +1 -0
  195. datacoolie_studio/static/assets/ProjectDetailPage-C6w9UsTz.css +1 -0
  196. datacoolie_studio/static/assets/ProjectDetailPage-DLdKfKNB.js +2 -0
  197. datacoolie_studio/static/assets/ProjectReferenceMappingsPage-BJspA7j8.css +1 -0
  198. datacoolie_studio/static/assets/ProjectReferenceMappingsPage-dhSnHFg0.js +1 -0
  199. datacoolie_studio/static/assets/ProjectsPage-DNLsEiIv.js +1 -0
  200. datacoolie_studio/static/assets/ProjectsPage-vdpfip9H.css +1 -0
  201. datacoolie_studio/static/assets/ReferenceMappingClearAction-C6LQUfuf.js +1 -0
  202. datacoolie_studio/static/assets/SettingsPage-ZGvDgc9e.css +1 -0
  203. datacoolie_studio/static/assets/SettingsPage-k_vDsGD4.js +1 -0
  204. datacoolie_studio/static/assets/VolumeDetails-wMWIvHNh.js +1 -0
  205. datacoolie_studio/static/assets/VolumePage-C8y6Frcb.js +2 -0
  206. datacoolie_studio/static/assets/apache-iceberg-R2p7bF3B.png +0 -0
  207. datacoolie_studio/static/assets/arrow-right-aQ3DmqkS.js +1 -0
  208. datacoolie_studio/static/assets/assetsQueries-DFUOUzAA.css +1 -0
  209. datacoolie_studio/static/assets/assetsQueries-ZtkHjUST.js +4 -0
  210. datacoolie_studio/static/assets/briefcase-business-DLf18_Wp.js +1 -0
  211. datacoolie_studio/static/assets/check-CSpsDKPU.js +1 -0
  212. datacoolie_studio/static/assets/clock-3-CA9klMyv.js +1 -0
  213. datacoolie_studio/static/assets/copy-CWqWXEY7.js +1 -0
  214. datacoolie_studio/static/assets/createLucideIcon-BhqHmOOf.js +1 -0
  215. datacoolie_studio/static/assets/csv-C4NWHdH_.png +0 -0
  216. datacoolie_studio/static/assets/datacoolie-icon-circle-dark_512x512-DwVkWtvb.png +0 -0
  217. datacoolie_studio/static/assets/delta-lake-BRtZiC8P.svg +3 -0
  218. datacoolie_studio/static/assets/detailPrimitives-Cv9964IQ.js +7 -0
  219. datacoolie_studio/static/assets/diagnosticsPresentation-BKNgfDsk.js +1 -0
  220. datacoolie_studio/static/assets/elk-worker.min-CGXVyog-.js +22 -0
  221. datacoolie_studio/static/assets/environmentOrder-3LYM9lXF.js +1 -0
  222. datacoolie_studio/static/assets/filter-x-CKvm18zY.js +1 -0
  223. datacoolie_studio/static/assets/index-DA9YUC7H.css +1 -0
  224. datacoolie_studio/static/assets/index-I7fwgNxR.js +9 -0
  225. datacoolie_studio/static/assets/layers-dGVk40Sl.js +1 -0
  226. datacoolie_studio/static/assets/maintenancePresentation-CDQkWMeT.js +1 -0
  227. datacoolie_studio/static/assets/monitoringPrimitives-BeOZ1vCB.js +7 -0
  228. datacoolie_studio/static/assets/presentation-CcKn-X3g.js +1 -0
  229. datacoolie_studio/static/assets/python-function-UdGeVhw2.png +0 -0
  230. datacoolie_studio/static/assets/referenceResolutionPresentation-dqKWf8rz.js +1 -0
  231. datacoolie_studio/static/assets/rolldown-runtime-CMxvf4Kt.js +1 -0
  232. datacoolie_studio/static/assets/vendor-echarts~FreshnessPage~MaintenancePage~VolumePage~PerformancePage~DiagnosticsPage~Fai~fa3hdhun-BhjplSoL.js +18 -0
  233. datacoolie_studio/static/assets/workflow-DUl94VGi.js +1 -0
  234. datacoolie_studio/static/assets/wrap-text-Dh2kbzwR.js +1 -0
  235. datacoolie_studio/static/favicon.png +0 -0
  236. datacoolie_studio/static/index.html +16 -0
  237. datacoolie_studio-0.1.1.dist-info/METADATA +463 -0
  238. datacoolie_studio-0.1.1.dist-info/RECORD +240 -0
  239. datacoolie_studio-0.1.1.dist-info/WHEEL +4 -0
  240. datacoolie_studio-0.1.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,3 @@
1
+ """DataCoolie Studio package."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,4 @@
1
+ from datacoolie_studio.cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+ from datacoolie_studio.api.v1.router import api_router
2
+
3
+ __all__ = ["api_router"]
@@ -0,0 +1 @@
1
+ """Router-aligned API contracts."""
@@ -0,0 +1,332 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Literal
4
+
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+ from datacoolie_studio.api.v1.contracts.lineage import SourceLocationResponse
7
+ from datacoolie_studio.api.v1.contracts.shared import ReferenceResolutionResponse, ReferenceType, TargetIdentifierKind
8
+ from datacoolie_studio.api.v1.contracts.workspace import ProjectReferenceMappingRead
9
+
10
+ class AssetSummaryResponse(BaseModel):
11
+ assets: int
12
+ references: int = 0
13
+ manual_mappings: int = 0
14
+ visible: int = 0
15
+ asset_attention: int = 0
16
+ with_attention: int = 0
17
+ automatic_references: int = 0
18
+ manual_references: int = 0
19
+ unresolved_references: int = 0
20
+
21
+
22
+ class AssetMetadataSourceResponse(BaseModel):
23
+ id: int
24
+ uri: str
25
+
26
+
27
+ class AssetAttentionResponse(BaseModel):
28
+ severity: Literal["info", "warning", "error"]
29
+ code: str
30
+ message: str
31
+ source_type: str
32
+ subject_type: str = "asset"
33
+ dataflow_id: str | None = None
34
+ metadata_source_id: int | None = None
35
+ reference_id: str | None = None
36
+ reference_occurrence_id: str | None = None
37
+ details: dict[str, Any] = Field(default_factory=dict)
38
+
39
+
40
+ class AssetResponse(BaseModel):
41
+ model_config = ConfigDict(extra="allow")
42
+
43
+ id: str
44
+ display_name: str
45
+ friendly_name: str
46
+ full_identity: str
47
+ asset_type: Literal["table", "path", "sql_query", "python_function", "api", "unresolved"]
48
+ format: str | None = None
49
+ connection_name: str | None = None
50
+ connection_type: str | None = None
51
+ catalog: str | None = None
52
+ database: str | None = None
53
+ schema_name: str | None = None
54
+ table: str | None = None
55
+ path: str | None = None
56
+ query: str | None = None
57
+ python_function: str | None = None
58
+ roles: list[str] = Field(default_factory=list)
59
+ metadata_source_ids: list[int] = Field(default_factory=list)
60
+ metadata_sources: list[AssetMetadataSourceResponse] = Field(default_factory=list)
61
+ upstream_count: int
62
+ downstream_count: int
63
+ input_dataflow_count: int
64
+ output_dataflow_count: int
65
+ depends_on_count: int
66
+ used_by_count: int = 0
67
+ attention_count: int
68
+ attention_items: list[AssetAttentionResponse] = Field(default_factory=list)
69
+ identifiers: list[dict[str, Any]] = Field(default_factory=list)
70
+ observations: list[dict[str, Any]] = Field(default_factory=list)
71
+
72
+
73
+ class AssetFilterOptionsResponse(BaseModel):
74
+ connections: list[str] = Field(default_factory=list)
75
+ formats: list[str] = Field(default_factory=list)
76
+ asset_types: list[str] = Field(default_factory=list)
77
+ roles: list[str] = Field(default_factory=list)
78
+ attention_states: list[str] = Field(default_factory=list)
79
+
80
+
81
+ class AssetReferenceGroupResponse(BaseModel):
82
+ model_config = ConfigDict(extra="allow")
83
+
84
+ id: str
85
+ reference_type: ReferenceType
86
+ normalized_value: str
87
+ display_name: str
88
+ resolution: ReferenceResolutionResponse
89
+ resolved_asset_id: str | None = None
90
+ resolved_asset_ids: list[str] = Field(default_factory=list)
91
+ resolved_asset: dict[str, Any] | None = None
92
+ candidate_asset_ids: list[str] = Field(default_factory=list)
93
+ candidate_assets: list[dict[str, Any]] = Field(default_factory=list)
94
+ occurrence_ids: list[str] = Field(default_factory=list)
95
+ consumer_asset_ids: list[str] = Field(default_factory=list)
96
+ consumer_assets: list[dict[str, Any]] = Field(default_factory=list)
97
+ provenances: list[str] = Field(default_factory=list)
98
+ resolution_methods: list[str] = Field(default_factory=list)
99
+ occurrence_count: int | None = None
100
+ dependency_count: int = 0
101
+ dataflow_ids: list[str] = Field(default_factory=list)
102
+ attention_count: int = 0
103
+ attention_items: list[AssetAttentionResponse] = Field(default_factory=list)
104
+ observations: list[dict[str, Any]] = Field(default_factory=list)
105
+ manual_mapping: dict[str, Any] | None = None
106
+
107
+
108
+ class AssetReferenceOccurrenceResponse(BaseModel):
109
+ model_config = ConfigDict(extra="allow")
110
+
111
+ id: str
112
+ reference_id: str
113
+ reference_type: ReferenceType
114
+ raw_value: str
115
+ normalized_value: str
116
+ context_scope: str | None = None
117
+ context_scope_source: Literal["detected", "metadata_context"] | None = None
118
+ source_location: SourceLocationResponse | None = None
119
+ display_name: str
120
+ provenance: Literal["sql", "python", "python_sql"] | None = None
121
+ consumer_asset_id: str | None = None
122
+ consumer_asset: dict[str, Any] | None = None
123
+ connection_name: str | None = None
124
+ resolution: ReferenceResolutionResponse
125
+ resolution_method: str | None = None
126
+ resolved_asset_id: str | None = None
127
+ resolved_asset: dict[str, Any] | None = None
128
+ candidate_asset_ids: list[str] = Field(default_factory=list)
129
+ candidate_assets: list[dict[str, Any]] = Field(default_factory=list)
130
+ dependency_count: int = 0
131
+ dataflow_ids: list[str] = Field(default_factory=list)
132
+ attention_count: int = 0
133
+ attention_items: list[AssetAttentionResponse] = Field(default_factory=list)
134
+ observations: list[dict[str, Any]] = Field(default_factory=list)
135
+ manual_mapping: dict[str, Any] | None = None
136
+
137
+
138
+ class AssetListItemResponse(BaseModel):
139
+ model_config = ConfigDict(extra="allow")
140
+
141
+ id: str
142
+ display_name: str
143
+ friendly_name: str
144
+ full_identity: str
145
+ asset_type: Literal["table", "path", "sql_query", "python_function", "api", "unresolved"]
146
+ format: str | None = None
147
+ connection_name: str | None = None
148
+ connection_type: str | None = None
149
+ catalog: str | None = None
150
+ database: str | None = None
151
+ schema_name: str | None = None
152
+ table: str | None = None
153
+ path: str | None = None
154
+ query: str | None = None
155
+ python_function: str | None = None
156
+ roles: list[str] = Field(default_factory=list)
157
+ metadata_source_ids: list[int] = Field(default_factory=list)
158
+ upstream_count: int
159
+ downstream_count: int
160
+ input_dataflow_count: int
161
+ output_dataflow_count: int
162
+ depends_on_count: int
163
+ used_by_count: int = 0
164
+ attention_count: int
165
+ identifier_count: int
166
+ observation_count: int
167
+ metadata_source_count: int
168
+ mapping_target: dict[str, str] | None = None
169
+
170
+
171
+ class AssetInventoryResponse(BaseModel):
172
+ summary: AssetSummaryResponse
173
+ items: list[AssetListItemResponse]
174
+ filter_options: AssetFilterOptionsResponse
175
+ catalog_version: str
176
+
177
+
178
+ class AssetReferenceListResponse(BaseModel):
179
+ items: list[AssetReferenceGroupResponse]
180
+ filter_options: dict[str, list[str]] = Field(default_factory=dict)
181
+ catalog_version: str
182
+
183
+
184
+ class ProjectReferenceRegistryTargetResponse(BaseModel):
185
+ id: str
186
+ asset_id: str
187
+ asset_ids: list[str] = Field(default_factory=list)
188
+ environment_ids: list[int] = Field(default_factory=list)
189
+ environment_names: list[str] = Field(default_factory=list)
190
+ asset_type: Literal["table", "path", "sql_query", "python_function", "api", "unresolved"]
191
+ format: str | None = None
192
+ connection_name: str
193
+ display_name: str
194
+ context: str | None = None
195
+ kind: TargetIdentifierKind
196
+ value: str
197
+ display: str
198
+
199
+
200
+ class ProjectReferenceRegistryEnvironmentResponse(BaseModel):
201
+ environment_id: int
202
+ environment_name: str
203
+ resolution: ReferenceResolutionResponse
204
+ resolved_asset_id: str | None = None
205
+ resolved_asset_ids: list[str] = Field(default_factory=list)
206
+ observed_target_ids: list[str] = Field(default_factory=list)
207
+ candidate_asset_ids: list[str] = Field(default_factory=list)
208
+ manual_mapping_id: int | None = None
209
+ manual_mapping_status: str | None = None
210
+ occurrence_count: int = 0
211
+ consumer_count: int = 0
212
+
213
+
214
+ class ProjectReferenceRegistryObservedTargetResponse(BaseModel):
215
+ target: ProjectReferenceRegistryTargetResponse
216
+ environment_ids: list[int] = Field(default_factory=list)
217
+ environment_names: list[str] = Field(default_factory=list)
218
+
219
+
220
+ class ProjectReferenceRegistryTargetCoverageResponse(BaseModel):
221
+ available_environment_names: list[str] = Field(default_factory=list)
222
+ missing_environment_names: list[str] = Field(default_factory=list)
223
+ available: int
224
+ total: int
225
+
226
+
227
+ class ProjectReferenceRegistryRowResponse(BaseModel):
228
+ id: str
229
+ reference_type: ReferenceType
230
+ normalized_value: str
231
+ mapping: ProjectReferenceMappingRead | None = None
232
+ resolution: ReferenceResolutionResponse
233
+ environments: list[ProjectReferenceRegistryEnvironmentResponse] = Field(default_factory=list)
234
+ candidate_asset_ids: list[str] = Field(default_factory=list)
235
+ resolved_asset_ids: list[str] = Field(default_factory=list)
236
+ target: ProjectReferenceRegistryTargetResponse | None = None
237
+ observed_targets: list[ProjectReferenceRegistryObservedTargetResponse] = Field(default_factory=list)
238
+ target_coverage: ProjectReferenceRegistryTargetCoverageResponse
239
+
240
+
241
+ class ProjectReferenceRegistryFailureResponse(BaseModel):
242
+ environment_id: int
243
+ environment_name: str
244
+ message: str
245
+
246
+
247
+ class ProjectReferenceRegistryResponse(BaseModel):
248
+ project_id: int
249
+ mappings: list[ProjectReferenceMappingRead]
250
+ rows: list[ProjectReferenceRegistryRowResponse]
251
+ targets: list[ProjectReferenceRegistryTargetResponse]
252
+ failures: list[ProjectReferenceRegistryFailureResponse]
253
+
254
+
255
+ class AssetReferenceDetailResponse(BaseModel):
256
+ reference: AssetReferenceGroupResponse
257
+ occurrences: list[AssetReferenceOccurrenceResponse] = Field(default_factory=list)
258
+ catalog_version: str
259
+
260
+
261
+ class AssetSourceResponse(BaseModel):
262
+ definition: "AssetDefinitionResponse"
263
+ catalog_version: str
264
+
265
+
266
+ class AssetDefinitionDiagnosticResponse(BaseModel):
267
+ severity: Literal["info", "warning", "error"]
268
+ code: str
269
+ message: str
270
+ details: dict[str, Any] = Field(default_factory=dict)
271
+
272
+
273
+ class AssetDefinitionResponse(BaseModel):
274
+ model_config = ConfigDict(extra="allow")
275
+
276
+ kind: Literal["sql_query", "python_function", "api", "path", "unresolved"]
277
+ language: str | None = None
278
+ status: Literal["available", "unavailable", "ambiguous", "empty"]
279
+ title: str | None = None
280
+ raw: str | None = None
281
+ formatted: str | None = None
282
+ source: str | None = None
283
+ function_path: str | None = None
284
+ module_name: str | None = None
285
+ relative_path: str | None = None
286
+ line_count: int = 0
287
+ diagnostics: list[AssetDefinitionDiagnosticResponse] = Field(default_factory=list)
288
+
289
+
290
+ class AssetDetailResponse(BaseModel):
291
+ asset: AssetResponse
292
+ definition: AssetDefinitionResponse | None = None
293
+ attention_items: list[AssetAttentionResponse] = Field(default_factory=list)
294
+ direct_relationships: dict[str, Any] = Field(default_factory=dict)
295
+ upstream_assets: list[dict[str, Any]] = Field(default_factory=list)
296
+ downstream_assets: list[dict[str, Any]] = Field(default_factory=list)
297
+ input_flows: list[dict[str, Any]] = Field(default_factory=list)
298
+ output_flows: list[dict[str, Any]] = Field(default_factory=list)
299
+ depends_on: list[dict[str, Any]] = Field(default_factory=list)
300
+ used_by: list[dict[str, Any]] = Field(default_factory=list)
301
+
302
+
303
+ class ReferenceSourceMatchResponse(BaseModel):
304
+ line: int
305
+ column: int
306
+ end_line: int
307
+ end_column: int
308
+ precision: Literal["exact_reference", "detection_expression", "location_only"]
309
+
310
+
311
+ class ReferenceSourceViewResponse(BaseModel):
312
+ id: Literal["query_source", "consumer_source", "evaluated_sql"]
313
+ label: str
314
+ language: Literal["sql", "python"]
315
+ content: str
316
+ path: str | None = None
317
+ function_path: str | None = None
318
+ module_name: str | None = None
319
+ matches: list[ReferenceSourceMatchResponse] = Field(default_factory=list)
320
+
321
+
322
+ class ReferenceSourceDiagnosticResponse(BaseModel):
323
+ severity: Literal["info", "warning", "error"]
324
+ code: str
325
+ message: str
326
+
327
+
328
+ class ReferenceOccurrenceSourceResponse(BaseModel):
329
+ occurrence_id: str
330
+ consumer_asset_id: str
331
+ views: list[ReferenceSourceViewResponse] = Field(default_factory=list)
332
+ diagnostics: list[ReferenceSourceDiagnosticResponse] = Field(default_factory=list)
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime
4
+ from typing import Any, Literal
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ CredentialProvider = Literal["s3", "minio", "adls", "onelake", "gcs", "dbfs"]
10
+
11
+
12
+ class CredentialProfileCreateRequest(BaseModel):
13
+ name: str = Field(min_length=1, max_length=255)
14
+ provider: CredentialProvider
15
+ auth_type: str = Field(min_length=1, max_length=50)
16
+ config: dict[str, Any] = Field(default_factory=dict)
17
+ secret: dict[str, Any] | None = None
18
+
19
+
20
+ class CredentialProfileUpdateRequest(BaseModel):
21
+ name: str | None = Field(default=None, min_length=1, max_length=255)
22
+ config: dict[str, Any] | None = None
23
+ secret: dict[str, Any] | None = None
24
+
25
+
26
+ class CredentialProfileInfo(BaseModel):
27
+ id: str
28
+ name: str
29
+ provider: CredentialProvider
30
+ auth_type: str
31
+ secret_state: Literal["present", "missing", "unavailable"]
32
+ masked_summary: dict[str, Any]
33
+ version: int
34
+ reference_count: int
35
+ created_at: datetime
36
+ updated_at: datetime
37
+
38
+
39
+ class CredentialProfileDetail(CredentialProfileInfo):
40
+ config: dict[str, Any]
41
+
42
+
43
+ class CredentialCapabilities(BaseModel):
44
+ providers: dict[str, list[str]]
45
+ secret_store_available: bool
46
+ secret_store_backend: str
47
+ remediation: str | None = None
@@ -0,0 +1,116 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Literal
4
+
5
+ from pydantic import BaseModel, Field, field_validator
6
+ from datacoolie_studio.api.v1.contracts.shared import ReferenceResolutionResponse, ReferenceType
7
+
8
+ class LineageSummaryResponse(BaseModel):
9
+ assets: int
10
+ references: int
11
+ dataflows: int
12
+ dependencies: int
13
+ stitched_assets: int
14
+ declared_assets: int
15
+ automatic_references: int
16
+ manual_references: int
17
+ unresolved_references: int
18
+ automatic_dependencies: int
19
+ manual_dependencies: int
20
+ unresolved_dependencies: int
21
+ diagnostics: int
22
+
23
+
24
+ class LineageAssetResponse(BaseModel):
25
+ id: str
26
+ entity_type: Literal["asset"]
27
+ asset_type: Literal["table", "path", "sql_query", "python_function", "api", "unresolved"]
28
+ declaration_status: Literal["declared", "discovered_only"]
29
+ display_name: str
30
+ label: str
31
+ display_label: str | None = None
32
+ endpoint_locator: str | None = None
33
+ endpoint_kind: str | None = None
34
+ identity_type: str | None = None
35
+ connection_name: str | None = None
36
+ connection_type: str | None = None
37
+ format: str | None = None
38
+ catalog: str | None = None
39
+ database: str | None = None
40
+ schema_name: str | None = None
41
+ table: str | None = None
42
+ path: str | None = None
43
+ python_function: str | None = None
44
+ metadata_source_ids: list[int] = Field(default_factory=list)
45
+ roles: list[str] = Field(default_factory=list)
46
+ connection_names: list[str] = Field(default_factory=list)
47
+ mapping_target: dict[str, str] | None = None
48
+
49
+
50
+ class LineageReferenceResponse(BaseModel):
51
+ id: str
52
+ entity_type: Literal["reference"]
53
+ reference_type: ReferenceType
54
+ display_name: str
55
+ normalized_value: str
56
+ resolution: ReferenceResolutionResponse
57
+ resolved_asset_id: str | None = None
58
+ resolved_asset_ids: list[str] = Field(default_factory=list)
59
+ candidate_asset_ids: list[str] = Field(default_factory=list)
60
+ occurrence_count: int = 0
61
+ consumer_asset_ids: list[str] = Field(default_factory=list)
62
+ provenances: list[Literal["sql", "python", "python_sql"]] = Field(default_factory=list)
63
+ dependency_count: int = 0
64
+ manual_mapping: dict[str, Any] | None = None
65
+
66
+ @field_validator("reference_type", mode="before")
67
+ @classmethod
68
+ def normalize_reference_type(cls, value: Any) -> Any:
69
+ if str(value or "").strip().lower() == "dynamic_expression":
70
+ return "unknown"
71
+ return value
72
+
73
+
74
+ class SourceLocationResponse(BaseModel):
75
+ module: str | None = None
76
+ path: str | None = None
77
+ function_path: str | None = None
78
+ line: int | None = None
79
+ column: int | None = None
80
+ end_line: int | None = None
81
+ end_column: int | None = None
82
+ coordinate_space: Literal["query_source", "function_source"] | None = None
83
+
84
+
85
+ class LineageDataflowResponse(BaseModel):
86
+ id: str
87
+ dataflow_id: str
88
+ name: str
89
+ source_asset_id: str
90
+ destination_asset_id: str
91
+ stage: str | None = None
92
+ load_type: str | None = None
93
+ metadata_source_id: int
94
+ metadata_source_uri: str
95
+
96
+
97
+ class LineageDependencyResponse(BaseModel):
98
+ id: str
99
+ target_asset_id: str
100
+ consumer_asset_id: str
101
+ kind: Literal["reads", "uses"]
102
+ provenance: Literal["sql", "python", "python_sql"]
103
+ resolution: ReferenceResolutionResponse
104
+ resolution_method: str
105
+ reference_id: str
106
+ reference_occurrence_id: str
107
+ resolved_asset_id: str | None = None
108
+
109
+
110
+ class LineageResponse(BaseModel):
111
+ schema_version: Literal["lineage.v4"]
112
+ summary: LineageSummaryResponse
113
+ assets: list[LineageAssetResponse]
114
+ references: list[LineageReferenceResponse]
115
+ dataflows: list[LineageDataflowResponse]
116
+ dependencies: list[LineageDependencyResponse]
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime
4
+ from typing import Any, Literal
5
+
6
+ from pydantic import BaseModel
7
+
8
+ class MetadataResponse(BaseModel):
9
+ summary: dict[str, Any]
10
+ sources: list[dict[str, Any]]
11
+ connections: list[dict[str, Any]]
12
+ dataflows: list[dict[str, Any]]
13
+ schema_hints: list[dict[str, Any]]
14
+ errors: list[dict[str, Any]]
15
+
16
+
17
+ class MetadataEditorDocumentResponse(BaseModel):
18
+ source: dict[str, Any]
19
+ sheets: dict[str, Any]
20
+ issues: list[dict[str, Any]]
21
+
22
+
23
+ class MetadataEditorWorkspaceResponse(BaseModel):
24
+ schema_version: Literal["metadata-editor-workspace.v1"]
25
+ environment_id: int
26
+ metadata_catalog_version: str
27
+ document: MetadataEditorDocumentResponse
28
+ draft: MetadataEditorDocumentResponse | None = None
29
+
30
+
31
+ class MetadataEditorValidationRequest(BaseModel):
32
+ source: dict[str, Any] | None = None
33
+ sheets: dict[str, Any]
34
+ issues: list[dict[str, Any]] = []
35
+
36
+
37
+ class MetadataEditorValidationResponse(BaseModel):
38
+ status: str
39
+ summary: dict[str, Any]
40
+ issues: list[dict[str, Any]]
41
+
42
+
43
+ class MetadataEditorSaveRequest(BaseModel):
44
+ expected_revision: dict[str, Any]
45
+ editor_document: MetadataEditorValidationRequest
46
+ confirm_overwrite: bool = False
47
+
48
+
49
+ class MetadataBackupResponse(BaseModel):
50
+ id: int
51
+ project_id: int
52
+ environment_id: int
53
+ source_id: int
54
+ source_uri: str
55
+ backup_path: str
56
+ source_revision: dict[str, Any] | None = None
57
+ saved_revision: dict[str, Any] | None = None
58
+ created_at: datetime
59
+
60
+
61
+ class MetadataBackupRestoreRequest(BaseModel):
62
+ expected_revision: dict[str, Any]
63
+ confirm_restore: bool = False
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import BaseModel
6
+
7
+ class ModuleInfo(BaseModel):
8
+ key: str
9
+ name: str
10
+ description: str
11
+ group: str
12
+ status: Literal["available", "coming_soon"]
13
+ togglable: bool
14
+ default_enabled: bool
15
+ pages: list[str]
16
+ enabled: bool
17
+
18
+
19
+ class ModuleStateUpdateRequest(BaseModel):
20
+ enabled: bool