gooddata-sdk 1.48.1.dev3__tar.gz → 1.48.1.dev4__tar.gz

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 (147) hide show
  1. {gooddata_sdk-1.48.1.dev3/gooddata_sdk.egg-info → gooddata_sdk-1.48.1.dev4}/PKG-INFO +4 -4
  2. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/README.md +1 -1
  3. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/data_source.py +4 -4
  4. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/table.py +2 -2
  5. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/declarative_model/user.py +2 -2
  6. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/declarative_model/user_group.py +2 -2
  7. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/content_service.py +9 -5
  8. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/analytics_model.py +11 -11
  9. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/base.py +2 -2
  10. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/dataset.py +2 -2
  11. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/dataset_extension.py +2 -2
  12. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/date_dataset.py +2 -2
  13. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/ldm.py +6 -6
  14. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/workspace.py +12 -12
  15. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/service.py +3 -2
  16. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/utils.py +30 -3
  17. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4/gooddata_sdk.egg-info}/PKG-INFO +4 -4
  18. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk.egg-info/requires.txt +1 -1
  19. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/setup.py +3 -3
  20. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/LICENSE.txt +0 -0
  21. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/MANIFEST.in +0 -0
  22. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/bin/gdc +0 -0
  23. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/__init__.py +0 -0
  24. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/_version.py +0 -0
  25. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/__init__.py +0 -0
  26. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/base.py +0 -0
  27. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/catalog_service_base.py +0 -0
  28. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/__init__.py +0 -0
  29. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/__init__.py +0 -0
  30. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/requests/__init__.py +0 -0
  31. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/requests/ldm_request.py +0 -0
  32. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/requests/scan_model_request.py +0 -0
  33. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/requests/scan_sql_request.py +0 -0
  34. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/responses/__init__.py +0 -0
  35. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/responses/scan_sql_response.py +0 -0
  36. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/action_model/sql_column.py +0 -0
  37. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/__init__.py +0 -0
  38. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/__init__.py +0 -0
  39. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/column.py +0 -0
  40. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/pdm.py +0 -0
  41. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/entity_model/__init__.py +0 -0
  42. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/entity_model/content_objects/__init__.py +0 -0
  43. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/entity_model/data_source.py +0 -0
  44. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/service.py +0 -0
  45. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/validation/__init__.py +0 -0
  46. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/data_source/validation/data_source.py +0 -0
  47. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/depends_on.py +0 -0
  48. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/entity.py +0 -0
  49. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/export/__init__.py +0 -0
  50. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/export/request.py +0 -0
  51. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/export/service.py +0 -0
  52. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/filter_by.py +0 -0
  53. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/identifier.py +0 -0
  54. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/__init__.py +0 -0
  55. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/common/__init__.py +0 -0
  56. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/common/dashboard_slides_template.py +0 -0
  57. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/common/running_section.py +0 -0
  58. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/common/slide_template.py +0 -0
  59. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/common/widget_slides_template.py +0 -0
  60. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/__init__.py +0 -0
  61. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/directive.py +0 -0
  62. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/export_template.py +0 -0
  63. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/identity_provider.py +0 -0
  64. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/jwk.py +0 -0
  65. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/llm_endpoint.py +0 -0
  66. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/organization.py +0 -0
  67. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/entity_model/setting.py +0 -0
  68. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/layout/__init__.py +0 -0
  69. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/layout/export_template.py +0 -0
  70. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/layout/identity_provider.py +0 -0
  71. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/layout/notification_channel.py +0 -0
  72. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/organization/service.py +0 -0
  73. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/parameter.py +0 -0
  74. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/__init__.py +0 -0
  75. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/declarative_model/__init__.py +0 -0
  76. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/declarative_model/dashboard_assignees.py +0 -0
  77. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/declarative_model/dashboard_permissions.py +0 -0
  78. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/declarative_model/manage_dashboard_permissions.py +0 -0
  79. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/declarative_model/permission.py +0 -0
  80. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/permission/service.py +0 -0
  81. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/rule.py +0 -0
  82. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/setting.py +0 -0
  83. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/types.py +0 -0
  84. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/__init__.py +0 -0
  85. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/declarative_model/__init__.py +0 -0
  86. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/declarative_model/user_and_user_groups.py +0 -0
  87. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/entity_model/__init__.py +0 -0
  88. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/entity_model/api_token.py +0 -0
  89. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/entity_model/user.py +0 -0
  90. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/entity_model/user_group.py +0 -0
  91. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/management_model/__init__.py +0 -0
  92. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/management_model/management.py +0 -0
  93. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/user/service.py +0 -0
  94. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/validate_by_item.py +0 -0
  95. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/__init__.py +0 -0
  96. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/__init__.py +0 -0
  97. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/__init__.py +0 -0
  98. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/__init__.py +0 -0
  99. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/export_definition.py +0 -0
  100. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/automation.py +0 -0
  101. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/__init__.py +0 -0
  102. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/data_filter_references.py +0 -0
  103. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/__init__.py +0 -0
  104. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/__init__.py +0 -0
  105. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/__init__.py +0 -0
  106. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/__init__.py +0 -0
  107. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/content_objects/__init__.py +0 -0
  108. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/content_objects/dataset.py +0 -0
  109. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/content_objects/metric.py +0 -0
  110. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/content_objects/workspace_setting.py +0 -0
  111. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/filter_view.py +0 -0
  112. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/__init__.py +0 -0
  113. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/graph.py +0 -0
  114. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/user_data_filter.py +0 -0
  115. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/entity_model/workspace.py +0 -0
  116. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/catalog/workspace/model_container.py +0 -0
  117. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/__init__.py +0 -0
  118. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/clone.py +0 -0
  119. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/constants.py +0 -0
  120. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/deploy.py +0 -0
  121. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/gdc_core.py +0 -0
  122. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/package.json +0 -0
  123. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/cli/utils.py +0 -0
  124. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/client.py +0 -0
  125. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/__init__.py +0 -0
  126. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/compute_to_sdk_converter.py +0 -0
  127. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/__init__.py +0 -0
  128. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/attribute.py +0 -0
  129. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/base.py +0 -0
  130. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/execution.py +0 -0
  131. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/filter.py +0 -0
  132. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/model/metric.py +0 -0
  133. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/service.py +0 -0
  134. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/compute/visualization_to_sdk_converter.py +0 -0
  135. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/config.py +0 -0
  136. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/py.typed +0 -0
  137. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/sdk.py +0 -0
  138. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/support.py +0 -0
  139. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/table.py +0 -0
  140. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/type_converter.py +0 -0
  141. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk/visualization.py +0 -0
  142. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk.egg-info/SOURCES.txt +0 -0
  143. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk.egg-info/dependency_links.txt +0 -0
  144. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/gooddata_sdk.egg-info/top_level.txt +0 -0
  145. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/setup.cfg +0 -0
  146. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/tests/test_client.py +0 -0
  147. {gooddata_sdk-1.48.1.dev3 → gooddata_sdk-1.48.1.dev4}/tests/test_type_converter.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gooddata-sdk
