mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
wip
This commit is contained in:
parent
b025000f20
commit
7c4cf72468
@ -18,7 +18,7 @@ func readDoc(t *testing.T, content string) []*CandidateNode {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
return []*CandidateNode{&CandidateNode{Node: &dataBucket, Document: 0}}
|
||||
return []*CandidateNode{&CandidateNode{Node: dataBucket.Content[0], Document: 0}}
|
||||
}
|
||||
|
||||
func resultsToString(results []*CandidateNode) string {
|
||||
@ -54,7 +54,7 @@ func TestDataTreeNavigatorSimple(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSubtractSimple(t *testing.T) {
|
||||
func TestDataTreeNavigatorDeleteSimple(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
b: apple
|
||||
@ -79,7 +79,7 @@ func TestDataTreeNavigatorSubtractSimple(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSubtractTwice(t *testing.T) {
|
||||
func TestDataTreeNavigatorDeleteTwice(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
b: apple
|
||||
@ -106,7 +106,7 @@ func TestDataTreeNavigatorSubtractTwice(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSubtractWithUnion(t *testing.T) {
|
||||
func TestDataTreeNavigatorDeleteWithUnion(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
b: apple
|
||||
@ -133,7 +133,7 @@ func TestDataTreeNavigatorSubtractWithUnion(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSubtractByIndex(t *testing.T) {
|
||||
func TestDataTreeNavigatorDeleteByIndex(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
- b: apple
|
||||
@ -160,6 +160,86 @@ func TestDataTreeNavigatorSubtractByIndex(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorDeleteByFind(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
- b: apple
|
||||
- b: sdfsd
|
||||
- b: apple`)
|
||||
|
||||
path, errPath := treeCreator.ParsePath("(a .- (* == apple))")
|
||||
if errPath != nil {
|
||||
t.Error(errPath)
|
||||
}
|
||||
results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
|
||||
|
||||
if errNav != nil {
|
||||
t.Error(errNav)
|
||||
}
|
||||
|
||||
expected := `
|
||||
-- Node --
|
||||
Document 0, path: [a]
|
||||
Tag: !!seq, Kind: SequenceNode, Anchor:
|
||||
- b: sdfsd
|
||||
`
|
||||
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorDeleteArrayByFind(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
- apple
|
||||
- sdfsd
|
||||
- apple`)
|
||||
|
||||
path, errPath := treeCreator.ParsePath("(a .- (. == apple))")
|
||||
if errPath != nil {
|
||||
t.Error(errPath)
|
||||
}
|
||||
results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
|
||||
|
||||
if errNav != nil {
|
||||
t.Error(errNav)
|
||||
}
|
||||
|
||||
expected := `
|
||||
-- Node --
|
||||
Document 0, path: [a]
|
||||
Tag: !!seq, Kind: SequenceNode, Anchor:
|
||||
- sdfsd
|
||||
`
|
||||
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorDeleteViaSelf(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `- apple
|
||||
- sdfsd
|
||||
- apple`)
|
||||
|
||||
path, errPath := treeCreator.ParsePath("(. .- .)")
|
||||
if errPath != nil {
|
||||
t.Error(errPath)
|
||||
}
|
||||
results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
|
||||
|
||||
if errNav != nil {
|
||||
t.Error(errNav)
|
||||
}
|
||||
|
||||
expected := `
|
||||
-- Node --
|
||||
Document 0, path: []
|
||||
Tag: !!seq, Kind: SequenceNode, Anchor:
|
||||
- sdfsd
|
||||
`
|
||||
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorDeleteAndWrite(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
@ -192,7 +272,7 @@ func TestDataTreeNavigatorDeleteAndWrite(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSubtractArray(t *testing.T) {
|
||||
func TestDataTreeNavigatorDeleteArray(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
- b: apple
|
||||
@ -268,6 +348,56 @@ func TestDataTreeNavigatorSimpleAssign(t *testing.T) {
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSimpleAssignSelf(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
b: apple`)
|
||||
|
||||
path, errPath := treeCreator.ParsePath("a(. == apple)(. := frog)")
|
||||
if errPath != nil {
|
||||
t.Error(errPath)
|
||||
}
|
||||
results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
|
||||
|
||||
if errNav != nil {
|
||||
t.Error(errNav)
|
||||
}
|
||||
|
||||
expected := `
|
||||
-- Node --
|
||||
Document 0, path: [a b]
|
||||
Tag: !!str, Kind: ScalarNode, Anchor:
|
||||
frog
|
||||
`
|
||||
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorSimpleAssignByFind(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `a:
|
||||
b: apple`)
|
||||
|
||||
path, errPath := treeCreator.ParsePath("(b == apple) := frog)")
|
||||
if errPath != nil {
|
||||
t.Error(errPath)
|
||||
}
|
||||
results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
|
||||
|
||||
if errNav != nil {
|
||||
t.Error(errNav)
|
||||
}
|
||||
|
||||
expected := `
|
||||
-- Node --
|
||||
Document 0, path: [a b]
|
||||
Tag: !!str, Kind: ScalarNode, Anchor:
|
||||
frog
|
||||
`
|
||||
|
||||
test.AssertResult(t, expected, resultsToString(results))
|
||||
}
|
||||
|
||||
func TestDataTreeNavigatorArraySplat(t *testing.T) {
|
||||
|
||||
nodes := readDoc(t, `- b: apple
|
||||
|
@ -26,8 +26,10 @@ func DeleteChildOperator(d *dataTreeNavigator, matchingNodes *orderedmap.Ordered
|
||||
|
||||
if candidate.Node.Kind == yaml.SequenceNode {
|
||||
deleteFromArray(candidate, nodesToDelete)
|
||||
} else {
|
||||
} else if candidate.Node.Kind == yaml.MappingNode {
|
||||
deleteFromMap(candidate, nodesToDelete)
|
||||
} else {
|
||||
log.Debug("Cannot delete from node that's not a map or array %v", NodeToString(candidate))
|
||||
}
|
||||
}
|
||||
return lhs, nil
|
||||
|
@ -84,17 +84,10 @@ func EqualsOperator(d *dataTreeNavigator, matchMap *orderedmap.OrderedMap, pathN
|
||||
valuePattern := pathNode.Rhs.PathElement.StringValue
|
||||
log.Debug("checking %v", candidate)
|
||||
|
||||
// if pathNode.Lhs.PathElement.PathElementType == SelfReference {
|
||||
// if Match(candidate.Node.Value, valuePattern) {
|
||||
// results.Set(el.Key, el.Value)
|
||||
// }
|
||||
// } else {
|
||||
errInChild := findMatchingChildren(d, results, candidate, pathNode.Lhs, valuePattern)
|
||||
if errInChild != nil {
|
||||
return nil, errInChild
|
||||
}
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
return results, nil
|
||||
|
@ -16,7 +16,7 @@ type Token struct {
|
||||
OperationType OperationType
|
||||
Value interface{}
|
||||
StringValue string
|
||||
AgainstSelf bool
|
||||
PrefixSelf bool
|
||||
|
||||
CheckForPreTraverse bool // this token can sometimes have the traverse '.' missing in frnot of it
|
||||
// e.g. a[1] should really be a.[1]
|
||||
@ -37,13 +37,13 @@ func pathToken(wrapped bool) lex.Action {
|
||||
func opToken(op OperationType, againstSelf bool) lex.Action {
|
||||
return func(s *lex.Scanner, m *machines.Match) (interface{}, error) {
|
||||
value := string(m.Bytes)
|
||||
return &Token{PathElementType: Operation, OperationType: op, Value: value, StringValue: value, AgainstSelf: againstSelf}, nil
|
||||
return &Token{PathElementType: Operation, OperationType: op, Value: value, StringValue: value, PrefixSelf: againstSelf}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func literalToken(pType PathElementType, literal string, checkForPre bool, checkForPost bool) lex.Action {
|
||||
func literalToken(pType PathElementType, literal string, checkForPre bool, checkForPost bool, againstSelf bool) lex.Action {
|
||||
return func(s *lex.Scanner, m *machines.Match) (interface{}, error) {
|
||||
return &Token{PathElementType: pType, Value: literal, StringValue: literal, CheckForPreTraverse: checkForPre, CheckForPostTraverse: checkForPost}, nil
|
||||
return &Token{PathElementType: pType, Value: literal, StringValue: literal, CheckForPreTraverse: checkForPre, CheckForPostTraverse: checkForPost, PrefixSelf: againstSelf}, nil
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,12 +68,13 @@ func arrayIndextoken(wrapped bool, checkForPre bool, checkForPost bool) lex.Acti
|
||||
// Creates the lexer object and compiles the NFA.
|
||||
func initLexer() (*lex.Lexer, error) {
|
||||
lexer := lex.NewLexer()
|
||||
lexer.Add([]byte(`\(`), literalToken(OpenBracket, "(", true, false))
|
||||
lexer.Add([]byte(`\)`), literalToken(CloseBracket, ")", false, true))
|
||||
lexer.Add([]byte(`\(`), literalToken(OpenBracket, "(", true, false, false))
|
||||
lexer.Add([]byte(`\)`), literalToken(CloseBracket, ")", false, true, false))
|
||||
lexer.Add([]byte(`\.\s*\)`), literalToken(CloseBracket, ")", false, true, true))
|
||||
|
||||
lexer.Add([]byte(`\[\+\]`), literalToken(PathKey, "[+]", true, true))
|
||||
lexer.Add([]byte(`\[\*\]`), literalToken(PathKey, "[*]", true, true))
|
||||
lexer.Add([]byte(`\*\*`), literalToken(PathKey, "**", false, false))
|
||||
lexer.Add([]byte(`\[\+\]`), literalToken(PathKey, "[+]", true, true, false))
|
||||
lexer.Add([]byte(`\[\*\]`), literalToken(PathKey, "[*]", true, true, false))
|
||||
lexer.Add([]byte(`\*\*`), literalToken(PathKey, "**", false, false, false))
|
||||
|
||||
lexer.Add([]byte(`([Oo][Rr])`), opToken(Or, false))
|
||||
lexer.Add([]byte(`([Aa][Nn][Dd])`), opToken(And, false))
|
||||
@ -143,7 +144,7 @@ func (p *pathTokeniser) Tokenise(path string) ([]*Token, error) {
|
||||
(tokens[index-1].PathElementType == PathKey || tokens[index-1].PathElementType == CloseBracket) {
|
||||
postProcessedTokens = append(postProcessedTokens, &Token{PathElementType: Operation, OperationType: Traverse, Value: "."})
|
||||
}
|
||||
if token.PathElementType == Operation && token.AgainstSelf {
|
||||
if token.PrefixSelf {
|
||||
postProcessedTokens = append(postProcessedTokens, &Token{PathElementType: SelfReference, Value: "SELF"})
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user