2
2
from __future__ import annotations
3
3
4
4
from pathlib import Path
5
- from typing import Any , Optional , TypeVar , Union
5
+ from typing import Any , Optional , Union
6
6
7
7
import attr
8
+ from attrs import define
8
9
from cattrs import global_converter , structure
9
10
from gooddata_api_client .model .declarative_analytical_dashboard import DeclarativeAnalyticalDashboard
10
11
from gooddata_api_client .model .declarative_analytical_dashboard_extension import DeclarativeAnalyticalDashboardExtension
17
18
from gooddata_api_client .model .declarative_visualization_object import DeclarativeVisualizationObject
18
19
19
20
from gooddata_sdk .catalog .base import Base
20
- from gooddata_sdk .catalog .identifier import CatalogUserIdentifier
21
21
from gooddata_sdk .catalog .permission .declarative_model .permission import (
22
22
CatalogDeclarativeDashboardPermissionsForAssignee ,
23
23
CatalogDeclarativeDashboardPermissionsForAssigneeRule ,
24
24
)
25
- from gooddata_sdk .utils import create_directory , get_sorted_yaml_files , read_layout_from_file , write_layout_to_file
25
+ from gooddata_sdk .catalog .workspace .declarative_model .workspace .analytics_model .base import (
26
+ CatalogAnalyticsBase ,
27
+ CatalogAnalyticsObjectBase ,
28
+ )
29
+ from gooddata_sdk .catalog .workspace .declarative_model .workspace .analytics_model .export_definition import (
30
+ CatalogDeclarativeExportDefinition ,
31
+ )
32
+ from gooddata_sdk .utils import create_directory , get_sorted_yaml_files
26
33
27
- T = TypeVar ("T" , bound = "CatalogAnalyticsObjectBase" )
28
34
AnalyticsObjects = Union [
29
35
DeclarativeAnalyticalDashboard ,
30
36
DeclarativeDashboardPlugin ,
41
47
LAYOUT_METRICS_DIR = "metrics"
42
48
LAYOUT_VISUALIZATION_OBJECTS_DIR = "visualization_objects"
43
49
ATTRIBUTE_HIERARCHY_OBJECTS_DIR = "attribute_hierarchy_objects"
50
+ EXPORT_DEFINITION_DIR = "export_definitions"
44
51
45
52
46
53
@attr .s (auto_attribs = True , kw_only = True )
@@ -70,7 +77,7 @@ class CatalogDeclarativeAnalyticsLayer(Base):
70
77
filter_contexts : list [CatalogDeclarativeFilterContext ] = attr .field (factory = list )
71
78
metrics : list [CatalogDeclarativeMetric ] = attr .field (factory = list )
72
79
visualization_objects : list [CatalogDeclarativeVisualizationObject ] = attr .field (factory = list )
73
- export_definitions : list [dict ] = attr .field (factory = list )
80
+ export_definitions : list [CatalogDeclarativeExportDefinition ] = attr .field (factory = list )
74
81
75
82
@staticmethod
76
83
def client_class () -> type [DeclarativeAnalyticsLayer ]:
@@ -124,6 +131,12 @@ def get_attribute_hierarchy_folder(analytics_model_folder: Path) -> Path:
124
131
create_directory (folder )
125
132
return folder
126
133
134
+ @staticmethod
135
+ def get_export_definition_dif (analytics_model_folder : Path ) -> Path :
136
+ folder = analytics_model_folder / EXPORT_DEFINITION_DIR
137
+ create_directory (folder )
138
+ return folder
139
+
127
140
def store_to_disk (self , workspace_folder : Path ) -> None :
128
141
analytics_model_folder = self .get_analytics_model_folder (workspace_folder )
129
142
@@ -134,6 +147,7 @@ def store_to_disk(self, workspace_folder: Path) -> None:
134
147
metrics_folder = self .get_metrics_folder (analytics_model_folder )
135
148
visualization_objects_folder = self .get_visualization_objects_folder (analytics_model_folder )
136
149
attribute_hierarchy_folder = self .get_attribute_hierarchy_folder (analytics_model_folder )
150
+ export_definition_folder = self .get_export_definition_dif (analytical_dashboards_folder )
137
151
138
152
for analytical_dashboard in self .analytical_dashboards :
139
153
analytical_dashboard .store_to_disk (analytical_dashboards_folder )
@@ -156,6 +170,9 @@ def store_to_disk(self, workspace_folder: Path) -> None:
156
170
for attribute_hierarchy in self .attribute_hierarchies :
157
171
attribute_hierarchy .store_to_disk (attribute_hierarchy_folder )
158
172
173
+ for export_definition in self .export_definitions :
174
+ export_definition .store_to_disk (export_definition_folder )
175
+
159
176
@classmethod
160
177
def load_from_disk (cls , workspace_folder : Path ) -> CatalogDeclarativeAnalyticsLayer :
161
178
analytics_model_folder = cls .get_analytics_model_folder (workspace_folder )
@@ -166,6 +183,7 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
166
183
metrics_folder = cls .get_metrics_folder (analytics_model_folder )
167
184
visualization_objects_folder = cls .get_visualization_objects_folder (analytics_model_folder )
168
185
attribute_hierarchy_folder = cls .get_attribute_hierarchy_folder (analytics_model_folder )
186
+ export_definition_folder = cls .get_export_definition_dif (analytical_dashboards_folder )
169
187
170
188
analytical_dashboard_files = get_sorted_yaml_files (analytical_dashboards_folder )
171
189
analytical_dashboard_extension_files = get_sorted_yaml_files (analytical_dashboard_extensions_folder )
@@ -174,6 +192,7 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
174
192
metric_files = get_sorted_yaml_files (metrics_folder )
175
193
visualization_object_files = get_sorted_yaml_files (visualization_objects_folder )
176
194
attribute_hierarchy_files = get_sorted_yaml_files (attribute_hierarchy_folder )
195
+ export_definition_files = get_sorted_yaml_files (export_definition_folder )
177
196
178
197
analytical_dashboards = [
179
198
CatalogDeclarativeAnalyticalDashboard .load_from_disk (analytical_dashboard_file )
@@ -200,6 +219,10 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
200
219
CatalogDeclarativeAttributeHierarchy .load_from_disk (attribute_hierarchy_file )
201
220
for attribute_hierarchy_file in attribute_hierarchy_files
202
221
]
222
+ export_definitions = [
223
+ CatalogDeclarativeExportDefinition .load_from_disk (export_definition_file )
224
+ for export_definition_file in export_definition_files
225
+ ]
203
226
return cls (
204
227
analytical_dashboards = analytical_dashboards ,
205
228
analytical_dashboard_extensions = analytical_dashboard_extensions ,
@@ -208,41 +231,12 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
208
231
filter_contexts = filter_contexts ,
209
232
metrics = metrics ,
210
233
visualization_objects = visualization_objects ,
234
+ export_definitions = export_definitions ,
211
235
)
212
236
213
237
214
- @attr .s (auto_attribs = True , kw_only = True )
215
- class CatalogAnalyticsObjectBase (Base ):
216
- id : str
217
-
218
- def store_to_disk (self , analytics_folder : Path ) -> None :
219
- analytics_file = analytics_folder / f"{ self .id } .yaml"
220
- write_layout_to_file (analytics_file , self .to_api ().to_dict (camel_case = True ))
221
-
222
- @classmethod
223
- def load_from_disk (cls : type [T ], analytics_file : Path ) -> T :
224
- analytics_layout = read_layout_from_file (analytics_file )
225
- return cls .from_dict (analytics_layout )
226
-
227
-
228
- @attr .s (auto_attribs = True , kw_only = True )
229
- class CatalogAnalyticsBase (CatalogAnalyticsObjectBase ):
230
- title : str
231
- content : dict [str , Any ]
232
- description : Optional [str ] = None
233
- tags : Optional [list [str ]] = None
234
-
235
-
236
- @attr .s (auto_attribs = True , kw_only = True )
237
- class CatalogAnalyticsBaseMeta (CatalogAnalyticsBase ):
238
- created_at : Optional [str ] = None
239
- created_by : Optional [CatalogUserIdentifier ] = None
240
- modified_at : Optional [str ] = None
241
- modified_by : Optional [CatalogUserIdentifier ] = None
242
-
243
-
244
- @attr .s (auto_attribs = True , kw_only = True )
245
- class CatalogDeclarativeAnalyticalDashboard (CatalogAnalyticsBaseMeta ):
238
+ @define (auto_attribs = True , kw_only = True )
239
+ class CatalogDeclarativeAnalyticalDashboard (CatalogAnalyticsBase ):
246
240
permissions : Optional [
247
241
list [
248
242
Union [
@@ -274,7 +268,7 @@ def structure_permissions(
274
268
275
269
276
270
@attr .s (auto_attribs = True , kw_only = True )
277
- class CatalogDeclarativeDashboardPlugin (CatalogAnalyticsBaseMeta ):
271
+ class CatalogDeclarativeDashboardPlugin (CatalogAnalyticsBase ):
278
272
@staticmethod
279
273
def client_class () -> type [DeclarativeDashboardPlugin ]:
280
274
return DeclarativeDashboardPlugin
@@ -299,21 +293,21 @@ def client_class() -> type[DeclarativeFilterContext]:
299
293
300
294
301
295
@attr .s (auto_attribs = True , kw_only = True )
302
- class CatalogDeclarativeMetric (CatalogAnalyticsBaseMeta ):
296
+ class CatalogDeclarativeMetric (CatalogAnalyticsBase ):
303
297
@staticmethod
304
298
def client_class () -> type [DeclarativeMetric ]:
305
299
return DeclarativeMetric
306
300
307
301
308
302
@attr .s (auto_attribs = True , kw_only = True )
309
- class CatalogDeclarativeVisualizationObject (CatalogAnalyticsBaseMeta ):
303
+ class CatalogDeclarativeVisualizationObject (CatalogAnalyticsBase ):
310
304
@staticmethod
311
305
def client_class () -> type [DeclarativeVisualizationObject ]:
312
306
return DeclarativeVisualizationObject
313
307
314
308
315
309
@attr .s (auto_attribs = True , kw_only = True )
316
- class CatalogDeclarativeAttributeHierarchy (CatalogAnalyticsBaseMeta ):
310
+ class CatalogDeclarativeAttributeHierarchy (CatalogAnalyticsBase ):
317
311
@staticmethod
318
312
def client_class () -> type [DeclarativeAttributeHierarchy ]:
319
313
return DeclarativeAttributeHierarchy
0 commit comments