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 != "" {