From 3e83ff7ac866d0bf63c7cd9fa2cddf22dbdddf97 Mon Sep 17 00:00:00 2001 From: Ryan SIU Date: Fri, 10 Jan 2020 16:34:31 +0800 Subject: [PATCH] #20 Read the top level keys only --- test/fixture/keyonly.yaml | 6 ++++++ yq.go | 9 +++++++++ yq_test.go | 26 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 test/fixture/keyonly.yaml diff --git a/test/fixture/keyonly.yaml b/test/fixture/keyonly.yaml new file mode 100644 index 00000000..f2dd3309 --- /dev/null +++ b/test/fixture/keyonly.yaml @@ -0,0 +1,6 @@ +a: + b: + c: 1 + d: + e: 2 + f: diff --git a/yq.go b/yq.go index d24d44c0..31154110 100644 --- a/yq.go +++ b/yq.go @@ -25,6 +25,7 @@ var writeInplace = false var writeScript = "" var outputToJSON = false var overwriteFlag = false +var keyOnlyFlag = false var allowEmptyFlag = false var appendFlag = false var verbose = false @@ -111,6 +112,7 @@ yq r -- things.yaml --key-starting-with-dashes } cmdRead.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") cmdRead.PersistentFlags().BoolVarP(&outputToJSON, "tojson", "j", false, "output as json") + cmdRead.PersistentFlags().BoolVarP(&keyOnlyFlag, "keyonly", "k", false, "output with top level keys only") return cmdRead } @@ -304,6 +306,13 @@ func readProperty(cmd *cobra.Command, args []string) error { dataBucket = mappedDocs } + if keyOnlyFlag { + for _, value := range dataBucket.(yaml.MapSlice) { + cmd.Println(value.Key) + } + return nil + } + dataStr, err := toString(dataBucket) if err != nil { return err diff --git a/yq_test.go b/yq_test.go index 677f7bd0..05c78a94 100644 --- a/yq_test.go +++ b/yq_test.go @@ -1,12 +1,14 @@ package main import ( + "bytes" "fmt" "runtime" "testing" "github.com/mikefarah/yq/v2/pkg/marshal" "github.com/mikefarah/yq/v2/test" + "github.com/spf13/cobra" ) func TestMultilineString(t *testing.T) { @@ -58,3 +60,27 @@ func TestNewYaml_WithUnknownScript(t *testing.T) { } test.AssertResult(t, expectedOutput, err.Error()) } + +func TestReadWithKeyOnly(t *testing.T) { + readCmd := createReadCmd() + expectedResult := `b +d +f +` + actualResult, err := executeTestCommand(readCmd, "test/fixture/keyonly.yaml", "a", "-k") + if err != nil { + t.Error(err.Error()) + } + test.AssertResult(t, expectedResult, actualResult) +} + +func executeTestCommand(command *cobra.Command, args ...string) (output string, err error) { + buf := new(bytes.Buffer) + + command.SetOutput(buf) + command.SetArgs(args) + + _, err = command.ExecuteC() + + return buf.String(), err +}