Added support for load_props, added missing load_xml tests

This commit is contained in:
Mike Farah 2022-02-15 14:51:22 +11:00
parent e1b5e90adf
commit 75fffc17e1
6 changed files with 125 additions and 6 deletions

View File

@ -0,0 +1 @@
this.is = a properties file

1
examples/small.xml Normal file
View File

@ -0,0 +1 @@
<this>is some xml</this>

View File

@ -1,10 +1,17 @@
# Load
The `load`/`strload` operator allows you to load in content from another file referenced in your yaml document.
The load operators allows you to load in content from another file.
Note that you can use string operators like `+` and `sub` to modify the value in the yaml file to a path that exists in your system.
Use `strload` to load text based content as a string block, and `load` to interpret the file as yaml.
You can load files of the following supported types:
|Format | Load Operator |
| --- | --- |
| Yaml | load |
| XML | load_xml |
| Properties | load_props |
| Plain String | load_str |
Lets say there is a file `../../examples/thing.yml`:
@ -12,3 +19,14 @@ Lets say there is a file `../../examples/thing.yml`:
a: apple is included
b: cool
```
and a file `small.xml`:
```xml
<this>is some xml</this>
```
and `small.properties`:
```properties
this.is = a properties file
```

View File

@ -1,10 +1,17 @@
# Load
The `load`/`strload` operator allows you to load in content from another file referenced in your yaml document.
The load operators allows you to load in content from another file.
Note that you can use string operators like `+` and `sub` to modify the value in the yaml file to a path that exists in your system.
Use `strload` to load text based content as a string block, and `load` to interpret the file as yaml.
You can load files of the following supported types:
|Format | Load Operator |
| --- | --- |
| Yaml | load |
| XML | load_xml |
| Properties | load_props |
| Plain String | load_str |
Lets say there is a file `../../examples/thing.yml`:
@ -12,6 +19,17 @@ Lets say there is a file `../../examples/thing.yml`:
a: apple is included
b: cool
```
and a file `small.xml`:
```xml
<this>is some xml</this>
```
and `small.properties`:
```properties
this.is = a properties file
```
{% hint style="warning" %}
Note that versions prior to 4.18 require the 'eval/e' command to be specified.&#x20;
@ -89,7 +107,7 @@ something:
```
then
```bash
yq '.something |= strload("../../examples/" + .file)' sample.yml
yq '.something |= load_str("../../examples/" + .file)' sample.yml
```
will output
```yaml
@ -98,3 +116,56 @@ something: |-
b: cool.
```
## Load from XML
Given a sample.yml file of:
```yaml
cool: things
```
then
```bash
yq '.more_stuff = load_xml("../../examples/small.xml")' sample.yml
```
will output
```yaml
cool: things
more_stuff:
this: is some xml
```
## Load from Properties
Given a sample.yml file of:
```yaml
cool: things
```
then
```bash
yq '.more_stuff = load_props("../../examples/small.properties")' sample.yml
```
will output
```yaml
cool: things
more_stuff:
this:
is: a properties file
```
## Merge from properties
This can be used as a convenient way to update a yaml document
Given a sample.yml file of:
```yaml
this:
is: from yaml
cool: ay
```
then
```bash
yq '. *= load_props("../../examples/small.properties")' sample.yml
```
will output
```yaml
this:
is: a properties file
cool: ay
```

View File

@ -380,6 +380,9 @@ func initLexer() (*lex.Lexer, error) {
lexer.Add([]byte(`load_xml`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: false, decoder: NewXMLDecoder(XMLPreferences.AttributePrefix, XMLPreferences.ContentName)}))
lexer.Add([]byte(`loadxml`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: false, decoder: NewXMLDecoder(XMLPreferences.AttributePrefix, XMLPreferences.ContentName)}))
lexer.Add([]byte(`load_props`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: false, decoder: NewPropertiesDecoder()}))
lexer.Add([]byte(`loadprops`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: false, decoder: NewPropertiesDecoder()}))
lexer.Add([]byte(`strload`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: true}))
lexer.Add([]byte(`load_str`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: true}))
lexer.Add([]byte(`loadstr`), opTokenWithPrefs(loadOpType, nil, loadPrefs{loadAsString: true}))

View File

@ -35,11 +35,36 @@ var loadScenarios = []expressionScenario{
description: "Replace node with referenced file as string",
subdescription: "This will work for any text based file",
document: `{something: {file: "thing.yml"}}`,
expression: `.something |= strload("../../examples/" + .file)`,
expression: `.something |= load_str("../../examples/" + .file)`,
expected: []string{
"D0, P[], (doc)::{something: \"a: apple is included\\nb: cool.\"}\n",
},
},
{
description: "Load from XML",
document: "cool: things",
expression: `.more_stuff = load_xml("../../examples/small.xml")`,
expected: []string{
"D0, P[], (doc)::cool: things\nmore_stuff:\n this: is some xml\n",
},
},
{
description: "Load from Properties",
document: "cool: things",
expression: `.more_stuff = load_props("../../examples/small.properties")`,
expected: []string{
"D0, P[], (doc)::cool: things\nmore_stuff:\n this:\n is: a properties file\n",
},
},
{
description: "Merge from properties",
subdescription: "This can be used as a convenient way to update a yaml document",
document: "this:\n is: from yaml\n cool: ay\n",
expression: `. *= load_props("../../examples/small.properties")`,
expected: []string{
"D0, P[], (!!map)::this:\n is: a properties file\n cool: ay\n",
},
},
}
func TestLoadScenarios(t *testing.T) {