clingy YAML file¶
By default, clingy init
will place a .clingy.yaml
file in your present working directory.
Top-level Parameters¶
label
- a label to label the entire clingy workflowdescription
- provide a description for the clingy workflow
Gets set on the top level with the above, like this example.
Environment variables¶
If you have environment variables you wish to pass into the YAML, you can do so with the following
${ENVIRONMENT_VARIABLE}
in your YAML. For example:
steps:
- command: <INSERT A COMMAND HERE>
args:
- ${ENVIRONMENT_VARIABLE_HERE} # should correctly be substituted on use
There is an example in this file
utilizing ${TERM}
.
Steps¶
Command¶
Specify a command to execute (ex: echo
).
Arguments (and Inputs)¶
In an array of args
, provide a set of arguments to execute against.
steps:
- # ... other step fields
args:
- <INSERT AN ARGUMENT HERE>
- <INSERT ANOTHER ARGUMENT HERE>
# ... keep adding arguments
If you want to use an input set by an output, you can use it with $[[KEY NAME]]
, where KEY NAME
is a value you specify in a key
in a preceding step. This is highlighted in the outputs section
below.
Outputs¶
There are a few different ways you can capture outputs, and then, in turn, use them as inputs. For example,
say you were to use echo "Hello my name is Madhu!"
, you may want to extract the name from that echo,
or echo it right back up, with the intended use of: echo "Hello $[[name]]!"
resulting in
Hello Madhu!
. This document will outline the major ways in which this is possible:
- Full Output - capture the entirety of the output and store it for reuse
- Regex - evaluate a regular expression and use the first match it encounters
- Positional - target a delimiter (ex:
|
) and specify its index
There are also some arguments and helpers that transcend all output extraction mechanics. See the
The overarching structure is that any output of a command you wish to store will need to be stored in
an output_processing
field:
steps:
- # ... other step fields
output_processing:
key: <INSERT A KEY HERE> # a key to search on later for reuse
matching_type: <CHOOSE ONE OF THE MATCHING TYPES BELOW> # a matching type for use later
# ... other fields specific to matching type, depending on which you chose
- # ... other step fields
command: <INSERT A COMMAND HERE>
args:
# use the key you specified above under "key"
- $[[KEY NAME SPECIFIED ABOVE HERE FROM <INSERT A KEY HERE>]]
You can also see this in the Go code here,
for the ClingyOutputProcessing
struct.
Full Output¶
This is used when matching_type
is set to full
.
This will fully use the output of a command and store it in a map with a corresponding key
for reuse.
Example¶
label: "..."
steps:
- label: saving input
command: echo
args:
- sample-input-value
output_processing:
key: sample_input_key
matching_type: full
- label: using output
command: echo
args:
- $[[sample_input_key]]
This can also be found in this test case: 02_basic_full_input_will_pass.yaml.
If done properly, the effect of this would be but in staggered screenshots:
# step 1 runs
> echo sample-input-value
sample-input-value
# step 2 runs
> echo $[[sample_input_key]]
sample-input-value
Regex¶
This is used when matching_type
is set to regex
.
This matching type will evaluate an additional regex
field within maching_args
, evaluating
a regex you provide. If found, it will assign the corresponding first match to the key
for reuse.
Example¶
label: "..."
steps:
- label: saving input
command: echo
args:
- "[[sample]]-input-value"
output_processing:
key: sample_input_key
matching_args:
regex: \[\[([^]]+)\]
matching_type: regex
- label: using output
command: echo
args:
- $[[sample_input_key]]
This can also be found in this test case: 04_basic_regex_input_will_pass.yaml.
If done properly, the effect of this would be but in staggered screenshots:
# step 1 runs
> echo "[[sample]]-input-value"
[[sample]]-input-value
# step 2 runs, pulling the value out of [[ ]]
> echo $[[sample_input_key]]
sample
Positional¶
This is used when matching_type
is set to positional
.
This matching type will evaluate:
* a positional_delimiter
field within matching_args
, splitting a string by that delimiter
* a positional_index
field that requires an integer you select from the delimited string above
A combination of the two will result in a value, which is then stored in a map and can be retrieved
by key
.
Example¶
label: "..."
steps:
- label: saving input
command: echo
args:
- sample-input-value
output_processing:
key: sample_input_key
matching_args:
positional_delimiter: "-"
positional_index: 0 # this will result in "sample" from above, if you used "1" it would be "input"
matching_type: positional
- label: using output
command: echo
args:
- $[[sample_input_key]]
This can also be found in this test case: 06_basic_positional_input_will_pass.yaml.
If done properly, the effect of this would be but in staggered screenshots:
# step 1 runs
> echo "sample-input-value"
sample-input-value
# step 2 runs, pulling the value out of [sample, input, key] of index 0, or "sample"
> echo $[[sample_input_key]]
sample
Other Arguments¶
Fail on no matches¶
If you are anticipating these and should fail, you can use the fail_on_no_match
to true
. This will
raise an error and interrupt execution of the suite. For example:
label: "..."
steps:
- label: saving input
command: echo
args:
- hello
output_processing:
key: sample_input_key
matching_type: regex
regex: ^bye$ # this will fail, but ^hello$ will pass!
fail_on_no_match: true
This will error because the regex did not find that echo statement and the suite will also exit with an error code 1.