3
- Version: 1.48.1.dev3
3
+ Version: 1.48.1.dev4
4
4
  Summary: GoodData Cloud Python SDK
5
5
  Author: GoodData
6
6
  Author-email: support@gooddata.com
7
7
  License: MIT
8
- Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.48.1.dev3
8
+ Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.48.1.dev4
9
9
  Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
10
10
  Keywords: gooddata,sdk,api,analytics,headless,business,intelligence,headless-bi,cloud,native,semantic,layer,sql,metrics
11
11
  Classifier: Development Status :: 5 - Production/Stable
@@ -23,7 +23,7 @@ Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.9.0
24
24
  Description-Content-Type: text/markdown
25
25
  License-File: LICENSE.txt
26
- Requires-Dist: gooddata-api-client~=1.48.1.dev3
26
+ Requires-Dist: gooddata-api-client~=1.48.1.dev4
27
27
  Requires-Dist: python-dateutil>=2.5.3
28
28
  Requires-Dist: pyyaml>=6.0
29
29
  Requires-Dist: attrs<=24.2.0,>=21.4.0
@@ -59,7 +59,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
59
59
  * Compute Service
60
60
  * Table Service
61
61
 
62
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev3) for more details.
62
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev4) for more details.
63
63
 
64
64
  ## Requirements
65
65
 
@@ -13,7 +13,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
13
13
  * Compute Service
14
14
  * Table Service
15
15
 
16
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev3) for more details.
16
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev4) for more details.
17
17
 
18
18
  ## Requirements
19
19
 
@@ -110,11 +110,11 @@ class CatalogDeclarativeDataSources(Base):
110
110
  def data_sources_folder(layout_organization_folder: Path) -> Path:
111
111
  return layout_organization_folder / LAYOUT_DATA_SOURCES_DIR
112
112
 
113
- def store_to_disk(self, layout_organization_folder: Path) -> None:
113
+ def store_to_disk(self, layout_organization_folder: Path, sort: bool = False) -> None:
114
114
  data_sources_folder = self.data_sources_folder(layout_organization_folder)
