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-04-08 15:30:30.388 | 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 2 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') 4 ----> 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 3 ----> 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-04-08 15:30:30.518 | 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-04-08 15:30:30.627 | 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-04-08 15:30:30.634 | DEBUG | cwl_loader:load_cwl_from_stream:186 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2026-04-08 15:30:30.635 | DEBUG | cwl_loader:load_cwl_from_yaml:107 - Updating the model from version 'v1.0' to version 'v1.2'...
2026-04-08 15:30:30.636 | DEBUG | cwl_loader:load_cwl_from_yaml:122 - Raw CWL document successfully updated to v1.2!
2026-04-08 15:30:30.636 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-04-08 15:30:30.833 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-04-08 15:30:30.833 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-04-08 15:30:30.834 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-04-08 15:30:30.834 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-04-08 15:30:30.835 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-04-08 15:30:30.836 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-04-08 15:30:30.837 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Sorting process is over.
2026-04-08 15:30:30.837 | 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-04-08 15:30:30.871 | DEBUG | cwl_loader:load_cwl_from_yaml:124 - No needs to update the Raw CWL document since it targets already the v1.2
2026-04-08 15:30:30.872 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-04-08 15:30:31.534 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-04-08 15:30:31.535 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-04-08 15:30:31.535 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-04-08 15:30:31.536 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-04-08 15:30:31.537 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-04-08 15:30:31.538 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-04-08 15:30:31.538 | 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: _:14784625-16e0-4b42-aa39-e0eb78d1ea49
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Point/bbox
type:
name: _:2573da59-80a0-4107-93e0-97ae259e910a
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: _:81d69987-84ed-4b60-8f98-08ad00c53d3a
items: double
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#LineString/bbox
type:
name: _:35272428-9305-4a18-aa26-d4fc3cedd453
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: _:762207e0-b4a8-480c-b506-721e1d35efb9
items:
name: _:8620f3e1-636a-4ecb-abc8-4dd473ac3f80
items:
name: _:d5dc5f51-1074-4ead-83af-a957435dcc62
items: double
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#Polygon/bbox
type:
name: _:00a7e3d5-36d4-4449-a498-ceee5166cce4
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: _:b98bc4a2-7966-4a09-ba14-a4818a1152a4
items:
name: _:8a426242-482d-44f0-ba10-5365db4d6ae6
items: double
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPoint/bbox
type:
name: _:535d37ab-6c28-4519-bb3f-b9d57c50dee0
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: _:31a3d0b1-6ab7-4782-8dcb-fc6a4ad9043d
items:
name: _:0c9e93a7-ec1f-4f9b-9813-15941ed491e5
items:
name: _:2f72656b-71c7-4dbd-989c-fdf319ab241f
items: double
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiLineString/bbox
type:
name: _:becf198e-7be4-4787-bd32-5b2dd82bcc43
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: _:c134fb6f-4ebd-44e3-9333-be65ee5572c2
items:
name: _:5d886e7d-2c58-4a29-822c-c68efc6f104c
items:
name: _:182a821d-adeb-42ce-b048-69398015b8cf
items:
name: _:eae996e6-78d5-4df1-bea6-58440f1944cd
items: double
type: array
type: array
type: array
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml#MultiPolygon/bbox
type:
name: _:e34279e5-e687-40bc-b817-1d3028e05636
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: _:99408eeb-199c-471d-b5dd-a04bc58ace7b
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: _:eaf76458-108a-4c99-9620-1934478a8900
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: _:2e65528b-9733-49e5-8a1d-3bb431ec7340
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: _:65d579d5-5e55-439d-bd84-cb2ecfbc5e19
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: _:76355e81-4f27-4ad2-87cb-f0b379337c25
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: _:777b2a25-1891-497e-b128-236a4f9ce198
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: _:2fe9f50c-0a77-465e-9514-5ec2b677df3b
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#Fields/exclude
type:
- 'null'
- name: _:6eff1985-a59b-4ea3-ba07-404c47b4da18
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: _:0384eccd-a5ce-4a22-9977-3439933ea64b
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: _:1d50c063-4883-49dd-b68e-1f745480e735
items: string
type: array
- name:
https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings/ids
type:
- 'null'
- name: _:260aafe5-98fa-43ff-a681-3df14b2fe75e
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: _:41b596ae-1e81-49a4-abd7-7fa0212495dd
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: _:053646a2-672d-4459-82d6-afa3867a9948
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-04-08 15:30:31.609 | 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-04-08 15:30:31.663 | 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-04-08 15:30:31.693 | DEBUG | cwl_loader:load_cwl_from_stream:186 - CWL data of type <class 'ruamel.yaml.comments.CommentedMap'> successfully loaded from stream
2026-04-08 15:30:31.694 | DEBUG | cwl_loader:load_cwl_from_yaml:124 - No needs to update the Raw CWL document since it targets already the v1.2
2026-04-08 15:30:31.695 | DEBUG | cwl_loader:load_cwl_from_yaml:128 - Parsing the raw CWL document to the CWL Utils DOM...
2026-04-08 15:30:31.837 | DEBUG | cwl_loader:load_cwl_from_yaml:137 - Raw CWL document successfully parsed to the CWL Utils DOM!
2026-04-08 15:30:31.838 | DEBUG | cwl_loader:load_cwl_from_yaml:139 - Dereferencing the steps[].run...
2026-04-08 15:30:31.838 | 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-04-08 15:30:31.839 | 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-04-08 15:30:31.839 | 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-04-08 15:30:31.841 | 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-04-08 15:30:31.842 | 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-04-08 15:30:31.842 | 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-04-08 15:30:31.843 | 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-04-08 15:30:31.843 | 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-04-08 15:30:31.844 | DEBUG | cwl_loader:load_cwl_from_yaml:143 - steps[].run successfully dereferenced! Dereferencing the FQNs...
2026-04-08 15:30:31.844 | DEBUG | cwl_loader:load_cwl_from_yaml:147 - CWL document successfully dereferenced! Now verifying steps[].run integrity...
2026-04-08 15:30:31.845 | DEBUG | cwl_loader:load_cwl_from_yaml:153 - All steps[].run link are resolvable!
2026-04-08 15:30:31.845 | DEBUG | cwl_loader:load_cwl_from_yaml:156 - Sorting Process instances by dependencies....
2026-04-08 15:30:31.846 | DEBUG | cwl_loader:load_cwl_from_yaml:158 - Sorting process is over.
2026-04-08 15:30:31.846 | 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_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: rio_stack
class: CommandLineTool
inputs:
- id: tiffs
type:
name: _:c1b7a35e-4750-40ba-8db7-3bd7bb4432d2
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_warp_stack
class: CommandLineTool
inputs:
- id: tiffs
type:
name: _:0d93ab73-1fde-49cc-a05e-65605ed6e71c
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: _:4bfac895-861e-4e2c-8a09-a2fb254905e0
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'