mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08:00 
			
		
		
		
	Fixed recursive decent on empty objects/arrays
This commit is contained in:
		
							parent
							
								
									0a66bb797d
								
							
						
					
					
						commit
						5205f01248
					
				| @ -2,6 +2,7 @@ Add behaves differently according to the type of the LHS: | |||||||
| - arrays: concatenate | - arrays: concatenate | ||||||
| - number scalars: arithmetic addition (soon) | - number scalars: arithmetic addition (soon) | ||||||
| - string scalars: concatenate (soon) | - string scalars: concatenate (soon) | ||||||
|  | 
 | ||||||
| ## Concatenate arrays | ## Concatenate arrays | ||||||
| Given a sample.yml file of: | Given a sample.yml file of: | ||||||
| ```yaml | ```yaml | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| Add behaves differently according to the type of the LHS: | Add behaves differently according to the type of the LHS: | ||||||
| - arrays: concatenate | - arrays: concatenate | ||||||
| - number scalars: arithmetic addition (soon) | - number scalars: arithmetic addition (soon) | ||||||
| - string scalars: concatenate (soon) | - string scalars: concatenate (soon) | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ type OperationType struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // operators TODO: | // operators TODO: | ||||||
|  | // - cookbook doc for common things | ||||||
| // - write in place | // - write in place | ||||||
| // - mergeAppend (merges and appends arrays) | // - mergeAppend (merges and appends arrays) | ||||||
| // - mergeEmpty (sets only if the document is empty, do I do that now?) | // - mergeEmpty (sets only if the document is empty, do I do that now?) | ||||||
| @ -70,9 +71,6 @@ var Select = &OperationType{Type: "SELECT", NumArgs: 1, Precedence: 50, Handler: | |||||||
| var Has = &OperationType{Type: "HAS", NumArgs: 1, Precedence: 50, Handler: HasOperator} | var Has = &OperationType{Type: "HAS", NumArgs: 1, Precedence: 50, Handler: HasOperator} | ||||||
| var DeleteChild = &OperationType{Type: "DELETE", NumArgs: 1, Precedence: 40, Handler: DeleteChildOperator} | var DeleteChild = &OperationType{Type: "DELETE", NumArgs: 1, Precedence: 40, Handler: DeleteChildOperator} | ||||||
| 
 | 
 | ||||||
| // var Exists = &OperationType{Type: "Length", NumArgs: 2, Precedence: 35} |  | ||||||
| // filters matches if they have the existing path |  | ||||||
| 
 |  | ||||||
| type Operation struct { | type Operation struct { | ||||||
| 	OperationType *OperationType | 	OperationType *OperationType | ||||||
| 	Value         interface{} | 	Value         interface{} | ||||||
|  | |||||||
| @ -13,6 +13,13 @@ var multiplyOperatorScenarios = []expressionScenario{ | |||||||
| 			"D0, P[], (!!map)::{a: {also: me}, b: {also: me}}\n", | 			"D0, P[], (!!map)::{a: {also: me}, b: {also: me}}\n", | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		skipDoc:    true, | ||||||
|  | 		expression: `{} * {"cat":"dog"}`, | ||||||
|  | 		expected: []string{ | ||||||
|  | 			"D0, P[], (!!map)::cat: dog\n", | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		skipDoc:    true, | 		skipDoc:    true, | ||||||
| 		document:   `{a: {also: me}, b: {also: [1]}}`, | 		document:   `{a: {also: me}, b: {also: [1]}}`, | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ func recursiveDecent(d *dataTreeNavigator, results *list.List, matchMap *list.Li | |||||||
| 		log.Debugf("Recursive Decent, added %v", NodeToString(candidate)) | 		log.Debugf("Recursive Decent, added %v", NodeToString(candidate)) | ||||||
| 		results.PushBack(candidate) | 		results.PushBack(candidate) | ||||||
| 
 | 
 | ||||||
| 		if candidate.Node.Kind != yaml.AliasNode { | 		if candidate.Node.Kind != yaml.AliasNode && len(candidate.Node.Content) > 0 { | ||||||
| 
 | 
 | ||||||
| 			children, err := Splat(d, nodeToMap(candidate)) | 			children, err := Splat(d, nodeToMap(candidate)) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,6 +5,22 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var recursiveDescentOperatorScenarios = []expressionScenario{ | var recursiveDescentOperatorScenarios = []expressionScenario{ | ||||||
|  | 	{ | ||||||
|  | 		skipDoc:    true, | ||||||
|  | 		document:   `{}`, | ||||||
|  | 		expression: `..`, | ||||||
|  | 		expected: []string{ | ||||||
|  | 			"D0, P[], (!!map)::{}\n", | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		skipDoc:    true, | ||||||
|  | 		document:   `[]`, | ||||||
|  | 		expression: `..`, | ||||||
|  | 		expected: []string{ | ||||||
|  | 			"D0, P[], (!!seq)::[]\n", | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		skipDoc:    true, | 		skipDoc:    true, | ||||||
| 		document:   `cat`, | 		document:   `cat`, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user