115
115
  create_directory(data_sources_folder)
116
116
  for data_source in self.data_sources:
117
- data_source.store_to_disk(data_sources_folder)
117
+ data_source.store_to_disk(data_sources_folder, sort=sort)
118
118
 
119
119
  @classmethod
120
120
  def load_from_disk(cls, layout_organization_folder: Path) -> CatalogDeclarativeDataSources:
@@ -201,12 +201,12 @@ class CatalogDeclarativeDataSource(Base):
201
201
  dictionary["client_secret"] = client_secret
202
202
  return self.client_class().from_dict(dictionary)
203
203
 
204
- def store_to_disk(self, data_sources_folder: Path) -> None:
204
+ def store_to_disk(self, data_sources_folder: Path, sort: bool = False) -> None:
205
205
  data_source_folder = self.data_source_folder(data_sources_folder, self.id)
206
206
  file_path = data_source_folder / f"{self.id}.yaml"
207
207
  data_source_dict = self.to_api().to_dict(camel_case=True)
208
208
 
209
- write_layout_to_file(file_path, data_source_dict)
209
+ write_layout_to_file(file_path, data_source_dict, sort=sort)
210
210
 
211
211
  @classmethod
212
212
  def load_from_disk(cls, data_sources_folder: Path, data_source_id: str) -> CatalogDeclarativeDataSource:
@@ -25,10 +25,10 @@ class CatalogDeclarativeTable(Base):
25
25
  def client_class() -> builtins.type[DeclarativeTable]:
26
26
  return DeclarativeTable
27
27
 
28
- def store_to_disk(self, pdm_folder: Path) -> None:
28
+ def store_to_disk(self, pdm_folder: Path, sort: bool = False) -> None:
29
29
  table_dict = self.to_api().to_dict(camel_case=True)
30
30
  table_file_path = pdm_folder / f"{self.id}.yaml"
31
- write_layout_to_file(table_file_path, table_dict)
31
+ write_layout_to_file(table_file_path, table_dict, sort=sort)
32
32
 
33
33
  @classmethod
34
34
  def load_from_disk(cls, table_file_path: Path) -> CatalogDeclarativeTable:
@@ -34,12 +34,12 @@ class CatalogDeclarativeUsers(Base):
34
34
  users = [CatalogDeclarativeUser.from_dict(record, camel_case=True) for record in data]
35
35
  return cls(users=users)
36
36
 
37
- def store_to_disk(self, layout_organization_folder: Path) -> None:
37
+ def store_to_disk(self, layout_organization_folder: Path, sort: bool = False) -> None:
38
38
  users_directory = layout_organization_folder / LAYOUT_USERS_DIR
39
39
  users_file = users_directory / LAYOUT_USERS_FILE
40
40
  create_directory(users_directory)
41
41
  users = [user.to_dict(camel_case=True) for user in self.users]
42
- write_layout_to_file(users_file, users)
42
+ write_layout_to_file(users_file, users, sort=sort)
43
43
 
44
44
 
45
45
  @attr.s(auto_attribs=True, kw_only=True)
@@ -33,12 +33,12 @@ class CatalogDeclarativeUserGroups(Base):
33
33
  user_groups = [CatalogDeclarativeUserGroup.from_dict(record, camel_case=True) for record in data]
34
34
  return cls(user_groups=user_groups)
35
35
 
36
- def store_to_disk(self, layout_organization_folder: Path) -> None:
36
+ def store_to_disk(self, layout_organization_folder: Path, sort: bool = False) -> None:
37
37
  user_groups_directory = layout_organization_folder / LAYOUT_USER_GROUPS_DIR
38
38
  user_groups_file = user_groups_directory / LAYOUT_USER_GROUPS_FILE
39
39
  create_directory(user_groups_directory)
40
40
  user_groups = [user_group.to_dict(camel_case=True) for user_group in self.user_groups]
41
- write_layout_to_file(user_groups_file, user_groups)
41
+ write_layout_to_file(user_groups_file, user_groups, sort=sort)
42
42
 
43
43
 
44
44
  @attr.s(auto_attribs=True, kw_only=True)
@@ -358,7 +358,7 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
358
358
  declarative_ldm = self.load_declarative_ldm(workspace_id, layout_root_path)
359
359
  self.put_declarative_ldm(workspace_id, declarative_ldm, validator, standalone_copy)
360
360
 
