diff --git a/datalad_dataverse/remote.py b/datalad_dataverse/remote.py index f255f56..eaf6424 100644 --- a/datalad_dataverse/remote.py +++ b/datalad_dataverse/remote.py @@ -13,12 +13,11 @@ from datalad_dataverse.utils import ( get_native_api, + format_doi, ) import os import re -from datalad_dataverse.utils import format_doi - from datalad.customremotes import SpecialRemote @@ -31,10 +30,12 @@ def __init__(self, *args): self.configs['dlacredential'] = \ 'Identifier used to retrieve an API token from a local ' \ 'credential store' + self.configs['version'] = 'Dataverse dataset version' self._doi = None self._url = None self._api = None self._token = None + self._dataset_version = None def initremote(self): """ @@ -140,6 +141,14 @@ def api(self): return self._api + @property + def dataset_version(self): + if self._dataset_version is None: + self._dataset_version = self.annex.getconfig('version') + if len(self._dataset_version) == 0: + self._dataset_version = ":latest" + return self._dataset_version + def prepare(self): # trigger API instance in order to get possibly auth/connection errors # right away @@ -158,6 +167,8 @@ def checkpresentexport(self, key, remote_file): return self.checkpresent(key=remote_file) def transfer_store(self, key, local_file, datafile=None): + if not self.dataset_version == ':latest': + raise RuntimeError('Cannot store files if a specific version is checked out!') ds_pid = self.doi if datafile is None: datafile = Datafile() @@ -185,12 +196,12 @@ def transfer_retrieve(self, key, file): # this relies on having established the NativeApi in prepare() api_token=self._token, ) - dataset = self.api.get_dataset(identifier=self.doi) + dataset = self.api.get_dataset_version(identifier=self.doi, version=self.dataset_version) # http error handling dataset.raise_for_status() - files_list = dataset.json()['data']['latestVersion']['files'] + files_list = dataset.json()['data']['files'] # find the file we want to download file_id = None @@ -214,6 +225,8 @@ def transferexport_retrieve(self, key, local_file, remote_file): self.transfer_retrieve(key=remote_file, file=local_file) def remove(self, key): + if not self.dataset_version == ':latest': + raise RuntimeError('Cannot remove file if a specific version is checked out!') # get the dataset and a list of all files dataset = self.api.get_dataset(identifier=self.doi) # http error handling