From 67fb924e0e7835c9a243469d04fe1470106bbd63 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Fri, 28 Feb 2020 15:24:16 +1100 Subject: [PATCH] Can find array elements bu value --- cmd/commands_test.go | 37 +++++++++++++++++++++++++++++++++++++ pkg/yqlib/path_parser.go | 8 ++++++++ 2 files changed, 45 insertions(+) diff --git a/cmd/commands_test.go b/cmd/commands_test.go index 1f365164..10e85ad6 100644 --- a/cmd/commands_test.go +++ b/cmd/commands_test.go @@ -2019,6 +2019,43 @@ func TestReadExpression(t *testing.T) { test.AssertResult(t, expectedOutput, result.Output) } +func TestReadFindValueCmd(t *testing.T) { + content := `- cat +- dog +- rat +` + filename := test.WriteTempYamlFile(content) + defer test.RemoveTempYamlFile(filename) + cmd := getRootCommand() + result := test.RunCmd(cmd, fmt.Sprintf("r %s (.==dog)", filename)) + if result.Error != nil { + t.Error(result.Error) + } + + expectedOutput := `dog +` + test.AssertResult(t, expectedOutput, result.Output) +} + +func TestReadFindValueDeepCmd(t *testing.T) { + content := `animals: + - cat + - dog + - rat +` + filename := test.WriteTempYamlFile(content) + defer test.RemoveTempYamlFile(filename) + cmd := getRootCommand() + result := test.RunCmd(cmd, fmt.Sprintf("r %s animals(.==dog)", filename)) + if result.Error != nil { + t.Error(result.Error) + } + + expectedOutput := `dog +` + test.AssertResult(t, expectedOutput, result.Output) +} + func TestDeleteYamlArrayExpressionCmd(t *testing.T) { content := `- name: fred - name: cat diff --git a/pkg/yqlib/path_parser.go b/pkg/yqlib/path_parser.go index 90a5f8a1..4e518990 100644 --- a/pkg/yqlib/path_parser.go +++ b/pkg/yqlib/path_parser.go @@ -65,6 +65,14 @@ func (p *pathParser) MatchesNextPathElement(nodeContext NodeContext, nodeKey str } log.Debug("done deep recursing, found %v matches", len(navigationStrategy.GetVisitedNodes())) return len(navigationStrategy.GetVisitedNodes()) > 0 + } else if strings.Contains(headString, "==") && nodeContext.Node.Kind == yaml.ScalarNode { + result := strings.SplitN(headString, "==", 2) + path := strings.TrimSpace(result[0]) + value := strings.TrimSpace(result[1]) + if path == "." { + log.Debug("need to match scalar") + return matchesString(value, nodeContext.Node.Value) + } } if head == "+" {