Lightweight python module to load, validate and visualize CWL (Common Workflow Language) files through networkx graphs. It uses cwl_utils for parsing and validation. It also contains a CLI app to quickly visualize cwl files.
pip install cwl2nx
Note : to use cwl2nx as a CLI app only, you may prefer to use pipx :
pip install pipx
pipx install cwl2nx
Just run :
cwl2nx <path_to_cwl>
run
cwl2nx --helpto get full documentation
- green: WorkflowInputParameter
- yellow: WorkflowStep
- blue: WorkflowStepInput
- pink / magenta : WorkflowStepOutput which are not WorkflowStepInput
- red : WorkflowOutputParameter
You will find an example of workflow in the GitHub repository : workflow_example.cwl.yaml. Other examples can be found here : https://workflowhub.eu
from cwl2nx import CWLToNetworkxConnector
dir = "workflow_example.cwl.yaml"
dag = CWLToNetworkxConnector(dir).convert_to_networkx() # dag is networkx.DiGraph
print(dag.nodes, dag.edges)You'll need to install
dagvizbefore
/!\ you need to run the code below in a jupyter notebook
from cwl2nx import CWLToNetworkxConnector
import networkx as nx
import dagviz
dir = "workflow_example.cwl.yaml"
connector = CWLToNetworkxConnector(dir)
dag = connector.convert_to_networkx()
dagviz.Dagre(dag)
dagviz.Metro(dag) # github tree dag styleTo get a string representing the graph (code from: https://github.com/ctongfei/py-dagviz):
from cwl2nx import cwl_to_str
dir = "workflow_example.cwl.yaml"
print(cwl_to_str(dir))output :
• input_file_1.json
│ • parameter.py
│ │ • config.yaml
╰─│─┴─• init_task
│ ╰─• init_task/initialized_dataset.json
├─────┼─• inter_task_1
│ ├─│─• inter_task_2
│ │ ╰─│─• inter_task_1/output_inter_1
│ │ ╰─│─• inter_task_2/output_inter_2
╰─────│─────┴─┴─• end_task
│ ╰─• end_task/output.csv
│ ╰─• wf_output
╰─• wf_output_2
Each node of the parsed networkx graph object has an attribute cwl_utils_object containing the cwl_utils object, among the following :
- WorkflowStep
- WorkflowStepInput
- WorkflowStepOutput
- WorkflowInputParameter
- WorkflowOutputParameter
The type of the node (one of the above in string) is accessible through the parameter node_type of each node.


