def add_composite_algo(self, data, timeout=False, exist_ok=False): """Create new composite algo asset. `data` is a dict object with the following schema: ``` { "name": str, "description": str, "file": str, "permissions": { "public": bool, "authorized_ids": list[str], }, } ``` If `exist_ok` is true, `AlreadyExists` exceptions will be ignored and the existing asset will be returned. """ data = _update_permissions_field(data) attributes = ['file', 'description'] with utils.extract_files(data, attributes) as (data, files): res = self._add(assets.COMPOSITE_ALGO, data, files=files, timeout=timeout, exist_ok=exist_ok) # The backend has inconsistent API responses when getting or adding an asset (with much # less data when responding to adds). A second GET request hides the discrepancies. return self.get_composite_algo(get_asset_key(res))
def add_dataset(self, data, exist_ok=False): """Create new dataset asset. `data` is a dict object with the following schema: ``` { "name": str, "description": str, "type": str, "data_opener": str, "objective_key": str, "permissions": { "public": bool, "authorized_ids": list[str], }, } ``` If a dataset with the same opener already exists, an `AlreadyExists` exception will be raised. If `exist_ok` is true, `AlreadyExists` exceptions will be ignored and the existing asset will be returned. """ attributes = ['data_opener', 'description'] with utils.extract_files(data, attributes) as (data, files): res = self._add(assets.DATASET, data, files=files, exist_ok=exist_ok) # The backend has inconsistent API responses when getting or adding an asset (with much # less data when responding to adds). A second GET request hides the discrepancies. return self.get_dataset(get_asset_key(res))
def add_aggregate_algo(self, data, exist_ok=False): """Create new aggregate algo asset. `data` is a dict object with the following schema: ``` { "name": str, "description": str, "file": str, "permissions": { "public": bool, "authorizedIDs": list[str], }, } ``` If an aggregate algo with the same archive file already exists, an `AlreadyExists` exception will be raised. If `exist_ok` is true, `AlreadyExists` exceptions will be ignored and the existing asset will be returned. """ attributes = ['file', 'description'] with utils.extract_files(data, attributes) as (data, files): res = self._add(assets.AGGREGATE_ALGO, data, files=files, exist_ok=exist_ok) # The backend has inconsistent API responses when getting or adding an asset (with much # less data when responding to adds). A second GET request hides the discrepancies. return self.get_aggregate_algo(get_asset_key(res))
def build_request_kwargs(self): # TODO should be located in the backends/remote module # Serialize and deserialize to prevent errors eg with pathlib.Path data = json.loads(self.json(exclude_unset=True)) if self.Meta.file_attributes: with utils.extract_files(data, self.Meta.file_attributes) as (data, files): yield (data, files) else: yield data, None