gooddata-sdk 1.23.1.dev2__tar.gz → 1.24.1.dev1__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.
- {gooddata_sdk-1.23.1.dev2/gooddata_sdk.egg-info → gooddata_sdk-1.24.1.dev1}/PKG-INFO +4 -4
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/README.md +1 -1
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/__init__.py +3 -0
- gooddata_sdk-1.24.1.dev1/gooddata_sdk/catalog/filter_by.py +18 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/content_service.py +15 -0
- gooddata_sdk-1.24.1.dev1/gooddata_sdk/compute/compute_to_sdk_converter.py +183 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/utils.py +31 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/visualization.py +15 -34
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1/gooddata_sdk.egg-info}/PKG-INFO +4 -4
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk.egg-info/SOURCES.txt +2 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk.egg-info/requires.txt +1 -1
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/setup.py +3 -3
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/LICENSE.txt +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/MANIFEST.in +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/bin/gdc +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/_version.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/base.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/catalog_service_base.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/ldm_request.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/scan_model_request.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/scan_sql_request.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/responses/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/responses/scan_sql_response.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/action_model/sql_column.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/data_source.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/column.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/pdm.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/table.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/content_objects/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/content_objects/table.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/data_source.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/validation/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/validation/data_source.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/depends_on.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/entity.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/request.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/identifier.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/entity_model/directive.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/entity_model/jwk.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/entity_model/organization.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/entity_model/setting.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/parameter.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_assignees.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_permissions.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/manage_dashboard_permissions.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/permission.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/rule.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/setting.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/types.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user_and_user_groups.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user_group.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/entity_model/user.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/entity_model/user_group.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/management_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/management_model/management.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/validate_by_item.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/analytics_model.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/data_filter_references.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/dataset.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/dataset_extension.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/date_dataset.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/ldm.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/workspace.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/dataset.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/metric.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/workspace_setting.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/graph.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/user_data_filter.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/workspace.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/model_container.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/clone.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/constants.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/deploy.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/gdc_core.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/package.json +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/cli/utils.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/client.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/__init__.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/attribute.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/base.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/execution.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/filter.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/metric.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/service.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/config.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/py.typed +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/sdk.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/support.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/table.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/type_converter.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk.egg-info/dependency_links.txt +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk.egg-info/top_level.txt +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/setup.cfg +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/tests/test_client.py +0 -0
- {gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/tests/test_type_converter.py +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gooddata-sdk
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.24.1.dev1
|
|
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.
|
|
8
|
+
Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.24.1.dev1
|
|
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.8.0
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
License-File: LICENSE.txt
|
|
26
|
-
Requires-Dist: gooddata-api-client~=1.
|
|
26
|
+
Requires-Dist: gooddata-api-client~=1.24.1.dev1
|
|
27
27
|
Requires-Dist: python-dateutil>=2.5.3
|
|
28
28
|
Requires-Dist: pyyaml>=5.1
|
|
29
29
|
Requires-Dist: attrs<=23.2.0,>=21.4.0
|
|
@@ -47,7 +47,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
|
|
|
47
47
|
* Compute Service
|
|
48
48
|
* Table Service
|
|
49
49
|
|
|
50
|
-
See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.
|
|
50
|
+
See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.24.1.dev1) for more details.
|
|
51
51
|
|
|
52
52
|
## Requirements
|
|
53
53
|
|
|
@@ -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.
|
|
16
|
+
See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.24.1.dev1) for more details.
|
|
17
17
|
|
|
18
18
|
## Requirements
|
|
19
19
|
|
|
@@ -67,6 +67,7 @@ from gooddata_sdk.catalog.export.request import (
|
|
|
67
67
|
ExportRequest,
|
|
68
68
|
ExportSettings,
|
|
69
69
|
)
|
|
70
|
+
from gooddata_sdk.catalog.filter_by import CatalogFilterBy
|
|
70
71
|
from gooddata_sdk.catalog.identifier import (
|
|
71
72
|
CatalogAssigneeIdentifier,
|
|
72
73
|
CatalogDatasetWorkspaceDataFilterIdentifier,
|
|
@@ -190,6 +191,7 @@ from gooddata_sdk.catalog.workspace.entity_model.user_data_filter import (
|
|
|
190
191
|
)
|
|
191
192
|
from gooddata_sdk.catalog.workspace.entity_model.workspace import CatalogWorkspace
|
|
192
193
|
from gooddata_sdk.client import GoodDataApiClient
|
|
194
|
+
from gooddata_sdk.compute.compute_to_sdk_converter import ComputeToSdkConverter
|
|
193
195
|
from gooddata_sdk.compute.model.attribute import Attribute
|
|
194
196
|
from gooddata_sdk.compute.model.base import ExecModelEntity, ObjId
|
|
195
197
|
from gooddata_sdk.compute.model.execution import (
|
|
@@ -234,6 +236,7 @@ from gooddata_sdk.visualization import (
|
|
|
234
236
|
Visualization,
|
|
235
237
|
VisualizationAttribute,
|
|
236
238
|
VisualizationBucket,
|
|
239
|
+
VisualizationFilter,
|
|
237
240
|
VisualizationMetric,
|
|
238
241
|
VisualizationService,
|
|
239
242
|
)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# (C) 2024 GoodData Corporation
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Type
|
|
5
|
+
|
|
6
|
+
import attr
|
|
7
|
+
from gooddata_api_client.model.filter_by import FilterBy
|
|
8
|
+
|
|
9
|
+
from gooddata_sdk.catalog.base import Base
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@attr.s(auto_attribs=True, kw_only=True)
|
|
13
|
+
class CatalogFilterBy(Base):
|
|
14
|
+
label_type: str
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def client_class() -> Type[FilterBy]:
|
|
18
|
+
return FilterBy
|
|
@@ -12,6 +12,7 @@ from gooddata_api_client.model.elements_request import ElementsRequest
|
|
|
12
12
|
from gooddata_sdk.catalog.catalog_service_base import CatalogServiceBase
|
|
13
13
|
from gooddata_sdk.catalog.data_source.validation.data_source import DataSourceValidator
|
|
14
14
|
from gooddata_sdk.catalog.depends_on import CatalogDependsOn, CatalogDependsOnDateFilter
|
|
15
|
+
from gooddata_sdk.catalog.filter_by import CatalogFilterBy
|
|
15
16
|
from gooddata_sdk.catalog.types import ValidObjects
|
|
16
17
|
from gooddata_sdk.catalog.validate_by_item import CatalogValidateByItem
|
|
17
18
|
from gooddata_sdk.catalog.workspace.declarative_model.workspace.analytics_model.analytics_model import (
|
|
@@ -564,6 +565,8 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
|
|
|
564
565
|
label_id: LabelElementsInputType,
|
|
565
566
|
depends_on: Optional[List[DependsOnItem]] = None,
|
|
566
567
|
validate_by: Optional[List[CatalogValidateByItem]] = None,
|
|
568
|
+
exact_filter: Optional[List[str]] = None,
|
|
569
|
+
filter_by: Optional[CatalogFilterBy] = None,
|
|
567
570
|
) -> List[str]:
|
|
568
571
|
"""
|
|
569
572
|
Get existing values for a label.
|
|
@@ -580,6 +583,11 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
|
|
|
580
583
|
Optional parameter specifying dependencies on other labels or date filters.
|
|
581
584
|
validate_by (Optional[List[CatalogValidateByItem]]):
|
|
582
585
|
Optional parameter specifying validation metrics, attributes, labels or facts.
|
|
586
|
+
exact_filter (Optional[List[str]]):
|
|
587
|
+
Optional parameter specifying exact filter values.
|
|
588
|
+
filter_by (Optional[CatalogFilterBy]):
|
|
589
|
+
Optional parameter specifying which label is used for filtering - primary or requested.
|
|
590
|
+
If omitted the server will use the default value of "REQUESTED"
|
|
583
591
|
Returns:
|
|
584
592
|
list of label values
|
|
585
593
|
"""
|
|
@@ -597,6 +605,13 @@ class CatalogWorkspaceContentService(CatalogServiceBase):
|
|
|
597
605
|
request = ElementsRequest(
|
|
598
606
|
label=label_id, depends_on=[d.to_api() for d in depends_on], validate_by=[v.to_api() for v in validate_by]
|
|
599
607
|
)
|
|
608
|
+
|
|
609
|
+
if exact_filter is not None:
|
|
610
|
+
request.exact_filter = exact_filter
|
|
611
|
+
|
|
612
|
+
if filter_by is not None:
|
|
613
|
+
request.filter_by = filter_by.to_api()
|
|
614
|
+
|
|
600
615
|
# TODO - fix return type of Paging.next in Backend + add support for this API to SDK
|
|
601
616
|
values = self._actions_api.compute_label_elements_post(workspace_id, request, _check_return_type=False)
|
|
602
617
|
return [v["title"] for v in values["elements"]]
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# (C) 2024 GoodData Corporation
|
|
2
|
+
from typing import Any, Dict, Union, cast
|
|
3
|
+
|
|
4
|
+
from gooddata_sdk.compute.model.attribute import Attribute
|
|
5
|
+
from gooddata_sdk.compute.model.base import ObjId
|
|
6
|
+
from gooddata_sdk.compute.model.filter import (
|
|
7
|
+
AbsoluteDateFilter,
|
|
8
|
+
AllTimeFilter,
|
|
9
|
+
Filter,
|
|
10
|
+
MetricValueFilter,
|
|
11
|
+
NegativeAttributeFilter,
|
|
12
|
+
PositiveAttributeFilter,
|
|
13
|
+
RankingFilter,
|
|
14
|
+
RelativeDateFilter,
|
|
15
|
+
)
|
|
16
|
+
from gooddata_sdk.compute.model.metric import (
|
|
17
|
+
ArithmeticMetric,
|
|
18
|
+
Metric,
|
|
19
|
+
PopDate,
|
|
20
|
+
PopDateDataset,
|
|
21
|
+
PopDateMetric,
|
|
22
|
+
PopDatesetMetric,
|
|
23
|
+
SimpleMetric,
|
|
24
|
+
)
|
|
25
|
+
from gooddata_sdk.utils import ref_extract, ref_extract_obj_id
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ComputeToSdkConverter:
|
|
29
|
+
"""
|
|
30
|
+
Provides functions to convert Compute API model objects represented as dictionaries to the SDK Compute model.
|
|
31
|
+
We cannot use the Visualization converter as the Compute API model is different:
|
|
32
|
+
- there are differences in naming: e.g. "label" vs "displayForm", "dataset" vs "dataSet"
|
|
33
|
+
- there are differences in structure: e.g. "measure" vs "measureDefinition"
|
|
34
|
+
|
|
35
|
+
The inputs to this converter should be dictionaries that come from parsing the JSON payloads
|
|
36
|
+
used with the backend's /execute API endpoint.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def convert_attribute(attribute_dict: Dict[str, Any]) -> Attribute:
|
|
41
|
+
"""
|
|
42
|
+
Converts attribute dictionary to the SDK Compute model.
|
|
43
|
+
:param attribute_dict: the attribute dictionary to convert
|
|
44
|
+
:return: the converted attribute
|
|
45
|
+
"""
|
|
46
|
+
return Attribute(
|
|
47
|
+
local_id=attribute_dict["localIdentifier"],
|
|
48
|
+
label=attribute_dict["label"]["identifier"]["id"],
|
|
49
|
+
show_all_values=attribute_dict["showAllValues"],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
@staticmethod
|
|
53
|
+
def convert_filter(filter_dict: Dict[str, Any]) -> Filter:
|
|
54
|
+
"""
|
|
55
|
+
Converts filter dictionary to the SDK Compute model.
|
|
56
|
+
:param filter_dict: the filter dictionary to convert
|
|
57
|
+
:return: the converted filter
|
|
58
|
+
"""
|
|
59
|
+
if "positiveAttributeFilter" in filter_dict:
|
|
60
|
+
f = filter_dict["positiveAttributeFilter"]
|
|
61
|
+
return PositiveAttributeFilter(label=ref_extract(f["label"]), values=f["in"]["values"])
|
|
62
|
+
|
|
63
|
+
if "negativeAttributeFilter" in filter_dict:
|
|
64
|
+
f = filter_dict["negativeAttributeFilter"]
|
|
65
|
+
return NegativeAttributeFilter(label=ref_extract(f["label"]), values=f["notIn"]["values"])
|
|
66
|
+
|
|
67
|
+
if "relativeDateFilter" in filter_dict:
|
|
68
|
+
f = filter_dict["relativeDateFilter"]
|
|
69
|
+
|
|
70
|
+
# there is a filter present, but means all time
|
|
71
|
+
if ("from" not in f) or ("to" not in f):
|
|
72
|
+
return AllTimeFilter(ref_extract_obj_id(f["dataset"]))
|
|
73
|
+
|
|
74
|
+
return RelativeDateFilter(
|
|
75
|
+
dataset=ref_extract_obj_id(f["dataset"]),
|
|
76
|
+
granularity=f["granularity"],
|
|
77
|
+
from_shift=f["from"],
|
|
78
|
+
to_shift=f["to"],
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if "absoluteDateFilter" in filter_dict:
|
|
82
|
+
f = filter_dict["absoluteDateFilter"]
|
|
83
|
+
|
|
84
|
+
return AbsoluteDateFilter(dataset=ref_extract_obj_id(f["dataset"]), from_date=f["from"], to_date=f["to"])
|
|
85
|
+
|
|
86
|
+
if "comparisonMeasureValueFilter" in filter_dict:
|
|
87
|
+
f = filter_dict["comparisonMeasureValueFilter"]
|
|
88
|
+
|
|
89
|
+
return MetricValueFilter(
|
|
90
|
+
metric=ref_extract(f["measure"]),
|
|
91
|
+
operator=f["operator"],
|
|
92
|
+
values=f["value"],
|
|
93
|
+
treat_nulls_as=f.get("treatNullValuesAs"),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
if "rangeMeasureValueFilter" in filter_dict:
|
|
97
|
+
f = filter_dict["rangeMeasureValueFilter"]
|
|
98
|
+
|
|
99
|
+
return MetricValueFilter(
|
|
100
|
+
metric=ref_extract(f["measure"]),
|
|
101
|
+
operator=f["operator"],
|
|
102
|
+
values=(f["from"], f["to"]),
|
|
103
|
+
treat_nulls_as=f.get("treatNullValuesAs"),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if "rankingFilter" in filter_dict:
|
|
107
|
+
f = filter_dict["rankingFilter"]
|
|
108
|
+
|
|
109
|
+
# mypy is unable to automatically convert Union[str, ObjId] to Union[str, ObjId, Attribute, Metric]
|
|
110
|
+
# so use explicit cast here
|
|
111
|
+
dimensionality = (
|
|
112
|
+
[cast(Union[str, ObjId, Attribute, Metric], ref_extract(a)) for a in f["attributes"]]
|
|
113
|
+
if "attributes" in f
|
|
114
|
+
else None
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
return RankingFilter(
|
|
118
|
+
metrics=[ref_extract(m) for m in f["measures"]],
|
|
119
|
+
dimensionality=dimensionality,
|
|
120
|
+
operator=f["operator"],
|
|
121
|
+
value=f["value"],
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
raise ValueError(f"Unsupported filter definition type: {filter_dict}")
|
|
125
|
+
|
|
126
|
+
@staticmethod
|
|
127
|
+
def convert_metric(metric_dict: Dict[str, Any]) -> Metric:
|
|
128
|
+
"""
|
|
129
|
+
Converts metric dictionary to the SDK Compute model.
|
|
130
|
+
:param metric_dict: the metric dictionary to convert
|
|
131
|
+
:return: the converted metric
|
|
132
|
+
"""
|
|
133
|
+
definition = metric_dict["definition"]
|
|
134
|
+
local_id = metric_dict["localIdentifier"]
|
|
135
|
+
|
|
136
|
+
if "measure" in definition:
|
|
137
|
+
d = definition["measure"]
|
|
138
|
+
aggregation = d.get("aggregation", None)
|
|
139
|
+
compute_ratio = d.get("computeRatio", False)
|
|
140
|
+
|
|
141
|
+
filters = [ComputeToSdkConverter.convert_filter(f) for f in d["filters"]] if "filters" in d else None
|
|
142
|
+
|
|
143
|
+
return SimpleMetric(
|
|
144
|
+
local_id=local_id,
|
|
145
|
+
item=ref_extract_obj_id(d["item"]),
|
|
146
|
+
aggregation=aggregation,
|
|
147
|
+
compute_ratio=compute_ratio,
|
|
148
|
+
filters=filters,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
if "arithmeticMeasure" in definition:
|
|
152
|
+
d = definition["arithmeticMeasure"]
|
|
153
|
+
return ArithmeticMetric(
|
|
154
|
+
local_id=local_id,
|
|
155
|
+
operator=d["operator"],
|
|
156
|
+
operands=[o["localIdentifier"] for o in d["measureIdentifiers"]],
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if "overPeriodMeasure" in definition:
|
|
160
|
+
d = definition["overPeriodMeasure"]
|
|
161
|
+
date_attributes = [
|
|
162
|
+
PopDate(attribute=ref_extract_obj_id(item["attribute"]), periods_ago=item["periodsAgo"])
|
|
163
|
+
for item in d["dateAttributes"]
|
|
164
|
+
]
|
|
165
|
+
|
|
166
|
+
return PopDateMetric(
|
|
167
|
+
local_id=local_id,
|
|
168
|
+
metric=d["measureIdentifier"]["localIdentifier"],
|
|
169
|
+
date_attributes=date_attributes,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
if "previousPeriodMeasure" in definition:
|
|
173
|
+
d = definition["previousPeriodMeasure"]
|
|
174
|
+
|
|
175
|
+
date_datasets = [PopDateDataset(ref_extract(dd["dataset"]), dd["periodsAgo"]) for dd in d["dateDatasets"]]
|
|
176
|
+
|
|
177
|
+
return PopDatesetMetric(
|
|
178
|
+
local_id=local_id,
|
|
179
|
+
metric=d["measureIdentifier"]["localIdentifier"],
|
|
180
|
+
date_datasets=date_datasets,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
raise ValueError(f"Unsupported metric definition type: {metric_dict}")
|
|
@@ -391,3 +391,34 @@ def read_json(path: Union[str, Path]) -> Any:
|
|
|
391
391
|
path = Path(path) if isinstance(path, str) else path
|
|
392
392
|
with open(path, "r", encoding="utf-8") as f:
|
|
393
393
|
return json.loads(f.read())
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def ref_extract_obj_id(ref: Dict[str, Any]) -> ObjId:
|
|
397
|
+
"""
|
|
398
|
+
Extracts ObjId from a ref dictionary.
|
|
399
|
+
:param ref: the ref to extract from
|
|
400
|
+
:return: the extracted ObjId
|
|
401
|
+
:raises ValueError: if the ref is not an identifier
|
|
402
|
+
"""
|
|
403
|
+
if "identifier" in ref:
|
|
404
|
+
return ObjId(id=ref["identifier"]["id"], type=ref["identifier"]["type"])
|
|
405
|
+
|
|
406
|
+
raise ValueError("invalid ref. must be identifier")
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def ref_extract(ref: Dict[str, Any]) -> Union[str, ObjId]:
|
|
410
|
+
"""
|
|
411
|
+
Extracts an object id from a ref dictionary: either an identifier or a localIdentifier.
|
|
412
|
+
:param ref: the ref to extract from
|
|
413
|
+
:return: thr extracted object id
|
|
414
|
+
:raises ValueError: if the ref is not an identifier or localIdentifier
|
|
415
|
+
"""
|
|
416
|
+
try:
|
|
417
|
+
return ref_extract_obj_id(ref)
|
|
418
|
+
except ValueError:
|
|
419
|
+
pass
|
|
420
|
+
|
|
421
|
+
if "localIdentifier" in ref:
|
|
422
|
+
return ref["localIdentifier"]
|
|
423
|
+
|
|
424
|
+
raise ValueError("invalid ref. must be identifier or localIdentifier")
|
|
@@ -29,7 +29,7 @@ from gooddata_sdk.compute.model.metric import (
|
|
|
29
29
|
PopDatesetMetric,
|
|
30
30
|
SimpleMetric,
|
|
31
31
|
)
|
|
32
|
-
from gooddata_sdk.utils import IdObjType, SideLoads, load_all_entities, safeget
|
|
32
|
+
from gooddata_sdk.utils import IdObjType, SideLoads, load_all_entities, ref_extract, ref_extract_obj_id, safeget
|
|
33
33
|
|
|
34
34
|
#
|
|
35
35
|
# Conversion from types stored in visualization into the gooddata_afm_client models.
|
|
@@ -160,48 +160,29 @@ class AttributeSortType(Enum):
|
|
|
160
160
|
#
|
|
161
161
|
|
|
162
162
|
|
|
163
|
-
def _ref_extract_obj_id(ref: dict[str, Any]) -> ObjId:
|
|
164
|
-
if "identifier" in ref:
|
|
165
|
-
return ObjId(id=ref["identifier"]["id"], type=ref["identifier"]["type"])
|
|
166
|
-
|
|
167
|
-
raise ValueError("invalid ref. must be identifier")
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
def _ref_extract(ref: dict[str, Any]) -> Union[str, ObjId]:
|
|
171
|
-
try:
|
|
172
|
-
return _ref_extract_obj_id(ref)
|
|
173
|
-
except ValueError:
|
|
174
|
-
pass
|
|
175
|
-
|
|
176
|
-
if "localIdentifier" in ref:
|
|
177
|
-
return ref["localIdentifier"]
|
|
178
|
-
|
|
179
|
-
raise ValueError("invalid ref. must be identifier or localIdentifier")
|
|
180
|
-
|
|
181
|
-
|
|
182
163
|
def _convert_filter_to_computable(filter_obj: dict[str, Any]) -> Filter:
|
|
183
164
|
if "positiveAttributeFilter" in filter_obj:
|
|
184
165
|
f = filter_obj["positiveAttributeFilter"]
|
|
185
166
|
# fallback to use URIs; SDK may be able to create filter with attr elements as uris...
|
|
186
167
|
in_values = f["in"]["values"] if "values" in f["in"] else f["in"]["uris"]
|
|
187
168
|
|
|
188
|
-
return PositiveAttributeFilter(label=
|
|
169
|
+
return PositiveAttributeFilter(label=ref_extract(f["displayForm"]), values=in_values)
|
|
189
170
|
|
|
190
171
|
elif "negativeAttributeFilter" in filter_obj:
|
|
191
172
|
f = filter_obj["negativeAttributeFilter"]
|
|
192
173
|
# fallback to use URIs; SDK may be able to create filter with attr elements as uris...
|
|
193
174
|
not_in_values = f["notIn"]["values"] if "values" in f["notIn"] else f["notIn"]["uris"]
|
|
194
175
|
|
|
195
|
-
return NegativeAttributeFilter(label=
|
|
176
|
+
return NegativeAttributeFilter(label=ref_extract(f["displayForm"]), values=not_in_values)
|
|
196
177
|
elif "relativeDateFilter" in filter_obj:
|
|
197
178
|
f = filter_obj["relativeDateFilter"]
|
|
198
179
|
|
|
199
180
|
# there is filter present, but uses all time
|
|
200
181
|
if ("from" not in f) or ("to" not in f):
|
|
201
|
-
return AllTimeFilter(
|
|
182
|
+
return AllTimeFilter(ref_extract_obj_id(f["dataSet"]))
|
|
202
183
|
|
|
203
184
|
return RelativeDateFilter(
|
|
204
|
-
dataset=
|
|
185
|
+
dataset=ref_extract_obj_id(f["dataSet"]),
|
|
205
186
|
granularity=_GRANULARITY_CONVERSION[f["granularity"]],
|
|
206
187
|
from_shift=f["from"],
|
|
207
188
|
to_shift=f["to"],
|
|
@@ -210,13 +191,13 @@ def _convert_filter_to_computable(filter_obj: dict[str, Any]) -> Filter:
|
|
|
210
191
|
elif "absoluteDateFilter" in filter_obj:
|
|
211
192
|
f = filter_obj["absoluteDateFilter"]
|
|
212
193
|
|
|
213
|
-
return AbsoluteDateFilter(dataset=
|
|
194
|
+
return AbsoluteDateFilter(dataset=ref_extract_obj_id(f["dataSet"]), from_date=f["from"], to_date=f["to"])
|
|
214
195
|
elif "measureValueFilter" in filter_obj:
|
|
215
196
|
f = filter_obj["measureValueFilter"]
|
|
216
197
|
|
|
217
198
|
# no condition means no limitation
|
|
218
199
|
if "condition" not in f:
|
|
219
|
-
return AllMetricValueFilter(metric=
|
|
200
|
+
return AllMetricValueFilter(metric=ref_extract(f["measure"]))
|
|
220
201
|
|
|
221
202
|
condition = f["condition"]
|
|
222
203
|
|
|
@@ -225,7 +206,7 @@ def _convert_filter_to_computable(filter_obj: dict[str, Any]) -> Filter:
|
|
|
225
206
|
treat_values_as_null = c.get("treatNullValuesAs")
|
|
226
207
|
|
|
227
208
|
return MetricValueFilter(
|
|
228
|
-
metric=
|
|
209
|
+
metric=ref_extract(f["measure"]),
|
|
229
210
|
operator=c["operator"],
|
|
230
211
|
values=c["value"],
|
|
231
212
|
treat_nulls_as=treat_values_as_null,
|
|
@@ -234,7 +215,7 @@ def _convert_filter_to_computable(filter_obj: dict[str, Any]) -> Filter:
|
|
|
234
215
|
c = condition["range"]
|
|
235
216
|
treat_values_as_null = c.get("treatNullValuesAs")
|
|
236
217
|
return MetricValueFilter(
|
|
237
|
-
metric=
|
|
218
|
+
metric=ref_extract(f["measure"]),
|
|
238
219
|
operator=c["operator"],
|
|
239
220
|
values=(c["from"], c["to"]),
|
|
240
221
|
treat_nulls_as=treat_values_as_null,
|
|
@@ -244,13 +225,13 @@ def _convert_filter_to_computable(filter_obj: dict[str, Any]) -> Filter:
|
|
|
244
225
|
# mypy is unable to automatically convert Union[str, ObjId] to Union[str, ObjId, Attribute, Metric]
|
|
245
226
|
# so use explicit cast here
|
|
246
227
|
dimensionality = (
|
|
247
|
-
[cast(Union[str, ObjId, Attribute, Metric],
|
|
228
|
+
[cast(Union[str, ObjId, Attribute, Metric], ref_extract(a)) for a in f["attributes"]]
|
|
248
229
|
if "attributes" in f
|
|
249
230
|
else None
|
|
250
231
|
)
|
|
251
232
|
|
|
252
233
|
return RankingFilter(
|
|
253
|
-
metrics=[
|
|
234
|
+
metrics=[ref_extract(f["measure"])],
|
|
254
235
|
dimensionality=dimensionality,
|
|
255
236
|
operator=f["operator"],
|
|
256
237
|
value=f["value"],
|
|
@@ -273,7 +254,7 @@ def _convert_metric_to_computable(metric: dict[str, Any]) -> Metric:
|
|
|
273
254
|
|
|
274
255
|
return SimpleMetric(
|
|
275
256
|
local_id=local_id,
|
|
276
|
-
item=
|
|
257
|
+
item=ref_extract_obj_id(d["item"]),
|
|
277
258
|
aggregation=aggregation,
|
|
278
259
|
compute_ratio=compute_ratio,
|
|
279
260
|
filters=filters,
|
|
@@ -281,7 +262,7 @@ def _convert_metric_to_computable(metric: dict[str, Any]) -> Metric:
|
|
|
281
262
|
|
|
282
263
|
elif "popMeasureDefinition" in measure_def:
|
|
283
264
|
d = measure_def["popMeasureDefinition"]
|
|
284
|
-
date_attributes = [PopDate(attribute=
|
|
265
|
+
date_attributes = [PopDate(attribute=ref_extract_obj_id(d["popAttribute"]), periods_ago=1)]
|
|
285
266
|
|
|
286
267
|
return PopDateMetric(
|
|
287
268
|
local_id=local_id,
|
|
@@ -292,7 +273,7 @@ def _convert_metric_to_computable(metric: dict[str, Any]) -> Metric:
|
|
|
292
273
|
elif "previousPeriodMeasure" in measure_def:
|
|
293
274
|
d = measure_def["previousPeriodMeasure"]
|
|
294
275
|
|
|
295
|
-
date_datasets = [PopDateDataset(
|
|
276
|
+
date_datasets = [PopDateDataset(ref_extract(dd["dataSet"]), dd["periodsAgo"]) for dd in d["dateDataSets"]]
|
|
296
277
|
|
|
297
278
|
return PopDatesetMetric(
|
|
298
279
|
local_id=local_id,
|
|
@@ -413,7 +394,7 @@ class VisualizationAttribute:
|
|
|
413
394
|
return self._a.get("showAllValues")
|
|
414
395
|
|
|
415
396
|
def as_computable(self) -> Attribute:
|
|
416
|
-
return Attribute(local_id=self.local_id, label=
|
|
397
|
+
return Attribute(local_id=self.local_id, label=ref_extract(self.label), show_all_values=self.show_all_values)
|
|
417
398
|
|
|
418
399
|
def __str__(self) -> str:
|
|
419
400
|
return self.__repr__()
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gooddata-sdk
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.24.1.dev1
|
|
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.
|
|
8
|
+
Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.24.1.dev1
|
|
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.8.0
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
License-File: LICENSE.txt
|
|
26
|
-
Requires-Dist: gooddata-api-client~=1.
|
|
26
|
+
Requires-Dist: gooddata-api-client~=1.24.1.dev1
|
|
27
27
|
Requires-Dist: python-dateutil>=2.5.3
|
|
28
28
|
Requires-Dist: pyyaml>=5.1
|
|
29
29
|
Requires-Dist: attrs<=23.2.0,>=21.4.0
|
|
@@ -47,7 +47,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
|
|
|
47
47
|
* Compute Service
|
|
48
48
|
* Table Service
|
|
49
49
|
|
|
50
|
-
See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.
|
|
50
|
+
See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.24.1.dev1) for more details.
|
|
51
51
|
|
|
52
52
|
## Requirements
|
|
53
53
|
|
|
@@ -24,6 +24,7 @@ gooddata_sdk/catalog/base.py
|
|
|
24
24
|
gooddata_sdk/catalog/catalog_service_base.py
|
|
25
25
|
gooddata_sdk/catalog/depends_on.py
|
|
26
26
|
gooddata_sdk/catalog/entity.py
|
|
27
|
+
gooddata_sdk/catalog/filter_by.py
|
|
27
28
|
gooddata_sdk/catalog/identifier.py
|
|
28
29
|
gooddata_sdk/catalog/parameter.py
|
|
29
30
|
gooddata_sdk/catalog/rule.py
|
|
@@ -115,6 +116,7 @@ gooddata_sdk/cli/gdc_core.py
|
|
|
115
116
|
gooddata_sdk/cli/package.json
|
|
116
117
|
gooddata_sdk/cli/utils.py
|
|
117
118
|
gooddata_sdk/compute/__init__.py
|
|
119
|
+
gooddata_sdk/compute/compute_to_sdk_converter.py
|
|
118
120
|
gooddata_sdk/compute/service.py
|
|
119
121
|
gooddata_sdk/compute/model/__init__.py
|
|
120
122
|
gooddata_sdk/compute/model/attribute.py
|
|
@@ -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.
|
|
10
|
+
"gooddata-api-client~=1.24.1.dev1",
|
|
11
11
|
"python-dateutil>=2.5.3",
|
|
12
12
|
"pyyaml>=5.1",
|
|
13
13
|
"attrs>=21.4.0,<=23.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.
|
|
25
|
+
version="1.24.1.dev1",
|
|
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.
|
|
39
|
+
"Documentation": "https://www.gooddata.com/docs/python-sdk/1.24.1.dev1",
|
|
40
40
|
"Source": "https://github.com/gooddata/gooddata-python-sdk",
|
|
41
41
|
},
|
|
42
42
|
classifiers=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/catalog_service_base.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/data_source/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/__init__.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/request.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/export/service.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/organization/service.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/permission/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/user/entity_model/user.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/validate_by_item.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/catalog/workspace/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/__init__.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/attribute.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk/compute/model/execution.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.23.1.dev2 → gooddata_sdk-1.24.1.dev1}/gooddata_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|