Skip to content

Commit db39083

Browse files
authored
feat(datasets): edit dataset metadata (#549)
1 parent 4273d2a commit db39083

File tree

6 files changed

+55
-9
lines changed

6 files changed

+55
-9
lines changed

renku/api/datasets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def dataset_path(self, name):
8787
path = LinkReference(
8888
client=self, name='datasets/' + name
8989
).reference
90+
9091
return path
9192

9293
def load_dataset(self, name=None):

renku/cli/_format/datasets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def tabular(client, datasets):
3131
tabulate(
3232
datasets,
3333
headers=OrderedDict((
34-
('short_id', 'id'),
34+
('uid', 'id'),
3535
('display_name', None),
3636
('version', None),
3737
('created', None),

renku/cli/dataset.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,15 @@
159159
from urllib.parse import ParseResult
160160

161161
import click
162+
import editor
162163
import requests
164+
import yaml
163165
from click import BadParameter
164166
from tqdm import tqdm
165167

166168
from renku.cli._providers import ProviderFactory
167169
from renku.models._tabulate import tabulate
170+
from renku.models.datasets import Dataset
168171

169172
from .._compat import Path
170173
from ._client import pass_local_client
@@ -217,6 +220,27 @@ def create(client, name):
217220
click.secho('OK', fg='green')
218221

219222

223+
@dataset.command()
224+
@click.argument('id')
225+
@pass_local_client(clean=True, commit=True)
226+
def edit(client, id):
227+
"""Edit dataset metadata."""
228+
dataset_ = client.load_dataset(id)
229+
230+
if dataset_:
231+
metadata_edited = editor.edit(
232+
contents=bytes(
233+
yaml.safe_dump(dataset_.editable), encoding='utf-8'
234+
)
235+
)
236+
237+
edited = yaml.safe_load(metadata_edited)
238+
updated_ = Dataset(**edited)
239+
240+
dataset_.update_metadata(updated_)
241+
dataset_.to_yaml()
242+
243+
220244
@dataset.command()
221245
@click.argument('name')
222246
@click.argument('urls', nargs=-1)

renku/models/datasets.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,11 @@ class Dataset(CreatorsMixin):
268268

269269
SUPPORTED_SCHEMES = ('', 'file', 'http', 'https', 'git+https', 'git+ssh')
270270

271+
EDITABLE_FIELDS = [
272+
'creator', 'date_published', 'description', 'in_language', 'keywords',
273+
'license', 'name', 'url', 'version', 'created', 'files'
274+
]
275+
271276
_id = jsonld.ib(default=None, context='@id')
272277

273278
creator = jsonld.container.list(
@@ -334,7 +339,7 @@ def to_unix(el):
334339
@property
335340
def uid(self):
336341
"""UUID part of identifier."""
337-
return self._id.split('/')[-1]
342+
return self.identifier.split('/')[-1]
338343

339344
@created.default
340345
def _now(self):
@@ -353,6 +358,13 @@ def creators_csv(self):
353358
"""Comma-separated list of creators associated with dataset."""
354359
return ','.join(creator.short_name for creator in self.creator)
355360

361+
@property
362+
def editable(self):
363+
"""Subset of attributes which user can edit."""
364+
obj = self.asjsonld()
365+
data = {field_: obj.pop(field_) for field_ in self.EDITABLE_FIELDS}
366+
return data
367+
356368
def find_file(self, file_path, return_index=False):
357369
"""Find a file in files container."""
358370
for index, file_ in enumerate(self.files):
@@ -370,13 +382,7 @@ def update_metadata(self, other_dataset):
370382
if is_doi(other_dataset.identifier):
371383
self._id = other_dataset.identifier
372384

373-
update_fields = [
374-
'creator', 'date_published', 'description', 'identifier',
375-
'in_language', 'keywords', 'license', 'name', 'url', 'version',
376-
'created', 'files'
377-
]
378-
379-
for field_ in update_fields:
385+
for field_ in self.EDITABLE_FIELDS:
380386
val = getattr(other_dataset, field_)
381387
if val:
382388
setattr(self, field_, val)

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
'PyYAML>=3.12',
8181
'pyld>=1.0.3',
8282
'python-dateutil>=2.6.1',
83+
'python-editor>=1.0.4',
8384
'rdflib-jsonld>=0.4.0',
8485
'requests>=2.21.0',
8586
'tabulate>=0.7.7',

tests/cli/test_datasets.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,20 @@ def test_dataset_overwrite_confirm(runner, project):
673673
assert 'OK' in result.output
674674

675675

676+
def test_dataset_edit(runner, client, project):
677+
"""Check dataset metadata editing."""
678+
result = runner.invoke(cli.cli, ['dataset', 'create', 'dataset'])
679+
assert 0 == result.exit_code
680+
assert 'OK' in result.output
681+
682+
dataset = client.load_dataset(name='dataset')
683+
684+
result = runner.invoke(
685+
cli.cli, ['dataset', 'edit', dataset.identifier], input='wq'
686+
)
687+
assert 0 == result.exit_code
688+
689+
676690
@pytest.mark.integration
677691
def test_dataset_import_real_doi(runner, project):
678692
"""Test dataset import for existing DOI."""

0 commit comments

Comments
 (0)