361
- def store_ldm_to_disk(self, workspace_id: str, path: Path = Path.cwd()) -> None:
361
+ def store_ldm_to_disk(self, workspace_id: str, path: Path = Path.cwd(), sort: bool = False) -> None:
362
362
  """Store declarative logical data model for a given workspace in directory hierarchy.
363
363
  This method does not tie the LDM to the workspace and organization, thus it is recommended
364
364
  for migration between organizations. If you want to backup LDM use store_declarative_ldm.
@@ -368,11 +368,13 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
368
368
  Workspace identification string e.g. "demo"
369
369
  path (Path, optional):
370
370
  Path to the root of the layout directory. Defaults to Path.cwd().
371
+ sort (bool, optional):
372
+ Flag if the output should be sorted before storing to disk. Default is False.
371
373
 
372
374
  Returns:
373
375
  None
374
376
  """
375
- self.get_declarative_ldm(workspace_id).store_to_disk(path)
377
+ self.get_declarative_ldm(workspace_id).store_to_disk(path, sort=sort)
376
378
 
377
379
  @staticmethod
378
380
  def load_ldm_from_disk(path: Path = Path.cwd()) -> CatalogDeclarativeModel:
@@ -479,7 +481,7 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
479
481
  self.put_declarative_analytics_model(workspace_id, declarative_analytics_model)
480
482
 
481
483
  def store_analytics_model_to_disk(
482
- self, workspace_id: str, path: Path = Path.cwd(), exclude: Optional[list[str]] = None
484
+ self, workspace_id: str, path: Path = Path.cwd(), exclude: Optional[list[str]] = None, sort: bool = False
483
485
  ) -> None:
484
486
  """Store analytics model for a given workspace in directory hierarchy.This method does not tie the declarative
485
487
  analytics model to the workspace and organization, thus it is recommended for migration between workspaces.
@@ -491,12 +493,14 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
491
493
  path (Path, optional):
492
494
  Path to the root of the layout directory. Defaults to Path.cwd().
493
495
  exclude (Optional[list[str]]):
494
- Defines properties which should not be included in the payload. E.g.: ["ACTIVITY_INFO"]
496
+ Defines properties which should not be included in the result. E.g.: ["ACTIVITY_INFO"] – refers to createdBy, etc. Default is None.
497
+ sort (bool, optional):
498
+ Flag if the output should be sorted before storing to disk. Default is False.
495
499
 
496
500
  Returns:
497
501
  None
498
502
  """
499
- self.get_declarative_analytics_model(workspace_id, exclude).store_to_disk(path)
503
+ self.get_declarative_analytics_model(workspace_id, exclude).store_to_disk(path, sort=sort)
500
504
 
501
505
  @staticmethod
502
506
  def load_analytics_model_from_disk(path: Path = Path.cwd()) -> CatalogDeclarativeAnalytics:
@@ -58,9 +58,9 @@ class CatalogDeclarativeAnalytics(Base):
58
58
  def client_class() -> type[DeclarativeAnalytics]:
59
59
  return DeclarativeAnalytics
60
60
 
61
- def store_to_disk(self, workspace_folder: Path) -> None:
61
+ def store_to_disk(self, workspace_folder: Path, sort: bool = False) -> None:
62
62
  if self.analytics is not None:
63
- self.analytics.store_to_disk(workspace_folder)
63
+ self.analytics.store_to_disk(workspace_folder, sort=sort)
64
64
 
65
65
  @classmethod
66
66
  def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalytics:
@@ -137,7 +137,7 @@ class CatalogDeclarativeAnalyticsLayer(Base):
137
137
  create_directory(folder)
138
138
  return folder
139
139
 
140
- def store_to_disk(self, workspace_folder: Path) -> None:
140
+ def store_to_disk(self, workspace_folder: Path, sort: bool = False) -> None:
141
141
  analytics_model_folder = self.get_analytics_model_folder(workspace_folder)
142
142
 
143
143
  analytical_dashboards_folder = self.get_analytical_dashboards_folder(analytics_model_folder)
@@ -150,28 +150,28 @@ class CatalogDeclarativeAnalyticsLayer(Base):
150
150
  export_definition_folder = self.get_export_definition_dif(analytical_dashboards_folder)
151
151
 
152
152
  for analytical_dashboard in self.analytical_dashboards:
153
- analytical_dashboard.store_to_disk(analytical_dashboards_folder)
153
+ analytical_dashboard.store_to_disk(analytical_dashboards_folder, sort=sort)
154
154
 
155
155
  for analytical_dashboard_extension in self.analytical_dashboard_extensions:
156
- analytical_dashboard_extension.store_to_disk(analytical_dashboard_extensions_folder)
156
+ analytical_dashboard_extension.store_to_disk(analytical_dashboard_extensions_folder, sort=sort)
157
157
 
