diff --git a/README.md b/README.md index c11fb4b5..21604ddb 100644 --- a/README.md +++ b/README.md @@ -294,7 +294,7 @@ Using [winget](https://learn.microsoft.com/en-us/windows/package-manager/) winget install --id MikeFarah.yq ``` -### Mac: +### MacPorts: Using [MacPorts](https://www.macports.org/) ``` sudo port selfupdate @@ -324,6 +324,14 @@ Flox can be used to install yq on Linux, MacOS, and Windows through WSL. flox install yq ``` + +### MacOS / Linux via gah: +Using [gah](https://github.com/marverix/gah) + +``` +gah install yq +``` + ## Features - [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/) - Written in portable go, so you can download a lovely dependency free binary diff --git a/pkg/yqlib/decoder_test.go b/pkg/yqlib/decoder_test.go index d71e8e8c..1307c4fe 100644 --- a/pkg/yqlib/decoder_test.go +++ b/pkg/yqlib/decoder_test.go @@ -41,7 +41,6 @@ func processFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) ( } exp, err := getExpressionParser().ParseExpression(expression) - if err != nil { return "", err } @@ -65,12 +64,10 @@ func processFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) ( } func mustProcessFormatScenario(s formatScenario, decoder Decoder, encoder Encoder) string { - result, err := processFormatScenario(s, decoder, encoder) if err != nil { log.Error("Bad scenario %v: %w", s.description, err) return fmt.Sprintf("Bad scenario %v: %v", s.description, err.Error()) } return result - } diff --git a/pkg/yqlib/decoder_toml.go b/pkg/yqlib/decoder_toml.go index d67047b8..a4dba948 100644 --- a/pkg/yqlib/decoder_toml.go +++ b/pkg/yqlib/decoder_toml.go @@ -140,7 +140,6 @@ func (dec *tomlDecoder) createArray(tomlNode *toml.Node) (*CandidateNode, error) Tag: "!!seq", Content: content, }, nil - } func (dec *tomlDecoder) createStringScalar(tomlNode *toml.Node) (*CandidateNode, error) { @@ -190,7 +189,6 @@ func (dec *tomlDecoder) decodeNode(tomlNode *toml.Node) (*CandidateNode, error) default: return nil, fmt.Errorf("unsupported type %v", tomlNode.Kind) } - } func (dec *tomlDecoder) Decode() (*CandidateNode, error) { @@ -200,7 +198,7 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) { // // toml library likes to panic var deferredError error - defer func() { //catch or finally + defer func() { // catch or finally if r := recover(); r != nil { var ok bool deferredError, ok = r.(error) @@ -211,7 +209,7 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) { }() log.Debug("ok here we go") - var runAgainstCurrentExp = false + runAgainstCurrentExp := false var err error for runAgainstCurrentExp || dec.parser.NextExpression() { @@ -242,7 +240,6 @@ func (dec *tomlDecoder) Decode() (*CandidateNode, error) { } return dec.rootMap, deferredError - } func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error) { @@ -282,13 +279,13 @@ func (dec *tomlDecoder) processTable(currentNode *toml.Node) (bool, error) { tableValue = dec.parser.Expression() // next expression is not table data, so we are done if tableValue.Kind != toml.KeyValue { - log.Debug("got an empty table, returning") - return true, nil - } - - runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(tableNodeValue, tableValue) - if err != nil && !errors.Is(err, io.EOF) { - return false, err + log.Debug("got an empty table") + runAgainstCurrentExp = true + } else { + runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(tableNodeValue, tableValue) + if err != nil && !errors.Is(err, io.EOF) { + return false, err + } } } diff --git a/pkg/yqlib/toml_test.go b/pkg/yqlib/toml_test.go index 60eb4c83..82c82f13 100644 --- a/pkg/yqlib/toml_test.go +++ b/pkg/yqlib/toml_test.go @@ -23,6 +23,7 @@ street = "first street" [owner] name = "Tom Preston-Werner" ` + var expectedTableArrayBeforeOwners = `owner: addresses: - street: first street @@ -67,6 +68,29 @@ var emptyTable = ` var emptyTableExpected = "dependencies: {}\n" +var multipleEmptyTables = ` +[firstEmptyTable] +[firstTableWithContent] +key = "value" +[secondEmptyTable] +[thirdEmptyTable] +[secondTableWithContent] +key = "value" +[fourthEmptyTable] +[fifthEmptyTable] +` + +var expectedMultipleEmptyTables = `firstEmptyTable: {} +firstTableWithContent: + key: value +secondEmptyTable: {} +thirdEmptyTable: {} +secondTableWithContent: + key: value +fourthEmptyTable: {} +fifthEmptyTable: {} +` + var sampleWithHeader = ` [servers] @@ -238,6 +262,13 @@ var tomlScenarios = []formatScenario{ expected: expectedSampleWithHeader, scenarioType: "decode", }, + { + description: "Parse: multiple empty tables", + skipDoc: true, + input: multipleEmptyTables, + expected: expectedMultipleEmptyTables, + scenarioType: "decode", + }, } func testTomlScenario(t *testing.T, s formatScenario) {