Examples¶
The following examples show how to use the loader APIs:
1.1 Parsing a Workflow¶
This sample shows how to read a CWL document from a remote public URL:
In [1]:
Copied!
from cwl_loader import load_cwl_from_location
# cwl_document = load_cwl_from_location('https://github.com/eoap/zarr-cloud-native-format/releases/download/0.3.0/app-water-bodies.0.3.0.cwl')
cwl_document = load_cwl_from_location("/home/stripodi/Downloads/hotspot.cwl")
from cwl_loader import load_cwl_from_location
# cwl_document = load_cwl_from_location('https://github.com/eoap/zarr-cloud-native-format/releases/download/0.3.0/app-water-bodies.0.3.0.cwl')
cwl_document = load_cwl_from_location("/home/stripodi/Downloads/hotspot.cwl")
2026-03-06 12:20:07.073 | DEBUG | cwl_loader:load_cwl_from_location:209 - Loading CWL document from /home/stripodi/Downloads/hotspot.cwl...
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[1], line 5 1 from cwl_loader import load_cwl_from_location 3 # cwl_document = load_cwl_from_location('https://github.com/eoap/zarr-cloud-native-format/releases/download/0.3.0/app-water-bodies.0.3.0.cwl') ----> 5 cwl_document = load_cwl_from_location("/home/stripodi/Downloads/hotspot.cwl") File /opt/hostedtoolcache/Python/3.14.3/x64/lib/python3.14/site-packages/cwl_loader/__init__.py:243, in load_cwl_from_location(path, cwl_version, sort) 241 return _load_cwl_from_stream(f) 242 else: --> 243 raise ValueError(f"Invalid source {path}: not a URL or existing file path") ValueError: Invalid source /home/stripodi/Downloads/hotspot.cwl: not a URL or existing file path
1.2 Serializing¶
This sample shows how to write a CWL document to a stream (string, file, ...):
In [2]:
Copied!
from cwl_loader import dump_cwl
import sys
dump_cwl(process=cwl_document, stream=sys.stderr)
from cwl_loader import dump_cwl
import sys
dump_cwl(process=cwl_document, stream=sys.stderr)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[2], line 4 1 from cwl_loader import dump_cwl 2 import sys ----> 4 dump_cwl(process=cwl_document, stream=sys.stderr) NameError: name 'cwl_document' is not defined
2.1 Parsing a CommandLineTool¶
This sample shows how to read a CWL document from a remote public URL:
In [3]:
Copied!
cwl_document = load_cwl_from_location(
"https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl"
)
cwl_document = load_cwl_from_location(
"https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl"
)
2026-03-06 12:20:07.294 | DEBUG | cwl_loader:load_cwl_from_location:209 - Loading CWL document from https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl...
2026-03-06 12:20:07.540 | DEBUG | cwl_loader:_load_cwl_from_stream:212 - Reading stream from https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl...
2026-03-06 12:20:07.547 | DEBUG | cwl_loader:load_cwl_from_stream:186 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2026-03-06 12:20:07.548 | DEBUG | cwl_loader:load_cwl_from_yaml:107 - Updating the model from version 'v1.0' to version 'v1.2'...
2026-03-06 12:20:07.548 | DEBUG | cwl_loader:load_cwl_from_yaml:122 - Raw CWL document successfully updated to v1.2!
2026-03-06 12:20:07.549 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-03-06 12:20:08.242 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-03-06 12:20:08.243 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-03-06 12:20:08.243 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-03-06 12:20:08.244 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-03-06 12:20:08.244 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-03-06 12:20:08.245 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-03-06 12:20:08.245 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Sorting process is over.
2026-03-06 12:20:08.246 | DEBUG | cwl_loader:_load_cwl_from_stream:218 - Stream from https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl successfully load!
2.2 Serializing¶
This sample shows how to write a CWL document to a stream (string, file, ...):
In [4]:
Copied!
dump_cwl(process=cwl_document, stream=sys.stderr)
dump_cwl(process=cwl_document, stream=sys.stderr)
id: my-asthonishing-stage-in-file
class: CommandLineTool
inputs:
- id: reference
label: Reference URL
doc: An URL to stage
type:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI
- id: another_input
label: Another Input
doc: An additional input for demonstration purposes
type: string
outputs:
- id: staged
type: File
outputBinding:
glob: staged
requirements:
- class: NetworkAccess
networkAccess: true
- class: SchemaDefRequirement
types:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Date
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Date/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Duration
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Duration/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Email
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Email/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Hostname
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Hostname/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNEmail
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNEmail/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNHostname
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNHostname/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv4
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv4/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv6
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv6/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRI
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRI/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRIReference
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRIReference/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#JsonPointer
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#JsonPointer/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Password
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Password/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#RelativeJsonPointer
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#RelativeJsonPointer/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#UUID
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#UUID/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URIReference
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URIReference/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URITemplate
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URITemplate/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Time
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Time/value
type: string
type: record
- class: DockerRequirement
dockerPull: ghcr.io/eoap/application-package-patterns/vegetation-indexes:0.1.1
- class: InlineJavascriptRequirement
- class: InitialWorkDirRequirement
listing:
- entryname: stage.py
entry: |-
import sys
import requests
import planetary_computer
href = sys.argv[1]
signed_url = planetary_computer.sign(href)
output_path = "staged"
response = requests.get(signed_url, stream=True)
response.raise_for_status() # Raise an error for bad status codes
with open(output_path, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Downloaded to {output_path}")
empty_arg = sys.argv[2]
cwlVersion: v1.2
baseCommand:
- python
- stage.py
arguments:
- $( inputs.reference.value )
- $( inputs.another_input )
3. Parsing existing data structures¶
Users can load CWL Worflow(s) even from existing dictionaries:
In [5]:
Copied!
from cwl_loader import load_cwl_from_yaml
cwl_document = load_cwl_from_yaml(
raw_process={
"cwlVersion": "v1.2",
"inputs": {
"api_endpoint": {
"doc": "STAC API endpoint for Landsat-9 data",
"type": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint",
"label": "STAC API endpoint",
},
"search_request": {
"doc": "STAC API settings for Landsat-9 data",
"type": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings",
"label": "STAC API settings",
},
},
"requirements": [
{"class": "InlineJavascriptRequirement"},
{"class": "NetworkAccess", "networkAccess": True},
{
"class": "SchemaDefRequirement",
"types": [
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml"
},
],
},
],
"doc": "This tool uses the STAC Client to search for STAC items\n",
"class": "CommandLineTool",
"baseCommand": ["stac-client"],
"label": "STAC Client Tool",
"arguments": [
"search",
"$(inputs.api_endpoint.url.value)",
"${ const args = []; const collections = inputs.search_request.collections; args.push('--collections', collections.join(\",\")); return args; }",
"${ const args = []; const bbox = inputs.search_request?.bbox; if (Array.isArray(bbox) && bbox.length >= 4) { args.push('--bbox', ...bbox.map(String)); } return args; }",
'${ const args = []; const limit = inputs.search_request?.limit; args.push("--limit", (limit ?? 10).toString()); return args; }',
"${ const maxItems = 5; return ['--max-items', maxItems.toString()]; }",
"${ const args = []; const filter = inputs.search_request?.filter; const filterLang = inputs.search_request?.['filter-lang']; if (filterLang) { args.push('--filter-lang', filterLang); } if (filter) { args.push('--filter', JSON.stringify(filter)); } return args; }",
"${ const datetime = inputs.search_request?.datetime; const datetimeInterval = inputs.search_request?.datetime_interval; if (datetime) { return ['--datetime', datetime]; } else if (datetimeInterval) { const start = datetimeInterval.start?.value || '..'; const end = datetimeInterval.end?.value || '..'; return ['--datetime', `${start}/${end}`]; } return []; }",
"${ const ids = inputs.search_request?.ids; const args = []; if (Array.isArray(ids) && ids.length > 0) { args.push('--ids', ...ids.map(String)); } return args; }",
"${ const intersects = inputs.search_request?.intersects; if (intersects) { return ['--intersects', JSON.stringify(intersects)]; } return []; }",
"--save",
"discovery-output.json",
],
"outputs": {
"search_output": {
"outputBinding": {"glob": "discovery-output.json"},
"type": "File",
}
},
"id": "stac-client",
"hints": [
{
"dockerPull": "docker.io/library/stac-client",
"class": "DockerRequirement",
}
],
}
)
dump_cwl(process=cwl_document, stream=sys.stderr)
from cwl_loader import load_cwl_from_yaml
cwl_document = load_cwl_from_yaml(
raw_process={
"cwlVersion": "v1.2",
"inputs": {
"api_endpoint": {
"doc": "STAC API endpoint for Landsat-9 data",
"type": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint",
"label": "STAC API endpoint",
},
"search_request": {
"doc": "STAC API settings for Landsat-9 data",
"type": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings",
"label": "STAC API settings",
},
},
"requirements": [
{"class": "InlineJavascriptRequirement"},
{"class": "NetworkAccess", "networkAccess": True},
{
"class": "SchemaDefRequirement",
"types": [
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml"
},
{
"$import": "https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml"
},
],
},
],
"doc": "This tool uses the STAC Client to search for STAC items\n",
"class": "CommandLineTool",
"baseCommand": ["stac-client"],
"label": "STAC Client Tool",
"arguments": [
"search",
"$(inputs.api_endpoint.url.value)",
"${ const args = []; const collections = inputs.search_request.collections; args.push('--collections', collections.join(\",\")); return args; }",
"${ const args = []; const bbox = inputs.search_request?.bbox; if (Array.isArray(bbox) && bbox.length >= 4) { args.push('--bbox', ...bbox.map(String)); } return args; }",
'${ const args = []; const limit = inputs.search_request?.limit; args.push("--limit", (limit ?? 10).toString()); return args; }',
"${ const maxItems = 5; return ['--max-items', maxItems.toString()]; }",
"${ const args = []; const filter = inputs.search_request?.filter; const filterLang = inputs.search_request?.['filter-lang']; if (filterLang) { args.push('--filter-lang', filterLang); } if (filter) { args.push('--filter', JSON.stringify(filter)); } return args; }",
"${ const datetime = inputs.search_request?.datetime; const datetimeInterval = inputs.search_request?.datetime_interval; if (datetime) { return ['--datetime', datetime]; } else if (datetimeInterval) { const start = datetimeInterval.start?.value || '..'; const end = datetimeInterval.end?.value || '..'; return ['--datetime', `${start}/${end}`]; } return []; }",
"${ const ids = inputs.search_request?.ids; const args = []; if (Array.isArray(ids) && ids.length > 0) { args.push('--ids', ...ids.map(String)); } return args; }",
"${ const intersects = inputs.search_request?.intersects; if (intersects) { return ['--intersects', JSON.stringify(intersects)]; } return []; }",
"--save",
"discovery-output.json",
],
"outputs": {
"search_output": {
"outputBinding": {"glob": "discovery-output.json"},
"type": "File",
}
},
"id": "stac-client",
"hints": [
{
"dockerPull": "docker.io/library/stac-client",
"class": "DockerRequirement",
}
],
}
)
dump_cwl(process=cwl_document, stream=sys.stderr)
2026-03-06 12:20:08.279 | DEBUG | cwl_loader:load_cwl_from_yaml:124 - No needs to update the Raw CWL document since it targets already the v1.2
2026-03-06 12:20:08.280 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-03-06 12:20:10.685 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-03-06 12:20:10.685 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-03-06 12:20:10.686 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-03-06 12:20:10.687 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-03-06 12:20:10.687 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-03-06 12:20:10.688 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-03-06 12:20:10.688 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Sorting process is over.
id: stac-client
class: CommandLineTool
label: STAC Client Tool
doc: "This tool uses the STAC Client to search for STAC items\n"
inputs:
- id: api_endpoint
label: STAC API endpoint
doc: STAC API endpoint for Landsat-9 data
type:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
- id: search_request
label: STAC API settings
doc: STAC API settings for Landsat-9 data
type:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings
outputs:
- id: search_output
type: File
outputBinding:
glob: discovery-output.json
requirements:
- class: InlineJavascriptRequirement
- class: NetworkAccess
networkAccess: true
- class: SchemaDefRequirement
types:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Date
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Date/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Duration
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Duration/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Email
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Email/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Hostname
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Hostname/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNEmail
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNEmail/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNHostname
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IDNHostname/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv4
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv4/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv6
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IPv6/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRI
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRI/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRIReference
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#IRIReference/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#JsonPointer
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#JsonPointer/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Password
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Password/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#RelativeJsonPointer
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#RelativeJsonPointer/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#UUID
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#UUID/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URIReference
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URIReference/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URITemplate
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URITemplate/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Time
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#Time/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PointType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PointType/Point
type: enum
- name: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PointType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point/coordinates
type:
name: _:2d585ae1-d82f-476d-a496-63bac200fa63
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point/bbox
type:
name: _:2d68ed05-ebff-45f6-af34-d315c8647b49
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineStringType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineStringType/LineString
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineStringType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString/coordinates
type:
name: _:aeb21911-93c0-433a-9c65-8058ef7adb27
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString/bbox
type:
name: _:c5afbb1c-ee61-4671-be68-f58b0c10a708
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PolygonType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PolygonType/Polygon
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#PolygonType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon/coordinates
type:
name: _:ecb6a87b-ffd6-4224-bccd-d5c896d72300
items:
name: _:a1a25f78-291b-4a21-8aa1-3d4cc87074e4
items:
name: _:d1de7c23-03ff-452e-a375-192621720b89
items: double
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon/bbox
type:
name: _:64e1c8ae-80cf-4544-887d-771310640b5c
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPointType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPointType/MultiPoint
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPointType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint/coordinates
type:
name: _:9984d1f6-5927-41e3-b6a8-da017414f445
items:
name: _:c9bed7b8-89c7-4b5d-92e0-bdeb4291585e
items: double
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint/bbox
type:
name: _:412c70af-602e-4f51-aa6d-64639897ffdd
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineStringType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineStringType/MultiLineString
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineStringType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString/coordinates
type:
name: _:dd738df5-a873-4180-87fb-56971f7e1cc4
items:
name: _:01f58b43-e235-4187-8a37-0ded0977606c
items:
name: _:cfad3611-9ab1-4388-8b2a-ab4731077c6c
items: double
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString/bbox
type:
name: _:074bc237-d3d1-41f8-a832-8ca61307a75e
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygonType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygonType/MultiPolygon
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygonType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon/coordinates
type:
name: _:ccc1141c-5ea4-437d-924e-0626bf134671
items:
name: _:f7fec1fa-a9be-46d8-9837-30caf13e9dfb
items:
name: _:e93a8cc8-e88c-4d0e-b56d-c1ca3cfeb2c4
items:
name: _:b7b487bf-49ee-42ee-914a-f73297539825
items: double
type: array
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon/bbox
type:
name: _:598b2b3b-fe35-49ee-8581-40b6a6a38b85
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureType/Feature
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature/id
doc: "Identifier"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature/geometry
type:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature/bbox
type:
name: _:dbd3c046-4f2f-486f-a7ca-3e63055b2cf4
items: double
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollectionType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollectionType/GeometryCollection
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollection
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollection/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollectionType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollection/geometries
type:
name: _:ae69711a-e532-44f1-ba36-7522e889fe7c
items:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollection/bbox
type:
name: _:0ea2839b-4e20-41f7-b4a8-c753b9c9d2a8
items: double
type: array
type: record
- name: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/href
doc: "i.e. http://data.example.com/buildings/123"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/rel
doc: "i.e. alternate"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/type
doc: "i.e. application/geo+json"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/hreflang
doc: "i.e. en"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/title
doc: "i.e. Trierer Strasse 70, 53115 Bonn"
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link/length
type: int
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollectionType
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollectionType/FeatureCollection
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/type
type:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollectionType
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/features
type:
name: _:f06a5438-8c55-46e0-807f-5f271d2e7872
items:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Feature
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/links
type:
name: _:733a87aa-0e2b-45a4-92cd-0a61d7750e42
items:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Link
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/timeStamp
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/numberMatched
type: int
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#FeatureCollection/numberReturned
type: int
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#KeyValuePair
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#KeyValuePair/key
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#KeyValuePair/value
type: string
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint/url
type:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint/headers
type:
- 'null'
- name: _:08e45874-7a32-4c29-9dd8-b727745d0fec
items:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#KeyValuePair
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#DatetimeInterval
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#DatetimeInterval/start
type:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#DatetimeInterval/end
type:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields/include
type:
- 'null'
- name: _:8fffcabd-af2a-4a4b-addf-bd3aa9220db5
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields/exclude
type:
- 'null'
- name: _:376015f6-177f-44f7-b39e-095bd22b5a37
items: string
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#FilterLang
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#FilterLang/cql2-text
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#FilterLang/cql2-json
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Direction
symbols:
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Direction/asc
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Direction/desc
type: enum
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#SortBy
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#SortBy/field
type: string
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#SortBy/direction
type:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Direction
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/bbox
type:
- 'null'
- name: _:df7fcaf5-1d35-4a80-96c5-cdaf46d591d1
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/datetime
type:
- 'null'
- https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#DateTime
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/datetime-interval
type:
- 'null'
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#DatetimeInterval
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/intersects
type:
- 'null'
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon
- https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#GeometryCollection
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/collections
type:
- 'null'
- name: _:dffae477-e2da-4ce0-af97-dfa5d0d134f4
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/ids
type:
- 'null'
- name: _:d34fd6d3-43ce-42cc-a174-b33eebbd8411
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/limit
type:
- 'null'
- int
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/max-items
type:
- 'null'
- int
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/fields
type:
- 'null'
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/filter
type:
- 'null'
- Any
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/filter-lang
type:
- 'null'
- https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#FilterLang
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/filter-crs
type:
- 'null'
- name: _:33dabfb3-d42b-437c-9ca3-60250152db55
items:
https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml#URI
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/sortby
type:
- 'null'
- name: _:2d180c20-19ea-4485-86f7-14cf0c95247f
items:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#SortBy
type: array
type: record
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACAPI
fields:
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACAPI/api_endpoint
type:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACAPI/search_request
type:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings
type: record
hints:
- class: DockerRequirement
dockerPull: docker.io/library/stac-client
cwlVersion: v1.2
baseCommand:
- stac-client
arguments:
- search
- $(inputs.api_endpoint.url.value)
- ${ const args = []; const collections = inputs.search_request.collections;
args.push('--collections', collections.join(",")); return args; }
- ${ const args = []; const bbox = inputs.search_request?.bbox; if
(Array.isArray(bbox) && bbox.length >= 4) { args.push('--bbox',
...bbox.map(String)); } return args; }
- ${ const args = []; const limit = inputs.search_request?.limit;
args.push("--limit", (limit ?? 10).toString()); return args; }
- ${ const maxItems = 5; return ['--max-items', maxItems.toString()]; }
- ${ const args = []; const filter = inputs.search_request?.filter; const
filterLang = inputs.search_request?.['filter-lang']; if (filterLang) {
args.push('--filter-lang', filterLang); } if (filter) { args.push('--filter',
JSON.stringify(filter)); } return args; }
- ${ const datetime = inputs.search_request?.datetime; const datetimeInterval =
inputs.search_request?.datetime_interval; if (datetime) { return
['--datetime', datetime]; } else if (datetimeInterval) { const start =
datetimeInterval.start?.value || '..'; const end = datetimeInterval.end?.value
|| '..'; return ['--datetime', `${start}/${end}`]; } return []; }
- ${ const ids = inputs.search_request?.ids; const args = []; if
(Array.isArray(ids) && ids.length > 0) { args.push('--ids',
...ids.map(String)); } return args; }
- ${ const intersects = inputs.search_request?.intersects; if (intersects) {
return ['--intersects', JSON.stringify(intersects)]; } return []; }
- --save
- discovery-output.json
4. Parsing conditional Workflow¶
In [6]:
Copied!
cwl_document = load_cwl_from_location(
"https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl"
)
dump_cwl(process=cwl_document, stream=sys.stderr)
cwl_document = load_cwl_from_location(
"https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl"
)
dump_cwl(process=cwl_document, stream=sys.stderr)
2026-03-06 12:20:10.769 | DEBUG | cwl_loader:load_cwl_from_location:209 - Loading CWL document from https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl...
2026-03-06 12:20:10.952 | DEBUG | cwl_loader:_load_cwl_from_stream:212 - Reading stream from https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl...
2026-03-06 12:20:10.973 | DEBUG | cwl_loader:load_cwl_from_stream:186 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2026-03-06 12:20:10.973 | DEBUG | cwl_loader:load_cwl_from_yaml:124 - No needs to update the Raw CWL document since it targets already the v1.2
2026-03-06 12:20:10.973 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-03-06 12:20:11.566 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-03-06 12:20:11.567 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-03-06 12:20:11.567 | DEBUG | cwl_loader:_on_process:52 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#stac must be externally imported...
2026-03-06 12:20:11.568 | DEBUG | cwl_loader:_on_process:56 - run_url: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl - uri: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl
2026-03-06 12:20:11.568 | DEBUG | cwl_loader:_on_process:52 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_stack must be externally imported...
2026-03-06 12:20:11.569 | DEBUG | cwl_loader:_on_process:56 - run_url: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl - uri: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl
2026-03-06 12:20:11.569 | DEBUG | cwl_loader:_on_process:52 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_warp_stack must be externally imported...
2026-03-06 12:20:11.570 | DEBUG | cwl_loader:_on_process:56 - run_url: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl - uri: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl
2026-03-06 12:20:11.570 | DEBUG | cwl_loader:_on_process:52 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_color must be externally imported...
2026-03-06 12:20:11.571 | DEBUG | cwl_loader:_on_process:56 - run_url: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl - uri: https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl
2026-03-06 12:20:11.571 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-03-06 12:20:11.572 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-03-06 12:20:11.572 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-03-06 12:20:11.573 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-03-06 12:20:11.574 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Sorting process is over.
2026-03-06 12:20:11.574 | DEBUG | cwl_loader:_load_cwl_from_stream:218 - Stream from https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl successfully load!
cwlVersion: v1.2
$graph:
- id: rio_warp_stack
class: CommandLineTool
inputs:
- id: tiffs
type:
name: _:5f77f38a-12d5-4424-bbb5-dfe67ba78440
items: string
type: array
- id: epsg_code
type: string
outputs:
- id: stacked
type: File
outputBinding:
glob: warped.tif
requirements:
- class: DockerRequirement
dockerPull: ghcr.io/eoap/how-to/rio:1.0.0
- class: EnvVarRequirement
envDef:
- envName: GDAL_TIFF_INTERNAL_MASK
envValue: YES
- envName: GDAL_HTTP_MERGE_CONSECUTIVE_RANGES
envValue: YES
- envName: CPL_VSIL_CURL_ALLOWED_EXTENSIONS
envValue: .tif
- class: InitialWorkDirRequirement
listing:
- entryname: run.sh
entry: |-
#!/bin/bash
rio stack $@
rio warp --dst-crs $(inputs.epsg_code) stacked.tif warped.tif
cwlVersion: v1.2
baseCommand:
- /bin/bash
- run.sh
arguments:
- valueFrom: |
${
var arr = [];
for(var i=0; i<inputs.tiffs.length; i++) {
arr.push(inputs.tiffs[i]);
}
return arr;
}
- stacked.tif
- id: main
class: Workflow
inputs:
- id: stac-item
type: string
- id: epsg_code
default: native
type: string
- id: bands
type:
name: _:7e59576f-57cb-489d-8a2a-bab52ddb7144
items: string
type: array
outputs:
- id: rgb-tif
outputSource: step_color/rgb
type: File
- id: stack
outputSource:
- step_stack/stacked
- step_warp_stack/stacked
pickValue: the_only_non_null
type: File
requirements:
- class: InlineJavascriptRequirement
- class: NetworkAccess
networkAccess: true
- class: ScatterFeatureRequirement
- class: MultipleInputFeatureRequirement
cwlVersion: v1.2
steps:
- id: step_curl
in:
- id: stac_item
source: stac-item
- id: common_band_name
source: bands
out:
- hrefs
run: '#stac'
scatter: step_curl/common_band_name
scatterMethod: dotproduct
- id: step_stack
in:
- id: tiffs
source: step_curl/hrefs
- id: epsg_code
source: epsg_code
out:
- stacked
run: '#rio_stack'
when: $( inputs.epsg_code == "native")
- id: step_warp_stack
in:
- id: tiffs
source: step_curl/hrefs
- id: epsg_code
source: epsg_code
out:
- stacked
run: '#rio_warp_stack'
when: $( inputs.epsg_code != "native")
- id: step_color
in:
- id: stacked
source:
- step_stack/stacked
- step_warp_stack/stacked
pickValue: the_only_non_null
out:
- rgb
run: '#rio_color'
- id: rio_stack
class: CommandLineTool
inputs:
- id: tiffs
type:
name: _:3fe893c8-4b99-4a03-af73-5852839bddcc
items: string
type: array
outputs:
- id: stacked
type: File
outputBinding:
glob: stacked.tif
requirements:
- class: DockerRequirement
dockerPull: ghcr.io/eoap/how-to/rio:1.0.0
- class: EnvVarRequirement
envDef:
- envName: GDAL_TIFF_INTERNAL_MASK
envValue: YES
- envName: GDAL_HTTP_MERGE_CONSECUTIVE_RANGES
envValue: YES
- envName: CPL_VSIL_CURL_ALLOWED_EXTENSIONS
envValue: .tif
- class: InitialWorkDirRequirement
listing:
- entryname: run.sh
entry: |-
#!/bin/bash
rio stack $@
cwlVersion: v1.2
baseCommand:
- /bin/bash
- run.sh
arguments:
- valueFrom: |
${
var arr = [];
for(var i=0; i<inputs.tiffs.length; i++) {
arr.push(inputs.tiffs[i]);
}
return arr;
}
- stacked.tif
- id: rio_color
class: CommandLineTool
inputs:
- id: stacked
type: File
outputs:
- id: rgb
type: File
outputBinding:
glob: rgb.tif
requirements:
- class: DockerRequirement
dockerPull: ghcr.io/eoap/how-to/rio:1.0.0
- class: InitialWorkDirRequirement
listing:
- entryname: run.sh
entry: |-
#!/bin/bash
rio color -j -1 --out-dtype uint8 $1 rgb.tif "gamma 3 0.95, sigmoidal rgb 35 0.13"
cwlVersion: v1.2
baseCommand:
- /bin/bash
- run.sh
arguments:
- $( inputs.stacked.path )
- id: stac
class: CommandLineTool
inputs:
- id: stac_item
type: string
- id: common_band_name
type: string
outputs:
- id: hrefs
type: string
outputBinding:
loadContents: true
glob: message
outputEval: |
${
const assets = JSON.parse(self[0].contents).assets;
const bandKey = Object.keys(assets).find(key =>
assets[key]['eo:bands'] &&
assets[key]['eo:bands'].length === 1 &&
assets[key]['eo:bands'].some(band => band.common_name === inputs.common_band_name)
);
if (!bandKey) {
throw new Error(`No valid asset found for band: ${inputs.common_band_name}`);
}
return assets[bandKey].href;
}
requirements:
- class: DockerRequirement
dockerPull: docker.io/curlimages/curl:latest
cwlVersion: v1.2
baseCommand: curl
arguments:
- $( inputs.stac_item )
stdout: message