mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08:00 
			
		
		
		
	Fixed create yaml
This commit is contained in:
		
							parent
							
								
									c9229439f7
								
							
						
					
					
						commit
						08f579f4e3
					
				| @ -63,7 +63,6 @@ func evaluateSequence(cmd *cobra.Command, args []string) error { | ||||
| 	printer := yqlib.NewPrinter(out, outputToJSON, unwrapScalar, colorsEnabled, indent, !noDocSeparators) | ||||
| 
 | ||||
| 	streamEvaluator := yqlib.NewStreamEvaluator() | ||||
| 	allAtOnceEvaluator := yqlib.NewAllAtOnceEvaluator() | ||||
| 
 | ||||
| 	switch len(args) { | ||||
| 	case 0: | ||||
| @ -75,7 +74,7 @@ func evaluateSequence(cmd *cobra.Command, args []string) error { | ||||
| 		} | ||||
| 	case 1: | ||||
| 		if nullInput { | ||||
| 			err = allAtOnceEvaluator.EvaluateFiles(args[0], []string{}, printer) | ||||
| 			err = streamEvaluator.EvaluateNew(args[0], printer) | ||||
| 		} else { | ||||
| 			err = streamEvaluator.EvaluateFiles("", []string{args[0]}, printer) | ||||
| 		} | ||||
|  | ||||
| @ -5,6 +5,18 @@ Which will assign the LHS node values to the RHS node values. The RHS expression | ||||
| 
 | ||||
| ### relative form: `|=` | ||||
| This will do a similar thing to the plain form, however, the RHS expression is run against _the LHS nodes_. This is useful for updating values based on old values, e.g. increment. | ||||
| ## Create yaml file | ||||
| Running | ||||
| ```bash | ||||
| yq eval --null-input '(.a.b = "cat") | (.x = "frog")' | ||||
| ``` | ||||
| will output | ||||
| ```yaml | ||||
| a: | ||||
|   b: cat | ||||
| x: frog | ||||
| ``` | ||||
| 
 | ||||
| ## Update node to be the child value | ||||
| Given a sample.yml file of: | ||||
| ```yaml | ||||
|  | ||||
| @ -36,6 +36,11 @@ func AssignUpdateOperator(d *dataTreeNavigator, matchingNodes *list.List, pathNo | ||||
| 			candidate.UpdateFrom(first.Value.(*CandidateNode)) | ||||
| 		} | ||||
| 	} | ||||
| 	// // if there was nothing given, perhaps we are creating a new yaml doc | ||||
| 	// if matchingNodes.Len() == 0 { | ||||
| 	// 	log.Debug("started with nothing, returning LHS, %v", lhs.Len()) | ||||
| 	// 	return lhs, nil | ||||
| 	// } | ||||
| 	return matchingNodes, nil | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -5,6 +5,13 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| var assignOperatorScenarios = []expressionScenario{ | ||||
| 	{ | ||||
| 		description: "Create yaml file", | ||||
| 		expression:  `(.a.b = "cat") | (.x = "frog")`, | ||||
| 		expected: []string{ | ||||
| 			"D0, P[], ()::a:\n    b: cat\nx: frog\n", | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		description: "Update node to be the child value", | ||||
| 		document:    `{a: {b: {g: foof}}}`, | ||||
|  | ||||
| @ -11,6 +11,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/mikefarah/yq/v4/test" | ||||
| 	yaml "gopkg.in/yaml.v3" | ||||
| ) | ||||
| 
 | ||||
| type expressionScenario struct { | ||||
| @ -40,6 +41,15 @@ func testScenario(t *testing.T, s *expressionScenario) { | ||||
| 			t.Error(err, s.document) | ||||
| 			return | ||||
| 		} | ||||
| 	} else { | ||||
| 		candidateNode := &CandidateNode{ | ||||
| 			Document:  0, | ||||
| 			Filename:  "", | ||||
| 			Node:      &yaml.Node{Tag: "!!null"}, | ||||
| 			FileIndex: 0, | ||||
| 		} | ||||
| 		inputs.PushBack(candidateNode) | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	results, err = treeNavigator.GetMatchingNodes(inputs, node) | ||||
| @ -152,20 +162,20 @@ func documentScenarios(t *testing.T, title string, scenarios []expressionScenari | ||||
| 			var output bytes.Buffer | ||||
| 			var err error | ||||
| 			printer := NewPrinter(bufio.NewWriter(&output), false, true, false, 2, true) | ||||
| 			streamEvaluator := NewStreamEvaluator() | ||||
| 
 | ||||
| 			if s.document != "" { | ||||
| 				node, err := treeCreator.ParsePath(s.expression) | ||||
| 				if err != nil { | ||||
| 					t.Error(err) | ||||
| 				} | ||||
| 				streamEvaluator := NewStreamEvaluator() | ||||
| 				err = streamEvaluator.Evaluate("sample.yaml", strings.NewReader(formattedDoc), node, printer) | ||||
| 
 | ||||
| 				if err != nil { | ||||
| 					t.Error(err) | ||||
| 				} | ||||
| 			} else { | ||||
| 				allAtOnceEvaluator := NewAllAtOnceEvaluator() | ||||
| 				err = allAtOnceEvaluator.EvaluateFiles(s.expression, []string{}, printer) | ||||
| 				err = streamEvaluator.EvaluateNew(s.expression, printer) | ||||
| 				if err != nil { | ||||
| 					t.Error(err) | ||||
| 				} | ||||
|  | ||||
| @ -11,6 +11,7 @@ import ( | ||||
| type StreamEvaluator interface { | ||||
| 	Evaluate(filename string, reader io.Reader, node *PathTreeNode, printer Printer) error | ||||
| 	EvaluateFiles(expression string, filenames []string, printer Printer) error | ||||
| 	EvaluateNew(expression string, printer Printer) error | ||||
| } | ||||
| 
 | ||||
| type streamEvaluator struct { | ||||
| @ -23,6 +24,27 @@ func NewStreamEvaluator() StreamEvaluator { | ||||
| 	return &streamEvaluator{treeNavigator: NewDataTreeNavigator(), treeCreator: NewPathTreeCreator()} | ||||
| } | ||||
| 
 | ||||
| func (s *streamEvaluator) EvaluateNew(expression string, printer Printer) error { | ||||
| 	node, err := treeCreator.ParsePath(expression) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	candidateNode := &CandidateNode{ | ||||
| 		Document:  0, | ||||
| 		Filename:  "", | ||||
| 		Node:      &yaml.Node{Tag: "!!null"}, | ||||
| 		FileIndex: 0, | ||||
| 	} | ||||
| 	inputList := list.New() | ||||
| 	inputList.PushBack(candidateNode) | ||||
| 
 | ||||
| 	matches, errorParsing := treeNavigator.GetMatchingNodes(inputList, node) | ||||
| 	if errorParsing != nil { | ||||
| 		return errorParsing | ||||
| 	} | ||||
| 	return printer.PrintResults(matches) | ||||
| } | ||||
| 
 | ||||
| func (s *streamEvaluator) EvaluateFiles(expression string, filenames []string, printer Printer) error { | ||||
| 
 | ||||
| 	node, err := treeCreator.ParsePath(expression) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user