158
158
  for dashboard_plugin in self.dashboard_plugins:
159
- dashboard_plugin.store_to_disk(dashboard_plugins_folder)
159
+ dashboard_plugin.store_to_disk(dashboard_plugins_folder, sort=sort)
160
160
 
161
161
  for filter_context in self.filter_contexts:
162
- filter_context.store_to_disk(filter_contexts_folder)
162
+ filter_context.store_to_disk(filter_contexts_folder, sort=sort)
163
163
 
164
164
  for metric in self.metrics:
165
- metric.store_to_disk(metrics_folder)
165
+ metric.store_to_disk(metrics_folder, sort=sort)
166
166
 
167
167
  for visualization_object in self.visualization_objects:
168
- visualization_object.store_to_disk(visualization_objects_folder)
168
+ visualization_object.store_to_disk(visualization_objects_folder, sort=sort)
169
169
 
170
170
  for attribute_hierarchy in self.attribute_hierarchies:
171
- attribute_hierarchy.store_to_disk(attribute_hierarchy_folder)
171
+ attribute_hierarchy.store_to_disk(attribute_hierarchy_folder, sort=sort)
172
172
 
173
173
  for export_definition in self.export_definitions:
174
- export_definition.store_to_disk(export_definition_folder)
174
+ export_definition.store_to_disk(export_definition_folder, sort=sort)
175
175
 
176
176
  @classmethod
177
177
  def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLayer:
@@ -15,9 +15,9 @@ T = TypeVar("T", bound="CatalogAnalyticsObjectBase")
15
15
  class CatalogAnalyticsObjectBase(Base):
16
16
  id: str
17
17
 
18
- def store_to_disk(self, analytics_folder: Path) -> None:
18
+ def store_to_disk(self, analytics_folder: Path, sort: bool = False) -> None:
19
19
  analytics_file = analytics_folder / f"{self.id}.yaml"
20
- write_layout_to_file(analytics_file, self.to_api().to_dict(camel_case=True))
20
+ write_layout_to_file(analytics_file, self.to_api().to_dict(camel_case=True), sort=sort)
21
21
 
22
22
  @classmethod
23
23
  def load_from_disk(cls: type[T], analytics_file: Path) -> T:
@@ -53,9 +53,9 @@ class CatalogDeclarativeDataset(Base):
53
53
  def client_class() -> type[DeclarativeDataset]:
54
54
  return DeclarativeDataset
55
55
 
56
- def store_to_disk(self, datasets_folder: Path) -> None:
56
+ def store_to_disk(self, datasets_folder: Path, sort: bool = False) -> None:
57
57
  dataset_file = datasets_folder / f"{self.id}.yaml"
58
- write_layout_to_file(dataset_file, self.to_api().to_dict(camel_case=True))
58
+ write_layout_to_file(dataset_file, self.to_api().to_dict(camel_case=True), sort=sort)
59
59
 
60
60
  @classmethod
61
61
  def load_from_disk(cls, dataset_file: Path) -> CatalogDeclarativeDataset:
@@ -22,9 +22,9 @@ class CatalogDeclarativeDatasetExtension(Base):
22
22
  def client_class() -> type[DeclarativeDatasetExtension]:
23
23
  return DeclarativeDatasetExtension
24
24
 
25
- def store_to_disk(self, dataset_extension_folder: Path) -> None:
25
+ def store_to_disk(self, dataset_extension_folder: Path, sort: bool = False) -> None:
26
26
  dataset_extension_file = dataset_extension_folder / f"{self.id}.yaml"
27
- write_layout_to_file(dataset_extension_file, self.to_api().to_dict(camel_case=True))
27
+ write_layout_to_file(dataset_extension_file, self.to_api().to_dict(camel_case=True), sort=sort)
28
28
 
29
29
  @classmethod
30
30
  def load_from_disk(cls, dataset_extension_file: Path) -> "CatalogDeclarativeDatasetExtension":
@@ -27,9 +27,9 @@ class CatalogDeclarativeDateDataset(Base):
27
27
  def client_class() -> type[DeclarativeDateDataset]:
28
28
  return DeclarativeDateDataset
29
29
 
30
- def store_to_disk(self, date_instances_folder: Path) -> None:
30
+ def store_to_disk(self, date_instances_folder: Path, sort: bool = False) -> None:
31
31
  date_instance_file = date_instances_folder / f"{self.id}.yaml"
32
- write_layout_to_file(date_instance_file, self.to_api().to_dict(camel_case=True))
32
+ write_layout_to_file(date_instance_file, self.to_api().to_dict(camel_case=True), sort=sort)
33
33
 
