common-workflow-language / common-workflow-language/cwltool

Cannot load CWL definition directly with Python objects using `Factory` class

Open
#1,903 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
376
Forks
255
Avg merge
2d 7h
Merged PRs (30d)
12

Description

## Expected Behavior

```python
from cwltool.factory import Factory
import json
with open("/tmp/base.json", mode="r", encoding="utf-8") as f:
cwl = json.load(f)
cwl
{'cwlVersion': 'v1.2', 'class': 'CommandLineTool', 'baseCommand': 'echo', 'inputs': {'input': {'type': 'int'}}, 'outputs': {'output': 'stdout'}}

#----------
tool = Factory().make("/tmp/base.json")
Resolved '/tmp/base.json' to 'file:///tmp/base.json'

tool(input=1)
[job base.json] /tmp/2ntkyyif$ echo > /tmp/2ntkyyif/054dc6206b72fb355c36f9ab1c37be5233d88d70
[job base.json] completed success
{'output': {'location': 'file:///tmp/2ntkyyif/054dc6206b72fb355c36f9ab1c37be5233d88d70', 'basename': '054dc6206b72fb355c36f9ab1c37be5233d88d70', 'nameroot': '054dc6206b72fb355c36f9ab1c37be5233d88d70', 'nameext': '', 'class': 'File', 'checksum': 'sha1$adc83b19e793491b1c6ea0fd8b46cd9f32e592fc', 'size': 1, 'http://commonwl.org/cwltool#generation': 0}}

#----------
tool = Factory().make(cwl)
Traceback (most recent call last):
File "/opt/pycharm-2023.2/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
coro = func()
File "", line 1, in
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/factory.py", line 67, in make
load = load_tool.load_tool(cwl, self.loading_context)
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/load_tool.py", line 605, in load_tool
loadingContext, uri = resolve_and_validate_document(
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/load_tool.py", line 519, in resolve_and_validate_document
uri = processobj["id"]
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/ruamel/yaml/comments.py", line 927, in __getitem__
return ordereddict.__getitem__(self, key)
KeyError: 'id'

#--------
cwl["id"] = "file:///tmp/base.json"
tool = Factory().make(cwl)

tool(input=1)
[job base.json_2] /tmp/vn0i5ukp$ echo > /tmp/vn0i5ukp/054dc6206b72fb355c36f9ab1c37be5233d88d70
[job base.json_2] completed success
{'output': {'location': 'file:///tmp/vn0i5ukp/054dc6206b72fb355c36f9ab1c37be5233d88d70', 'basename': '054dc6206b72fb355c36f9ab1c37be5233d88d70', 'nameroot': '054dc6206b72fb355c36f9ab1c37be5233d88d70', 'nameext': '', 'class': 'File', 'checksum': 'sha1$adc83b19e793491b1c6ea0fd8b46cd9f32e592fc', 'size': 1, 'http://commonwl.org/cwltool#generation': 0}}
```

## Actual Behavior

When the `id` field is missing and the CWL is provided directly as Python objects, the following error is raised:
```python
KeyError: processobj["id"]
```
However, the code seems to attempt adding a temporary `id` (in the form `_:` beforehand) to work around the "missing" document reference when the contents are provided directly. Therefore, the above `processobj` reference seems invalid.

## Workflow Code
see above

## Full Traceback
```pytb
Traceback (most recent call last):
File "/opt/pycharm-2023.2/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
coro = func()
File "", line 1, in
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/factory.py", line 67, in make
load = load_tool.load_tool(cwl, self.loading_context)
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/load_tool.py", line 605, in load_tool
loadingContext, uri = resolve_and_validate_document(
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/cwltool/load_tool.py", line 519, in resolve_and_validate_document
uri = processobj["id"]
File "/home/francis/dev/conda/envs/weaver/lib/python3.10/site-packages/ruamel/yaml/comments.py", line 927, in __getitem__
return ordereddict.__getitem__(self, key)
KeyError: 'id'
```

## Your Environment
* cwltool version: 3.1.20230906142556

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.