Metadata-Version: 2.4
Name: graph2cwl
Version: 0.0.3
Summary: Helper to generate cwl workflows
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: cwl-utils>=0.40

# graph2cwl

Python module that interfaces with cwl-utils in order to generate cwl files.

## Getting Started

```bash
pip install graph2cwl
```

Here is a code snippet :

```python
from graph2cwl import WorkflowCreator

wf = WorkflowCreator(id="wf")
wf.add_step(id="step_1", run="./my_file.py")
wf.add_step(id="step_2", run="./my_file_2.py")
wf.add_dependency("step_1", "step_2", dep_name="step_1_out")
wf.add_workflow_input("input_1")
wf.add_workflow_output("output", outputSource="step_1/step_1_out")
wf.add_dependency("input_1", "step_2")
wf.add_dependency("input_1", "step_1")

wf.to_yaml("wf.yaml")
```

This creates the following valid cwl:

```yaml
id: w
class: Workflow
inputs:
  - id: input_1
    type: File
outputs:
  - id: output
    outputSource: step_1/step_1_out
    type: File
cwlVersion: v1.2
steps:
  - id: step_1
    in:
      - id: xehsftvk
        source: input_1
    out:
      - step_1_out
    run: my_file.py
  - id: step_2
    in:
      - id: fwfmzpkk
        source: step_1/step_1_out
      - id: ellhmrzg
        source: input_1
    out: []
    run: my_file_2.py
```

which can be visualized (see [cwl2nx](https://github.com/mariusgarenaux/cwl2nx)):

```text
• w/input_1
├─• w/step_1
│ ╰─• w/step_1/step_1_out
│   ├─• w/output
╰───┴─• w/step_2
```

## Advanced usage

To embed the cwl with additionnal information, you must follow the cwl specification, implemented in cwl-utils. For example, to insert additional informations to a step, you can add the `hints` argument, or the `extension_field` one :

```python
from graph2cwl import WorkflowCreator

wf = WorkflowCreator(id="w")
wf.add_step(id="step_1", run="./my_file.py", hints={"hint1": "value1"})
wf.add_step(id="step_2", run="./my_file_2.py")
wf.add_dependency("step_1", "step_2", dep_name="step_1_out")
wf.add_workflow_input("input_1", extension_fields={"label": "het"})
wf.add_workflow_output("output", outputSource="step_1/step_1_out")
wf.add_dependency("input_1", "step_2")
wf.add_dependency("input_1", "step_1")

wf.to_yaml("wf2.yaml")
```

See : https://cwl-utils.readthedocs.io/en/latest/autoapi/cwl_utils/parser/cwl_v1_2/index.html#cwl_utils.parser.cwl_v1_2.WorkflowStep for the list of supported arguments.