34
34
  @classmethod
35
35
  def load_from_disk(cls, date_instance_file: Path) -> CatalogDeclarativeDateDataset:
@@ -34,9 +34,9 @@ class CatalogDeclarativeModel(Base):
34
34
  def client_class() -> type[DeclarativeModel]:
35
35
  return DeclarativeModel
36
36
 
37
- def store_to_disk(self, workspace_folder: Path) -> None:
37
+ def store_to_disk(self, workspace_folder: Path, sort: bool = False) -> None:
38
38
  if self.ldm is not None:
39
- self.ldm.store_to_disk(workspace_folder)
39
+ self.ldm.store_to_disk(workspace_folder, sort=sort)
40
40
 
41
41
  @classmethod
42
42
  def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeModel:
@@ -106,20 +106,20 @@ class CatalogDeclarativeLdm(Base):
106
106
  create_directory(folder)
107
107
  return folder
108
108
 
109
- def store_to_disk(self, workspace_folder: Path) -> None:
109
+ def store_to_disk(self, workspace_folder: Path, sort: bool = False) -> None:
110
110
  ldm_folder = self.create_ldm_folder(workspace_folder)
111
111
  datasets_folder = self.create_datasets_folder(ldm_folder)
112
112
  date_instances_folder = self.create_date_instances_folder(ldm_folder)
113
113
 
114
114
  for dataset in self.datasets:
115
- dataset.store_to_disk(datasets_folder)
115
+ dataset.store_to_disk(datasets_folder, sort=sort)
116
116
  for date_instance in self.date_instances:
117
- date_instance.store_to_disk(date_instances_folder)
117
+ date_instance.store_to_disk(date_instances_folder, sort=sort)
118
118
  # Note: should be defaulted to an empty list in the future
119
119
  if self.dataset_extensions:
120
120
  dataset_extensions_folder = self.create_dataset_extensions_folder(ldm_folder)
121
121
  for dataset_extension in self.dataset_extensions:
122
- dataset_extension.store_to_disk(dataset_extensions_folder)
122
+ dataset_extension.store_to_disk(dataset_extensions_folder, sort=sort)
123
123
 
124
124
  @classmethod
125
125
  def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeLdm:
@@ -54,11 +54,11 @@ class CatalogDeclarativeWorkspaceModel(Base):
54
54
  def client_class() -> type[DeclarativeWorkspaceModel]:
55
55
  return DeclarativeWorkspaceModel
56
56
 
57
- def store_to_disk(self, workspace_folder: Path) -> None:
57
+ def store_to_disk(self, workspace_folder: Path, sort: bool = False) -> None:
58
58
  if self.ldm is not None:
59
- self.ldm.store_to_disk(workspace_folder)
59
+ self.ldm.store_to_disk(workspace_folder, sort=sort)
60
60
  if self.analytics is not None:
61
- self.analytics.store_to_disk(workspace_folder)
61
+ self.analytics.store_to_disk(workspace_folder, sort=sort)
62
62
 
63
63
  @classmethod
64
64
  def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeWorkspaceModel:
@@ -102,16 +102,16 @@ class CatalogDeclarativeWorkspace(Base):
102
102
  del dictionary["model"]
103
103
  return client_class.from_dict(dictionary, camel_case=False)
104
104
 
105
- def store_to_disk(self, workspaces_folder: Path) -> None:
105
+ def store_to_disk(self, workspaces_folder: Path, sort: bool = False) -> None:
106
106
  workspace_folder = workspaces_folder / self.id
107
107
  file_path = workspace_folder / f"{self.id}.yaml"
108
108
  create_directory(workspace_folder)
109
109
 
110
110
  workspace_dict = self.to_api(include_nested_structures=False).to_dict(camel_case=True)
111
- write_layout_to_file(file_path, workspace_dict)
111
+ write_layout_to_file(file_path, workspace_dict, sort=sort)
112
112
 
113
113
  if self.model is not None:
114
- self.model.store_to_disk(workspace_folder)
114
+ self.model.store_to_disk(workspace_folder, sort)
115
115
 
116
116
  @classmethod
117
117
  def load_from_disk(cls, workspaces_folder: Path, workspace_id: str) -> CatalogDeclarativeWorkspace:
@@ -204,9 +204,9 @@ class CatalogDeclarativeWorkspaceDataFilter(Base):
204
204
  def client_class() -> type[DeclarativeWorkspaceDataFilter]:
205
205
  return DeclarativeWorkspaceDataFilter
206
206
 
