1
0
mirror of https://github.com/taigrr/yq synced 2025-01-18 04:53:17 -08:00
This commit is contained in:
Mike Farah
2020-11-06 14:37:01 +11:00
parent b290a65602
commit 2edf64182b
9 changed files with 129 additions and 89 deletions

View File

@@ -4,8 +4,6 @@ import (
"container/list"
)
var treeCreator = NewPathTreeCreator()
func resultsToString(results *list.List) []string {
var pretty []string = make([]string, 0)
for el := results.Front(); el != nil; el = el.Next() {

View File

@@ -22,6 +22,15 @@ var documentIndexScenarios = []expressionScenario{
"D1, P[], (doc)::a: frog\n",
},
},
{
description: "Print Document Index with matches",
document: "a: cat\n---\na: frog\n",
expression: `.a | {"match": ., "doc": (. | documentIndex)}`,
expected: []string{
"D0, P[], (!!map)::match: cat\ndoc: 0\n",
"D1, P[], (!!map)::match: frog\ndoc: 1\n",
},
},
}
func TestDocumentIndexScenarios(t *testing.T) {

View File

@@ -18,7 +18,11 @@ type OperationType struct {
// operators TODO:
// - generator doc from operator tests
// - documentIndex - retrieves document index, can be used with select
// - slurp - stdin, read in sequence, vs read all
// - write in place
// - get path operator (like doc index)
// - get file index op (like doc index)
// - get file name op (like doc index)
// - mergeAppend (merges and appends arrays)
// - mergeEmpty (sets only if the document is empty, do I do that now?)
// - updateTag - not recursive

View File

@@ -3,6 +3,7 @@ package yqlib
import (
"bufio"
"bytes"
"container/list"
"fmt"
"os"
"strings"
@@ -20,15 +21,16 @@ type expressionScenario struct {
}
func testScenario(t *testing.T, s *expressionScenario) {
node, errPath := treeCreator.ParsePath(s.expression)
if errPath != nil {
t.Error(errPath)
return
var results *list.List
var err error
if s.document != "" {
results, err = EvaluateStream("sample.yaml", strings.NewReader(s.document), s.expression)
} else {
results, err = EvaluateExpression(s.expression)
}
results, errNav := EvaluateStream("sample.yaml", strings.NewReader(s.document), node)
if errNav != nil {
t.Error(errNav)
if err != nil {
t.Error(err)
return
}
test.AssertResultComplexWithContext(t, s.expected, resultsToString(results), fmt.Sprintf("exp: %v\ndoc: %v", s.expression, s.document))
@@ -66,13 +68,15 @@ func documentScenarios(t *testing.T, title string, scenarios []expressionScenari
w.WriteString(fmt.Sprintf("Result\n"))
node, errPath := treeCreator.ParsePath(s.expression)
if errPath != nil {
t.Error(errPath)
return
}
var output bytes.Buffer
results, err := EvaluateStream("sample.yaml", strings.NewReader(s.document), node)
var results *list.List
var err error
if s.document != "" {
results, err = EvaluateStream("sample.yaml", strings.NewReader(s.document), s.expression)
} else {
results, err = EvaluateExpression(s.expression)
}
printer.PrintResults(results, bufio.NewWriter(&output))
w.WriteString(fmt.Sprintf("```yaml\n%v```\n", output.String()))

View File

@@ -43,6 +43,15 @@ func (p *resultsPrinter) writeString(writer io.Writer, txt string) error {
}
func (p *resultsPrinter) PrintResults(matchingNodes *list.List, writer io.Writer) error {
var err error
if p.outputToJSON {
explodeOp := Operation{OperationType: Explode}
explodeNode := PathTreeNode{Operation: &explodeOp}
matchingNodes, err = treeNavigator.GetMatchingNodes(matchingNodes, &explodeNode)
if err != nil {
return err
}
}
bufferedWriter := bufio.NewWriter(writer)
defer safelyFlush(bufferedWriter)

View File

@@ -3,7 +3,6 @@ package yqlib
import (
"bufio"
"container/list"
"errors"
"io"
"os"
@@ -11,12 +10,9 @@ import (
)
var treeNavigator = NewDataTreeNavigator(NavigationPrefs{})
var treeCreator = NewPathTreeCreator()
func readStream(filename string) (io.Reader, error) {
if filename == "" {
return nil, errors.New("Must provide filename")
}
var stream io.Reader
if filename == "-" {
stream = bufio.NewReader(os.Stdin)
@@ -31,7 +27,20 @@ func readStream(filename string) (io.Reader, error) {
return stream, nil
}
func EvaluateStream(filename string, reader io.Reader, node *PathTreeNode) (*list.List, error) {
func EvaluateExpression(expression string) (*list.List, error) {
node, err := treeCreator.ParsePath(expression)
if err != nil {
return nil, err
}
return treeNavigator.GetMatchingNodes(list.New(), node)
}
func EvaluateStream(filename string, reader io.Reader, expression string) (*list.List, error) {
node, err := treeCreator.ParsePath(expression)
if err != nil {
return nil, err
}
var matchingNodes = list.New()
var currentIndex uint = 0
@@ -63,13 +72,13 @@ func EvaluateStream(filename string, reader io.Reader, node *PathTreeNode) (*lis
}
}
func Evaluate(filename string, node *PathTreeNode) (*list.List, error) {
func Evaluate(filename string, expression string) (*list.List, error) {
var reader, err = readStream(filename)
if err != nil {
return nil, err
}
return EvaluateStream(filename, reader, node)
return EvaluateStream(filename, reader, expression)
}