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')
2025-12-01 09:33:51.287 | DEBUG | cwl_loader:load_cwl_from_location:228 - 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.0/x64/lib/python3.14/site-packages/cwl_loader/__init__.py:263, in load_cwl_from_location(path, cwl_version, sort) 261 return _load_cwl_from_stream(f) 262 else: --> 263 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')
2025-12-01 09:33:51.462 | DEBUG | cwl_loader:load_cwl_from_location:228 - Loading CWL document from https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl...
2025-12-01 09:33:51.609 | DEBUG | cwl_loader:_load_cwl_from_stream:231 - Reading stream from https://raw.githubusercontent.com/eoap/application-package-patterns/refs/heads/main/templates/stage-in-file.cwl...
2025-12-01 09:33:51.616 | DEBUG | cwl_loader:load_cwl_from_stream:203 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2025-12-01 09:33:51.616 | DEBUG | cwl_loader:load_cwl_from_yaml:130 - Updating the model from version 'v1.0' to version 'v1.2'...
2025-12-01 09:33:51.617 | DEBUG | cwl_loader:load_cwl_from_yaml:141 - Raw CWL document successfully updated to v1.2!
2025-12-01 09:33:51.617 | DEBUG | cwl_loader:load_cwl_from_yaml:145 - Parsing the raw CWL document to the CWL Utils DOM...
2025-12-01 09:33:52.534 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Raw CWL document successfully parsed to the CWL Utils DOM!
2025-12-01 09:33:52.535 | DEBUG | cwl_loader:load_cwl_from_yaml:160 - Dereferencing the steps[].run...
2025-12-01 09:33:52.535 | DEBUG | cwl_loader:load_cwl_from_yaml:167 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2025-12-01 09:33:52.535 | DEBUG | cwl_loader:load_cwl_from_yaml:171 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2025-12-01 09:33:52.536 | DEBUG | cwl_loader:load_cwl_from_yaml:175 - All steps[].run link are resolvable!
2025-12-01 09:33:52.536 | DEBUG | cwl_loader:load_cwl_from_yaml:178 - Sorting Process instances by dependencies....
2025-12-01 09:33:52.537 | DEBUG | cwl_loader:load_cwl_from_yaml:180 - Sorting process is over.
2025-12-01 09:33:52.538 | DEBUG | cwl_loader:_load_cwl_from_stream:240 - 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)
2025-12-01 09:33:52.566 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - No needs to update the Raw CWL document since it targets already the v1.2
2025-12-01 09:33:52.567 | DEBUG | cwl_loader:load_cwl_from_yaml:145 - Parsing the raw CWL document to the CWL Utils DOM...
2025-12-01 09:33:55.344 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Raw CWL document successfully parsed to the CWL Utils DOM!
2025-12-01 09:33:55.345 | DEBUG | cwl_loader:load_cwl_from_yaml:160 - Dereferencing the steps[].run...
2025-12-01 09:33:55.345 | DEBUG | cwl_loader:load_cwl_from_yaml:167 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2025-12-01 09:33:55.346 | DEBUG | cwl_loader:load_cwl_from_yaml:171 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2025-12-01 09:33:55.346 | DEBUG | cwl_loader:load_cwl_from_yaml:175 - All steps[].run link are resolvable!
2025-12-01 09:33:55.346 | DEBUG | cwl_loader:load_cwl_from_yaml:178 - Sorting Process instances by dependencies....
2025-12-01 09:33:55.347 | DEBUG | cwl_loader:load_cwl_from_yaml:180 - 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: _:fa3240a8-8f3a-4ef1-98de-1cf48314c3c0
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point/bbox
type:
name: _:85e8e5c1-fe2e-4e58-bc44-8d270a2273d4
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: _:a76211e6-1a6c-49d0-a0fe-c09d833094a7
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString/bbox
type:
name: _:35214c92-0176-4795-a058-a3c04b4ffd5f
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: _:ec4e3204-8a67-4b65-8bd9-1bc429142a12
items:
name: _:8d70f816-8124-40fb-8adf-aad91a4a529f
items: double
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon/bbox
type:
name: _:b1f5e197-a5a9-4c80-bf14-e9bad0de38a7
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: _:be9745a2-3953-4b78-965e-3eddb7e94567
items:
name: _:c8a2f7ce-6a90-40da-9e1d-d25ef4f3eeb0
items: double
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint/bbox
type:
name: _:ed961f4e-9859-423a-b04a-f0ad3b027e99
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: _:c55ec274-9db3-4972-b5ee-7bf51dfa206a
items:
name: _:02a2c7b7-3826-486f-a805-73a5642f8d00
items:
name: _:53cf91dc-f1e8-450f-b892-7934999a7409
items: double
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString/bbox
type:
name: _:9b027996-5307-4f22-8c20-f0f4deeca0c6
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: _:872fa3d1-b1aa-473b-bb8c-394148b9806d
items:
name: _:06f03ada-a6f0-4823-b035-e807a8cc5d45
items:
name: _:f00f99c4-1b67-473e-991a-d8f6c102946f
items:
name: _:51f7c57e-064a-43fa-b431-bb1f50cd9138
items: double
type: array
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon/bbox
type:
name: _:96b9943d-fd5d-4c1d-a95a-a054912da414
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: _:2e628fbc-f28c-4990-aad2-3f9d1c6a52d5
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: _:1528669c-8550-436b-8a1e-1ba64e742438
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: _:60763e8f-36ca-4d8d-8fa3-18bdf4b86a62
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: _:7970a3b0-f732-4484-ac49-483ba71b915b
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: _:4ee43ff7-cfda-4333-b8ff-c5784ca34acc
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: _:bc8cb104-d8d2-4928-b135-80527b169af3
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: _:66be98df-495f-4cab-8c2d-1151f2946285
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields/exclude
type:
- 'null'
- name: _:bbde9bba-f78f-42e1-9aa5-8be2978fd937
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: _:21840fa0-e2ef-4df6-b86f-10be0b990fc5
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: _:d2cc59e4-d051-4fb9-bd7c-4f25cac85fcf
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/ids
type:
- 'null'
- name: _:d871d102-3672-4da0-95b1-4a178e75a955
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: _:f6f1fa04-d96e-4d80-8706-59da55de66a2
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: _:f3aa9433-f745-45be-80fb-d177c0f7f653
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)
2025-12-01 09:33:55.409 | DEBUG | cwl_loader:load_cwl_from_location:228 - Loading CWL document from https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl...
2025-12-01 09:33:55.541 | DEBUG | cwl_loader:_load_cwl_from_stream:231 - Reading stream from https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl...
2025-12-01 09:33:55.565 | DEBUG | cwl_loader:load_cwl_from_stream:203 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2025-12-01 09:33:55.566 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - No needs to update the Raw CWL document since it targets already the v1.2
2025-12-01 09:33:55.567 | DEBUG | cwl_loader:load_cwl_from_yaml:145 - Parsing the raw CWL document to the CWL Utils DOM...
2025-12-01 09:33:56.243 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Raw CWL document successfully parsed to the CWL Utils DOM!
2025-12-01 09:33:56.244 | DEBUG | cwl_loader:load_cwl_from_yaml:160 - Dereferencing the steps[].run...
2025-12-01 09:33:56.245 | DEBUG | cwl_loader:_on_process:78 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#stac must be externally imported...
2025-12-01 09:33:56.245 | DEBUG | cwl_loader:_on_process:82 - 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
2025-12-01 09:33:56.245 | DEBUG | cwl_loader:_on_process:78 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_stack must be externally imported...
2025-12-01 09:33:56.246 | DEBUG | cwl_loader:_on_process:82 - 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
2025-12-01 09:33:56.246 | DEBUG | cwl_loader:_on_process:78 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_warp_stack must be externally imported...
2025-12-01 09:33:56.247 | DEBUG | cwl_loader:_on_process:82 - 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
2025-12-01 09:33:56.247 | DEBUG | cwl_loader:_on_process:78 - Checking if https://raw.githubusercontent.com/eoap/how-to/refs/heads/main/cwl-workflows/conditional-workflows.cwl#rio_color must be externally imported...
2025-12-01 09:33:56.248 | DEBUG | cwl_loader:_on_process:82 - 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
2025-12-01 09:33:56.248 | DEBUG | cwl_loader:load_cwl_from_yaml:167 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2025-12-01 09:33:56.248 | DEBUG | cwl_loader:load_cwl_from_yaml:171 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2025-12-01 09:33:56.249 | DEBUG | cwl_loader:load_cwl_from_yaml:175 - All steps[].run link are resolvable!
2025-12-01 09:33:56.249 | DEBUG | cwl_loader:load_cwl_from_yaml:178 - Sorting Process instances by dependencies....
2025-12-01 09:33:56.251 | DEBUG | cwl_loader:load_cwl_from_yaml:180 - Sorting process is over.
2025-12-01 09:33:56.251 | DEBUG | cwl_loader:_load_cwl_from_stream:240 - 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: _:26b0721c-703f-4953-8ad6-23ced85ebf6b
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: 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
- id: main
class: Workflow
inputs:
- id: stac-item
type: string
- id: epsg_code
default: native
type: string
- id: bands
type:
name: _:bba7f928-bd75-4479-b485-44bf980d8521
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_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_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_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: _:dc15de89-07f1-4a81-b80a-2fc09e82d0a4
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 )