Skip to content

Commit a7dfe6d

Browse files
authored
Merge pull request #65 from oslokommune/DP-1933-dataset-update-partial
DP-1933 Support partial dataset metadata updates
2 parents f9f4b77 + a6990fb commit a7dfe6d

File tree

5 files changed

+47
-29
lines changed

5 files changed

+47
-29
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## ?.?.?
2+
3+
* `Dataset.update_dataset` now supports partial metadata updates when the
4+
keyword argument `partial` is true.
5+
16
## 0.6.3
27

38
* PyJWT 2.0.0 or above is now required.

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ dataset.update_dataset(
338338
"description": "Describe your dataset here",
339339
"keywords": ["some-keyword", "another-keyword"], # Add another keyword
340340
"accessRights": "public",
341-
"license": "Norsk lisens for offentlige data (NLOD) 1.0", # Add licensing information
341+
"license": "http://data.norge.no/nlod/", # Add licensing information
342342
"objective": "Exemplify how to update an existing dataset", # Update objective text
343343
"contactPoint": {
344344
"name": "Your name",
@@ -349,3 +349,12 @@ dataset.update_dataset(
349349
}
350350
)
351351
```
352+
353+
The `update_dataset` method also supports an optional `partial` keyword,
354+
enabling partial updates when true:
355+
356+
```py
357+
dataset.update_dataset(
358+
"my-dataset-id", {"description": "Only update description"}, partial=True
359+
)
360+
```

okdata/sdk/data/dataset.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,13 @@ def get_dataset(self, datasetid, retries=0):
3939
log.info(f"SDK:Getting dataset: {datasetid} from: {url}")
4040
return self.get(url, retries=retries).json()
4141

42-
def update_dataset(self, datasetid, data, retries=0):
42+
def update_dataset(self, datasetid, data, partial=False, retries=0):
4343
datasetUrl = self.config.get("datasetUrl")
4444
url = f"{datasetUrl}/{datasetid}"
4545
log.info(f"SDK:Updating dataset: {datasetid} with payload: {data}")
46-
result = self.put(url, data, retries=retries)
47-
body = result.json()
46+
method = self.patch if partial else self.put
47+
response = method(url, data, retries=retries)
48+
body = response.json()
4849
log.info(f"Updated dataset: {body['Id']}")
4950
return body
5051

okdata/sdk/sdk.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,37 +30,31 @@ def headers(self):
3030
headers["Authorization"] = f"Bearer {self.auth.access_token}"
3131
return headers
3232

33-
def post(self, url, data, retries=0, **kwargs):
34-
log.info(f"SDK:Posting resource to url: {url}")
33+
def _request(self, method, url, retries, **kwargs):
3534
session = self.prepared_request_with_retries(retries)
36-
result = session.post(
37-
url, data=json.dumps(data), headers=self.headers(), **kwargs
38-
)
39-
result.raise_for_status()
40-
return result
35+
try:
36+
request_method = getattr(session, method)
37+
except AttributeError:
38+
raise ValueError(f"'{method}' is not a valid request method")
39+
log.info(f"SDK:Making a {method.upper()} request to URL: {url}")
40+
response = request_method(url, headers=self.headers(), **kwargs)
41+
response.raise_for_status()
42+
return response
43+
44+
def post(self, url, data, retries=0, **kwargs):
45+
return self._request("post", url, retries, data=json.dumps(data), **kwargs)
4146

4247
def put(self, url, data, retries=0, **kwargs):
43-
log.info(f"SDK:Putting resource to url: {url}")
44-
session = self.prepared_request_with_retries(retries)
45-
result = session.put(
46-
url, data=json.dumps(data), headers=self.headers(), **kwargs
47-
)
48-
result.raise_for_status()
49-
return result
48+
return self._request("put", url, retries, data=json.dumps(data), **kwargs)
49+
50+
def patch(self, url, data, retries=0, **kwargs):
51+
return self._request("patch", url, retries, data=json.dumps(data), **kwargs)
5052

5153
def get(self, url, retries=0, **kwargs):
52-
log.info(f"SDK:Getting resource from url: {url}")
53-
session = self.prepared_request_with_retries(retries)
54-
result = session.get(url, headers=self.headers(), **kwargs)
55-
result.raise_for_status()
56-
return result
54+
return self._request("get", url, retries, **kwargs)
5755

5856
def delete(self, url, retries=0, **kwargs):
59-
log.info(f"SDK:Deleting resource from url: {url}")
60-
session = self.prepared_request_with_retries(retries)
61-
result = session.delete(url, headers=self.headers(), **kwargs)
62-
result.raise_for_status()
63-
return result
57+
return self._request("delete", url, retries, **kwargs)
6458

6559
@staticmethod
6660
def prepared_request_with_retries(retries):

tests/data/dataset_test.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,21 @@ def test_getDataset(self, requests_mock):
6969
def test_updateDataset(self, requests_mock):
7070
ds = Dataset(config=config, auth=auth_default)
7171
datasetid = "test-dataset-updateDataset"
72-
matcher = re.compile("datasets")
72+
matcher = re.compile(f"datasets/{datasetid}")
7373
response = json.dumps({"Id": datasetid})
7474
requests_mock.register_uri("PUT", matcher, text=response, status_code=200)
7575
body = ds.update_dataset(datasetid, {"Id": datasetid})
7676
assert body["Id"] == datasetid
7777

78+
def test_update_dataset_partial(self, requests_mock):
79+
ds = Dataset(config=config, auth=auth_default)
80+
dataset_id = "test-dataset-update-partial"
81+
matcher = re.compile(f"datasets/{dataset_id}")
82+
response = json.dumps({"Id": dataset_id})
83+
requests_mock.register_uri("PATCH", matcher, text=response, status_code=200)
84+
body = ds.update_dataset(dataset_id, {"Id": dataset_id}, partial=True)
85+
assert body["Id"] == dataset_id
86+
7887

7988
class TestVersion:
8089
def test_createDatasetVersion(self, requests_mock):

0 commit comments

Comments
 (0)