From 3e780c08a0e3a0be53f1cda4d539cbcbda180d36 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Wed, 3 Nov 2021 13:54:09 +1100 Subject: [PATCH] gitbook wip --- bob.yml | 2 + examples/data1.yaml | 9 +- how-it-works.md | 121 +++++ pkg/yqlib/doc/Anchor and Alias Operators.md | 331 ------------ pkg/yqlib/doc/Assign (Update).md | 204 -------- pkg/yqlib/doc/Boolean Operators.md | 220 -------- pkg/yqlib/doc/Collect into Array.md | 41 -- pkg/yqlib/doc/Comment Operators.md | 151 ------ pkg/yqlib/doc/Contains.md | 85 --- pkg/yqlib/doc/Create, Collect into Object.md | 79 --- pkg/yqlib/doc/Delete.md | 117 ----- pkg/yqlib/doc/Document Index.md | 88 ---- pkg/yqlib/doc/Encoder.md | 0 pkg/yqlib/doc/Entries.md | 118 ----- pkg/yqlib/doc/Env Variable Operators.md | 78 --- pkg/yqlib/doc/Equals.md | 123 ----- pkg/yqlib/doc/File Operators.md | 71 --- pkg/yqlib/doc/Has.md | 67 --- pkg/yqlib/doc/Keys.md | 35 -- pkg/yqlib/doc/Length.md | 68 --- pkg/yqlib/doc/Multiply (Merge).md | 366 ------------- pkg/yqlib/doc/Path.md | 92 ---- pkg/yqlib/doc/Pipe.md | 35 -- pkg/yqlib/doc/{aa.md => README.md} | 8 +- pkg/yqlib/doc/Recursive Descent (Glob).md | 154 ------ pkg/yqlib/doc/Reduce.md | 76 --- pkg/yqlib/doc/Select.md | 38 -- pkg/yqlib/doc/Sort Keys.md | 68 --- pkg/yqlib/doc/Split into Documents.md | 31 -- pkg/yqlib/doc/String Operators.md | 295 ----------- pkg/yqlib/doc/Style.md | 237 --------- pkg/yqlib/doc/Subtract.md | 110 ---- pkg/yqlib/doc/Tag.md | 58 --- pkg/yqlib/doc/Traverse (Read).md | 482 ------------------ pkg/yqlib/doc/Union.md | 30 -- pkg/yqlib/doc/Unique.md | 82 --- pkg/yqlib/doc/Variable Operators.md | 96 ---- pkg/yqlib/doc/With.md | 62 --- pkg/yqlib/doc/{Add.md => add.md} | 8 +- ...value).md => alternative-default-value.md} | 2 + ...ncoder and Decoder.md => encode-decode.md} | 3 + pkg/yqlib/doc/{Flatten.md => flatten.md} | 1 + pkg/yqlib/doc/{Group By.md => group-by.md} | 2 + pkg/yqlib/doc/headers/Main.md | 3 +- pkg/yqlib/doc/headers/{Add.md => add.md} | 8 +- ...value).md => alternative-default-value.md} | 2 + ...ators.md => anchor-and-alias-operators.md} | 0 .../{Assign (Assign).md => assign-update.md} | 0 ...lean Operators.md => boolean-operators.md} | 0 ...ct into Array.md => collect-into-array.md} | 0 ...ment Operators.md => comment-operators.md} | 0 ...bject.md => create-collect-into-object.md} | 0 ...ncoder and Decoder.md => encode-decode.md} | 4 +- .../doc/headers/{Flatten.md => flatten.md} | 1 + .../doc/headers/{Group By.md => group-by.md} | 2 + pkg/yqlib/operator_add_test.go | 2 +- pkg/yqlib/operator_alternative_test.go | 2 +- pkg/yqlib/operator_anchors_aliases_test.go | 2 +- pkg/yqlib/operator_assign_test.go | 2 +- pkg/yqlib/operator_encoder_decoder_test.go | 2 +- pkg/yqlib/operator_flatten_test.go | 2 +- pkg/yqlib/operator_group_by_test.go | 2 +- scripts/copy-docs.sh | 4 + scripts/generate-man-page-md.sh | 9 +- tim.yml | 2 + 65 files changed, 176 insertions(+), 4217 deletions(-) create mode 100644 bob.yml create mode 100644 how-it-works.md delete mode 100644 pkg/yqlib/doc/Anchor and Alias Operators.md delete mode 100644 pkg/yqlib/doc/Assign (Update).md delete mode 100644 pkg/yqlib/doc/Boolean Operators.md delete mode 100644 pkg/yqlib/doc/Collect into Array.md delete mode 100644 pkg/yqlib/doc/Comment Operators.md delete mode 100644 pkg/yqlib/doc/Contains.md delete mode 100644 pkg/yqlib/doc/Create, Collect into Object.md delete mode 100644 pkg/yqlib/doc/Delete.md delete mode 100644 pkg/yqlib/doc/Document Index.md delete mode 100644 pkg/yqlib/doc/Encoder.md delete mode 100644 pkg/yqlib/doc/Entries.md delete mode 100644 pkg/yqlib/doc/Env Variable Operators.md delete mode 100644 pkg/yqlib/doc/Equals.md delete mode 100644 pkg/yqlib/doc/File Operators.md delete mode 100644 pkg/yqlib/doc/Has.md delete mode 100644 pkg/yqlib/doc/Keys.md delete mode 100644 pkg/yqlib/doc/Length.md delete mode 100644 pkg/yqlib/doc/Multiply (Merge).md delete mode 100644 pkg/yqlib/doc/Path.md delete mode 100644 pkg/yqlib/doc/Pipe.md rename pkg/yqlib/doc/{aa.md => README.md} (95%) delete mode 100644 pkg/yqlib/doc/Recursive Descent (Glob).md delete mode 100644 pkg/yqlib/doc/Reduce.md delete mode 100644 pkg/yqlib/doc/Select.md delete mode 100644 pkg/yqlib/doc/Sort Keys.md delete mode 100644 pkg/yqlib/doc/Split into Documents.md delete mode 100644 pkg/yqlib/doc/String Operators.md delete mode 100644 pkg/yqlib/doc/Style.md delete mode 100644 pkg/yqlib/doc/Subtract.md delete mode 100644 pkg/yqlib/doc/Tag.md delete mode 100644 pkg/yqlib/doc/Traverse (Read).md delete mode 100644 pkg/yqlib/doc/Union.md delete mode 100644 pkg/yqlib/doc/Unique.md delete mode 100644 pkg/yqlib/doc/Variable Operators.md delete mode 100644 pkg/yqlib/doc/With.md rename pkg/yqlib/doc/{Add.md => add.md} (96%) rename pkg/yqlib/doc/{Alternative (Default value).md => alternative-default-value.md} (96%) rename pkg/yqlib/doc/{Encoder and Decoder.md => encode-decode.md} (99%) rename pkg/yqlib/doc/{Flatten.md => flatten.md} (98%) rename pkg/yqlib/doc/{Group By.md => group-by.md} (98%) rename pkg/yqlib/doc/headers/{Add.md => add.md} (64%) rename pkg/yqlib/doc/headers/{Alternative (Default value).md => alternative-default-value.md} (79%) rename pkg/yqlib/doc/headers/{Anchor and Alias Operators.md => anchor-and-alias-operators.md} (100%) rename pkg/yqlib/doc/headers/{Assign (Assign).md => assign-update.md} (100%) rename pkg/yqlib/doc/headers/{Boolean Operators.md => boolean-operators.md} (100%) rename pkg/yqlib/doc/headers/{Collect into Array.md => collect-into-array.md} (100%) rename pkg/yqlib/doc/headers/{Comment Operators.md => comment-operators.md} (100%) rename pkg/yqlib/doc/headers/{Create, Collect into Object.md => create-collect-into-object.md} (100%) rename pkg/yqlib/doc/headers/{Encoder and Decoder.md => encode-decode.md} (85%) rename pkg/yqlib/doc/headers/{Flatten.md => flatten.md} (77%) rename pkg/yqlib/doc/headers/{Group By.md => group-by.md} (82%) create mode 100755 scripts/copy-docs.sh create mode 100644 tim.yml diff --git a/bob.yml b/bob.yml new file mode 100644 index 00000000..8c102531 --- /dev/null +++ b/bob.yml @@ -0,0 +1,2 @@ +name: bob +age: 23 diff --git a/examples/data1.yaml b/examples/data1.yaml index bc87e31c..e940b64d 100644 --- a/examples/data1.yaml +++ b/examples/data1.yaml @@ -1,5 +1,4 @@ -Resources: - S3Bucket: - Type: AWS::CloudFormation::Stack - Properties: - BucketName: !Ref MyBucketNameA \ No newline at end of file +- name: bob + age: 23 +- name: tim + age: 17 \ No newline at end of file diff --git a/how-it-works.md b/how-it-works.md new file mode 100644 index 00000000..01fc048f --- /dev/null +++ b/how-it-works.md @@ -0,0 +1,121 @@ +# How it works + +In `yq` expressions are made up of operators and pipes. A context of nodes is passed through the expression and each operation takes the context as input and returns a new context as output. That output is piped in as input for the next operation in the expression. To begin with, the context is set to the first yaml document of the first yaml file (if processing in sequence using eval). + +Lets look at a couple of examples. + +## Simple assignment example + +Given a document like: + +```yaml +a: cat +b: dog +``` + +with an expression: + +``` +.a = .b +``` + +Like math expression - operator precedence is important. + +The `=` operator takes two arguments, a `lhs` expression, which in this case is `.a` and `rhs` expression which is `.b`. + +It pipes the current, lets call it 'root' context through the `lhs` expression of `.a` to return the node + +```yaml +cat +``` + +Sidenote: this node holds not only its value 'cat', but comments and metadata too, including path and parent information. + +The `=` operator then pipes the 'root' context through the `rhs` expression of `.b` to return the node + +```yaml +dog +``` + +Both sides have now been evaluated, so now the operator copies across the value from the RHS (`.b`) to the the LHS (`.a`), and it returns the now updated context: + +```yaml +a: dog +b: dog +``` + + +## Complex assignment, operator precedence rules + +Just like math expression - `yq` expression have an order of precedence. The pipe `|` operator has a low order of precedence, so operators with higher precedence will get evalated first. + +Most of the time, this is intuitively what you'd want, for instance `.a = "cat" | .b = "dog"` is effectively: `(.a = "cat") | (.b = "dog")`. + +However, this is not always the case, particularly if you have a complex LHS or RHS expression, for instance if you want to select particular nodes to update. + +Lets say you had: + +```yaml +- name: bob + fruit: apple +- name: sally + fruit: orange + +``` + +Lets say you wanted to update the `sally` entry to have fruit: 'mango'. The _incorrect_ way to do that is: +`.[] | select(.name == "sally") | .fruit = "mango"`. + +Becasue `|` has a low operator precedence, this will be evaluated (_incorrectly_) as : `(.[]) | (select(.name == "sally")) | (.fruit = "mango")`. What you'll see is only: + +```yaml +name: sally +fruit: mango +``` + +Returned :( + + +In this case, you will need to use brackets (think BODMAS from maths) and wrap the entire LHS, so the _correct_ expression is: +`(.[] | select(.name == "sally") | .fruit) = "mango"` + + +## Relative update (e.g. `|=`) +There is another form of the `=` operator which we call the relative form. It's very similar to `=` but with one key difference when evaluating the RHS expression. + +In the plain form, we pass in the 'root' level context to the RHS expression. In relative form, we pass in _each result of the LHS_ to the RHS expression. Let's go through an example. + +Given a document like: + +```yaml +a: 1 +b: thing +``` + +with an expression: + +``` +.a |= . + 1 +``` + +Similar to the `=` operator, `|=` takes two operands, the LHS and RHS. + +It pipes the current context (the whole document) through the LHS expression of `.a` to get the node value: + +``` +1 +``` + +Now it pipes _that LHS context_ into the RHS expression `. + 1` (whereas in the `=` plain form it piped the original document context into the RHS) to yield: + + +``` +2 +``` + +The assignment operator then copies across the value from the RHS to the value on the LHS, and it returns the now updated 'root' context: + +```yaml +a: 2 +b: thing +``` diff --git a/pkg/yqlib/doc/Anchor and Alias Operators.md b/pkg/yqlib/doc/Anchor and Alias Operators.md deleted file mode 100644 index 00dc39dd..00000000 --- a/pkg/yqlib/doc/Anchor and Alias Operators.md +++ /dev/null @@ -1,331 +0,0 @@ -Use the `alias` and `anchor` operators to read and write yaml aliases and anchors. The `explode` operator normalises a yaml file (dereference (or expands) aliases and remove anchor names). - -`yq` supports merge aliases (like `<<: *blah`) however this is no longer in the standard yaml spec (1.2) and so `yq` will automatically add the `!!merge` tag to these nodes as it is effectively a custom tag. - - -## Merge one map -see https://yaml.org/type/merge.html - -Given a sample.yml file of: -```yaml -- &CENTER - x: 1 - y: 2 -- &LEFT - x: 0 - y: 2 -- &BIG - r: 10 -- &SMALL - r: 1 -- !!merge <<: *CENTER - r: 10 -``` -then -```bash -yq eval '.[4] | explode(.)' sample.yml -``` -will output -```yaml -x: 1 -y: 2 -r: 10 -``` - -## Merge multiple maps -see https://yaml.org/type/merge.html - -Given a sample.yml file of: -```yaml -- &CENTER - x: 1 - y: 2 -- &LEFT - x: 0 - y: 2 -- &BIG - r: 10 -- &SMALL - r: 1 -- !!merge <<: - - *CENTER - - *BIG -``` -then -```bash -yq eval '.[4] | explode(.)' sample.yml -``` -will output -```yaml -r: 10 -x: 1 -y: 2 -``` - -## Override -see https://yaml.org/type/merge.html - -Given a sample.yml file of: -```yaml -- &CENTER - x: 1 - y: 2 -- &LEFT - x: 0 - y: 2 -- &BIG - r: 10 -- &SMALL - r: 1 -- !!merge <<: - - *BIG - - *LEFT - - *SMALL - x: 1 -``` -then -```bash -yq eval '.[4] | explode(.)' sample.yml -``` -will output -```yaml -r: 10 -x: 1 -y: 2 -``` - -## Get anchor -Given a sample.yml file of: -```yaml -a: &billyBob cat -``` -then -```bash -yq eval '.a | anchor' sample.yml -``` -will output -```yaml -billyBob -``` - -## Set anchor -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '.a anchor = "foobar"' sample.yml -``` -will output -```yaml -a: &foobar cat -``` - -## Set anchor relatively using assign-update -Given a sample.yml file of: -```yaml -a: - b: cat -``` -then -```bash -yq eval '.a anchor |= .b' sample.yml -``` -will output -```yaml -a: &cat - b: cat -``` - -## Get alias -Given a sample.yml file of: -```yaml -b: &billyBob meow -a: *billyBob -``` -then -```bash -yq eval '.a | alias' sample.yml -``` -will output -```yaml -billyBob -``` - -## Set alias -Given a sample.yml file of: -```yaml -b: &meow purr -a: cat -``` -then -```bash -yq eval '.a alias = "meow"' sample.yml -``` -will output -```yaml -b: &meow purr -a: *meow -``` - -## Set alias to blank does nothing -Given a sample.yml file of: -```yaml -b: &meow purr -a: cat -``` -then -```bash -yq eval '.a alias = ""' sample.yml -``` -will output -```yaml -b: &meow purr -a: cat -``` - -## Set alias relatively using assign-update -Given a sample.yml file of: -```yaml -b: &meow purr -a: - f: meow -``` -then -```bash -yq eval '.a alias |= .f' sample.yml -``` -will output -```yaml -b: &meow purr -a: *meow -``` - -## Explode alias and anchor -Given a sample.yml file of: -```yaml -f: - a: &a cat - b: *a -``` -then -```bash -yq eval 'explode(.f)' sample.yml -``` -will output -```yaml -f: - a: cat - b: cat -``` - -## Explode with no aliases or anchors -Given a sample.yml file of: -```yaml -a: mike -``` -then -```bash -yq eval 'explode(.a)' sample.yml -``` -will output -```yaml -a: mike -``` - -## Explode with alias keys -Given a sample.yml file of: -```yaml -f: - a: &a cat - *a: b -``` -then -```bash -yq eval 'explode(.f)' sample.yml -``` -will output -```yaml -f: - a: cat - cat: b -``` - -## Explode with merge anchors -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval 'explode(.)' sample.yml -``` -will output -```yaml -foo: - a: foo_a - thing: foo_thing - c: foo_c -bar: - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: bar_b - thing: foo_thing - c: foobarList_c - a: foo_a -foobar: - c: foo_c - a: foo_a - thing: foobar_thing -``` - -## Dereference and update a field -`Use explode with multiply to dereference an object - -Given a sample.yml file of: -```yaml -item_value: &item_value - value: true -thingOne: - name: item_1 - !!merge <<: *item_value -thingTwo: - name: item_2 - !!merge <<: *item_value -``` -then -```bash -yq eval '.thingOne |= explode(.) * {"value": false}' sample.yml -``` -will output -```yaml -item_value: &item_value - value: true -thingOne: - name: item_1 - value: false -thingTwo: - name: item_2 - !!merge <<: *item_value -``` - diff --git a/pkg/yqlib/doc/Assign (Update).md b/pkg/yqlib/doc/Assign (Update).md deleted file mode 100644 index d43d70ec..00000000 --- a/pkg/yqlib/doc/Assign (Update).md +++ /dev/null @@ -1,204 +0,0 @@ - -## Create yaml file -Running -```bash -yq eval --null-input '.a.b = "cat" | .x = "frog"' -``` -will output -```yaml -a: - b: cat -x: frog -``` - -## Update node to be the child value -Given a sample.yml file of: -```yaml -a: - b: - g: foof -``` -then -```bash -yq eval '.a |= .b' sample.yml -``` -will output -```yaml -a: - g: foof -``` - -## Double elements in an array -Given a sample.yml file of: -```yaml -- 1 -- 2 -- 3 -``` -then -```bash -yq eval '.[] |= . * 2' sample.yml -``` -will output -```yaml -- 2 -- 4 -- 6 -``` - -## Update node from another file -Note this will also work when the second file is a scalar (string/number) - -Given a sample.yml file of: -```yaml -a: apples -``` -And another sample another.yml file of: -```yaml -b: bob -``` -then -```bash -yq eval-all 'select(fileIndex==0).a = select(fileIndex==1) | select(fileIndex==0)' sample.yml another.yml -``` -will output -```yaml -a: - b: bob -``` - -## Update node to be the sibling value -Given a sample.yml file of: -```yaml -a: - b: child -b: sibling -``` -then -```bash -yq eval '.a = .b' sample.yml -``` -will output -```yaml -a: sibling -b: sibling -``` - -## Updated multiple paths -Given a sample.yml file of: -```yaml -a: fieldA -b: fieldB -c: fieldC -``` -then -```bash -yq eval '(.a, .c) = "potatoe"' sample.yml -``` -will output -```yaml -a: potatoe -b: fieldB -c: potatoe -``` - -## Update string value -Given a sample.yml file of: -```yaml -a: - b: apple -``` -then -```bash -yq eval '.a.b = "frog"' sample.yml -``` -will output -```yaml -a: - b: frog -``` - -## Update string value via |= -Note there is no difference between `=` and `|=` when the RHS is a scalar - -Given a sample.yml file of: -```yaml -a: - b: apple -``` -then -```bash -yq eval '.a.b |= "frog"' sample.yml -``` -will output -```yaml -a: - b: frog -``` - -## Update deeply selected results -Note that the LHS is wrapped in brackets! This is to ensure we dont first filter out the yaml and then update the snippet. - -Given a sample.yml file of: -```yaml -a: - b: apple - c: cactus -``` -then -```bash -yq eval '(.a[] | select(. == "apple")) = "frog"' sample.yml -``` -will output -```yaml -a: - b: frog - c: cactus -``` - -## Update array values -Given a sample.yml file of: -```yaml -- candy -- apple -- sandy -``` -then -```bash -yq eval '(.[] | select(. == "*andy")) = "bogs"' sample.yml -``` -will output -```yaml -- bogs -- apple -- bogs -``` - -## Update empty object -Given a sample.yml file of: -```yaml -{} -``` -then -```bash -yq eval '.a.b |= "bogs"' sample.yml -``` -will output -```yaml -{a: {b: bogs}} -``` - -## Update empty object and array -Given a sample.yml file of: -```yaml -{} -``` -then -```bash -yq eval '.a.b.[0] |= "bogs"' sample.yml -``` -will output -```yaml -{a: {b: [bogs]}} -``` - diff --git a/pkg/yqlib/doc/Boolean Operators.md b/pkg/yqlib/doc/Boolean Operators.md deleted file mode 100644 index fccf1c1c..00000000 --- a/pkg/yqlib/doc/Boolean Operators.md +++ /dev/null @@ -1,220 +0,0 @@ -The `or` and `and` operators take two parameters and return a boolean result. - -`not` flips a boolean from true to false, or vice versa. - -`any` will return `true` if there are any `true` values in a array sequence, and `all` will return true if _all_ elements in an array are true. - -`any_c(condition)` and `all_c(condition)` are like `any` and `all` but they take a condition expression that is used against each element to determine if it's `true`. Note: in `jq` you can simply pass a condition to `any` or `all` and it simply works - `yq` isn't that clever..yet - -These are most commonly used with the `select` operator to filter particular nodes. - -## `or` example -Running -```bash -yq eval --null-input 'true or false' -``` -will output -```yaml -true -``` - -## `and` example -Running -```bash -yq eval --null-input 'true and false' -``` -will output -```yaml -false -``` - -## Matching nodes with select, equals and or -Given a sample.yml file of: -```yaml -- a: bird - b: dog -- a: frog - b: bird -- a: cat - b: fly -``` -then -```bash -yq eval '[.[] | select(.a == "cat" or .b == "dog")]' sample.yml -``` -will output -```yaml -- a: bird - b: dog -- a: cat - b: fly -``` - -## `any` returns true if any boolean in a given array is true -Given a sample.yml file of: -```yaml -- false -- true -``` -then -```bash -yq eval 'any' sample.yml -``` -will output -```yaml -true -``` - -## `any` returns false for an empty array -Given a sample.yml file of: -```yaml -[] -``` -then -```bash -yq eval 'any' sample.yml -``` -will output -```yaml -false -``` - -## `any_c` returns true if any element in the array is true for the given condition. -Given a sample.yml file of: -```yaml -a: - - rad - - awesome -b: - - meh - - whatever -``` -then -```bash -yq eval '.[] |= any_c(. == "awesome")' sample.yml -``` -will output -```yaml -a: true -b: false -``` - -## `all` returns true if all booleans in a given array are true -Given a sample.yml file of: -```yaml -- true -- true -``` -then -```bash -yq eval 'all' sample.yml -``` -will output -```yaml -true -``` - -## `all` returns true for an empty array -Given a sample.yml file of: -```yaml -[] -``` -then -```bash -yq eval 'all' sample.yml -``` -will output -```yaml -true -``` - -## `all_c` returns true if all elements in the array are true for the given condition. -Given a sample.yml file of: -```yaml -a: - - rad - - awesome -b: - - meh - - 12 -``` -then -```bash -yq eval '.[] |= all_c(tag == "!!str")' sample.yml -``` -will output -```yaml -a: true -b: false -``` - -## Not true is false -Running -```bash -yq eval --null-input 'true | not' -``` -will output -```yaml -false -``` - -## Not false is true -Running -```bash -yq eval --null-input 'false | not' -``` -will output -```yaml -true -``` - -## String values considered to be true -Running -```bash -yq eval --null-input '"cat" | not' -``` -will output -```yaml -false -``` - -## Empty string value considered to be true -Running -```bash -yq eval --null-input '"" | not' -``` -will output -```yaml -false -``` - -## Numbers are considered to be true -Running -```bash -yq eval --null-input '1 | not' -``` -will output -```yaml -false -``` - -## Zero is considered to be true -Running -```bash -yq eval --null-input '0 | not' -``` -will output -```yaml -false -``` - -## Null is considered to be false -Running -```bash -yq eval --null-input '~ | not' -``` -will output -```yaml -true -``` - diff --git a/pkg/yqlib/doc/Collect into Array.md b/pkg/yqlib/doc/Collect into Array.md deleted file mode 100644 index 8195ee9a..00000000 --- a/pkg/yqlib/doc/Collect into Array.md +++ /dev/null @@ -1,41 +0,0 @@ -# Collect into Array - -This creates an array using the expression between the square brackets. - - -## Collect empty -Running -```bash -yq eval --null-input '[]' -``` -will output -```yaml -[] -``` - -## Collect single -Running -```bash -yq eval --null-input '["cat"]' -``` -will output -```yaml -- cat -``` - -## Collect many -Given a sample.yml file of: -```yaml -a: cat -b: dog -``` -then -```bash -yq eval '[.a, .b]' sample.yml -``` -will output -```yaml -- cat -- dog -``` - diff --git a/pkg/yqlib/doc/Comment Operators.md b/pkg/yqlib/doc/Comment Operators.md deleted file mode 100644 index f36b48d5..00000000 --- a/pkg/yqlib/doc/Comment Operators.md +++ /dev/null @@ -1,151 +0,0 @@ -Use these comment operators to set or retrieve comments. - -Like the `=` and `|=` assign operators, the same syntax applies when updating comments: - - -### plain form: `=` -This will assign the LHS nodes comments to the expression on the RHS. The RHS is run against the matching nodes in the pipeline - -### relative form: `|=` -Similar to the plain form, however the RHS evaluates against each matching LHS node! This is useful if you want to set the comments as a relative expression of the node, for instance its value or path. - - -## Set line comment -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '.a lineComment="single"' sample.yml -``` -will output -```yaml -a: cat # single -``` - -## Use update assign to perform relative updates -Given a sample.yml file of: -```yaml -a: cat -b: dog -``` -then -```bash -yq eval '.. lineComment |= .' sample.yml -``` -will output -```yaml -a: cat # cat -b: dog # dog -``` - -## Set head comment -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '. headComment="single"' sample.yml -``` -will output -```yaml -# single - -a: cat -``` - -## Set foot comment, using an expression -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '. footComment=.a' sample.yml -``` -will output -```yaml -a: cat - -# cat -``` - -## Remove comment -Given a sample.yml file of: -```yaml -a: cat # comment -b: dog # leave this -``` -then -```bash -yq eval '.a lineComment=""' sample.yml -``` -will output -```yaml -a: cat -b: dog # leave this -``` - -## Remove (strip) all comments -Note the use of `...` to ensure key nodes are included. - -Given a sample.yml file of: -```yaml -a: cat # comment -# great -b: # key comment -``` -then -```bash -yq eval '... comments=""' sample.yml -``` -will output -```yaml -a: cat -b: -``` - -## Get line comment -Given a sample.yml file of: -```yaml -a: cat # meow -``` -then -```bash -yq eval '.a | lineComment' sample.yml -``` -will output -```yaml -meow -``` - -## Get head comment -Given a sample.yml file of: -```yaml -a: cat # meow -``` -then -```bash -yq eval '. | headComment' sample.yml -``` -will output -```yaml - -``` - -## Get foot comment -Given a sample.yml file of: -```yaml -a: cat # meow -``` -then -```bash -yq eval '. | footComment' sample.yml -``` -will output -```yaml - -``` - diff --git a/pkg/yqlib/doc/Contains.md b/pkg/yqlib/doc/Contains.md deleted file mode 100644 index b1ab09d4..00000000 --- a/pkg/yqlib/doc/Contains.md +++ /dev/null @@ -1,85 +0,0 @@ - -## Array contains array -Array is equal or subset of - -Given a sample.yml file of: -```yaml -- foobar -- foobaz -- blarp -``` -then -```bash -yq eval 'contains(["baz", "bar"])' sample.yml -``` -will output -```yaml -true -``` - -## Object included in array -Given a sample.yml file of: -```yaml -"foo": 12 -"bar": - - 1 - - 2 - - "barp": 12 - "blip": 13 -``` -then -```bash -yq eval 'contains({"bar": [{"barp": 12}]})' sample.yml -``` -will output -```yaml -true -``` - -## Object not included in array -Given a sample.yml file of: -```yaml -"foo": 12 -"bar": - - 1 - - 2 - - "barp": 12 - "blip": 13 -``` -then -```bash -yq eval 'contains({"foo": 12, "bar": [{"barp": 15}]})' sample.yml -``` -will output -```yaml -false -``` - -## String contains substring -Given a sample.yml file of: -```yaml -foobar -``` -then -```bash -yq eval 'contains("bar")' sample.yml -``` -will output -```yaml -true -``` - -## String equals string -Given a sample.yml file of: -```yaml -meow -``` -then -```bash -yq eval 'contains("meow")' sample.yml -``` -will output -```yaml -true -``` - diff --git a/pkg/yqlib/doc/Create, Collect into Object.md b/pkg/yqlib/doc/Create, Collect into Object.md deleted file mode 100644 index ffbc11bf..00000000 --- a/pkg/yqlib/doc/Create, Collect into Object.md +++ /dev/null @@ -1,79 +0,0 @@ -This is used to construct objects (or maps). This can be used against existing yaml, or to create fresh yaml documents. -## Collect empty object -Running -```bash -yq eval --null-input '{}' -``` -will output -```yaml -{} -``` - -## Wrap (prefix) existing object -Given a sample.yml file of: -```yaml -name: Mike -``` -then -```bash -yq eval '{"wrap": .}' sample.yml -``` -will output -```yaml -wrap: - name: Mike -``` - -## Using splat to create multiple objects -Given a sample.yml file of: -```yaml -name: Mike -pets: - - cat - - dog -``` -then -```bash -yq eval '{.name: .pets.[]}' sample.yml -``` -will output -```yaml -Mike: cat -Mike: dog -``` - -## Working with multiple documents -Given a sample.yml file of: -```yaml -name: Mike -pets: - - cat - - dog ---- -name: Rosey -pets: - - monkey - - sheep -``` -then -```bash -yq eval '{.name: .pets.[]}' sample.yml -``` -will output -```yaml -Mike: cat -Mike: dog -Rosey: monkey -Rosey: sheep -``` - -## Creating yaml from scratch -Running -```bash -yq eval --null-input '{"wrap": "frog"}' -``` -will output -```yaml -wrap: frog -``` - diff --git a/pkg/yqlib/doc/Delete.md b/pkg/yqlib/doc/Delete.md deleted file mode 100644 index 8842b091..00000000 --- a/pkg/yqlib/doc/Delete.md +++ /dev/null @@ -1,117 +0,0 @@ -Deletes matching entries in maps or arrays. -## Delete entry in map -Given a sample.yml file of: -```yaml -a: cat -b: dog -``` -then -```bash -yq eval 'del(.b)' sample.yml -``` -will output -```yaml -a: cat -``` - -## Delete nested entry in map -Given a sample.yml file of: -```yaml -a: - a1: fred - a2: frood -``` -then -```bash -yq eval 'del(.a.a1)' sample.yml -``` -will output -```yaml -a: - a2: frood -``` - -## Delete entry in array -Given a sample.yml file of: -```yaml -- 1 -- 2 -- 3 -``` -then -```bash -yq eval 'del(.[1])' sample.yml -``` -will output -```yaml -- 1 -- 3 -``` - -## Delete nested entry in array -Given a sample.yml file of: -```yaml -- a: cat - b: dog -``` -then -```bash -yq eval 'del(.[0].a)' sample.yml -``` -will output -```yaml -- b: dog -``` - -## Delete no matches -Given a sample.yml file of: -```yaml -a: cat -b: dog -``` -then -```bash -yq eval 'del(.c)' sample.yml -``` -will output -```yaml -a: cat -b: dog -``` - -## Delete matching entries -Given a sample.yml file of: -```yaml -a: cat -b: dog -c: bat -``` -then -```bash -yq eval 'del( .[] | select(. == "*at") )' sample.yml -``` -will output -```yaml -b: dog -``` - -## Recursively delete matching keys -Given a sample.yml file of: -```yaml -a: - name: frog - b: - name: blog - age: 12 -``` -then -```bash -yq eval 'del(.. | select(has("name")).name)' sample.yml -``` -will output -```yaml -a: - b: - age: 12 -``` - diff --git a/pkg/yqlib/doc/Document Index.md b/pkg/yqlib/doc/Document Index.md deleted file mode 100644 index f9a2366e..00000000 --- a/pkg/yqlib/doc/Document Index.md +++ /dev/null @@ -1,88 +0,0 @@ -Use the `documentIndex` operator (or the `di` shorthand) to select nodes of a particular document. -## Retrieve a document index -Given a sample.yml file of: -```yaml -a: cat ---- -a: frog -``` -then -```bash -yq eval '.a | documentIndex' sample.yml -``` -will output -```yaml -0 ---- -1 -``` - -## Retrieve a document index, shorthand -Given a sample.yml file of: -```yaml -a: cat ---- -a: frog -``` -then -```bash -yq eval '.a | di' sample.yml -``` -will output -```yaml -0 ---- -1 -``` - -## Filter by document index -Given a sample.yml file of: -```yaml -a: cat ---- -a: frog -``` -then -```bash -yq eval 'select(documentIndex == 1)' sample.yml -``` -will output -```yaml -a: frog -``` - -## Filter by document index shorthand -Given a sample.yml file of: -```yaml -a: cat ---- -a: frog -``` -then -```bash -yq eval 'select(di == 1)' sample.yml -``` -will output -```yaml -a: frog -``` - -## Print Document Index with matches -Given a sample.yml file of: -```yaml -a: cat ---- -a: frog -``` -then -```bash -yq eval '.a | ({"match": ., "doc": documentIndex})' sample.yml -``` -will output -```yaml -match: cat -doc: 0 -match: frog -doc: 1 -``` - diff --git a/pkg/yqlib/doc/Encoder.md b/pkg/yqlib/doc/Encoder.md deleted file mode 100644 index e69de29b..00000000 diff --git a/pkg/yqlib/doc/Entries.md b/pkg/yqlib/doc/Entries.md deleted file mode 100644 index cac83f8f..00000000 --- a/pkg/yqlib/doc/Entries.md +++ /dev/null @@ -1,118 +0,0 @@ -Similar to the same named functions in `jq` these functions convert to/from an object and an array of key-value pairs. This is most useful for performing operations on keys of maps. -## to_entries Map -Given a sample.yml file of: -```yaml -a: 1 -b: 2 -``` -then -```bash -yq eval 'to_entries' sample.yml -``` -will output -```yaml -- key: a - value: 1 -- key: b - value: 2 -``` - -## to_entries Array -Given a sample.yml file of: -```yaml -- a -- b -``` -then -```bash -yq eval 'to_entries' sample.yml -``` -will output -```yaml -- key: 0 - value: a -- key: 1 - value: b -``` - -## to_entries null -Given a sample.yml file of: -```yaml -null -``` -then -```bash -yq eval 'to_entries' sample.yml -``` -will output -```yaml -``` - -## from_entries map -Given a sample.yml file of: -```yaml -a: 1 -b: 2 -``` -then -```bash -yq eval 'to_entries | from_entries' sample.yml -``` -will output -```yaml -a: 1 -b: 2 -``` - -## from_entries with numeric key indexes -from_entries always creates a map, even for numeric keys - -Given a sample.yml file of: -```yaml -- a -- b -``` -then -```bash -yq eval 'to_entries | from_entries' sample.yml -``` -will output -```yaml -0: a -1: b -``` - -## Use with_entries to update keys -Given a sample.yml file of: -```yaml -a: 1 -b: 2 -``` -then -```bash -yq eval 'with_entries(.key |= "KEY_" + .)' sample.yml -``` -will output -```yaml -KEY_a: 1 -KEY_b: 2 -``` - -## Use with_entries to filter the map -Given a sample.yml file of: -```yaml -a: - b: bird -c: - d: dog -``` -then -```bash -yq eval 'with_entries(select(.value | has("b")))' sample.yml -``` -will output -```yaml -a: - b: bird -``` - diff --git a/pkg/yqlib/doc/Env Variable Operators.md b/pkg/yqlib/doc/Env Variable Operators.md deleted file mode 100644 index c9923c68..00000000 --- a/pkg/yqlib/doc/Env Variable Operators.md +++ /dev/null @@ -1,78 +0,0 @@ -This operator is used to handle environment variables usage in path expressions. While environment variables can, of course, be passed in via your CLI with string interpolation, this often comes with complex quote escaping and can be tricky to write and read. Note that there are two forms, `env` which will parse the environment variable as a yaml (be it a map, array, string, number of boolean) and `strenv` which will always parse the argument as a string. - - -## Read string environment variable -Running -```bash -myenv="cat meow" yq eval --null-input '.a = env(myenv)' -``` -will output -```yaml -a: cat meow -``` - -## Read boolean environment variable -Running -```bash -myenv="true" yq eval --null-input '.a = env(myenv)' -``` -will output -```yaml -a: true -``` - -## Read numeric environment variable -Running -```bash -myenv="12" yq eval --null-input '.a = env(myenv)' -``` -will output -```yaml -a: 12 -``` - -## Read yaml environment variable -Running -```bash -myenv="{b: fish}" yq eval --null-input '.a = env(myenv)' -``` -will output -```yaml -a: {b: fish} -``` - -## Read boolean environment variable as a string -Running -```bash -myenv="true" yq eval --null-input '.a = strenv(myenv)' -``` -will output -```yaml -a: "true" -``` - -## Read numeric environment variable as a string -Running -```bash -myenv="12" yq eval --null-input '.a = strenv(myenv)' -``` -will output -```yaml -a: "12" -``` - -## Dynamic key lookup with environment variable -Given a sample.yml file of: -```yaml -cat: meow -dog: woof -``` -then -```bash -myenv="cat" yq eval '.[env(myenv)]' sample.yml -``` -will output -```yaml -meow -``` - diff --git a/pkg/yqlib/doc/Equals.md b/pkg/yqlib/doc/Equals.md deleted file mode 100644 index dcdff2b6..00000000 --- a/pkg/yqlib/doc/Equals.md +++ /dev/null @@ -1,123 +0,0 @@ -This is a boolean operator that will return ```true``` if the LHS is equal to the RHS and ``false`` otherwise. - -``` -.a == .b -``` - -It is most often used with the select operator to find particular nodes: - -``` -select(.a == .b) -``` - - -## Match string -Given a sample.yml file of: -```yaml -- cat -- goat -- dog -``` -then -```bash -yq eval '.[] | (. == "*at")' sample.yml -``` -will output -```yaml -true -true -false -``` - -## Don't match string -Given a sample.yml file of: -```yaml -- cat -- goat -- dog -``` -then -```bash -yq eval '.[] | (. != "*at")' sample.yml -``` -will output -```yaml -false -false -true -``` - -## Match number -Given a sample.yml file of: -```yaml -- 3 -- 4 -- 5 -``` -then -```bash -yq eval '.[] | (. == 4)' sample.yml -``` -will output -```yaml -false -true -false -``` - -## Dont match number -Given a sample.yml file of: -```yaml -- 3 -- 4 -- 5 -``` -then -```bash -yq eval '.[] | (. != 4)' sample.yml -``` -will output -```yaml -true -false -true -``` - -## Match nulls -Running -```bash -yq eval --null-input 'null == ~' -``` -will output -```yaml -true -``` - -## Non exisitant key doesn't equal a value -Given a sample.yml file of: -```yaml -a: frog -``` -then -```bash -yq eval 'select(.b != "thing")' sample.yml -``` -will output -```yaml -a: frog -``` - -## Two non existant keys are equal -Given a sample.yml file of: -```yaml -a: frog -``` -then -```bash -yq eval 'select(.b == .c)' sample.yml -``` -will output -```yaml -a: frog -``` - diff --git a/pkg/yqlib/doc/File Operators.md b/pkg/yqlib/doc/File Operators.md deleted file mode 100644 index 0571b341..00000000 --- a/pkg/yqlib/doc/File Operators.md +++ /dev/null @@ -1,71 +0,0 @@ -File operators are most often used with merge when needing to merge specific files together. Note that when doing this, you will need to use `eval-all` to ensure all yaml documents are loaded into memory before performing the merge (as opposed to `eval` which runs the expression once per document). - -Note that the `fileIndex` operator has a short alias of `fi`. - -## Merging files -Note the use of eval-all to ensure all documents are loaded into memory. -```bash -yq eval-all 'select(fi == 0) * select(filename == "file2.yaml")' file1.yaml file2.yaml -``` -## Get filename -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval 'filename' sample.yml -``` -will output -```yaml -sample.yml -``` - -## Get file index -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval 'fileIndex' sample.yml -``` -will output -```yaml -0 -``` - -## Get file indices of multiple documents -Given a sample.yml file of: -```yaml -a: cat -``` -And another sample another.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval-all 'fileIndex' sample.yml another.yml -``` -will output -```yaml -0 ---- -1 -``` - -## Get file index alias -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval 'fi' sample.yml -``` -will output -```yaml -0 -``` - diff --git a/pkg/yqlib/doc/Has.md b/pkg/yqlib/doc/Has.md deleted file mode 100644 index 6dbfe0f8..00000000 --- a/pkg/yqlib/doc/Has.md +++ /dev/null @@ -1,67 +0,0 @@ -This is operation that returns true if the key exists in a map (or index in an array), false otherwise. -## Has map key -Given a sample.yml file of: -```yaml -- a: yes -- a: ~ -- a: -- b: nope -``` -then -```bash -yq eval '.[] | has("a")' sample.yml -``` -will output -```yaml -true -true -true -false -``` - -## Select, checking for existence of deep paths -Simply pipe in parent expressions into `has` - -Given a sample.yml file of: -```yaml -- a: - b: - c: cat -- a: - b: - d: dog -``` -then -```bash -yq eval '.[] | select(.a.b | has("c"))' sample.yml -``` -will output -```yaml -a: - b: - c: cat -``` - -## Has array index -Given a sample.yml file of: -```yaml -- [] -- [1] -- [1, 2] -- [1, null] -- [1, 2, 3] - -``` -then -```bash -yq eval '.[] | has(1)' sample.yml -``` -will output -```yaml -false -false -true -true -true -``` - diff --git a/pkg/yqlib/doc/Keys.md b/pkg/yqlib/doc/Keys.md deleted file mode 100644 index 04bad8b2..00000000 --- a/pkg/yqlib/doc/Keys.md +++ /dev/null @@ -1,35 +0,0 @@ -# Keys - -Use the `keys` operator to return map keys or array indices. -## Map keys -Given a sample.yml file of: -```yaml -dog: woof -cat: meow -``` -then -```bash -yq eval 'keys' sample.yml -``` -will output -```yaml -- dog -- cat -``` - -## Array keys -Given a sample.yml file of: -```yaml -- apple -- banana -``` -then -```bash -yq eval 'keys' sample.yml -``` -will output -```yaml -- 0 -- 1 -``` - diff --git a/pkg/yqlib/doc/Length.md b/pkg/yqlib/doc/Length.md deleted file mode 100644 index 0f7e73d7..00000000 --- a/pkg/yqlib/doc/Length.md +++ /dev/null @@ -1,68 +0,0 @@ -Returns the lengths of the nodes. Length is defined according to the type of the node. - -## String length -returns length of string - -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '.a | length' sample.yml -``` -will output -```yaml -3 -``` - -## null length -Given a sample.yml file of: -```yaml -a: null -``` -then -```bash -yq eval '.a | length' sample.yml -``` -will output -```yaml -0 -``` - -## Map length -returns number of entries - -Given a sample.yml file of: -```yaml -a: cat -c: dog -``` -then -```bash -yq eval 'length' sample.yml -``` -will output -```yaml -2 -``` - -## Array length -returns number of elements - -Given a sample.yml file of: -```yaml -- 2 -- 4 -- 6 -- 8 -``` -then -```bash -yq eval 'length' sample.yml -``` -will output -```yaml -4 -``` - diff --git a/pkg/yqlib/doc/Multiply (Merge).md b/pkg/yqlib/doc/Multiply (Merge).md deleted file mode 100644 index e2d2c856..00000000 --- a/pkg/yqlib/doc/Multiply (Merge).md +++ /dev/null @@ -1,366 +0,0 @@ -Like the multiple operator in jq, depending on the operands, this multiply operator will do different things. Currently numbers, arrays and objects are supported. - -## Objects and arrays - merging -Objects are merged deeply matching on matching keys. By default, array values override and are not deeply merged. - -Note that when merging objects, this operator returns the merged object (not the parent). This will be clearer in the examples below. - -### Merge Flags -You can control how objects are merged by using one or more of the following flags. Multiple flags can be used together, e.g. `.a *+? .b`. See examples below - -- `+` to append arrays -- `?` to only merge existing fields -- `d` to deeply merge arrays - -### Merging files -Note the use of `eval-all` to ensure all documents are loaded into memory. - -```bash -yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' file1.yaml file2.yaml -``` - -## Multiply integers -Running -```bash -yq eval --null-input '3 * 4' -``` -will output -```yaml -12 -``` - -## Merge objects together, returning merged result only -Given a sample.yml file of: -```yaml -a: - field: me - fieldA: cat -b: - field: - g: wizz - fieldB: dog -``` -then -```bash -yq eval '.a * .b' sample.yml -``` -will output -```yaml -field: - g: wizz -fieldA: cat -fieldB: dog -``` - -## Merge objects together, returning parent object -Given a sample.yml file of: -```yaml -a: - field: me - fieldA: cat -b: - field: - g: wizz - fieldB: dog -``` -then -```bash -yq eval '. * {"a":.b}' sample.yml -``` -will output -```yaml -a: - field: - g: wizz - fieldA: cat - fieldB: dog -b: - field: - g: wizz - fieldB: dog -``` - -## Merge keeps style of LHS -Given a sample.yml file of: -```yaml -a: {things: great} -b: - also: "me" -``` -then -```bash -yq eval '. * {"a":.b}' sample.yml -``` -will output -```yaml -a: {things: great, also: "me"} -b: - also: "me" -``` - -## Merge arrays -Given a sample.yml file of: -```yaml -a: - - 1 - - 2 - - 3 -b: - - 3 - - 4 - - 5 -``` -then -```bash -yq eval '. * {"a":.b}' sample.yml -``` -will output -```yaml -a: - - 3 - - 4 - - 5 -b: - - 3 - - 4 - - 5 -``` - -## Merge, only existing fields -Given a sample.yml file of: -```yaml -a: - thing: one - cat: frog -b: - missing: two - thing: two -``` -then -```bash -yq eval '.a *? .b' sample.yml -``` -will output -```yaml -thing: two -cat: frog -``` - -## Merge, appending arrays -Given a sample.yml file of: -```yaml -a: - array: - - 1 - - 2 - - animal: dog - value: coconut -b: - array: - - 3 - - 4 - - animal: cat - value: banana -``` -then -```bash -yq eval '.a *+ .b' sample.yml -``` -will output -```yaml -array: - - 1 - - 2 - - animal: dog - - 3 - - 4 - - animal: cat -value: banana -``` - -## Merge, only existing fields, appending arrays -Given a sample.yml file of: -```yaml -a: - thing: - - 1 - - 2 -b: - thing: - - 3 - - 4 - another: - - 1 -``` -then -```bash -yq eval '.a *?+ .b' sample.yml -``` -will output -```yaml -thing: - - 1 - - 2 - - 3 - - 4 -``` - -## Merge, deeply merging arrays -Merging arrays deeply means arrays are merge like objects, with indexes as their key. In this case, we merge the first item in the array, and do nothing with the second. - -Given a sample.yml file of: -```yaml -a: - - name: fred - age: 12 - - name: bob - age: 32 -b: - - name: fred - age: 34 -``` -then -```bash -yq eval '.a *d .b' sample.yml -``` -will output -```yaml -- name: fred - age: 34 -- name: bob - age: 32 -``` - -## Merge arrays of objects together, matching on a key -It's a complex command, the trickyness comes from needing to have the right context in the expressions. -First we save the second array into a variable '$two' which lets us reference it later. -We then need to update the first array. We will use the relative update (|=) because we need to update relative to the current element of the array in the LHS in the RHS expression. -We set the current element of the first array as $cur. Now we multiply (merge) $cur with the matching entry in $two, by passing $two through a select filter. - - -Given a sample.yml file of: -```yaml -- a: apple - b: appleB -- a: kiwi - b: kiwiB -- a: banana - b: bananaB -``` -And another sample another.yml file of: -```yaml -- a: banana - c: bananaC -- a: apple - b: appleB2 -- a: dingo - c: dingoC -``` -then -```bash -yq eval-all '(select(fi==1) | .[]) as $two | select(fi==0) | .[] |= (. as $cur | $cur * ($two | select(.a == $cur.a)))' sample.yml another.yml -``` -will output -```yaml -- a: apple - b: appleB2 -- a: kiwi - b: kiwiB -- a: banana - b: bananaB - c: bananaC -``` - -## Merge to prefix an element -Given a sample.yml file of: -```yaml -a: cat -b: dog -``` -then -```bash -yq eval '. * {"a": {"c": .a}}' sample.yml -``` -will output -```yaml -a: - c: cat -b: dog -``` - -## Merge with simple aliases -Given a sample.yml file of: -```yaml -a: &cat - c: frog -b: - f: *cat -c: - g: thongs -``` -then -```bash -yq eval '.c * .b' sample.yml -``` -will output -```yaml -g: thongs -f: *cat -``` - -## Merge copies anchor names -Given a sample.yml file of: -```yaml -a: - c: &cat frog -b: - f: *cat -c: - g: thongs -``` -then -```bash -yq eval '.c * .a' sample.yml -``` -will output -```yaml -g: thongs -c: &cat frog -``` - -## Merge with merge anchors -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar * .foobarList' sample.yml -``` -will output -```yaml -c: foobarList_c -!!merge <<: - - *foo - - *bar -thing: foobar_thing -b: foobarList_b -``` - diff --git a/pkg/yqlib/doc/Path.md b/pkg/yqlib/doc/Path.md deleted file mode 100644 index 9bf1f404..00000000 --- a/pkg/yqlib/doc/Path.md +++ /dev/null @@ -1,92 +0,0 @@ -The path operator can be used to get the traversal paths of matching nodes in an expression. The path is returned as an array, which if traversed in order will lead to the matching node. - -You can get the key/index of matching nodes by using the `path` operator to return the path array then piping that through `.[-1]` to get the last element of that array, the key. - -## Map path -Given a sample.yml file of: -```yaml -a: - b: cat -``` -then -```bash -yq eval '.a.b | path' sample.yml -``` -will output -```yaml -- a -- b -``` - -## Get map key -Given a sample.yml file of: -```yaml -a: - b: cat -``` -then -```bash -yq eval '.a.b | path | .[-1]' sample.yml -``` -will output -```yaml -b -``` - -## Array path -Given a sample.yml file of: -```yaml -a: - - cat - - dog -``` -then -```bash -yq eval '.a.[] | select(. == "dog") | path' sample.yml -``` -will output -```yaml -- a -- 1 -``` - -## Get array index -Given a sample.yml file of: -```yaml -a: - - cat - - dog -``` -then -```bash -yq eval '.a.[] | select(. == "dog") | path | .[-1]' sample.yml -``` -will output -```yaml -1 -``` - -## Print path and value -Given a sample.yml file of: -```yaml -a: - - cat - - dog - - frog -``` -then -```bash -yq eval '.a.[] | select(. == "*og") | [{"path":path, "value":.}]' sample.yml -``` -will output -```yaml -- path: - - a - - 1 - value: dog -- path: - - a - - 2 - value: frog -``` - diff --git a/pkg/yqlib/doc/Pipe.md b/pkg/yqlib/doc/Pipe.md deleted file mode 100644 index b1160d29..00000000 --- a/pkg/yqlib/doc/Pipe.md +++ /dev/null @@ -1,35 +0,0 @@ -Pipe the results of an expression into another. Like the bash operator. - -## Simple Pipe -Given a sample.yml file of: -```yaml -a: - b: cat -``` -then -```bash -yq eval '.a | .b' sample.yml -``` -will output -```yaml -cat -``` - -## Multiple updates -Given a sample.yml file of: -```yaml -a: cow -b: sheep -c: same -``` -then -```bash -yq eval '.a = "cat" | .b = "dog"' sample.yml -``` -will output -```yaml -a: cat -b: dog -c: same -``` - diff --git a/pkg/yqlib/doc/aa.md b/pkg/yqlib/doc/README.md similarity index 95% rename from pkg/yqlib/doc/aa.md rename to pkg/yqlib/doc/README.md index 5be8d9d9..ac099ca5 100644 --- a/pkg/yqlib/doc/aa.md +++ b/pkg/yqlib/doc/README.md @@ -1,3 +1,5 @@ +# How it works + In `yq` expressions are made up of operators and pipes. A context of nodes is passed through the expression and each operation takes the context as input and returns a new context as output. That output is piped in as input for the next operation in the expression. To begin with, the context is set to the first yaml document of the first yaml file (if processing in sequence using eval). Lets look at a couple of examples. @@ -35,7 +37,7 @@ This being the last operation in the expression, the results will be printed out 3 ``` -# Example with an operator that takes arguments. +## Example with an operator that takes arguments. Given a document like: @@ -73,7 +75,7 @@ a: dog b: dog ``` -# Relative update (e.g. `|=`) +## Relative update (e.g. `|=`) There is another form of the `=` operator which we call the relative form. It's very similar to `=` but with one key difference when evaluating the RHS expression. In the plain form, we pass in the 'root' level context to the RHS expression. In relative form, we pass in _each result of the LHS_ to the RHS expression. Let's go through an example. @@ -93,7 +95,7 @@ with an expression: Similar to the `=` operator, `|=` takes two operands, the LHS and RHS. -It pipes the current context (the whole document) through the LHS expression of `.a` to get the node value: +It pipes the current context (the whole document) through the LHS expression of `.a` to get the node value: ``` 1 diff --git a/pkg/yqlib/doc/Recursive Descent (Glob).md b/pkg/yqlib/doc/Recursive Descent (Glob).md deleted file mode 100644 index b95393dd..00000000 --- a/pkg/yqlib/doc/Recursive Descent (Glob).md +++ /dev/null @@ -1,154 +0,0 @@ -This operator recursively matches (or globs) all children nodes given of a particular element, including that node itself. This is most often used to apply a filter recursively against all matches. It can be used in either the - -## match values form `..` -This will, like the `jq` equivalent, recursively match all _value_ nodes. Use it to find/manipulate particular values. - -For instance to set the `style` of all _value_ nodes in a yaml doc, excluding map keys: - -```bash -yq eval '.. style= "flow"' file.yaml -``` - -## match values and map keys form `...` -The also includes map keys in the results set. This is particularly useful in YAML as unlike JSON, map keys can have their own styling, tags and use anchors and aliases. - -For instance to set the `style` of all nodes in a yaml doc, including the map keys: - -```bash -yq eval '... style= "flow"' file.yaml -``` -## Recurse map (values only) -Given a sample.yml file of: -```yaml -a: frog -``` -then -```bash -yq eval '..' sample.yml -``` -will output -```yaml -a: frog -frog -``` - -## Recursively find nodes with keys -Note that this example has wrapped the expression in `[]` to show that there are two matches returned. You do not have to wrap in `[]` in your path expression. - -Given a sample.yml file of: -```yaml -a: - name: frog - b: - name: blog - age: 12 -``` -then -```bash -yq eval '[.. | select(has("name"))]' sample.yml -``` -will output -```yaml -- name: frog - b: - name: blog - age: 12 -- name: blog - age: 12 -``` - -## Recursively find nodes with values -Given a sample.yml file of: -```yaml -a: - nameA: frog - b: - nameB: frog - age: 12 -``` -then -```bash -yq eval '.. | select(. == "frog")' sample.yml -``` -will output -```yaml -frog -frog -``` - -## Recurse map (values and keys) -Note that the map key appears in the results - -Given a sample.yml file of: -```yaml -a: frog -``` -then -```bash -yq eval '...' sample.yml -``` -will output -```yaml -a: frog -a -frog -``` - -## Aliases are not traversed -Given a sample.yml file of: -```yaml -a: &cat - c: frog -b: *cat -``` -then -```bash -yq eval '[..]' sample.yml -``` -will output -```yaml -- a: &cat - c: frog - b: *cat -- &cat - c: frog -- frog -- *cat -``` - -## Merge docs are not traversed -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar | [..]' sample.yml -``` -will output -```yaml -- c: foobar_c - !!merge <<: *foo - thing: foobar_thing -- foobar_c -- *foo -- foobar_thing -``` - diff --git a/pkg/yqlib/doc/Reduce.md b/pkg/yqlib/doc/Reduce.md deleted file mode 100644 index d45f06bc..00000000 --- a/pkg/yqlib/doc/Reduce.md +++ /dev/null @@ -1,76 +0,0 @@ -Reduce is a powerful way to process a collection of data into a new form. - -``` - as $ ireduce (; ) -``` - -e.g. - -``` -.[] as $item ireduce (0; . + $item) -``` - -On the LHS we are configuring the collection of items that will be reduced `` as well as what each element will be called `$`. Note that the array has been splatted into its individual elements. - -On the RHS there is ``, the starting value of the accumulator and ``, the expression that will update the accumulator for each element in the collection. Note that within the block expression, `.` will evaluate to the current value of the accumulator. - -## yq vs jq syntax -Reduce syntax in `yq` is a little different from `jq` - as `yq` (currently) isn't as sophisticated as `jq` and its only supports infix notation (e.g. a + b, where the operator is in the middle of the two parameters) - where as `jq` uses a mix of infix notation with _prefix_ notation (e.g. `reduce a b` is like writing `+ a b`). - -To that end, the reduce operator is called `ireduce` for backwards compatability if a `jq` like prefix version of `reduce` is ever added. - - -## Sum numbers -Given a sample.yml file of: -```yaml -- 10 -- 2 -- 5 -- 3 -``` -then -```bash -yq eval '.[] as $item ireduce (0; . + $item)' sample.yml -``` -will output -```yaml -20 -``` - -## Merge all yaml files together -Given a sample.yml file of: -```yaml -a: cat -``` -And another sample another.yml file of: -```yaml -b: dog -``` -then -```bash -yq eval-all '. as $item ireduce ({}; . * $item )' sample.yml another.yml -``` -will output -```yaml -a: cat -b: dog -``` - -## Convert an array to an object -Given a sample.yml file of: -```yaml -- name: Cathy - has: apples -- name: Bob - has: bananas -``` -then -```bash -yq eval '.[] as $item ireduce ({}; .[$item | .name] = ($item | .has) )' sample.yml -``` -will output -```yaml -Cathy: apples -Bob: bananas -``` - diff --git a/pkg/yqlib/doc/Select.md b/pkg/yqlib/doc/Select.md deleted file mode 100644 index 0dfe2769..00000000 --- a/pkg/yqlib/doc/Select.md +++ /dev/null @@ -1,38 +0,0 @@ -Select is used to filter arrays and maps by a boolean expression. -## Select elements from array -Given a sample.yml file of: -```yaml -- cat -- goat -- dog -``` -then -```bash -yq eval '.[] | select(. == "*at")' sample.yml -``` -will output -```yaml -cat -goat -``` - -## Select and update matching values in map -Given a sample.yml file of: -```yaml -a: - things: cat - bob: goat - horse: dog -``` -then -```bash -yq eval '(.a.[] | select(. == "*at")) |= "rabbit"' sample.yml -``` -will output -```yaml -a: - things: rabbit - bob: rabbit - horse: dog -``` - diff --git a/pkg/yqlib/doc/Sort Keys.md b/pkg/yqlib/doc/Sort Keys.md deleted file mode 100644 index a1a99306..00000000 --- a/pkg/yqlib/doc/Sort Keys.md +++ /dev/null @@ -1,68 +0,0 @@ -The Sort Keys operator sorts maps by their keys (based on their string value). This operator does not do anything to arrays or scalars (so you can easily recursively apply it to all maps). - -Sort is particularly useful for diffing two different yaml documents: - -```bash -yq eval -i 'sortKeys(..)' file1.yml -yq eval -i 'sortKeys(..)' file2.yml -diff file1.yml file2.yml -``` - -## Sort keys of map -Given a sample.yml file of: -```yaml -c: frog -a: blah -b: bing -``` -then -```bash -yq eval 'sortKeys(.)' sample.yml -``` -will output -```yaml -a: blah -b: bing -c: frog -``` - -## Sort keys recursively -Note the array elements are left unsorted, but maps inside arrays are sorted - -Given a sample.yml file of: -```yaml -bParent: - c: dog - array: - - 3 - - 1 - - 2 -aParent: - z: donkey - x: - - c: yum - b: delish - - b: ew - a: apple -``` -then -```bash -yq eval 'sortKeys(..)' sample.yml -``` -will output -```yaml -aParent: - x: - - b: delish - c: yum - - a: apple - b: ew - z: donkey -bParent: - array: - - 3 - - 1 - - 2 - c: dog -``` - diff --git a/pkg/yqlib/doc/Split into Documents.md b/pkg/yqlib/doc/Split into Documents.md deleted file mode 100644 index a902b43c..00000000 --- a/pkg/yqlib/doc/Split into Documents.md +++ /dev/null @@ -1,31 +0,0 @@ -# Split into Documents - -This operator splits all matches into separate documents - -## Split empty -Running -```bash -yq eval --null-input 'splitDoc' -``` -will output -```yaml - -``` - -## Split array -Given a sample.yml file of: -```yaml -- a: cat -- b: dog -``` -then -```bash -yq eval '.[] | splitDoc' sample.yml -``` -will output -```yaml -a: cat ---- -b: dog -``` - diff --git a/pkg/yqlib/doc/String Operators.md b/pkg/yqlib/doc/String Operators.md deleted file mode 100644 index 0e2c9746..00000000 --- a/pkg/yqlib/doc/String Operators.md +++ /dev/null @@ -1,295 +0,0 @@ -# String Operators - -## RegEx -This uses golangs native regex functions under the hood - See https://github.com/google/re2/wiki/Syntax for the supported syntax. - - -# String blocks, bash and newlines -Bash is notorious for chomping on precious trailing newline characters, making it tricky to set strings with newlines properly. In particular, the `$( exp )` _will trim trailing newlines_. - -For instance to get this yaml: - -``` -a: | - cat -``` - -Using `$( exp )` wont work, as it will trim the trailing new line. - -``` -m=$(echo "cat\n") yq e -n '.a = strenv(m)' -a: cat -``` - -However, using printf works: -``` -printf -v m "cat\n" ; m="$m" yq e -n '.a = strenv(m)' -a: | - cat -``` - -As well as having multiline expressions: -``` -m="cat -" yq e -n '.a = strenv(m)' -a: | - cat -``` - -Similarly, if you're trying to set the content from a file, and want a trailing new line: - -``` -IFS= read -rd '' output < <(cat my_file) -output=$output ./yq e '.data.values = strenv(output)' first.yml -``` -## Join strings -Given a sample.yml file of: -```yaml -- cat -- meow -- 1 -- null -- true -``` -then -```bash -yq eval 'join("; ")' sample.yml -``` -will output -```yaml -cat; meow; 1; ; true -``` - -## Match string -Given a sample.yml file of: -```yaml -foo bar foo -``` -then -```bash -yq eval 'match("foo")' sample.yml -``` -will output -```yaml -string: foo -offset: 0 -length: 3 -captures: [] -``` - -## Match string, case insensitive -Given a sample.yml file of: -```yaml -foo bar FOO -``` -then -```bash -yq eval '[match("(?i)foo"; "g")]' sample.yml -``` -will output -```yaml -- string: foo - offset: 0 - length: 3 - captures: [] -- string: FOO - offset: 8 - length: 3 - captures: [] -``` - -## Match with capture groups -Given a sample.yml file of: -```yaml -abc abc -``` -then -```bash -yq eval '[match("(abc)+"; "g")]' sample.yml -``` -will output -```yaml -- string: abc - offset: 0 - length: 3 - captures: - - string: abc - offset: 0 - length: 3 -- string: abc - offset: 4 - length: 3 - captures: - - string: abc - offset: 4 - length: 3 -``` - -## Match with named capture groups -Given a sample.yml file of: -```yaml -foo bar foo foo foo -``` -then -```bash -yq eval '[match("foo (?Pbar)? foo"; "g")]' sample.yml -``` -will output -```yaml -- string: foo bar foo - offset: 0 - length: 11 - captures: - - string: bar - offset: 4 - length: 3 - name: bar123 -- string: foo foo - offset: 12 - length: 8 - captures: - - string: null - offset: -1 - length: 0 - name: bar123 -``` - -## Capture named groups into a map -Given a sample.yml file of: -```yaml -xyzzy-14 -``` -then -```bash -yq eval 'capture("(?P[a-z]+)-(?P[0-9]+)")' sample.yml -``` -will output -```yaml -a: xyzzy -n: "14" -``` - -## Match without global flag -Given a sample.yml file of: -```yaml -cat cat -``` -then -```bash -yq eval 'match("cat")' sample.yml -``` -will output -```yaml -string: cat -offset: 0 -length: 3 -captures: [] -``` - -## Match with global flag -Given a sample.yml file of: -```yaml -cat cat -``` -then -```bash -yq eval '[match("cat"; "g")]' sample.yml -``` -will output -```yaml -- string: cat - offset: 0 - length: 3 - captures: [] -- string: cat - offset: 4 - length: 3 - captures: [] -``` - -## Test using regex -Like jq'q equivalant, this works like match but only returns true/false instead of full match details - -Given a sample.yml file of: -```yaml -- cat -- dog -``` -then -```bash -yq eval '.[] | test("at")' sample.yml -``` -will output -```yaml -true -false -``` - -## Substitute / Replace string -This uses golang regex, described [here](https://github.com/google/re2/wiki/Syntax) -Note the use of `|=` to run in context of the current string value. - -Given a sample.yml file of: -```yaml -a: dogs are great -``` -then -```bash -yq eval '.a |= sub("dogs", "cats")' sample.yml -``` -will output -```yaml -a: cats are great -``` - -## Substitute / Replace string with regex -This uses golang regex, described [here](https://github.com/google/re2/wiki/Syntax) -Note the use of `|=` to run in context of the current string value. - -Given a sample.yml file of: -```yaml -a: cat -b: heat -``` -then -```bash -yq eval '.[] |= sub("(a)", "${1}r")' sample.yml -``` -will output -```yaml -a: cart -b: heart -``` - -## Split strings -Given a sample.yml file of: -```yaml -cat; meow; 1; ; true -``` -then -```bash -yq eval 'split("; ")' sample.yml -``` -will output -```yaml -- cat -- meow -- "1" -- "" -- "true" -``` - -## Split strings one match -Given a sample.yml file of: -```yaml -word -``` -then -```bash -yq eval 'split("; ")' sample.yml -``` -will output -```yaml -- word -``` - diff --git a/pkg/yqlib/doc/Style.md b/pkg/yqlib/doc/Style.md deleted file mode 100644 index 1f0f0939..00000000 --- a/pkg/yqlib/doc/Style.md +++ /dev/null @@ -1,237 +0,0 @@ -The style operator can be used to get or set the style of nodes (e.g. string style, yaml style) -## Update and set style of a particular node (simple) -Given a sample.yml file of: -```yaml -a: - b: thing - c: something -``` -then -```bash -yq eval '.a.b = "new" | .a.b style="double"' sample.yml -``` -will output -```yaml -a: - b: "new" - c: something -``` - -## Update and set style of a particular node using path variables -Given a sample.yml file of: -```yaml -a: - b: thing - c: something -``` -then -```bash -yq eval 'with(.a.b ; . = "new" | . style="double")' sample.yml -``` -will output -```yaml -a: - b: "new" - c: something -``` - -## Set tagged style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="tagged"' sample.yml -``` -will output -```yaml -!!map -a: !!str cat -b: !!int 5 -c: !!float 3.2 -e: !!bool true -``` - -## Set double quote style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="double"' sample.yml -``` -will output -```yaml -a: "cat" -b: "5" -c: "3.2" -e: "true" -``` - -## Set double quote style on map keys too -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '... style="double"' sample.yml -``` -will output -```yaml -"a": "cat" -"b": "5" -"c": "3.2" -"e": "true" -``` - -## Set single quote style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="single"' sample.yml -``` -will output -```yaml -a: 'cat' -b: '5' -c: '3.2' -e: 'true' -``` - -## Set literal quote style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="literal"' sample.yml -``` -will output -```yaml -a: |- - cat -b: |- - 5 -c: |- - 3.2 -e: |- - true -``` - -## Set folded quote style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="folded"' sample.yml -``` -will output -```yaml -a: >- - cat -b: >- - 5 -c: >- - 3.2 -e: >- - true -``` - -## Set flow quote style -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '.. style="flow"' sample.yml -``` -will output -```yaml -{a: cat, b: 5, c: 3.2, e: true} -``` - -## Reset style - or pretty print -Set empty (default) quote style, note the usage of `...` to match keys too. Note that there is a `--prettyPrint/-P` short flag for this. - -Given a sample.yml file of: -```yaml -a: cat -"b": 5 -'c': 3.2 -"e": true -``` -then -```bash -yq eval '... style=""' sample.yml -``` -will output -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` - -## Set style relatively with assign-update -Given a sample.yml file of: -```yaml -a: single -b: double -``` -then -```bash -yq eval '.[] style |= .' sample.yml -``` -will output -```yaml -a: 'single' -b: "double" -``` - -## Read style -Given a sample.yml file of: -```yaml -{a: "cat", b: 'thing'} -``` -then -```bash -yq eval '.. | style' sample.yml -``` -will output -```yaml -flow -double -single -``` - diff --git a/pkg/yqlib/doc/Subtract.md b/pkg/yqlib/doc/Subtract.md deleted file mode 100644 index 8f71d32e..00000000 --- a/pkg/yqlib/doc/Subtract.md +++ /dev/null @@ -1,110 +0,0 @@ - -## Array subtraction -Running -```bash -yq eval --null-input '[1,2] - [2,3]' -``` -will output -```yaml -- 1 -``` - -## Array subtraction with nested array -Running -```bash -yq eval --null-input '[[1], 1, 2] - [[1], 3]' -``` -will output -```yaml -- 1 -- 2 -``` - -## Array subtraction with nested object -Note that order of the keys does not matter - -Given a sample.yml file of: -```yaml -- a: b - c: d -- a: b -``` -then -```bash -yq eval '. - [{"c": "d", "a": "b"}]' sample.yml -``` -will output -```yaml -- a: b -``` - -## Number subtraction - float -If the lhs or rhs are floats then the expression will be calculated with floats. - -Given a sample.yml file of: -```yaml -a: 3 -b: 4.5 -``` -then -```bash -yq eval '.a = .a - .b' sample.yml -``` -will output -```yaml -a: -1.5 -b: 4.5 -``` - -## Number subtraction - float -If the lhs or rhs are floats then the expression will be calculated with floats. - -Given a sample.yml file of: -```yaml -a: 3 -b: 4.5 -``` -then -```bash -yq eval '.a = .a - .b' sample.yml -``` -will output -```yaml -a: -1.5 -b: 4.5 -``` - -## Number subtraction - int -If both the lhs and rhs are ints then the expression will be calculated with ints. - -Given a sample.yml file of: -```yaml -a: 3 -b: 4 -``` -then -```bash -yq eval '.a = .a - .b' sample.yml -``` -will output -```yaml -a: -1 -b: 4 -``` - -## Decrement numbers -Given a sample.yml file of: -```yaml -a: 3 -b: 5 -``` -then -```bash -yq eval '.[] -= 1' sample.yml -``` -will output -```yaml -a: 2 -b: 4 -``` - diff --git a/pkg/yqlib/doc/Tag.md b/pkg/yqlib/doc/Tag.md deleted file mode 100644 index ab64ed36..00000000 --- a/pkg/yqlib/doc/Tag.md +++ /dev/null @@ -1,58 +0,0 @@ -The tag operator can be used to get or set the tag of nodes (e.g. `!!str`, `!!int`, `!!bool`). -## Get tag -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -f: [] -``` -then -```bash -yq eval '.. | tag' sample.yml -``` -will output -```yaml -!!map -!!str -!!int -!!float -!!bool -!!seq -``` - -## Set custom tag -Given a sample.yml file of: -```yaml -a: str -``` -then -```bash -yq eval '.a tag = "!!mikefarah"' sample.yml -``` -will output -```yaml -a: !!mikefarah str -``` - -## Find numbers and convert them to strings -Given a sample.yml file of: -```yaml -a: cat -b: 5 -c: 3.2 -e: true -``` -then -```bash -yq eval '(.. | select(tag == "!!int")) tag= "!!str"' sample.yml -``` -will output -```yaml -a: cat -b: "5" -c: 3.2 -e: true -``` - diff --git a/pkg/yqlib/doc/Traverse (Read).md b/pkg/yqlib/doc/Traverse (Read).md deleted file mode 100644 index eca29e0e..00000000 --- a/pkg/yqlib/doc/Traverse (Read).md +++ /dev/null @@ -1,482 +0,0 @@ -This is the simplest (and perhaps most used) operator, it is used to navigate deeply into yaml structures. -## Simple map navigation -Given a sample.yml file of: -```yaml -a: - b: apple -``` -then -```bash -yq eval '.a' sample.yml -``` -will output -```yaml -b: apple -``` - -## Splat -Often used to pipe children into other operators - -Given a sample.yml file of: -```yaml -- b: apple -- c: banana -``` -then -```bash -yq eval '.[]' sample.yml -``` -will output -```yaml -b: apple -c: banana -``` - -## Optional Splat -Just like splat, but won't error if you run it against scalars - -Given a sample.yml file of: -```yaml -cat -``` -then -```bash -yq eval '.[]' sample.yml -``` -will output -```yaml -``` - -## Special characters -Use quotes with brackets around path elements with special characters - -Given a sample.yml file of: -```yaml -"{}": frog -``` -then -```bash -yq eval '.["{}"]' sample.yml -``` -will output -```yaml -frog -``` - -## Nested special characters -Given a sample.yml file of: -```yaml -a: - "key.withdots": - "another.key": apple -``` -then -```bash -yq eval '.a["key.withdots"]["another.key"]' sample.yml -``` -will output -```yaml -apple -``` - -## Keys with spaces -Use quotes with brackets around path elements with special characters - -Given a sample.yml file of: -```yaml -"red rabbit": frog -``` -then -```bash -yq eval '.["red rabbit"]' sample.yml -``` -will output -```yaml -frog -``` - -## Dynamic keys -Expressions within [] can be used to dynamically lookup / calculate keys - -Given a sample.yml file of: -```yaml -b: apple -apple: crispy yum -banana: soft yum -``` -then -```bash -yq eval '.[.b]' sample.yml -``` -will output -```yaml -crispy yum -``` - -## Children don't exist -Nodes are added dynamically while traversing - -Given a sample.yml file of: -```yaml -c: banana -``` -then -```bash -yq eval '.a.b' sample.yml -``` -will output -```yaml -null -``` - -## Optional identifier -Like jq, does not output an error when the yaml is not an array or object as expected - -Given a sample.yml file of: -```yaml -- 1 -- 2 -- 3 -``` -then -```bash -yq eval '.a?' sample.yml -``` -will output -```yaml -``` - -## Wildcard matching -Given a sample.yml file of: -```yaml -a: - cat: apple - mad: things -``` -then -```bash -yq eval '.a."*a*"' sample.yml -``` -will output -```yaml -apple -things -``` - -## Aliases -Given a sample.yml file of: -```yaml -a: &cat - c: frog -b: *cat -``` -then -```bash -yq eval '.b' sample.yml -``` -will output -```yaml -*cat -``` - -## Traversing aliases with splat -Given a sample.yml file of: -```yaml -a: &cat - c: frog -b: *cat -``` -then -```bash -yq eval '.b[]' sample.yml -``` -will output -```yaml -frog -``` - -## Traversing aliases explicitly -Given a sample.yml file of: -```yaml -a: &cat - c: frog -b: *cat -``` -then -```bash -yq eval '.b.c' sample.yml -``` -will output -```yaml -frog -``` - -## Traversing arrays by index -Given a sample.yml file of: -```yaml -- 1 -- 2 -- 3 -``` -then -```bash -yq eval '.[0]' sample.yml -``` -will output -```yaml -1 -``` - -## Traversing nested arrays by index -Given a sample.yml file of: -```yaml -[[], [cat]] -``` -then -```bash -yq eval '.[1][0]' sample.yml -``` -will output -```yaml -cat -``` - -## Maps with numeric keys -Given a sample.yml file of: -```yaml -2: cat -``` -then -```bash -yq eval '.[2]' sample.yml -``` -will output -```yaml -cat -``` - -## Maps with non existing numeric keys -Given a sample.yml file of: -```yaml -a: b -``` -then -```bash -yq eval '.[0]' sample.yml -``` -will output -```yaml -null -``` - -## Traversing merge anchors -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar.a' sample.yml -``` -will output -```yaml -foo_a -``` - -## Traversing merge anchors with override -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar.c' sample.yml -``` -will output -```yaml -foo_c -``` - -## Traversing merge anchors with local override -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar.thing' sample.yml -``` -will output -```yaml -foobar_thing -``` - -## Splatting merge anchors -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobar[]' sample.yml -``` -will output -```yaml -foo_c -foo_a -foobar_thing -``` - -## Traversing merge anchor lists -Note that the later merge anchors override previous - -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobarList.thing' sample.yml -``` -will output -```yaml -bar_thing -``` - -## Splatting merge anchor lists -Given a sample.yml file of: -```yaml -foo: &foo - a: foo_a - thing: foo_thing - c: foo_c -bar: &bar - b: bar_b - thing: bar_thing - c: bar_c -foobarList: - b: foobarList_b - !!merge <<: - - *foo - - *bar - c: foobarList_c -foobar: - c: foobar_c - !!merge <<: *foo - thing: foobar_thing -``` -then -```bash -yq eval '.foobarList[]' sample.yml -``` -will output -```yaml -bar_b -foo_a -bar_thing -foobarList_c -``` - -## Select multiple indices -Given a sample.yml file of: -```yaml -a: - - a - - b - - c -``` -then -```bash -yq eval '.a[0, 2]' sample.yml -``` -will output -```yaml -a -c -``` - diff --git a/pkg/yqlib/doc/Union.md b/pkg/yqlib/doc/Union.md deleted file mode 100644 index e01782fe..00000000 --- a/pkg/yqlib/doc/Union.md +++ /dev/null @@ -1,30 +0,0 @@ -This operator is used to combine different results together. -## Combine scalars -Running -```bash -yq eval --null-input '1, true, "cat"' -``` -will output -```yaml -1 -true -cat -``` - -## Combine selected paths -Given a sample.yml file of: -```yaml -a: fieldA -b: fieldB -c: fieldC -``` -then -```bash -yq eval '.a, .c' sample.yml -``` -will output -```yaml -fieldA -fieldC -``` - diff --git a/pkg/yqlib/doc/Unique.md b/pkg/yqlib/doc/Unique.md deleted file mode 100644 index 06fabd39..00000000 --- a/pkg/yqlib/doc/Unique.md +++ /dev/null @@ -1,82 +0,0 @@ -This is used to filter out duplicated items in an array. - -## Unique array of scalars (string/numbers) -Given a sample.yml file of: -```yaml -- 1 -- 2 -- 3 -- 2 -``` -then -```bash -yq eval 'unique' sample.yml -``` -will output -```yaml -- 1 -- 2 -- 3 -``` - -## Unique nulls -Unique works on the node value, so it considers different representations of nulls to be different - -Given a sample.yml file of: -```yaml -- ~ -- null -- ~ -- null -``` -then -```bash -yq eval 'unique' sample.yml -``` -will output -```yaml -- ~ -- null -``` - -## Unique all nulls -Run against the node tag to unique all the nulls - -Given a sample.yml file of: -```yaml -- ~ -- null -- ~ -- null -``` -then -```bash -yq eval 'unique_by(tag)' sample.yml -``` -will output -```yaml -- ~ -``` - -## Unique array object fields -Given a sample.yml file of: -```yaml -- name: harry - pet: cat -- name: billy - pet: dog -- name: harry - pet: dog -``` -then -```bash -yq eval 'unique_by(.name)' sample.yml -``` -will output -```yaml -- name: harry - pet: cat -- name: billy - pet: dog -``` - diff --git a/pkg/yqlib/doc/Variable Operators.md b/pkg/yqlib/doc/Variable Operators.md deleted file mode 100644 index 311382a6..00000000 --- a/pkg/yqlib/doc/Variable Operators.md +++ /dev/null @@ -1,96 +0,0 @@ -Like the `jq` equivalents, variables are sometimes required for the more complex expressions (or swapping values between fields). - -Note that there is also an additional `ref` operator that holds a reference (instead of a copy) of the path, allowing you to make multiple changes to the same path. - -## Single value variable -Given a sample.yml file of: -```yaml -a: cat -``` -then -```bash -yq eval '.a as $foo | $foo' sample.yml -``` -will output -```yaml -cat -``` - -## Multi value variable -Given a sample.yml file of: -```yaml -- cat -- dog -``` -then -```bash -yq eval '.[] as $foo | $foo' sample.yml -``` -will output -```yaml -cat -dog -``` - -## Using variables as a lookup -Example taken from [jq](https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|...) - -Given a sample.yml file of: -```yaml -"posts": - - "title": Frist psot - "author": anon - - "title": A well-written article - "author": person1 -"realnames": - "anon": Anonymous Coward - "person1": Person McPherson -``` -then -```bash -yq eval '.realnames as $names | .posts[] | {"title":.title, "author": $names[.author]}' sample.yml -``` -will output -```yaml -title: Frist psot -author: Anonymous Coward -title: A well-written article -author: Person McPherson -``` - -## Using variables to swap values -Given a sample.yml file of: -```yaml -a: a_value -b: b_value -``` -then -```bash -yq eval '.a as $x | .b as $y | .b = $x | .a = $y' sample.yml -``` -will output -```yaml -a: b_value -b: a_value -``` - -## Use ref to reference a path repeatedly -Note: You may find the `with` operator more useful. - -Given a sample.yml file of: -```yaml -a: - b: thing - c: something -``` -then -```bash -yq eval '.a.b ref $x | $x = "new" | $x style="double"' sample.yml -``` -will output -```yaml -a: - b: "new" - c: something -``` - diff --git a/pkg/yqlib/doc/With.md b/pkg/yqlib/doc/With.md deleted file mode 100644 index 216cb496..00000000 --- a/pkg/yqlib/doc/With.md +++ /dev/null @@ -1,62 +0,0 @@ -Use the `with` operator to conveniently make multiple updates to a deeply nested path, or to update array elements relatively to each other. The first argument expression sets the root context, and the second expression runs against that root context. - -## Update and style -Given a sample.yml file of: -```yaml -a: - deeply: - nested: value -``` -then -```bash -yq eval 'with(.a.deeply.nested; . = "newValue" | . style="single")' sample.yml -``` -will output -```yaml -a: - deeply: - nested: 'newValue' -``` - -## Update multiple deeply nested properties -Given a sample.yml file of: -```yaml -a: - deeply: - nested: value - other: thing -``` -then -```bash -yq eval 'with(.a.deeply; .nested = "newValue" | .other= "newThing")' sample.yml -``` -will output -```yaml -a: - deeply: - nested: newValue - other: newThing -``` - -## Update array elements relatively -The second expression runs with each element of the array as it's contextual root. This allows you to make updates relative to the element. - -Given a sample.yml file of: -```yaml -myArray: - - a: apple - - a: banana -``` -then -```bash -yq eval 'with(.myArray[]; .b = .a + " yum")' sample.yml -``` -will output -```yaml -myArray: - - a: apple - b: apple yum - - a: banana - b: banana yum -``` - diff --git a/pkg/yqlib/doc/Add.md b/pkg/yqlib/doc/add.md similarity index 96% rename from pkg/yqlib/doc/Add.md rename to pkg/yqlib/doc/add.md index c6d80669..bd0ce202 100644 --- a/pkg/yqlib/doc/Add.md +++ b/pkg/yqlib/doc/add.md @@ -1,7 +1,9 @@ +# Add + Add behaves differently according to the type of the LHS: -- arrays: concatenate -- number scalars: arithmetic addition -- string scalars: concatenate +* arrays: concatenate +* number scalars: arithmetic addition +* string scalars: concatenate Use `+=` as append assign for things like increment. Note that `.a += .x` is equivalent to running `.a = .a + .x`. diff --git a/pkg/yqlib/doc/Alternative (Default value).md b/pkg/yqlib/doc/alternative-default-value.md similarity index 96% rename from pkg/yqlib/doc/Alternative (Default value).md rename to pkg/yqlib/doc/alternative-default-value.md index 6521c378..dea0fba3 100644 --- a/pkg/yqlib/doc/Alternative (Default value).md +++ b/pkg/yqlib/doc/alternative-default-value.md @@ -1,3 +1,5 @@ +# Alternative (Default value) + This operator is used to provide alternative (or default) values when a particular expression is either null or false. ## LHS is defined diff --git a/pkg/yqlib/doc/Encoder and Decoder.md b/pkg/yqlib/doc/encode-decode.md similarity index 99% rename from pkg/yqlib/doc/Encoder and Decoder.md rename to pkg/yqlib/doc/encode-decode.md index 1c0741c8..384b5559 100644 --- a/pkg/yqlib/doc/Encoder and Decoder.md +++ b/pkg/yqlib/doc/encode-decode.md @@ -1,8 +1,11 @@ +# Encoder / Decoder + Encode operators will take the piped in object structure and encode it as a string in the desired format. The decode operators do the opposite, they take a formatted string and decode it into the relevant object structure. Note that you can optionally pass an indent value to the encode functions (see below). These operators are useful to process yaml documents that have stringified embeded yaml/json/props in them. + ## Encode value as yaml string Indent defaults to 2 diff --git a/pkg/yqlib/doc/Flatten.md b/pkg/yqlib/doc/flatten.md similarity index 98% rename from pkg/yqlib/doc/Flatten.md rename to pkg/yqlib/doc/flatten.md index 7a741136..7fc012c4 100644 --- a/pkg/yqlib/doc/Flatten.md +++ b/pkg/yqlib/doc/flatten.md @@ -1,3 +1,4 @@ +# Flatten This recursively flattens arrays. ## Flatten diff --git a/pkg/yqlib/doc/Group By.md b/pkg/yqlib/doc/group-by.md similarity index 98% rename from pkg/yqlib/doc/Group By.md rename to pkg/yqlib/doc/group-by.md index f135b1e9..144ecf09 100644 --- a/pkg/yqlib/doc/Group By.md +++ b/pkg/yqlib/doc/group-by.md @@ -1,3 +1,5 @@ +# Group By + This is used to group items in an array by an expression. ## Group by field diff --git a/pkg/yqlib/doc/headers/Main.md b/pkg/yqlib/doc/headers/Main.md index 2ccac8b4..ac2750af 100644 --- a/pkg/yqlib/doc/headers/Main.md +++ b/pkg/yqlib/doc/headers/Main.md @@ -58,4 +58,5 @@ See the [documentation](https://mikefarah.gitbook.io/yq/) for more. # BUGS / ISSUES / FEATURE REQUESTS -Please visit the GitHub page https://github.com/mikefarah/yq/. \ No newline at end of file +Please visit the GitHub page https://github.com/mikefarah/yq/. + diff --git a/pkg/yqlib/doc/headers/Add.md b/pkg/yqlib/doc/headers/add.md similarity index 64% rename from pkg/yqlib/doc/headers/Add.md rename to pkg/yqlib/doc/headers/add.md index dcd16a1e..de4caf8c 100644 --- a/pkg/yqlib/doc/headers/Add.md +++ b/pkg/yqlib/doc/headers/add.md @@ -1,6 +1,8 @@ +# Add + Add behaves differently according to the type of the LHS: -- arrays: concatenate -- number scalars: arithmetic addition -- string scalars: concatenate +* arrays: concatenate +* number scalars: arithmetic addition +* string scalars: concatenate Use `+=` as append assign for things like increment. Note that `.a += .x` is equivalent to running `.a = .a + .x`. diff --git a/pkg/yqlib/doc/headers/Alternative (Default value).md b/pkg/yqlib/doc/headers/alternative-default-value.md similarity index 79% rename from pkg/yqlib/doc/headers/Alternative (Default value).md rename to pkg/yqlib/doc/headers/alternative-default-value.md index 1f601398..de5192bb 100644 --- a/pkg/yqlib/doc/headers/Alternative (Default value).md +++ b/pkg/yqlib/doc/headers/alternative-default-value.md @@ -1 +1,3 @@ +# Alternative (Default value) + This operator is used to provide alternative (or default) values when a particular expression is either null or false. diff --git a/pkg/yqlib/doc/headers/Anchor and Alias Operators.md b/pkg/yqlib/doc/headers/anchor-and-alias-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/Anchor and Alias Operators.md rename to pkg/yqlib/doc/headers/anchor-and-alias-operators.md diff --git a/pkg/yqlib/doc/headers/Assign (Assign).md b/pkg/yqlib/doc/headers/assign-update.md similarity index 100% rename from pkg/yqlib/doc/headers/Assign (Assign).md rename to pkg/yqlib/doc/headers/assign-update.md diff --git a/pkg/yqlib/doc/headers/Boolean Operators.md b/pkg/yqlib/doc/headers/boolean-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/Boolean Operators.md rename to pkg/yqlib/doc/headers/boolean-operators.md diff --git a/pkg/yqlib/doc/headers/Collect into Array.md b/pkg/yqlib/doc/headers/collect-into-array.md similarity index 100% rename from pkg/yqlib/doc/headers/Collect into Array.md rename to pkg/yqlib/doc/headers/collect-into-array.md diff --git a/pkg/yqlib/doc/headers/Comment Operators.md b/pkg/yqlib/doc/headers/comment-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/Comment Operators.md rename to pkg/yqlib/doc/headers/comment-operators.md diff --git a/pkg/yqlib/doc/headers/Create, Collect into Object.md b/pkg/yqlib/doc/headers/create-collect-into-object.md similarity index 100% rename from pkg/yqlib/doc/headers/Create, Collect into Object.md rename to pkg/yqlib/doc/headers/create-collect-into-object.md diff --git a/pkg/yqlib/doc/headers/Encoder and Decoder.md b/pkg/yqlib/doc/headers/encode-decode.md similarity index 85% rename from pkg/yqlib/doc/headers/Encoder and Decoder.md rename to pkg/yqlib/doc/headers/encode-decode.md index c5ceec5a..177dce21 100644 --- a/pkg/yqlib/doc/headers/Encoder and Decoder.md +++ b/pkg/yqlib/doc/headers/encode-decode.md @@ -1,5 +1,7 @@ +# Encoder / Decoder + Encode operators will take the piped in object structure and encode it as a string in the desired format. The decode operators do the opposite, they take a formatted string and decode it into the relevant object structure. Note that you can optionally pass an indent value to the encode functions (see below). -These operators are useful to process yaml documents that have stringified embeded yaml/json/props in them. \ No newline at end of file +These operators are useful to process yaml documents that have stringified embeded yaml/json/props in them. diff --git a/pkg/yqlib/doc/headers/Flatten.md b/pkg/yqlib/doc/headers/flatten.md similarity index 77% rename from pkg/yqlib/doc/headers/Flatten.md rename to pkg/yqlib/doc/headers/flatten.md index e195ca4e..2ac9896b 100644 --- a/pkg/yqlib/doc/headers/Flatten.md +++ b/pkg/yqlib/doc/headers/flatten.md @@ -1 +1,2 @@ +# Flatten This recursively flattens arrays. diff --git a/pkg/yqlib/doc/headers/Group By.md b/pkg/yqlib/doc/headers/group-by.md similarity index 82% rename from pkg/yqlib/doc/headers/Group By.md rename to pkg/yqlib/doc/headers/group-by.md index 365cc698..a8900063 100644 --- a/pkg/yqlib/doc/headers/Group By.md +++ b/pkg/yqlib/doc/headers/group-by.md @@ -1 +1,3 @@ +# Group By + This is used to group items in an array by an expression. diff --git a/pkg/yqlib/operator_add_test.go b/pkg/yqlib/operator_add_test.go index 0ffa2934..445977e8 100644 --- a/pkg/yqlib/operator_add_test.go +++ b/pkg/yqlib/operator_add_test.go @@ -150,5 +150,5 @@ func TestAddOperatorScenarios(t *testing.T) { for _, tt := range addOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Add", addOperatorScenarios) + documentScenarios(t, "add", addOperatorScenarios) } diff --git a/pkg/yqlib/operator_alternative_test.go b/pkg/yqlib/operator_alternative_test.go index 3b852fa8..0331213d 100644 --- a/pkg/yqlib/operator_alternative_test.go +++ b/pkg/yqlib/operator_alternative_test.go @@ -91,5 +91,5 @@ func TestAlternativeOperatorScenarios(t *testing.T) { for _, tt := range alternativeOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Alternative (Default value)", alternativeOperatorScenarios) + documentScenarios(t, "alternative-default-value", alternativeOperatorScenarios) } diff --git a/pkg/yqlib/operator_anchors_aliases_test.go b/pkg/yqlib/operator_anchors_aliases_test.go index b9493f55..30642dcd 100644 --- a/pkg/yqlib/operator_anchors_aliases_test.go +++ b/pkg/yqlib/operator_anchors_aliases_test.go @@ -233,5 +233,5 @@ func TestAnchorAliasOperatorScenarios(t *testing.T) { for _, tt := range anchorOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Anchor and Alias Operators", anchorOperatorScenarios) + documentScenarios(t, "anchor-and-alias-operators", anchorOperatorScenarios) } diff --git a/pkg/yqlib/operator_assign_test.go b/pkg/yqlib/operator_assign_test.go index 1c704623..98b2d572 100644 --- a/pkg/yqlib/operator_assign_test.go +++ b/pkg/yqlib/operator_assign_test.go @@ -168,5 +168,5 @@ func TestAssignOperatorScenarios(t *testing.T) { for _, tt := range assignOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Assign (Update)", assignOperatorScenarios) + documentScenarios(t, "assign-update", assignOperatorScenarios) } diff --git a/pkg/yqlib/operator_encoder_decoder_test.go b/pkg/yqlib/operator_encoder_decoder_test.go index 84c154c4..775590ec 100644 --- a/pkg/yqlib/operator_encoder_decoder_test.go +++ b/pkg/yqlib/operator_encoder_decoder_test.go @@ -113,5 +113,5 @@ func TestEncoderDecoderOperatorScenarios(t *testing.T) { for _, tt := range encoderDecoderOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Encoder and Decoder", encoderDecoderOperatorScenarios) + documentScenarios(t, "encode-decode", encoderDecoderOperatorScenarios) } diff --git a/pkg/yqlib/operator_flatten_test.go b/pkg/yqlib/operator_flatten_test.go index 94efea7b..4e826471 100644 --- a/pkg/yqlib/operator_flatten_test.go +++ b/pkg/yqlib/operator_flatten_test.go @@ -44,5 +44,5 @@ func TestFlattenOperatorScenarios(t *testing.T) { for _, tt := range flattenOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Flatten", flattenOperatorScenarios) + documentScenarios(t, "flatten", flattenOperatorScenarios) } diff --git a/pkg/yqlib/operator_group_by_test.go b/pkg/yqlib/operator_group_by_test.go index c10e3bb4..60462206 100644 --- a/pkg/yqlib/operator_group_by_test.go +++ b/pkg/yqlib/operator_group_by_test.go @@ -27,5 +27,5 @@ func TestGroupByOperatorScenarios(t *testing.T) { for _, tt := range groupByOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "Group By", groupByOperatorScenarios) + documentScenarios(t, "group-by", groupByOperatorScenarios) } diff --git a/scripts/copy-docs.sh b/scripts/copy-docs.sh new file mode 100755 index 00000000..e3f39341 --- /dev/null +++ b/scripts/copy-docs.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cp how-it-works.md ../yq-gitbook/. +cp pkg/yqlib/doc/*.md ../yq-gitbook/operators/. \ No newline at end of file diff --git a/scripts/generate-man-page-md.sh b/scripts/generate-man-page-md.sh index 23176721..c2806b3b 100755 --- a/scripts/generate-man-page-md.sh +++ b/scripts/generate-man-page-md.sh @@ -5,15 +5,12 @@ set -e cat ./pkg/yqlib/doc/headers/Main.md > man.md printf "\n# HOW IT WORKS\n" >> man.md -cat ./pkg/yqlib/doc/aa.md >> man.md +tail -n +2 how-it-works.md >> man.md for f in ./pkg/yqlib/doc/*.md; do docNameWithExt="${f##*/}" docName="${docNameWithExt%.*}" docNameCap=$(echo $docName | tr [a-z] [A-Z]) - if [ "$docName" != "aa" ]; then - printf "\n\n# ${docNameCap}\n" >> man.md - cat "$f" >> man.md - fi - + printf "\n\n# ${docNameCap}\n" >> man.md + tail -n +2 "$f" >> man.md done diff --git a/tim.yml b/tim.yml new file mode 100644 index 00000000..008b6e31 --- /dev/null +++ b/tim.yml @@ -0,0 +1,2 @@ +name: tim +age: 17