mirror of
https://github.com/taigrr/yq
synced 2025-01-18 04:53:17 -08:00
refining
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user