207
- def store_to_disk(self, workspaces_data_filters_folder: Path) -> None:
207
+ def store_to_disk(self, workspaces_data_filters_folder: Path, sort: bool = False) -> None:
208
208
  workspaces_data_filter_file = workspaces_data_filters_folder / f"{self.id}.yaml"
209
- write_layout_to_file(workspaces_data_filter_file, self.to_api().to_dict(camel_case=True))
209
+ write_layout_to_file(workspaces_data_filter_file, self.to_api().to_dict(camel_case=True), sort=sort)
210
210
 
211
211
  @classmethod
212
212
  def load_from_disk(cls, workspaces_data_filter_file: Path) -> CatalogDeclarativeWorkspaceDataFilter:
@@ -267,9 +267,9 @@ class CatalogDeclarativeUserDataFilter(Base):
267
267
  def client_class() -> type[DeclarativeUserDataFilter]:
268
268
  return DeclarativeUserDataFilter
269
269
 
270
- def store_to_disk(self, user_data_filters_folder: Path) -> None:
270
+ def store_to_disk(self, user_data_filters_folder: Path, sort: bool = False) -> None:
271
271
  user_data_filter_file = user_data_filters_folder / f"{self.id}.yaml"
272
- write_layout_to_file(user_data_filter_file, self.to_api().to_dict(camel_case=True))
272
+ write_layout_to_file(user_data_filter_file, self.to_api().to_dict(camel_case=True), sort=sort)
273
273
 
274
274
  @classmethod
275
275
  def load_from_disk(cls, user_data_filter_file: Path) -> CatalogDeclarativeUserDataFilter:
@@ -306,9 +306,9 @@ class CatalogDeclarativeFilterView(Base):
306
306
  def client_class() -> type[DeclarativeFilterView]:
307
307
  return DeclarativeFilterView
308
308
 
309
- def store_to_disk(self, filter_views_folder: Path) -> None:
309
+ def store_to_disk(self, filter_views_folder: Path, sort: bool = False) -> None:
310
310
  filter_view_file = filter_views_folder / f"{self.id}.yaml"
311
- write_layout_to_file(filter_view_file, self.to_api().to_dict(camel_case=True))
311
+ write_layout_to_file(filter_view_file, self.to_api().to_dict(camel_case=True), sort=sort)
312
312
 
313
313
  @classmethod
314
314
  def load_from_disk(cls, filter_view_file: Path) -> CatalogDeclarativeFilterView:
@@ -666,6 +666,7 @@ class CatalogWorkspaceService(CatalogServiceBase):
666
666
  from_lang: str,
667
667
  already_translated: dict[str, str],
668
668
  translation_file_path: Path,
669
+ sort: bool = False,
669
670
  ) -> dict[str, str]:
670
671
  if to_translate and translator_func:
671
672
  translated = {
@@ -673,7 +674,7 @@ class CatalogWorkspaceService(CatalogServiceBase):
673
674
  **already_translated,
674
675
  }
675
676
  # Write translation file
676
- write_layout_to_file(translation_file_path, translated)
677
+ write_layout_to_file(translation_file_path, translated, sort=sort)
677
678
  elif already_translated:
678
679
  logger.info("Nothing to translate, but translation file exists, so we can apply it.")
679
680
  translated = already_translated
@@ -686,7 +687,7 @@ class CatalogWorkspaceService(CatalogServiceBase):
686
687
  translated = {}
687
688
  for x in to_translate:
688
689
  translated[x] = x
689
- write_layout_to_file(translation_file_path, translated)
690
+ write_layout_to_file(translation_file_path, translated, sort=sort)
690
691
  return translated
691
692
 
692
693
  @staticmethod
@@ -5,7 +5,7 @@ import functools
5
5
  import json
6
6
  import os
7
7
  import re
8
- from collections.abc import KeysView
8
+ from collections.abc import KeysView, Mapping
9
9
  from enum import Enum, auto
10
10
  from pathlib import Path
11
11
  from shutil import rmtree
@@ -182,9 +182,18 @@ class IndentDumper(yaml.SafeDumper):
182
182
  return super().increase_indent(flow, False)
183
183
 
184
184
 
185
- def write_layout_to_file(path: Path, content: Union[dict[str, Any], list[dict]]) -> None:
185
+ def write_layout_to_file(path: Path, content: Union[dict[str, Any], list[dict]], sort: bool = False) -> None:
186
+ """
187
+ Write content to a YAML file.
188
+
189
+ Args:
190
+ path (Path): The path to the file where the content will be written.
191
+ content (Union[dict[str, Any], list[dict]]): The content to write to the file.
192
+ sort (bool): If True, the content will be sorted before writing. Defaults to False
193
+ """
194
+ content_to_store = deep_sort(content) if sort else content
186
195
  with open(path, "w", encoding="utf-8") as fp:
