Skip to content

Commit 6a2ba1d

Browse files
committed
convert: add options for crate name and description
1 parent 146e347 commit 6a2ba1d

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

src/runcrate/cli.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,27 @@ def cli():
5656
type=click.Path(exists=True, dir_okay=False, readable=True, path_type=Path),
5757
help="path to a README file (should be README.md in Markdown format)",
5858
)
59-
def convert(root, output, license, workflow_name, readme):
59+
@click.option(
60+
"-n",
61+
"--crate-name",
62+
metavar="STRING",
63+
help="crate name",
64+
)
65+
@click.option(
66+
"-d",
67+
"--crate-desc",
68+
metavar="STRING",
69+
help="crate description",
70+
)
71+
def convert(root, output, license, workflow_name, readme, crate_name, crate_desc):
6072
"""\
6173
Convert a CWLProv RO bundle into a Workflow Run RO-Crate.
6274
6375
RO_DIR: top-level directory of the CWLProv RO
6476
"""
6577
if not output:
6678
output = Path(f"{root.name}.crate.zip")
67-
builder = ProvCrateBuilder(root, workflow_name, license, readme)
79+
builder = ProvCrateBuilder(root, workflow_name, license, readme, crate_name, crate_desc)
6880
crate = builder.build()
6981
if output.suffix == ".zip":
7082
crate.write_zip(output)

src/runcrate/convert.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,14 @@ def get_workflow(wf_path):
199199

200200
class ProvCrateBuilder:
201201

202-
def __init__(self, root, workflow_name=None, license=None, readme=None):
202+
def __init__(self, root, workflow_name=None, license=None, readme=None,
203+
crate_name=None, crate_desc=None):
203204
self.root = Path(root)
204205
self.workflow_name = workflow_name
205206
self.license = license or DEFAULT_LICENSE
206207
self.readme = Path(readme) if readme else readme
208+
self.crate_name = crate_name
209+
self.crate_desc = crate_desc
207210
self.wf_path = self.root / "workflow" / WORKFLOW_BASENAME
208211
self.cwl_defs = get_workflow(self.wf_path)
209212
self.step_maps = self._get_step_maps(self.cwl_defs)
@@ -292,9 +295,9 @@ def get_dict(self, entity):
292295
def build(self):
293296
crate = ROCrate(gen_preview=False)
294297
crate.metadata.extra_contexts.append(TERMS_NAMESPACE)
295-
self.add_root_metadata(crate)
296298
self.add_profiles(crate)
297299
self.add_workflow(crate)
300+
self.add_root_metadata(crate)
298301
self.add_engine_run(crate)
299302
self.add_action(crate, self.workflow_run)
300303
self.patch_workflow_input_collection(crate)
@@ -309,6 +312,10 @@ def add_root_metadata(self, crate):
309312
readme["about"] = crate.root_dataset
310313
if self.readme.suffix.lower() == ".md":
311314
readme["encodingFormat"] = "text/markdown"
315+
if not self.crate_name:
316+
self.crate_name = f"run of {self.workflow_name}"
317+
crate.root_dataset["name"] = self.crate_name
318+
crate.root_dataset["description"] = self.crate_desc or self.crate_name
312319

313320
def add_profiles(self, crate):
314321
profiles = []
@@ -339,10 +346,11 @@ def add_workflow(self, crate):
339346
lang_version=lang_version, gen_cwl=False, properties=properties
340347
)
341348
cwl_workflow = self.cwl_defs[workflow.id]
342-
wf_name = self.wf_path.name
349+
if not self.workflow_name:
350+
self.workflow_name = self.wf_path.name
343351
if hasattr(cwl_workflow, "label") and cwl_workflow.label:
344-
wf_name = cwl_workflow.label
345-
workflow["name"] = self.workflow_name or wf_name
352+
self.workflow_name = cwl_workflow.label
353+
workflow["name"] = self.workflow_name
346354
if hasattr(cwl_workflow, "doc") and cwl_workflow.doc:
347355
workflow["description"] = cwl_workflow.doc
348356
# cannot convert "intent" to featureList: workflow is not a SoftwareApplication

