Skip to content
This repository was archived by the owner on Jun 28, 2022. It is now read-only.

Commit 9f02dc3

Browse files
author
ns-shudson
authored
LEXIO-37872: get_dataset_version (#5)
1 parent 761c055 commit 9f02dc3

File tree

5 files changed

+172
-11
lines changed

5 files changed

+172
-11
lines changed

crma_api_client/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
from .client import CRMAAPIClient
44

5-
__version__ = "0.5.0"
5+
__version__ = "0.6.0"

crma_api_client/client.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
import httpx
99
from pydantic import BaseModel
1010

11-
from crma_api_client.resources.dataset import DatasetVersionsResponse
11+
from crma_api_client.resources.dataset import (
12+
DatasetVersionResponse,
13+
DatasetVersionsResponse,
14+
)
1215
from crma_api_client.resources.query import QueryLanguage, QueryResponse
1316
from .encoder import json_dumps_common
1417

@@ -169,6 +172,24 @@ async def list_dataset_versions(self, identifier: str) -> DatasetVersionsRespons
169172
response = await self.request(f"/wave/datasets/{identifier}/versions", "GET")
170173
return DatasetVersionsResponse.parse_obj(response.json())
171174

175+
async def get_dataset_version(
176+
self, dataset_id: str, version_id: str
177+
) -> DatasetVersionResponse:
178+
"""Get a single version for a dataset
179+
180+
Args:
181+
dataset_id: Dataset name or ID
182+
version_id: Version ID
183+
184+
Returns:
185+
the version of the dataset
186+
187+
"""
188+
response = await self.request(
189+
f"/wave/datasets/{dataset_id}/versions/{version_id}", "GET"
190+
)
191+
return DatasetVersionResponse.parse_obj(response.json())
192+
172193
async def query(
173194
self,
174195
query: str,

crma_api_client/resources/dataset.py

Lines changed: 134 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,144 @@
11
"""Contains definitions for the dataset resource"""
22

33
from datetime import datetime
4-
from typing import List
4+
from enum import Enum
5+
from typing import List, Optional, TypeVar
56

6-
from pydantic import BaseModel
7+
from pydantic import BaseModel, validator
78

89
from .user import User
910
from .util import to_camel
1011

12+
T = TypeVar("T")
1113

12-
class Dataset(BaseModel):
14+
15+
class CRMAModel(BaseModel):
16+
"""Base class for all models from the CRMA API
17+
18+
Has logic for converting camel case to snake case
19+
"""
20+
21+
class Config:
22+
"""Model configuration"""
23+
24+
alias_generator = to_camel
25+
26+
27+
class Dataset(CRMAModel):
1328
"""Dataset model"""
1429

1530
id: str
1631
url: str
1732

1833

19-
class DatasetVersion(BaseModel):
34+
class DateType(Enum):
35+
"""The type of date field"""
36+
37+
date = "Date"
38+
date_only = "DateOnly"
39+
date_time = "DateTime"
40+
41+
42+
class XmdDateFields(CRMAModel):
43+
"""Date fields in the extended metadata format
44+
45+
See https://developer.salesforce.com/docs/atlas.en-us.230.0.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_resources_xmd_main.htm#XmdDateFieldRepresentation
46+
"""
47+
48+
day: str
49+
epoch_day: str
50+
epoch_second: str
51+
fiscal_month: Optional[str]
52+
fiscal_quarter: Optional[str]
53+
fiscal_week: Optional[str]
54+
fiscal_year: Optional[str]
55+
full_field: str
56+
hour: str
57+
minute: str
58+
month: str
59+
quarter: str
60+
second: str
61+
week: str
62+
year: str
63+
64+
@validator("fiscal_month", "fiscal_quarter", "fiscal_week", "fiscal_year")
65+
def not_none(cls, v: T) -> T:
66+
"""Validates that the given value is not None
67+
68+
This is needed since the Optional type doesn't distinguish between a field
69+
being None and being missing.
70+
71+
Args:
72+
v: the value to check
73+
74+
Raises:
75+
ValueError: if the value is None
76+
77+
Returns:
78+
the value if it's not None
79+
80+
"""
81+
if v is None:
82+
raise ValueError("Fiscal fields may not be None")
83+
return v
84+
85+
86+
class XmdDate(CRMAModel):
87+
"""Date in the extended metadata format
88+
89+
See https://developer.salesforce.com/docs/atlas.en-us.230.0.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_resources_xmd_main.htm#XmdDateRepresentation
90+
"""
91+
92+
alias: str
93+
fields: XmdDateFields
94+
first_day_of_week: int
95+
fiscal_month_offset: int
96+
fully_qualified_name: str
97+
is_year_end_fiscal_year: bool
98+
label: str
99+
type: DateType
100+
101+
102+
class XmdDimension(CRMAModel):
103+
"""Dimension in the Xmd format
104+
105+
See https://developer.salesforce.com/docs/atlas.en-us.230.0.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_resources_xmd_main.htm#XmdDimensionRepresentation
106+
"""
107+
108+
field: str
109+
label: str
110+
111+
112+
class XmdMeasure(CRMAModel):
113+
"""Measure in the Xmd format
114+
115+
See https://developer.salesforce.com/docs/atlas.en-us.230.0.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_resources_xmd_main.htm#XmdMeasureRepresentation
116+
"""
117+
118+
field: str
119+
label: str
120+
121+
122+
class DatasetXmd(CRMAModel):
123+
"""Extended metadata for a dataset
124+
125+
See https://developer.salesforce.com/docs/atlas.en-us.230.0.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_resources_xmd_main.htm
126+
"""
127+
128+
created_by: User
129+
created_date: datetime
130+
dates: List[XmdDate]
131+
derived_dimensions: List[XmdDimension]
132+
derived_measures: List[XmdMeasure]
133+
dimensions: List[XmdDimension]
134+
last_modified_by: User
135+
last_modified_date: datetime
136+
measures: List[XmdMeasure]
137+
type: str
138+
url: str
139+
140+
141+
class DatasetVersion(CRMAModel):
20142
"""Dataset version model
21143
22144
See https://developer.salesforce.com/docs/atlas.en-us.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_responses_dataset_version.htm
@@ -32,13 +154,17 @@ class DatasetVersion(BaseModel):
32154
type: str
33155
url: str
34156

35-
class Config:
36-
"""Model configuration"""
37157

38-
alias_generator = to_camel
158+
class DatasetVersionResponse(DatasetVersion):
159+
"""Dataset version model
160+
161+
See https://developer.salesforce.com/docs/atlas.en-us.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_responses_dataset_version.htm
162+
"""
163+
164+
xmd_main: DatasetXmd
39165

40166

41-
class DatasetVersionsResponse(BaseModel):
167+
class DatasetVersionsResponse(CRMAModel):
42168
"""Response model for a list of dataset versions
43169
44170
See https://developer.salesforce.com/docs/atlas.en-us.bi_dev_guide_rest.meta/bi_dev_guide_rest/bi_responses_dataset_version_collection.htm

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "crma-api-client"
3-
version = "0.5.0"
3+
version = "0.6.0"
44
description = "CRM Analytics REST API Client"
55
authors = ["Jonathan Drake <[email protected]>"]
66
license = "BSD-3-Clause"

tests/functional/test_dataset.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Contains functional tests for the dataset resource"""
2+
3+
import pytest
4+
5+
from crma_api_client.client import CRMAAPIClient
6+
7+
8+
@pytest.mark.asyncio
9+
async def test_get_dataset_version(client: CRMAAPIClient):
10+
"""Should get the metadata for a particular dataset"""
11+
dataset_id = "Sample_Superstore_xls_Orders"
12+
versions_response = await client.list_dataset_versions(dataset_id)
13+
version = versions_response.versions[0]
14+
await client.get_dataset_version(dataset_id, version.id)

0 commit comments

Comments
 (0)