diff --git a/cmd/utils.go b/cmd/utils.go index 769e421b..cc8c7e7e 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -183,6 +183,8 @@ func configureEncoder() (yqlib.Encoder, error) { } func createEncoder(format *yqlib.PrinterOutputFormat) (yqlib.Encoder, error) { + yqlib.ConfiguredXMLPreferences.Indent = indent + switch format { case yqlib.JSONOutputFormat: return yqlib.NewJSONEncoder(indent, colorsEnabled, unwrapScalar), nil @@ -195,7 +197,7 @@ func createEncoder(format *yqlib.PrinterOutputFormat) (yqlib.Encoder, error) { case yqlib.YamlOutputFormat: return yqlib.NewYamlEncoder(indent, colorsEnabled, yqlib.ConfiguredYamlPreferences), nil case yqlib.XMLOutputFormat: - return yqlib.NewXMLEncoder(indent, yqlib.ConfiguredXMLPreferences), nil + return yqlib.NewXMLEncoder(yqlib.ConfiguredXMLPreferences), nil case yqlib.TomlOutputFormat: return yqlib.NewTomlEncoder(), nil case yqlib.ShellVariablesOutputFormat: diff --git a/pkg/yqlib/encoder_xml.go b/pkg/yqlib/encoder_xml.go index 8212c58e..d33e2acc 100644 --- a/pkg/yqlib/encoder_xml.go +++ b/pkg/yqlib/encoder_xml.go @@ -17,10 +17,10 @@ type xmlEncoder struct { leadingContent string } -func NewXMLEncoder(indent int, prefs XmlPreferences) Encoder { +func NewXMLEncoder(prefs XmlPreferences) Encoder { var indentString = "" - for index := 0; index < indent; index++ { + for index := 0; index < prefs.Indent; index++ { indentString = indentString + " " } return &xmlEncoder{indentString, nil, prefs, ""} diff --git a/pkg/yqlib/operator_encoder_decoder.go b/pkg/yqlib/operator_encoder_decoder.go index 68202c54..6a372c66 100644 --- a/pkg/yqlib/operator_encoder_decoder.go +++ b/pkg/yqlib/operator_encoder_decoder.go @@ -10,6 +10,7 @@ import ( ) func configureEncoder(format *PrinterOutputFormat, indent int) Encoder { + switch format { case JSONOutputFormat: return NewJSONEncoder(indent, false, false) @@ -22,7 +23,9 @@ func configureEncoder(format *PrinterOutputFormat, indent int) Encoder { case YamlOutputFormat: return NewYamlEncoder(indent, false, ConfiguredYamlPreferences) case XMLOutputFormat: - return NewXMLEncoder(indent, ConfiguredXMLPreferences) + var xmlPrefs = ConfiguredXMLPreferences.Copy() + xmlPrefs.Indent = indent + return NewXMLEncoder(xmlPrefs) case Base64OutputFormat: return NewBase64Encoder() case UriOutputFormat: diff --git a/pkg/yqlib/operators_test.go b/pkg/yqlib/operators_test.go index 24e07532..7fa4182e 100644 --- a/pkg/yqlib/operators_test.go +++ b/pkg/yqlib/operators_test.go @@ -32,7 +32,7 @@ type expressionScenario struct { } func TestMain(m *testing.M) { - logging.SetLevel(logging.DEBUG, "") + logging.SetLevel(logging.ERROR, "") Now = func() time.Time { return time.Date(2021, time.May, 19, 1, 2, 3, 4, time.UTC) } diff --git a/pkg/yqlib/xml.go b/pkg/yqlib/xml.go index 09bb872c..28769689 100644 --- a/pkg/yqlib/xml.go +++ b/pkg/yqlib/xml.go @@ -1,6 +1,7 @@ package yqlib type XmlPreferences struct { + Indent int AttributePrefix string ContentName string StrictMode bool @@ -14,6 +15,7 @@ type XmlPreferences struct { func NewDefaultXmlPreferences() XmlPreferences { return XmlPreferences{ + Indent: 2, AttributePrefix: "+@", ContentName: "+content", StrictMode: false, @@ -26,4 +28,19 @@ func NewDefaultXmlPreferences() XmlPreferences { } } +func (p *XmlPreferences) Copy() XmlPreferences { + return XmlPreferences{ + Indent: p.Indent, + AttributePrefix: p.AttributePrefix, + ContentName: p.ContentName, + StrictMode: p.StrictMode, + KeepNamespace: p.KeepNamespace, + UseRawToken: p.UseRawToken, + ProcInstPrefix: p.ProcInstPrefix, + DirectiveName: p.DirectiveName, + SkipProcInst: p.SkipProcInst, + SkipDirectives: p.SkipDirectives, + } +} + var ConfiguredXMLPreferences = NewDefaultXmlPreferences() diff --git a/pkg/yqlib/xml_test.go b/pkg/yqlib/xml_test.go index c3eca8d1..40e8e384 100644 --- a/pkg/yqlib/xml_test.go +++ b/pkg/yqlib/xml_test.go @@ -619,9 +619,9 @@ func testXMLScenario(t *testing.T, s formatScenario) { case "", "decode": test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewYamlEncoder(4, false, ConfiguredYamlPreferences)), s.description) case "encode": - test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(2, ConfiguredXMLPreferences)), s.description) + test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(ConfiguredXMLPreferences)), s.description) case "roundtrip": - test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewXMLEncoder(2, ConfiguredXMLPreferences)), s.description) + test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewXMLEncoder(ConfiguredXMLPreferences)), s.description) case "decode-keep-ns": prefs := NewDefaultXmlPreferences() prefs.KeepNamespace = true @@ -637,7 +637,7 @@ func testXMLScenario(t *testing.T, s formatScenario) { case "roundtrip-skip-directives": prefs := NewDefaultXmlPreferences() prefs.SkipDirectives = true - test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(2, prefs)), s.description) + test.AssertResultWithContext(t, s.expected, mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(prefs)), s.description) case "decode-error": result, err := processFormatScenario(s, NewXMLDecoder(NewDefaultXmlPreferences()), NewYamlEncoder(2, false, ConfiguredYamlPreferences)) if err == nil { @@ -646,7 +646,7 @@ func testXMLScenario(t *testing.T, s formatScenario) { test.AssertResultComplexWithContext(t, s.expectedError, err.Error(), s.description) } case "encode-error": - result, err := processFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(2, NewDefaultXmlPreferences())) + result, err := processFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(NewDefaultXmlPreferences())) if err == nil { t.Errorf("Expected error '%v' but it worked: %v", s.expectedError, result) } else { @@ -721,12 +721,12 @@ func documentXMLDecodeKeepNsScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, "will output\n") prefs := NewDefaultXmlPreferences() prefs.KeepNamespace = false - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(2, prefs)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(prefs)))) prefsWithout := NewDefaultXmlPreferences() prefs.KeepNamespace = true writeOrPanic(w, "instead of\n") - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefsWithout), NewXMLEncoder(2, prefsWithout)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefsWithout), NewXMLEncoder(prefsWithout)))) } func documentXMLDecodeKeepNsRawTokenScenario(w *bufio.Writer, s formatScenario) { @@ -747,13 +747,13 @@ func documentXMLDecodeKeepNsRawTokenScenario(w *bufio.Writer, s formatScenario) prefs := NewDefaultXmlPreferences() prefs.UseRawToken = false - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(2, prefs)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(prefs)))) prefsWithout := NewDefaultXmlPreferences() prefsWithout.UseRawToken = true writeOrPanic(w, "instead of\n") - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefsWithout), NewXMLEncoder(2, prefsWithout)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefsWithout), NewXMLEncoder(prefsWithout)))) } func documentXMLEncodeScenario(w *bufio.Writer, s formatScenario) { @@ -771,7 +771,7 @@ func documentXMLEncodeScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, "```bash\nyq -o=xml sample.yml\n```\n") writeOrPanic(w, "will output\n") - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(2, ConfiguredXMLPreferences)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewYamlDecoder(ConfiguredYamlPreferences), NewXMLEncoder(ConfiguredXMLPreferences)))) } func documentXMLRoundTripScenario(w *bufio.Writer, s formatScenario) { @@ -789,7 +789,7 @@ func documentXMLRoundTripScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, "```bash\nyq '.' sample.xml\n```\n") writeOrPanic(w, "will output\n") - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewXMLEncoder(2, ConfiguredXMLPreferences)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewXMLEncoder(ConfiguredXMLPreferences)))) } func documentXMLSkipDirectivesScenario(w *bufio.Writer, s formatScenario) { @@ -809,7 +809,7 @@ func documentXMLSkipDirectivesScenario(w *bufio.Writer, s formatScenario) { prefs := NewDefaultXmlPreferences() prefs.SkipDirectives = true - writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(2, prefs)))) + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(prefs), NewXMLEncoder(prefs)))) } func TestXMLScenarios(t *testing.T) {