tests/test_cli.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,34 @@ def test_cli_convert_workflow_name(data_dir, tmpdir):
102102
assert workflow["name"] == workflow_name
103103

104104

105+
def test_cli_convert_crate_name(data_dir, tmpdir):
106+
root = data_dir / "revsort-run-1"
107+
crate_dir = tmpdir / "revsort-run-1-crate"
108+
workflow_name = "RevSort"
109+
crate_name = "name of the crate"
110+
runner = CliRunner()
111+
args = ["convert", str(root), "-o", str(crate_dir), "-w", workflow_name, "-n", crate_name]
112+
result = runner.invoke(cli, args)
113+
assert result.exit_code == 0, result.exception
114+
crate = ROCrate(crate_dir)
115+
assert crate.root_dataset["name"] == crate_name
116+
assert crate.root_dataset["description"] == crate_name
117+
118+
119+
def test_cli_convert_crate_desc(data_dir, tmpdir):
120+
root = data_dir / "revsort-run-1"
121+
crate_dir = tmpdir / "revsort-run-1-crate"
122+
workflow_name = "RevSort"
123+
crate_desc = "description of the crate"
124+
runner = CliRunner()
125+
args = ["convert", str(root), "-o", str(crate_dir), "-w", workflow_name, "-d", crate_desc]
126+
result = runner.invoke(cli, args)
127+
assert result.exit_code == 0, result.exception
128+
crate = ROCrate(crate_dir)
129+
assert crate.root_dataset["name"] == f"run of {workflow_name}"
130+
assert crate.root_dataset["description"] == crate_desc
131+
132+
105133
def test_cli_convert_readme(data_dir, tmpdir):
106134
root = data_dir / "revsort-run-1"
107135
crate_dir = tmpdir / "revsort-run-1-crate"

tests/test_cwlprov_crate_builder.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ def test_revsort(data_dir, tmpdir):
4747
assert readme_f["about"] is crate.root_dataset
4848
workflow = crate.mainEntity
4949
assert workflow.id == "packed.cwl"
50-
assert workflow["name"] == "RevSort"
50+
assert workflow["name"] == workflow_name
51+
assert crate.root_dataset["name"] == f"run of {workflow_name}"
52+
assert crate.root_dataset["description"] == f"run of {workflow_name}"
5153
tools = workflow["hasPart"]
5254
assert len(tools) == 2
5355
for entity in tools:
@@ -1193,12 +1195,22 @@ def test_agent_no_name(data_dir, tmpdir):
11931195
assert "name" not in agent
11941196

11951197

1196-
def test_no_license(data_dir, tmpdir):
1198+
def test_no_license(data_dir):
11971199
root = data_dir / "revsort-run-1"
1198-
output = tmpdir / "revsort-run-1-crate"
1199-
readme = data_dir / "README.md"
1200-
workflow_name = "RevSort"
1201-
builder = ProvCrateBuilder(root, workflow_name=workflow_name, readme=readme)
1200+
builder = ProvCrateBuilder(root)
12021201
crate = builder.build()
1203-
crate.write(output)
12041202
assert crate.root_dataset["license"] == "notspecified"
1203+
1204+
1205+
def test_name_desc(data_dir):
1206+
root = data_dir / "revsort-run-1"
1207+
workflow_name = "RevSort"
1208+
crate_name = "name of the crate"
1209+
builder = ProvCrateBuilder(root, workflow_name=workflow_name, crate_name=crate_name)
1210+
crate = builder.build()
1211+
assert crate.root_dataset["name"] == crate_name
1212+
assert crate.root_dataset["description"] == crate_name
1213+
crate_desc = "description of the crate"
1214+
builder = ProvCrateBuilder(root, workflow_name=workflow_name, crate_name=crate_name, crate_desc=crate_desc)
1215+
crate = builder.build()
1216+
assert crate.root_dataset["description"] == crate_desc

0 commit comments

Comments
 (0)