Skip to content

Commit 34bbbfe

Browse files
committed
Improve consistency of client
1 parent f307d7c commit 34bbbfe

3 files changed

Lines changed: 55 additions & 39 deletions

File tree

dataverse/dataset.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ def __init__(self, entry=SWORD_BOOTSTRAP, dataverse=None, edit_uri=None,
2626
self.edit_uri = edit_uri
2727
self.edit_media_uri = edit_media_uri
2828
self.statement_uri = statement_uri
29+
self.is_deleted = False
2930

3031
self._entry = etree.XML(entry) if isinstance(entry, str) else entry
3132
self._statement = None
32-
self._state = None
3333
self._json = {}
3434
self._id = None
3535

@@ -159,16 +159,15 @@ def get_statement(self, refresh=False):
159159
return self._statement
160160

161161
def get_state(self, refresh=False):
162-
if not refresh and self._state or self._state == 'DEACCESSIONED':
163-
return self._state
162+
if self.is_deleted:
163+
return 'DEACCESSIONED'
164164

165-
self._state = get_element(
165+
return get_element(
166166
self.get_statement(refresh),
167167
tag='category',
168168
attribute='term',
169169
attribute_value='latestVersionState'
170170
).text
171-
return self._state
172171

173172
def get_json(self, version='latest', refresh=False):
174173
if not refresh and self._json.get(version):
@@ -193,15 +192,28 @@ def get_json(self, version='latest', refresh=False):
193192
self._json[version] = resp.json()['data']
194193
return self._json[version]
195194

196-
def get_file(self, file_name, version='latest', refresh=True):
195+
def publish(self):
196+
resp = requests.post(
197+
self.edit_uri,
198+
headers={'In-Progress': 'false', 'Content-Length': 0},
199+
auth=self.connection.auth,
200+
)
201+
202+
if resp.status_code != 200:
203+
raise OperationFailedError('The Dataverse could not be published.')
204+
205+
receipt = resp.content
206+
self._refresh(receipt=receipt, published=True)
207+
208+
def get_file(self, file_name, version='latest', refresh=False):
197209
files = self.get_files(version, refresh)
198210
return next((f for f in files if f.name == file_name), None)
199211

200-
def get_file_by_id(self, file_id, version='latest', refresh=True):
212+
def get_file_by_id(self, file_id, version='latest', refresh=False):
201213
files = self.get_files(version, refresh)
202214
return next((f for f in files if f.id == file_id), None)
203215

204-
def get_files(self, version='latest', refresh=True):
216+
def get_files(self, version='latest', refresh=False):
205217
try:
206218
files_json = self.get_json(version, refresh)['files']
207219
return [DataverseFile.from_json(self, file_json)
@@ -250,20 +262,7 @@ def upload_file(self, filename, content, zip=True):
250262
auth=self.connection.auth,
251263
)
252264

253-
self._refresh()
254-
255-
def publish(self):
256-
resp = requests.post(
257-
self.edit_uri,
258-
headers={'In-Progress': 'false', 'Content-Length': 0},
259-
auth=self.connection.auth,
260-
)
261-
262-
if resp.status_code != 200:
263-
raise OperationFailedError('The Dataverse could not be published.')
264-
265-
receipt = resp.content
266-
self._refresh(receipt=receipt)
265+
self.get_json(refresh=True)
267266

268267
def delete_file(self, dataverse_file):
269268
resp = requests.delete(
@@ -274,6 +273,8 @@ def delete_file(self, dataverse_file):
274273
if resp.status_code != 204:
275274
raise OperationFailedError('The file could not be deleted.')
276275

276+
self.get_json(refresh=True)
277+
277278
def delete_all_files(self):
278279
for f in self.get_files():
279280
self.delete_file(f)
@@ -290,7 +291,7 @@ def delete_all_files(self):
290291
# self._refresh(deposit_receipt=depositReceipt)
291292

292293
# if we perform a server operation, we should refresh the dataset object
293-
def _refresh(self, receipt=None):
294+
def _refresh(self, receipt=None, published=False):
294295
if receipt:
295296
self.edit_uri = get_element(
296297
receipt,
@@ -312,4 +313,6 @@ def _refresh(self, receipt=None):
312313
).get('href')
313314
self.get_statement(refresh=True)
314315
self.get_entry(refresh=True)
315-
self.get_state(refresh=True)
316+
317+
update_version = 'latest-published' if published else 'latest'
318+
self.get_json(update_version, refresh=True)

dataverse/dataverse.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,17 @@ def publish(self):
8787
if resp.status_code != 200:
8888
raise OperationFailedError('The Dataverse could not be published.')
8989

90-
def add_dataset(self, dataset):
91-
if get_element(dataset._entry, 'title', 'dcterms') is None:
92-
raise InsufficientMetadataError('This dataset must have a title.')
93-
if get_element(dataset._entry, 'description', 'dcterms') is None:
94-
raise InsufficientMetadataError('This dataset must have a description.')
95-
if get_element(dataset._entry, 'creator', 'dcterms') is None:
96-
raise InsufficientMetadataError('This dataset must have an author.')
90+
def create_dataset(self, title, description, creator, **kwargs):
91+
dataset = Dataset(
92+
title=title,
93+
description=description,
94+
creator=creator,
95+
**kwargs
96+
)
97+
98+
self._add_dataset(dataset)
99+
100+
def _add_dataset(self, dataset):
97101

98102
resp = requests.post(
99103
self.collection.get('href'),
@@ -110,7 +114,7 @@ def add_dataset(self, dataset):
110114
self.get_collection_info(refresh=True)
111115

112116
def delete_dataset(self, dataset):
113-
if dataset._state == 'DELETED' or dataset._state == 'DEACCESSIONED':
117+
if dataset.get_state() == 'DELETED' or dataset.get_state() == 'DEACCESSIONED':
114118
return
115119

116120
resp = requests.delete(
@@ -124,7 +128,7 @@ def delete_dataset(self, dataset):
124128
'https://github.com/IQSS/dataverse/issues/778'
125129
)
126130

127-
dataset._state = 'DEACCESSIONED'
131+
dataset.is_deleted = True
128132
self.get_collection_info(refresh=True)
129133

130134
def get_datasets(self, refresh=False):

dataverse/test/test_dataverse.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,19 +220,28 @@ def teardown_class(cls):
220220
def setup_method(self, method):
221221

222222
# create a dataset for each test
223-
s = Dataset(**PICS_OF_CATS_DATASET)
224-
self.dataverse.add_dataset(s)
225-
self.dataset = self.dataverse.get_dataset_by_doi(s.doi)
223+
dataset = Dataset(**PICS_OF_CATS_DATASET)
224+
self.dataverse._add_dataset(dataset)
225+
self.dataset = self.dataverse.get_dataset_by_doi(dataset.doi)
226226

227227
def teardown_method(self, method):
228228
try:
229229
self.dataverse.delete_dataset(self.dataset)
230230
finally:
231231
return
232232

233-
def test_create_dataset_from_xml(self):
233+
def test_create_dataset(self):
234+
title = str(uuid.uuid1()) # must be unique
235+
self.dataverse.create_dataset(title, 'Descripty', 'foo@test.com')
236+
dataset = self.dataverse.get_dataset_by_title(title)
237+
try:
238+
assert dataset.title == title
239+
finally:
240+
self.dataverse.delete_dataset(dataset)
241+
242+
def test_add_dataset_from_xml(self):
234243
new_dataset = Dataset.from_xml_file(ATOM_DATASET)
235-
self.dataverse.add_dataset(new_dataset)
244+
self.dataverse._add_dataset(new_dataset)
236245
retrieved_dataset = self.dataverse.get_dataset_by_title('Roasting at Home')
237246
assert retrieved_dataset
238247
self.dataverse.delete_dataset(retrieved_dataset)
@@ -279,7 +288,7 @@ def test_delete_a_file(self):
279288

280289
def test_delete_a_dataset(self):
281290
xmlDataset = Dataset.from_xml_file(ATOM_DATASET)
282-
self.dataverse.add_dataset(xmlDataset)
291+
self.dataverse._add_dataset(xmlDataset)
283292
atomDataset = self.dataverse.get_dataset_by_title('Roasting at Home')
284293
num_datasets = len(self.dataverse.get_datasets())
285294

0 commit comments

Comments
 (0)