187
- yaml.dump(content, fp, indent=2, Dumper=IndentDumper, allow_unicode=True)
196
+ yaml.dump(content_to_store, fp, indent=2, Dumper=IndentDumper, allow_unicode=True)
188
197
 
189
198
 
190
199
  def read_layout_from_file(path: Path) -> Any:
@@ -451,3 +460,21 @@ def filter_for_attributes_labels(attributes: list[Attribute], character_limit: i
451
460
  if current_batch: # Add remaining batch
452
461
  queries.append(f"labels.id=in=({','.join(current_batch)})")
453
462
  return queries
463
+
464
+
465
+ def deep_sort(obj: Any) -> Any:
466
+ """
467
+ Recursively sort dictionaries by key. The order of lists and tuples is preserved.
468
+ """
469
+ if isinstance(obj, Mapping):
470
+ # Sort dict by keys, deep-sorting values
471
+ return {k: deep_sort(v) for k, v in sorted(obj.items(), key=lambda kv: kv[0])}
472
+ elif isinstance(obj, list):
473
+ # Deep-sort elements first
474
+ list_items = [deep_sort(x) for x in obj]
475
+ return list_items
476
+ elif isinstance(obj, tuple):
477
+ tuple_items = tuple(deep_sort(x) for x in obj)
478
+ return tuple_items
479
+ else:
480
+ return obj
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gooddata-sdk
3
- Version: 1.48.1.dev3
3
+ Version: 1.48.1.dev4
4
4
  Summary: GoodData Cloud Python SDK
5
5
  Author: GoodData
6
6
  Author-email: support@gooddata.com
7
7
  License: MIT
8
- Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.48.1.dev3
8
+ Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.48.1.dev4
9
9
  Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
10
10
  Keywords: gooddata,sdk,api,analytics,headless,business,intelligence,headless-bi,cloud,native,semantic,layer,sql,metrics
11
11
  Classifier: Development Status :: 5 - Production/Stable
@@ -23,7 +23,7 @@ Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.9.0
24
24
  Description-Content-Type: text/markdown
25
25
  License-File: LICENSE.txt
26
- Requires-Dist: gooddata-api-client~=1.48.1.dev3
26
+ Requires-Dist: gooddata-api-client~=1.48.1.dev4
27
27
  Requires-Dist: python-dateutil>=2.5.3
28
28
  Requires-Dist: pyyaml>=6.0
29
29
  Requires-Dist: attrs<=24.2.0,>=21.4.0
@@ -59,7 +59,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
59
59
  * Compute Service
60
60
  * Table Service
61
61
 
62
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev3) for more details.
62
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.48.1.dev4) for more details.
63
63
 
64
64
  ## Requirements
65
65
 
@@ -1,4 +1,4 @@
1
- gooddata-api-client~=1.48.1.dev3
1
+ gooddata-api-client~=1.48.1.dev4
2
2
  python-dateutil>=2.5.3
3
3
  pyyaml>=6.0
4
4
  attrs<=24.2.0,>=21.4.0
@@ -7,7 +7,7 @@ this_directory = Path(__file__).parent
7
7
  long_description = (this_directory / "README.md").read_text(encoding="utf-8")
8
8
 
9
9
  REQUIRES = [
10
- "gooddata-api-client~=1.48.1.dev3",
10
+ "gooddata-api-client~=1.48.1.dev4",
11
11
  "python-dateutil>=2.5.3",
12
12
  "pyyaml>=6.0",
13
13
  "attrs>=21.4.0,<=24.2.0",
@@ -22,7 +22,7 @@ setup(
22
22
  description="GoodData Cloud Python SDK",
23
23
  long_description=long_description,
24
24
  long_description_content_type="text/markdown",
25
- version="1.48.1.dev3",
25
+ version="1.48.1.dev4",
26
26
  author="GoodData",
27
27
  author_email="support@gooddata.com",
28
28
  license="MIT",
@@ -36,7 +36,7 @@ setup(
36
36
  "bin/gdc",
37
37
  ],
38
38
  project_urls={
39
- "Documentation": "https://www.gooddata.com/docs/python-sdk/1.48.1.dev3",
39
+ "Documentation": "https://www.gooddata.com/docs/python-sdk/1.48.1.dev4",
40
40
  "Source": "https://github.com/gooddata/gooddata-python-sdk",
41
41
  },
42
42
  classifiers=[