diff --git a/examples/mike.xml b/examples/mike.xml index 3c9360b9..e64b598b 100644 --- a/examples/mike.xml +++ b/examples/mike.xml @@ -1,11 +1,4 @@ - - - - - - cool - - bar - bar23 - \ No newline at end of file + 3f + meow:as + true \ No newline at end of file diff --git a/examples/mike2.xml b/examples/mike2.xml new file mode 100644 index 00000000..0ad80955 --- /dev/null +++ b/examples/mike2.xml @@ -0,0 +1,11 @@ + + + + + + + cool + + ba2234r + bar2234233 + \ No newline at end of file diff --git a/pkg/yqlib/decode_xml_test.go b/pkg/yqlib/decode_xml_test.go new file mode 100644 index 00000000..714e4c7c --- /dev/null +++ b/pkg/yqlib/decode_xml_test.go @@ -0,0 +1,106 @@ +package yqlib + +import ( + "bufio" + "bytes" + "fmt" + "strings" + "testing" + + "github.com/mikefarah/yq/v4/test" + yaml "gopkg.in/yaml.v3" +) + +func decodeXml(t *testing.T, xml string) *CandidateNode { + decoder := NewXmlDecoder("+", "+content") + + decoder.Init(strings.NewReader(xml)) + + node := &yaml.Node{} + err := decoder.Decode(node) + if err != nil { + t.Error(err, "fail to decode", xml) + } + return &CandidateNode{Node: node} +} + +type xmlScenario struct { + inputXml string + expected string + description string + subdescription string + skipDoc bool +} + +var xmlScenarios = []xmlScenario{ + { + description: "Parse xml: simple", + inputXml: "\nmeow", + expected: "D0, P[], (doc)::cat: meow\n", + }, + { + description: "Parse xml: array", + subdescription: "Consecutive nodes with identical xml names are assumed to be arrays.", + inputXml: "\n12", + expected: "D0, P[], (doc)::animal:\n - \"1\"\n - \"2\"\n", + }, + { + description: "Parse xml: attributes", + subdescription: "Attributes are converted to fields, with the attribute prefix.", + inputXml: "\n7", + expected: "D0, P[], (doc)::cat:\n +legs: \"4\"\n legs: \"7\"\n", + }, + { + description: "Parse xml: attributes with content", + subdescription: "Content is added as a field, using the content name", + inputXml: "\nmeow", + expected: "D0, P[], (doc)::cat:\n +content: meow\n +legs: \"4\"\n", + }, +} + +func testXmlScenario(t *testing.T, s *xmlScenario) { + var actual = resultToString(t, decodeXml(t, s.inputXml)) + test.AssertResult(t, s.expected, actual) +} + +func documentXmlScenario(t *testing.T, w *bufio.Writer, i interface{}) { + s := i.(xmlScenario) + + if s.skipDoc { + return + } + writeOrPanic(w, fmt.Sprintf("## %v\n", s.description)) + + if s.subdescription != "" { + writeOrPanic(w, s.subdescription) + writeOrPanic(w, "\n\n") + } + + writeOrPanic(w, "Given a sample.xml file of:\n") + writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.inputXml)) + + writeOrPanic(w, "then\n") + writeOrPanic(w, "```bash\nyq e sample.xml\n```\n") + writeOrPanic(w, "will output\n") + + var output bytes.Buffer + printer := NewPrinterWithSingleWriter(bufio.NewWriter(&output), YamlOutputFormat, true, false, 2, true) + + node := decodeXml(t, s.inputXml) + + printer.PrintResults(node.AsList()) + + writeOrPanic(w, fmt.Sprintf("```yaml\n%v```\n\n", output.String())) + +} + +func TestXmlScenarios(t *testing.T) { + for _, tt := range xmlScenarios { + testXmlScenario(t, &tt) + } + genericScenarios := make([]interface{}, len(xmlScenarios)) + for i, s := range xmlScenarios { + genericScenarios[i] = s + } + documentScenarios(t, "usage", "xml", genericScenarios, documentXmlScenario) +} diff --git a/pkg/yqlib/doc/add.md b/pkg/yqlib/doc/operators/add.md similarity index 100% rename from pkg/yqlib/doc/add.md rename to pkg/yqlib/doc/operators/add.md diff --git a/pkg/yqlib/doc/alternative-default-value.md b/pkg/yqlib/doc/operators/alternative-default-value.md similarity index 100% rename from pkg/yqlib/doc/alternative-default-value.md rename to pkg/yqlib/doc/operators/alternative-default-value.md diff --git a/pkg/yqlib/doc/anchor-and-alias-operators.md b/pkg/yqlib/doc/operators/anchor-and-alias-operators.md similarity index 100% rename from pkg/yqlib/doc/anchor-and-alias-operators.md rename to pkg/yqlib/doc/operators/anchor-and-alias-operators.md diff --git a/pkg/yqlib/doc/assign-update.md b/pkg/yqlib/doc/operators/assign-update.md similarity index 100% rename from pkg/yqlib/doc/assign-update.md rename to pkg/yqlib/doc/operators/assign-update.md diff --git a/pkg/yqlib/doc/boolean-operators.md b/pkg/yqlib/doc/operators/boolean-operators.md similarity index 100% rename from pkg/yqlib/doc/boolean-operators.md rename to pkg/yqlib/doc/operators/boolean-operators.md diff --git a/pkg/yqlib/doc/collect-into-array.md b/pkg/yqlib/doc/operators/collect-into-array.md similarity index 100% rename from pkg/yqlib/doc/collect-into-array.md rename to pkg/yqlib/doc/operators/collect-into-array.md diff --git a/pkg/yqlib/doc/comment-operators.md b/pkg/yqlib/doc/operators/comment-operators.md similarity index 100% rename from pkg/yqlib/doc/comment-operators.md rename to pkg/yqlib/doc/operators/comment-operators.md diff --git a/pkg/yqlib/doc/contains.md b/pkg/yqlib/doc/operators/contains.md similarity index 100% rename from pkg/yqlib/doc/contains.md rename to pkg/yqlib/doc/operators/contains.md diff --git a/pkg/yqlib/doc/create-collect-into-object.md b/pkg/yqlib/doc/operators/create-collect-into-object.md similarity index 100% rename from pkg/yqlib/doc/create-collect-into-object.md rename to pkg/yqlib/doc/operators/create-collect-into-object.md diff --git a/pkg/yqlib/doc/delete.md b/pkg/yqlib/doc/operators/delete.md similarity index 100% rename from pkg/yqlib/doc/delete.md rename to pkg/yqlib/doc/operators/delete.md diff --git a/pkg/yqlib/doc/document-index.md b/pkg/yqlib/doc/operators/document-index.md similarity index 100% rename from pkg/yqlib/doc/document-index.md rename to pkg/yqlib/doc/operators/document-index.md diff --git a/pkg/yqlib/doc/encode-decode.md b/pkg/yqlib/doc/operators/encode-decode.md similarity index 100% rename from pkg/yqlib/doc/encode-decode.md rename to pkg/yqlib/doc/operators/encode-decode.md diff --git a/pkg/yqlib/doc/entries.md b/pkg/yqlib/doc/operators/entries.md similarity index 100% rename from pkg/yqlib/doc/entries.md rename to pkg/yqlib/doc/operators/entries.md diff --git a/pkg/yqlib/doc/env-variable-operators.md b/pkg/yqlib/doc/operators/env-variable-operators.md similarity index 100% rename from pkg/yqlib/doc/env-variable-operators.md rename to pkg/yqlib/doc/operators/env-variable-operators.md diff --git a/pkg/yqlib/doc/equals.md b/pkg/yqlib/doc/operators/equals.md similarity index 100% rename from pkg/yqlib/doc/equals.md rename to pkg/yqlib/doc/operators/equals.md diff --git a/pkg/yqlib/doc/file-operators.md b/pkg/yqlib/doc/operators/file-operators.md similarity index 100% rename from pkg/yqlib/doc/file-operators.md rename to pkg/yqlib/doc/operators/file-operators.md diff --git a/pkg/yqlib/doc/flatten.md b/pkg/yqlib/doc/operators/flatten.md similarity index 100% rename from pkg/yqlib/doc/flatten.md rename to pkg/yqlib/doc/operators/flatten.md diff --git a/pkg/yqlib/doc/group-by.md b/pkg/yqlib/doc/operators/group-by.md similarity index 100% rename from pkg/yqlib/doc/group-by.md rename to pkg/yqlib/doc/operators/group-by.md diff --git a/pkg/yqlib/doc/has.md b/pkg/yqlib/doc/operators/has.md similarity index 100% rename from pkg/yqlib/doc/has.md rename to pkg/yqlib/doc/operators/has.md diff --git a/pkg/yqlib/doc/headers/Main.md b/pkg/yqlib/doc/operators/headers/Main.md similarity index 100% rename from pkg/yqlib/doc/headers/Main.md rename to pkg/yqlib/doc/operators/headers/Main.md diff --git a/pkg/yqlib/doc/headers/add.md b/pkg/yqlib/doc/operators/headers/add.md similarity index 100% rename from pkg/yqlib/doc/headers/add.md rename to pkg/yqlib/doc/operators/headers/add.md diff --git a/pkg/yqlib/doc/headers/alternative-default-value.md b/pkg/yqlib/doc/operators/headers/alternative-default-value.md similarity index 100% rename from pkg/yqlib/doc/headers/alternative-default-value.md rename to pkg/yqlib/doc/operators/headers/alternative-default-value.md diff --git a/pkg/yqlib/doc/headers/anchor-and-alias-operators.md b/pkg/yqlib/doc/operators/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/operators/headers/anchor-and-alias-operators.md diff --git a/pkg/yqlib/doc/headers/assign-update.md b/pkg/yqlib/doc/operators/headers/assign-update.md similarity index 100% rename from pkg/yqlib/doc/headers/assign-update.md rename to pkg/yqlib/doc/operators/headers/assign-update.md diff --git a/pkg/yqlib/doc/headers/boolean-operators.md b/pkg/yqlib/doc/operators/headers/boolean-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/boolean-operators.md rename to pkg/yqlib/doc/operators/headers/boolean-operators.md diff --git a/pkg/yqlib/doc/headers/collect-into-array.md b/pkg/yqlib/doc/operators/headers/collect-into-array.md similarity index 100% rename from pkg/yqlib/doc/headers/collect-into-array.md rename to pkg/yqlib/doc/operators/headers/collect-into-array.md diff --git a/pkg/yqlib/doc/headers/comment-operators.md b/pkg/yqlib/doc/operators/headers/comment-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/comment-operators.md rename to pkg/yqlib/doc/operators/headers/comment-operators.md diff --git a/pkg/yqlib/doc/headers/contains.md b/pkg/yqlib/doc/operators/headers/contains.md similarity index 100% rename from pkg/yqlib/doc/headers/contains.md rename to pkg/yqlib/doc/operators/headers/contains.md diff --git a/pkg/yqlib/doc/headers/create-collect-into-object.md b/pkg/yqlib/doc/operators/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/operators/headers/create-collect-into-object.md diff --git a/pkg/yqlib/doc/headers/delete.md b/pkg/yqlib/doc/operators/headers/delete.md similarity index 100% rename from pkg/yqlib/doc/headers/delete.md rename to pkg/yqlib/doc/operators/headers/delete.md diff --git a/pkg/yqlib/doc/headers/document-index.md b/pkg/yqlib/doc/operators/headers/document-index.md similarity index 100% rename from pkg/yqlib/doc/headers/document-index.md rename to pkg/yqlib/doc/operators/headers/document-index.md diff --git a/pkg/yqlib/doc/headers/encode-decode.md b/pkg/yqlib/doc/operators/headers/encode-decode.md similarity index 100% rename from pkg/yqlib/doc/headers/encode-decode.md rename to pkg/yqlib/doc/operators/headers/encode-decode.md diff --git a/pkg/yqlib/doc/headers/entries.md b/pkg/yqlib/doc/operators/headers/entries.md similarity index 100% rename from pkg/yqlib/doc/headers/entries.md rename to pkg/yqlib/doc/operators/headers/entries.md diff --git a/pkg/yqlib/doc/headers/env-variable-operators.md b/pkg/yqlib/doc/operators/headers/env-variable-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/env-variable-operators.md rename to pkg/yqlib/doc/operators/headers/env-variable-operators.md diff --git a/pkg/yqlib/doc/headers/equals.md b/pkg/yqlib/doc/operators/headers/equals.md similarity index 100% rename from pkg/yqlib/doc/headers/equals.md rename to pkg/yqlib/doc/operators/headers/equals.md diff --git a/pkg/yqlib/doc/headers/file-operators.md b/pkg/yqlib/doc/operators/headers/file-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/file-operators.md rename to pkg/yqlib/doc/operators/headers/file-operators.md diff --git a/pkg/yqlib/doc/headers/flatten.md b/pkg/yqlib/doc/operators/headers/flatten.md similarity index 100% rename from pkg/yqlib/doc/headers/flatten.md rename to pkg/yqlib/doc/operators/headers/flatten.md diff --git a/pkg/yqlib/doc/headers/group-by.md b/pkg/yqlib/doc/operators/headers/group-by.md similarity index 100% rename from pkg/yqlib/doc/headers/group-by.md rename to pkg/yqlib/doc/operators/headers/group-by.md diff --git a/pkg/yqlib/doc/headers/has.md b/pkg/yqlib/doc/operators/headers/has.md similarity index 100% rename from pkg/yqlib/doc/headers/has.md rename to pkg/yqlib/doc/operators/headers/has.md diff --git a/pkg/yqlib/doc/headers/keys.md b/pkg/yqlib/doc/operators/headers/keys.md similarity index 100% rename from pkg/yqlib/doc/headers/keys.md rename to pkg/yqlib/doc/operators/headers/keys.md diff --git a/pkg/yqlib/doc/headers/length.md b/pkg/yqlib/doc/operators/headers/length.md similarity index 100% rename from pkg/yqlib/doc/headers/length.md rename to pkg/yqlib/doc/operators/headers/length.md diff --git a/pkg/yqlib/doc/headers/load.md b/pkg/yqlib/doc/operators/headers/load.md similarity index 100% rename from pkg/yqlib/doc/headers/load.md rename to pkg/yqlib/doc/operators/headers/load.md diff --git a/pkg/yqlib/doc/headers/map.md b/pkg/yqlib/doc/operators/headers/map.md similarity index 100% rename from pkg/yqlib/doc/headers/map.md rename to pkg/yqlib/doc/operators/headers/map.md diff --git a/pkg/yqlib/doc/headers/multiply-merge.md b/pkg/yqlib/doc/operators/headers/multiply-merge.md similarity index 100% rename from pkg/yqlib/doc/headers/multiply-merge.md rename to pkg/yqlib/doc/operators/headers/multiply-merge.md diff --git a/pkg/yqlib/doc/headers/parent.md b/pkg/yqlib/doc/operators/headers/parent.md similarity index 100% rename from pkg/yqlib/doc/headers/parent.md rename to pkg/yqlib/doc/operators/headers/parent.md diff --git a/pkg/yqlib/doc/headers/path.md b/pkg/yqlib/doc/operators/headers/path.md similarity index 100% rename from pkg/yqlib/doc/headers/path.md rename to pkg/yqlib/doc/operators/headers/path.md diff --git a/pkg/yqlib/doc/headers/pipe.md b/pkg/yqlib/doc/operators/headers/pipe.md similarity index 100% rename from pkg/yqlib/doc/headers/pipe.md rename to pkg/yqlib/doc/operators/headers/pipe.md diff --git a/pkg/yqlib/doc/headers/recursive-descent-glob.md b/pkg/yqlib/doc/operators/headers/recursive-descent-glob.md similarity index 100% rename from pkg/yqlib/doc/headers/recursive-descent-glob.md rename to pkg/yqlib/doc/operators/headers/recursive-descent-glob.md diff --git a/pkg/yqlib/doc/headers/reduce.md b/pkg/yqlib/doc/operators/headers/reduce.md similarity index 100% rename from pkg/yqlib/doc/headers/reduce.md rename to pkg/yqlib/doc/operators/headers/reduce.md diff --git a/pkg/yqlib/doc/headers/select.md b/pkg/yqlib/doc/operators/headers/select.md similarity index 100% rename from pkg/yqlib/doc/headers/select.md rename to pkg/yqlib/doc/operators/headers/select.md diff --git a/pkg/yqlib/doc/headers/sort-keys.md b/pkg/yqlib/doc/operators/headers/sort-keys.md similarity index 100% rename from pkg/yqlib/doc/headers/sort-keys.md rename to pkg/yqlib/doc/operators/headers/sort-keys.md diff --git a/pkg/yqlib/doc/headers/sort.md b/pkg/yqlib/doc/operators/headers/sort.md similarity index 100% rename from pkg/yqlib/doc/headers/sort.md rename to pkg/yqlib/doc/operators/headers/sort.md diff --git a/pkg/yqlib/doc/headers/split-into-documents.md b/pkg/yqlib/doc/operators/headers/split-into-documents.md similarity index 100% rename from pkg/yqlib/doc/headers/split-into-documents.md rename to pkg/yqlib/doc/operators/headers/split-into-documents.md diff --git a/pkg/yqlib/doc/headers/string-operators.md b/pkg/yqlib/doc/operators/headers/string-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/string-operators.md rename to pkg/yqlib/doc/operators/headers/string-operators.md diff --git a/pkg/yqlib/doc/headers/style.md b/pkg/yqlib/doc/operators/headers/style.md similarity index 100% rename from pkg/yqlib/doc/headers/style.md rename to pkg/yqlib/doc/operators/headers/style.md diff --git a/pkg/yqlib/doc/headers/subtract.md b/pkg/yqlib/doc/operators/headers/subtract.md similarity index 100% rename from pkg/yqlib/doc/headers/subtract.md rename to pkg/yqlib/doc/operators/headers/subtract.md diff --git a/pkg/yqlib/doc/headers/tag.md b/pkg/yqlib/doc/operators/headers/tag.md similarity index 100% rename from pkg/yqlib/doc/headers/tag.md rename to pkg/yqlib/doc/operators/headers/tag.md diff --git a/pkg/yqlib/doc/headers/traverse-read.md b/pkg/yqlib/doc/operators/headers/traverse-read.md similarity index 100% rename from pkg/yqlib/doc/headers/traverse-read.md rename to pkg/yqlib/doc/operators/headers/traverse-read.md diff --git a/pkg/yqlib/doc/headers/union.md b/pkg/yqlib/doc/operators/headers/union.md similarity index 100% rename from pkg/yqlib/doc/headers/union.md rename to pkg/yqlib/doc/operators/headers/union.md diff --git a/pkg/yqlib/doc/headers/unique.md b/pkg/yqlib/doc/operators/headers/unique.md similarity index 100% rename from pkg/yqlib/doc/headers/unique.md rename to pkg/yqlib/doc/operators/headers/unique.md diff --git a/pkg/yqlib/doc/headers/variable-operators.md b/pkg/yqlib/doc/operators/headers/variable-operators.md similarity index 100% rename from pkg/yqlib/doc/headers/variable-operators.md rename to pkg/yqlib/doc/operators/headers/variable-operators.md diff --git a/pkg/yqlib/doc/headers/with.md b/pkg/yqlib/doc/operators/headers/with.md similarity index 100% rename from pkg/yqlib/doc/headers/with.md rename to pkg/yqlib/doc/operators/headers/with.md diff --git a/pkg/yqlib/doc/keys.md b/pkg/yqlib/doc/operators/keys.md similarity index 100% rename from pkg/yqlib/doc/keys.md rename to pkg/yqlib/doc/operators/keys.md diff --git a/pkg/yqlib/doc/length.md b/pkg/yqlib/doc/operators/length.md similarity index 100% rename from pkg/yqlib/doc/length.md rename to pkg/yqlib/doc/operators/length.md diff --git a/pkg/yqlib/doc/load.md b/pkg/yqlib/doc/operators/load.md similarity index 100% rename from pkg/yqlib/doc/load.md rename to pkg/yqlib/doc/operators/load.md diff --git a/pkg/yqlib/doc/map.md b/pkg/yqlib/doc/operators/map.md similarity index 100% rename from pkg/yqlib/doc/map.md rename to pkg/yqlib/doc/operators/map.md diff --git a/pkg/yqlib/doc/multiply-merge.md b/pkg/yqlib/doc/operators/multiply-merge.md similarity index 100% rename from pkg/yqlib/doc/multiply-merge.md rename to pkg/yqlib/doc/operators/multiply-merge.md diff --git a/pkg/yqlib/doc/parent.md b/pkg/yqlib/doc/operators/parent.md similarity index 100% rename from pkg/yqlib/doc/parent.md rename to pkg/yqlib/doc/operators/parent.md diff --git a/pkg/yqlib/doc/path.md b/pkg/yqlib/doc/operators/path.md similarity index 100% rename from pkg/yqlib/doc/path.md rename to pkg/yqlib/doc/operators/path.md diff --git a/pkg/yqlib/doc/pipe.md b/pkg/yqlib/doc/operators/pipe.md similarity index 100% rename from pkg/yqlib/doc/pipe.md rename to pkg/yqlib/doc/operators/pipe.md diff --git a/pkg/yqlib/doc/recursive-descent-glob.md b/pkg/yqlib/doc/operators/recursive-descent-glob.md similarity index 100% rename from pkg/yqlib/doc/recursive-descent-glob.md rename to pkg/yqlib/doc/operators/recursive-descent-glob.md diff --git a/pkg/yqlib/doc/reduce.md b/pkg/yqlib/doc/operators/reduce.md similarity index 100% rename from pkg/yqlib/doc/reduce.md rename to pkg/yqlib/doc/operators/reduce.md diff --git a/pkg/yqlib/doc/select.md b/pkg/yqlib/doc/operators/select.md similarity index 100% rename from pkg/yqlib/doc/select.md rename to pkg/yqlib/doc/operators/select.md diff --git a/pkg/yqlib/doc/sort-keys.md b/pkg/yqlib/doc/operators/sort-keys.md similarity index 100% rename from pkg/yqlib/doc/sort-keys.md rename to pkg/yqlib/doc/operators/sort-keys.md diff --git a/pkg/yqlib/doc/sort.md b/pkg/yqlib/doc/operators/sort.md similarity index 100% rename from pkg/yqlib/doc/sort.md rename to pkg/yqlib/doc/operators/sort.md diff --git a/pkg/yqlib/doc/split-into-documents.md b/pkg/yqlib/doc/operators/split-into-documents.md similarity index 100% rename from pkg/yqlib/doc/split-into-documents.md rename to pkg/yqlib/doc/operators/split-into-documents.md diff --git a/pkg/yqlib/doc/string-operators.md b/pkg/yqlib/doc/operators/string-operators.md similarity index 100% rename from pkg/yqlib/doc/string-operators.md rename to pkg/yqlib/doc/operators/string-operators.md diff --git a/pkg/yqlib/doc/style.md b/pkg/yqlib/doc/operators/style.md similarity index 100% rename from pkg/yqlib/doc/style.md rename to pkg/yqlib/doc/operators/style.md diff --git a/pkg/yqlib/doc/subtract.md b/pkg/yqlib/doc/operators/subtract.md similarity index 100% rename from pkg/yqlib/doc/subtract.md rename to pkg/yqlib/doc/operators/subtract.md diff --git a/pkg/yqlib/doc/tag.md b/pkg/yqlib/doc/operators/tag.md similarity index 100% rename from pkg/yqlib/doc/tag.md rename to pkg/yqlib/doc/operators/tag.md diff --git a/pkg/yqlib/doc/traverse-read.md b/pkg/yqlib/doc/operators/traverse-read.md similarity index 100% rename from pkg/yqlib/doc/traverse-read.md rename to pkg/yqlib/doc/operators/traverse-read.md diff --git a/pkg/yqlib/doc/union.md b/pkg/yqlib/doc/operators/union.md similarity index 100% rename from pkg/yqlib/doc/union.md rename to pkg/yqlib/doc/operators/union.md diff --git a/pkg/yqlib/doc/unique.md b/pkg/yqlib/doc/operators/unique.md similarity index 100% rename from pkg/yqlib/doc/unique.md rename to pkg/yqlib/doc/operators/unique.md diff --git a/pkg/yqlib/doc/variable-operators.md b/pkg/yqlib/doc/operators/variable-operators.md similarity index 100% rename from pkg/yqlib/doc/variable-operators.md rename to pkg/yqlib/doc/operators/variable-operators.md diff --git a/pkg/yqlib/doc/with.md b/pkg/yqlib/doc/operators/with.md similarity index 100% rename from pkg/yqlib/doc/with.md rename to pkg/yqlib/doc/operators/with.md diff --git a/pkg/yqlib/doc/usage/headers/xml.md b/pkg/yqlib/doc/usage/headers/xml.md new file mode 100644 index 00000000..9258afd0 --- /dev/null +++ b/pkg/yqlib/doc/usage/headers/xml.md @@ -0,0 +1,12 @@ +# XML + +At the moment, `yq` only supports decoding `xml` (into one of the other supported output formats). + +As yaml does not have the concept of attributes, these are converted to regular fields with a prefix to prevent clobbering. Consecutive xml nodes with the same name are assumed to be arrays. + +All values in XML are assumed to be strings - but you can use `from_yaml` to parse them into their correct types: + + +``` +yq e -p=xml '.myNumberField |= from_yaml' my.xml +``` diff --git a/pkg/yqlib/doc/usage/xml.md b/pkg/yqlib/doc/usage/xml.md new file mode 100644 index 00000000..245f9cbd --- /dev/null +++ b/pkg/yqlib/doc/usage/xml.md @@ -0,0 +1,80 @@ +# XML + +At the moment, `yq` only supports decoding `xml` (into one of the other supported output formats). + +As yaml does not have the concept of attributes, these are converted to regular fields with a prefix to prevent clobbering. Consecutive xml nodes with the same name are assumed to be arrays. + +All values in XML are assumed to be strings. + +## Parse xml: simple +Given a sample.xml file of: +```xml + +meow +``` +then +```bash +yq e sample.xml +``` +will output +```yaml +cat: meow +``` + +## Parse xml: array +Consecutive nodes with identical xml names are assumed to be arrays. + +Given a sample.xml file of: +```xml + +12 +``` +then +```bash +yq e sample.xml +``` +will output +```yaml +animal: + - "1" + - "2" +``` + +## Parse xml: attributes +Attributes are converted to fields, with the attribute prefix. + +Given a sample.xml file of: +```xml + +7 +``` +then +```bash +yq e sample.xml +``` +will output +```yaml +cat: + +legs: "4" + legs: "7" +``` + +## Parse xml: attributes with content +Content is added as a field, using the content name + +Given a sample.xml file of: +```xml + +meow +``` +then +```bash +yq e sample.xml +``` +will output +```yaml +cat: + +content: meow + +legs: "4" +``` + diff --git a/pkg/yqlib/operator_add_test.go b/pkg/yqlib/operator_add_test.go index 445977e8..b303866a 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) + documentOperatorScenarios(t, "add", addOperatorScenarios) } diff --git a/pkg/yqlib/operator_alternative_test.go b/pkg/yqlib/operator_alternative_test.go index 0331213d..e23c8dbb 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) + documentOperatorScenarios(t, "alternative-default-value", alternativeOperatorScenarios) } diff --git a/pkg/yqlib/operator_anchors_aliases_test.go b/pkg/yqlib/operator_anchors_aliases_test.go index 30642dcd..9222c177 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) + documentOperatorScenarios(t, "anchor-and-alias-operators", anchorOperatorScenarios) } diff --git a/pkg/yqlib/operator_assign_test.go b/pkg/yqlib/operator_assign_test.go index 9ecca5d4..b5f6813c 100644 --- a/pkg/yqlib/operator_assign_test.go +++ b/pkg/yqlib/operator_assign_test.go @@ -178,5 +178,5 @@ func TestAssignOperatorScenarios(t *testing.T) { for _, tt := range assignOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "assign-update", assignOperatorScenarios) + documentOperatorScenarios(t, "assign-update", assignOperatorScenarios) } diff --git a/pkg/yqlib/operator_booleans_test.go b/pkg/yqlib/operator_booleans_test.go index ac6de3eb..e9b72f99 100644 --- a/pkg/yqlib/operator_booleans_test.go +++ b/pkg/yqlib/operator_booleans_test.go @@ -229,5 +229,5 @@ func TestBooleanOperatorScenarios(t *testing.T) { for _, tt := range booleanOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "boolean-operators", booleanOperatorScenarios) + documentOperatorScenarios(t, "boolean-operators", booleanOperatorScenarios) } diff --git a/pkg/yqlib/operator_collect_object_test.go b/pkg/yqlib/operator_collect_object_test.go index edbe63d2..4db923f7 100644 --- a/pkg/yqlib/operator_collect_object_test.go +++ b/pkg/yqlib/operator_collect_object_test.go @@ -160,5 +160,5 @@ func TestCollectObjectOperatorScenarios(t *testing.T) { for _, tt := range collectObjectOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "create-collect-into-object", collectObjectOperatorScenarios) + documentOperatorScenarios(t, "create-collect-into-object", collectObjectOperatorScenarios) } diff --git a/pkg/yqlib/operator_collect_test.go b/pkg/yqlib/operator_collect_test.go index 0e23e340..fce899fb 100644 --- a/pkg/yqlib/operator_collect_test.go +++ b/pkg/yqlib/operator_collect_test.go @@ -108,5 +108,5 @@ func TestCollectOperatorScenarios(t *testing.T) { for _, tt := range collectOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "collect-into-array", collectOperatorScenarios) + documentOperatorScenarios(t, "collect-into-array", collectOperatorScenarios) } diff --git a/pkg/yqlib/operator_comments_test.go b/pkg/yqlib/operator_comments_test.go index cc3ce4fe..223eeb6c 100644 --- a/pkg/yqlib/operator_comments_test.go +++ b/pkg/yqlib/operator_comments_test.go @@ -136,5 +136,5 @@ func TestCommentOperatorScenarios(t *testing.T) { for _, tt := range commentOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "comment-operators", commentOperatorScenarios) + documentOperatorScenarios(t, "comment-operators", commentOperatorScenarios) } diff --git a/pkg/yqlib/operator_contains_test.go b/pkg/yqlib/operator_contains_test.go index e1d3dd01..5cef9d7c 100644 --- a/pkg/yqlib/operator_contains_test.go +++ b/pkg/yqlib/operator_contains_test.go @@ -78,5 +78,5 @@ func TestContainsOperatorScenarios(t *testing.T) { for _, tt := range containsOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "contains", containsOperatorScenarios) + documentOperatorScenarios(t, "contains", containsOperatorScenarios) } diff --git a/pkg/yqlib/operator_delete_test.go b/pkg/yqlib/operator_delete_test.go index 02efcb75..76d95224 100644 --- a/pkg/yqlib/operator_delete_test.go +++ b/pkg/yqlib/operator_delete_test.go @@ -171,5 +171,5 @@ func TestDeleteOperatorScenarios(t *testing.T) { for _, tt := range deleteOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "delete", deleteOperatorScenarios) + documentOperatorScenarios(t, "delete", deleteOperatorScenarios) } diff --git a/pkg/yqlib/operator_document_index_test.go b/pkg/yqlib/operator_document_index_test.go index 1e35cd19..23195505 100644 --- a/pkg/yqlib/operator_document_index_test.go +++ b/pkg/yqlib/operator_document_index_test.go @@ -54,5 +54,5 @@ func TestDocumentIndexScenarios(t *testing.T) { for _, tt := range documentIndexScenarios { testScenario(t, &tt) } - documentScenarios(t, "document-index", documentIndexScenarios) + documentOperatorScenarios(t, "document-index", documentIndexScenarios) } diff --git a/pkg/yqlib/operator_encoder_decoder_test.go b/pkg/yqlib/operator_encoder_decoder_test.go index c7597533..93b3376c 100644 --- a/pkg/yqlib/operator_encoder_decoder_test.go +++ b/pkg/yqlib/operator_encoder_decoder_test.go @@ -174,5 +174,5 @@ func TestEncoderDecoderOperatorScenarios(t *testing.T) { for _, tt := range encoderDecoderOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "encode-decode", encoderDecoderOperatorScenarios) + documentOperatorScenarios(t, "encode-decode", encoderDecoderOperatorScenarios) } diff --git a/pkg/yqlib/operator_entries_test.go b/pkg/yqlib/operator_entries_test.go index 4bee227d..1dd120c3 100644 --- a/pkg/yqlib/operator_entries_test.go +++ b/pkg/yqlib/operator_entries_test.go @@ -76,5 +76,5 @@ func TestEntriesOperatorScenarios(t *testing.T) { for _, tt := range entriesOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "entries", entriesOperatorScenarios) + documentOperatorScenarios(t, "entries", entriesOperatorScenarios) } diff --git a/pkg/yqlib/operator_env_test.go b/pkg/yqlib/operator_env_test.go index 1cc1ba67..eac19734 100644 --- a/pkg/yqlib/operator_env_test.go +++ b/pkg/yqlib/operator_env_test.go @@ -68,5 +68,5 @@ func TestEnvOperatorScenarios(t *testing.T) { for _, tt := range envOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "env-variable-operators", envOperatorScenarios) + documentOperatorScenarios(t, "env-variable-operators", envOperatorScenarios) } diff --git a/pkg/yqlib/operator_equals_test.go b/pkg/yqlib/operator_equals_test.go index 69cd6e09..517dae36 100644 --- a/pkg/yqlib/operator_equals_test.go +++ b/pkg/yqlib/operator_equals_test.go @@ -186,5 +186,5 @@ func TestEqualOperatorScenarios(t *testing.T) { for _, tt := range equalsOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "equals", equalsOperatorScenarios) + documentOperatorScenarios(t, "equals", equalsOperatorScenarios) } diff --git a/pkg/yqlib/operator_file_test.go b/pkg/yqlib/operator_file_test.go index 88d1422f..875d4187 100644 --- a/pkg/yqlib/operator_file_test.go +++ b/pkg/yqlib/operator_file_test.go @@ -53,5 +53,5 @@ func TestFileOperatorsScenarios(t *testing.T) { for _, tt := range fileOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "file-operators", fileOperatorScenarios) + documentOperatorScenarios(t, "file-operators", fileOperatorScenarios) } diff --git a/pkg/yqlib/operator_flatten_test.go b/pkg/yqlib/operator_flatten_test.go index 4e826471..add71e1f 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) + documentOperatorScenarios(t, "flatten", flattenOperatorScenarios) } diff --git a/pkg/yqlib/operator_group_by_test.go b/pkg/yqlib/operator_group_by_test.go index 60462206..2c7803da 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) + documentOperatorScenarios(t, "group-by", groupByOperatorScenarios) } diff --git a/pkg/yqlib/operator_has_test.go b/pkg/yqlib/operator_has_test.go index fbd31d5b..3a631330 100644 --- a/pkg/yqlib/operator_has_test.go +++ b/pkg/yqlib/operator_has_test.go @@ -77,5 +77,5 @@ func TestHasOperatorScenarios(t *testing.T) { for _, tt := range hasOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "has", hasOperatorScenarios) + documentOperatorScenarios(t, "has", hasOperatorScenarios) } diff --git a/pkg/yqlib/operator_keys_test.go b/pkg/yqlib/operator_keys_test.go index bd5087fb..b42306f7 100644 --- a/pkg/yqlib/operator_keys_test.go +++ b/pkg/yqlib/operator_keys_test.go @@ -81,5 +81,5 @@ func TestKeysOperatorScenarios(t *testing.T) { for _, tt := range keysOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "keys", keysOperatorScenarios) + documentOperatorScenarios(t, "keys", keysOperatorScenarios) } diff --git a/pkg/yqlib/operator_length_test.go b/pkg/yqlib/operator_length_test.go index d08c1326..a67e627d 100644 --- a/pkg/yqlib/operator_length_test.go +++ b/pkg/yqlib/operator_length_test.go @@ -62,5 +62,5 @@ func TestLengthOperatorScenarios(t *testing.T) { for _, tt := range lengthOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "length", lengthOperatorScenarios) + documentOperatorScenarios(t, "length", lengthOperatorScenarios) } diff --git a/pkg/yqlib/operator_load_test.go b/pkg/yqlib/operator_load_test.go index 4fe690f1..5cfae4ad 100644 --- a/pkg/yqlib/operator_load_test.go +++ b/pkg/yqlib/operator_load_test.go @@ -46,5 +46,5 @@ func TestLoadScenarios(t *testing.T) { for _, tt := range loadScenarios { testScenario(t, &tt) } - documentScenarios(t, "load", loadScenarios) + documentOperatorScenarios(t, "load", loadScenarios) } diff --git a/pkg/yqlib/operator_map_test.go b/pkg/yqlib/operator_map_test.go index 1dd5db57..715df336 100644 --- a/pkg/yqlib/operator_map_test.go +++ b/pkg/yqlib/operator_map_test.go @@ -47,5 +47,5 @@ func TestMapOperatorScenarios(t *testing.T) { for _, tt := range mapOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "map", mapOperatorScenarios) + documentOperatorScenarios(t, "map", mapOperatorScenarios) } diff --git a/pkg/yqlib/operator_multiply_test.go b/pkg/yqlib/operator_multiply_test.go index 59a08849..ab136f13 100644 --- a/pkg/yqlib/operator_multiply_test.go +++ b/pkg/yqlib/operator_multiply_test.go @@ -441,5 +441,5 @@ func TestMultiplyOperatorScenarios(t *testing.T) { for _, tt := range multiplyOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "multiply-merge", multiplyOperatorScenarios) + documentOperatorScenarios(t, "multiply-merge", multiplyOperatorScenarios) } diff --git a/pkg/yqlib/operator_parent_test.go b/pkg/yqlib/operator_parent_test.go index f4cbf236..35afd67e 100644 --- a/pkg/yqlib/operator_parent_test.go +++ b/pkg/yqlib/operator_parent_test.go @@ -33,5 +33,5 @@ func TestParentOperatorScenarios(t *testing.T) { for _, tt := range parentOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "parent", parentOperatorScenarios) + documentOperatorScenarios(t, "parent", parentOperatorScenarios) } diff --git a/pkg/yqlib/operator_path_test.go b/pkg/yqlib/operator_path_test.go index a93830a2..faf06ce9 100644 --- a/pkg/yqlib/operator_path_test.go +++ b/pkg/yqlib/operator_path_test.go @@ -69,5 +69,5 @@ func TestPathOperatorsScenarios(t *testing.T) { for _, tt := range pathOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "path", pathOperatorScenarios) + documentOperatorScenarios(t, "path", pathOperatorScenarios) } diff --git a/pkg/yqlib/operator_pipe_test.go b/pkg/yqlib/operator_pipe_test.go index fc36cde9..9e979603 100644 --- a/pkg/yqlib/operator_pipe_test.go +++ b/pkg/yqlib/operator_pipe_test.go @@ -27,5 +27,5 @@ func TestPipeOperatorScenarios(t *testing.T) { for _, tt := range pipeOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "pipe", pipeOperatorScenarios) + documentOperatorScenarios(t, "pipe", pipeOperatorScenarios) } diff --git a/pkg/yqlib/operator_recursive_descent_test.go b/pkg/yqlib/operator_recursive_descent_test.go index 8d4ddc7e..45e63cfd 100644 --- a/pkg/yqlib/operator_recursive_descent_test.go +++ b/pkg/yqlib/operator_recursive_descent_test.go @@ -233,5 +233,5 @@ func TestRecursiveDescentOperatorScenarios(t *testing.T) { for _, tt := range recursiveDescentOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "recursive-descent-glob", recursiveDescentOperatorScenarios) + documentOperatorScenarios(t, "recursive-descent-glob", recursiveDescentOperatorScenarios) } diff --git a/pkg/yqlib/operator_reduce_test.go b/pkg/yqlib/operator_reduce_test.go index dde2c33f..80b45a56 100644 --- a/pkg/yqlib/operator_reduce_test.go +++ b/pkg/yqlib/operator_reduce_test.go @@ -36,5 +36,5 @@ func TestReduceOperatorScenarios(t *testing.T) { for _, tt := range reduceOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "reduce", reduceOperatorScenarios) + documentOperatorScenarios(t, "reduce", reduceOperatorScenarios) } diff --git a/pkg/yqlib/operator_select_test.go b/pkg/yqlib/operator_select_test.go index 4a1e8723..43c16a9b 100644 --- a/pkg/yqlib/operator_select_test.go +++ b/pkg/yqlib/operator_select_test.go @@ -99,5 +99,5 @@ func TestSelectOperatorScenarios(t *testing.T) { for _, tt := range selectOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "select", selectOperatorScenarios) + documentOperatorScenarios(t, "select", selectOperatorScenarios) } diff --git a/pkg/yqlib/operator_sort_keys_test.go b/pkg/yqlib/operator_sort_keys_test.go index 462771e6..8d421556 100644 --- a/pkg/yqlib/operator_sort_keys_test.go +++ b/pkg/yqlib/operator_sort_keys_test.go @@ -36,5 +36,5 @@ func TestSortKeysOperatorScenarios(t *testing.T) { for _, tt := range sortKeysOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "sort-keys", sortKeysOperatorScenarios) + documentOperatorScenarios(t, "sort-keys", sortKeysOperatorScenarios) } diff --git a/pkg/yqlib/operator_sort_test.go b/pkg/yqlib/operator_sort_test.go index 6828d73e..7c4128d6 100644 --- a/pkg/yqlib/operator_sort_test.go +++ b/pkg/yqlib/operator_sort_test.go @@ -76,5 +76,5 @@ func TestSortByOperatorScenarios(t *testing.T) { for _, tt := range sortByOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "sort", sortByOperatorScenarios) + documentOperatorScenarios(t, "sort", sortByOperatorScenarios) } diff --git a/pkg/yqlib/operator_split_document_test.go b/pkg/yqlib/operator_split_document_test.go index 813f3173..ca490512 100644 --- a/pkg/yqlib/operator_split_document_test.go +++ b/pkg/yqlib/operator_split_document_test.go @@ -28,5 +28,5 @@ func TestSplitDocOperatorScenarios(t *testing.T) { for _, tt := range splitDocOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "split-into-documents", splitDocOperatorScenarios) + documentOperatorScenarios(t, "split-into-documents", splitDocOperatorScenarios) } diff --git a/pkg/yqlib/operator_strings_test.go b/pkg/yqlib/operator_strings_test.go index c94a2fc8..c4e26214 100644 --- a/pkg/yqlib/operator_strings_test.go +++ b/pkg/yqlib/operator_strings_test.go @@ -170,5 +170,5 @@ func TestStringsOperatorScenarios(t *testing.T) { for _, tt := range stringsOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "string-operators", stringsOperatorScenarios) + documentOperatorScenarios(t, "string-operators", stringsOperatorScenarios) } diff --git a/pkg/yqlib/operator_style_test.go b/pkg/yqlib/operator_style_test.go index 5f2490fd..ce263a7b 100644 --- a/pkg/yqlib/operator_style_test.go +++ b/pkg/yqlib/operator_style_test.go @@ -152,5 +152,5 @@ func TestStyleOperatorScenarios(t *testing.T) { for _, tt := range styleOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "style", styleOperatorScenarios) + documentOperatorScenarios(t, "style", styleOperatorScenarios) } diff --git a/pkg/yqlib/operator_subtract_test.go b/pkg/yqlib/operator_subtract_test.go index 7e209d5e..e43e0bfe 100644 --- a/pkg/yqlib/operator_subtract_test.go +++ b/pkg/yqlib/operator_subtract_test.go @@ -99,5 +99,5 @@ func TestSubtractOperatorScenarios(t *testing.T) { for _, tt := range subtractOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "subtract", subtractOperatorScenarios) + documentOperatorScenarios(t, "subtract", subtractOperatorScenarios) } diff --git a/pkg/yqlib/operator_tag_test.go b/pkg/yqlib/operator_tag_test.go index 08b22741..380f6028 100644 --- a/pkg/yqlib/operator_tag_test.go +++ b/pkg/yqlib/operator_tag_test.go @@ -64,5 +64,5 @@ func TestTagOperatorScenarios(t *testing.T) { for _, tt := range tagOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "tag", tagOperatorScenarios) + documentOperatorScenarios(t, "tag", tagOperatorScenarios) } diff --git a/pkg/yqlib/operator_traverse_path_test.go b/pkg/yqlib/operator_traverse_path_test.go index b556ba28..94400ba2 100644 --- a/pkg/yqlib/operator_traverse_path_test.go +++ b/pkg/yqlib/operator_traverse_path_test.go @@ -519,5 +519,5 @@ func TestTraversePathOperatorScenarios(t *testing.T) { for _, tt := range traversePathOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "traverse-read", traversePathOperatorScenarios) + documentOperatorScenarios(t, "traverse-read", traversePathOperatorScenarios) } diff --git a/pkg/yqlib/operator_union_test.go b/pkg/yqlib/operator_union_test.go index a5f12de7..1409fd7f 100644 --- a/pkg/yqlib/operator_union_test.go +++ b/pkg/yqlib/operator_union_test.go @@ -44,5 +44,5 @@ func TestUnionOperatorScenarios(t *testing.T) { for _, tt := range unionOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "union", unionOperatorScenarios) + documentOperatorScenarios(t, "union", unionOperatorScenarios) } diff --git a/pkg/yqlib/operator_unique_test.go b/pkg/yqlib/operator_unique_test.go index 347f4d71..4a3ce79b 100644 --- a/pkg/yqlib/operator_unique_test.go +++ b/pkg/yqlib/operator_unique_test.go @@ -61,5 +61,5 @@ func TestUniqueOperatorScenarios(t *testing.T) { for _, tt := range uniqueOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "unique", uniqueOperatorScenarios) + documentOperatorScenarios(t, "unique", uniqueOperatorScenarios) } diff --git a/pkg/yqlib/operator_variables_test.go b/pkg/yqlib/operator_variables_test.go index a6e8d854..e40f8dd8 100644 --- a/pkg/yqlib/operator_variables_test.go +++ b/pkg/yqlib/operator_variables_test.go @@ -66,5 +66,5 @@ func TestVariableOperatorScenarios(t *testing.T) { for _, tt := range variableOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "variable-operators", variableOperatorScenarios) + documentOperatorScenarios(t, "variable-operators", variableOperatorScenarios) } diff --git a/pkg/yqlib/operator_with_test.go b/pkg/yqlib/operator_with_test.go index 11ea08c1..aad4d15c 100644 --- a/pkg/yqlib/operator_with_test.go +++ b/pkg/yqlib/operator_with_test.go @@ -34,5 +34,5 @@ func TestWithOperatorScenarios(t *testing.T) { for _, tt := range withOperatorScenarios { testScenario(t, &tt) } - documentScenarios(t, "with", withOperatorScenarios) + documentOperatorScenarios(t, "with", withOperatorScenarios) } diff --git a/pkg/yqlib/operators_test.go b/pkg/yqlib/operators_test.go index a407c40d..c99c63a7 100644 --- a/pkg/yqlib/operators_test.go +++ b/pkg/yqlib/operators_test.go @@ -90,27 +90,32 @@ func testScenario(t *testing.T, s *expressionScenario) { test.AssertResultComplexWithContext(t, s.expected, resultsToString(t, context.MatchingNodes), fmt.Sprintf("desc: %v\nexp: %v\ndoc: %v", s.description, s.expression, s.document)) } +func resultToString(t *testing.T, n *CandidateNode) string { + var valueBuffer bytes.Buffer + printer := NewPrinterWithSingleWriter(bufio.NewWriter(&valueBuffer), YamlOutputFormat, true, false, 4, true) + + err := printer.PrintResults(n.AsList()) + if err != nil { + t.Error(err) + return "" + } + + tag := n.Node.Tag + if n.Node.Kind == yaml.DocumentNode { + tag = "doc" + } else if n.Node.Kind == yaml.AliasNode { + tag = "alias" + } + return fmt.Sprintf(`D%v, P%v, (%v)::%v`, n.Document, n.Path, tag, valueBuffer.String()) +} + func resultsToString(t *testing.T, results *list.List) []string { var pretty = make([]string, 0) for el := results.Front(); el != nil; el = el.Next() { n := el.Value.(*CandidateNode) - var valueBuffer bytes.Buffer - printer := NewPrinterWithSingleWriter(bufio.NewWriter(&valueBuffer), YamlOutputFormat, true, false, 4, true) - err := printer.PrintResults(n.AsList()) - if err != nil { - t.Error(err) - return nil - } - - tag := n.Node.Tag - if n.Node.Kind == yaml.DocumentNode { - tag = "doc" - } else if n.Node.Kind == yaml.AliasNode { - tag = "alias" - } - output := fmt.Sprintf(`D%v, P%v, (%v)::%v`, n.Document, n.Path, tag, valueBuffer.String()) + output := resultToString(t, n) pretty = append(pretty, output) } return pretty @@ -123,8 +128,8 @@ func writeOrPanic(w *bufio.Writer, text string) { } } -func copyFromHeader(title string, out *os.File) error { - source := fmt.Sprintf("doc/headers/%v.md", title) +func copyFromHeader(folder string, title string, out *os.File) error { + source := fmt.Sprintf("doc/%v/headers/%v.md", folder, title) _, err := os.Stat(source) if os.IsNotExist(err) { return nil @@ -154,8 +159,10 @@ func formatYaml(yaml string, filename string) string { return output.String() } -func documentScenarios(t *testing.T, title string, scenarios []expressionScenario) { - f, err := os.Create(fmt.Sprintf("doc/%v.md", title)) +type documentScenarioFunc func(t *testing.T, writer *bufio.Writer, scenario interface{}) + +func documentScenarios(t *testing.T, folder string, title string, scenarios []interface{}, documentScenario documentScenarioFunc) { + f, err := os.Create(fmt.Sprintf("doc/%v/%v.md", folder, title)) if err != nil { t.Error(err) @@ -163,7 +170,7 @@ func documentScenarios(t *testing.T, title string, scenarios []expressionScenari } defer f.Close() - err = copyFromHeader(title, f) + err = copyFromHeader(folder, title, f) if err != nil { t.Error(err) return @@ -173,14 +180,26 @@ func documentScenarios(t *testing.T, title string, scenarios []expressionScenari writeOrPanic(w, "\n") for _, s := range scenarios { - if !s.skipDoc { - documentScenario(t, w, s) - } + documentScenario(t, w, s) } w.Flush() } -func documentScenario(t *testing.T, w *bufio.Writer, s expressionScenario) { +func documentOperatorScenarios(t *testing.T, title string, scenarios []expressionScenario) { + genericScenarios := make([]interface{}, len(scenarios)) + for i, s := range scenarios { + genericScenarios[i] = s + } + + documentScenarios(t, "operators", title, genericScenarios, documentOperatorScenario) +} + +func documentOperatorScenario(t *testing.T, w *bufio.Writer, i interface{}) { + s := i.(expressionScenario) + + if s.skipDoc { + return + } writeOrPanic(w, fmt.Sprintf("## %v\n", s.description)) if s.subdescription != "" {