mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08:00 
			
		
		
		
	Fixed printer
This commit is contained in:
		
							parent
							
								
									79867473d5
								
							
						
					
					
						commit
						a57944d123
					
				| @ -14,6 +14,5 @@ var noDocSeparators = false | |||||||
| var nullInput = false | var nullInput = false | ||||||
| var verbose = false | var verbose = false | ||||||
| var version = false | var version = false | ||||||
| var shellCompletion = "" |  | ||||||
| 
 | 
 | ||||||
| // var log = logging.MustGetLogger("yq") | // var log = logging.MustGetLogger("yq") | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								cmd/root.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								cmd/root.go
									
									
									
									
									
								
							| @ -1,7 +1,6 @@ | |||||||
| package cmd | package cmd | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"os" | 	"os" | ||||||
| 
 | 
 | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| @ -18,20 +17,6 @@ func New() *cobra.Command { | |||||||
| 				cmd.Print(GetVersionDisplay()) | 				cmd.Print(GetVersionDisplay()) | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 			if shellCompletion != "" { |  | ||||||
| 				switch shellCompletion { |  | ||||||
| 				case "bash", "": |  | ||||||
| 					return cmd.GenBashCompletion(os.Stdout) |  | ||||||
| 				case "zsh": |  | ||||||
| 					return cmd.GenZshCompletion(os.Stdout) |  | ||||||
| 				case "fish": |  | ||||||
| 					return cmd.GenFishCompletion(os.Stdout, true) |  | ||||||
| 				case "powershell": |  | ||||||
| 					return cmd.GenPowerShellCompletion(os.Stdout) |  | ||||||
| 				default: |  | ||||||
| 					return fmt.Errorf("Unknown variant %v", shellCompletion) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			cmd.Println(cmd.UsageString()) | 			cmd.Println(cmd.UsageString()) | ||||||
| 			return nil | 			return nil | ||||||
| 
 | 
 | ||||||
| @ -62,10 +47,12 @@ func New() *cobra.Command { | |||||||
| 	rootCmd.PersistentFlags().IntVarP(&indent, "indent", "I", 2, "sets indent level for output") | 	rootCmd.PersistentFlags().IntVarP(&indent, "indent", "I", 2, "sets indent level for output") | ||||||
| 	rootCmd.Flags().BoolVarP(&version, "version", "V", false, "Print version information and quit") | 	rootCmd.Flags().BoolVarP(&version, "version", "V", false, "Print version information and quit") | ||||||
| 
 | 
 | ||||||
| 	rootCmd.Flags().StringVarP(&shellCompletion, "shellCompletion", "", "", "[bash/zsh/powershell/fish] prints shell completion script") |  | ||||||
| 
 |  | ||||||
| 	rootCmd.PersistentFlags().BoolVarP(&forceColor, "colors", "C", false, "force print with colors") | 	rootCmd.PersistentFlags().BoolVarP(&forceColor, "colors", "C", false, "force print with colors") | ||||||
| 	rootCmd.PersistentFlags().BoolVarP(&forceNoColor, "no-colors", "M", false, "force print with no colors") | 	rootCmd.PersistentFlags().BoolVarP(&forceNoColor, "no-colors", "M", false, "force print with no colors") | ||||||
| 	rootCmd.AddCommand(createEvaluateSequenceCommand(), createEvaluateAllCommand()) | 	rootCmd.AddCommand( | ||||||
|  | 		createEvaluateSequenceCommand(), | ||||||
|  | 		createEvaluateAllCommand(), | ||||||
|  | 		completionCmd, | ||||||
|  | 	) | ||||||
| 	return rootCmd | 	return rootCmd | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										61
									
								
								cmd/shell-completion.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								cmd/shell-completion.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | package cmd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"os" | ||||||
|  | 
 | ||||||
|  | 	"github.com/spf13/cobra" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var completionCmd = &cobra.Command{ | ||||||
|  | 	Use:   "shell-completion [bash|zsh|fish|powershell]", | ||||||
|  | 	Short: "Generate completion script", | ||||||
|  | 	Long: `To load completions: | ||||||
|  | 
 | ||||||
|  | Bash: | ||||||
|  | 
 | ||||||
|  | $ source <(yq shell-completion bash) | ||||||
|  | 
 | ||||||
|  | # To load completions for each session, execute once: | ||||||
|  | Linux: | ||||||
|  |   $ yq shell-completion bash > /etc/bash_completion.d/yq | ||||||
|  | MacOS: | ||||||
|  |   $ yq shell-completion bash > /usr/local/etc/bash_completion.d/yq | ||||||
|  | 
 | ||||||
|  | Zsh: | ||||||
|  | 
 | ||||||
|  | # If shell completion is not already enabled in your environment you will need | ||||||
|  | # to enable it.  You can execute the following once: | ||||||
|  | 
 | ||||||
|  | $ echo "autoload -U compinit; compinit" >> ~/.zshrc | ||||||
|  | 
 | ||||||
|  | # To load completions for each session, execute once: | ||||||
|  | $ yq shell-completion zsh > "${fpath[1]}/_yq" | ||||||
|  | 
 | ||||||
|  | # You will need to start a new shell for this setup to take effect. | ||||||
|  | 
 | ||||||
|  | Fish: | ||||||
|  | 
 | ||||||
|  | $ yq shell-completion fish | source | ||||||
|  | 
 | ||||||
|  | # To load completions for each session, execute once: | ||||||
|  | $ yq shell-completion fish > ~/.config/fish/completions/yq.fish | ||||||
|  | `, | ||||||
|  | 	DisableFlagsInUseLine: true, | ||||||
|  | 	ValidArgs:             []string{"bash", "zsh", "fish", "powershell"}, | ||||||
|  | 	Args:                  cobra.ExactValidArgs(1), | ||||||
|  | 	RunE: func(cmd *cobra.Command, args []string) error { | ||||||
|  | 		var err error = nil | ||||||
|  | 		switch args[0] { | ||||||
|  | 		case "bash": | ||||||
|  | 			err = cmd.Root().GenBashCompletion(os.Stdout) | ||||||
|  | 		case "zsh": | ||||||
|  | 			err = cmd.Root().GenZshCompletion(os.Stdout) | ||||||
|  | 		case "fish": | ||||||
|  | 			err = cmd.Root().GenFishCompletion(os.Stdout, true) | ||||||
|  | 		case "powershell": | ||||||
|  | 			err = cmd.Root().GenPowerShellCompletion(os.Stdout) | ||||||
|  | 		} | ||||||
|  | 		return err | ||||||
|  | 
 | ||||||
|  | 	}, | ||||||
|  | } | ||||||
| @ -1,664 +0,0 @@ | |||||||
| package yqlib |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"container/list" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func resultsToString(results *list.List) []string { |  | ||||||
| 	var pretty []string = make([]string, 0) |  | ||||||
| 	for el := results.Front(); el != nil; el = el.Next() { |  | ||||||
| 		n := el.Value.(*CandidateNode) |  | ||||||
| 		pretty = append(pretty, NodeToString(n)) |  | ||||||
| 	} |  | ||||||
| 	return pretty |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteSimple(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   b: apple |  | ||||||
| //   c: camel`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a .- b") |  | ||||||
| // 	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: !!map, Kind: MappingNode, Anchor: |  | ||||||
| //   c: camel |  | ||||||
| // ` |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteTwice(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   b: apple |  | ||||||
| //   c: camel |  | ||||||
| //   d: dingo`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a .- b OR a .- c") |  | ||||||
| // 	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: !!map, Kind: MappingNode, Anchor: |  | ||||||
| //   d: dingo |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteWithUnion(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   b: apple |  | ||||||
| //   c: camel |  | ||||||
| //   d: dingo`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a .- (b OR c)") |  | ||||||
| // 	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: !!map, Kind: MappingNode, Anchor: |  | ||||||
| //   d: dingo |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteByIndex(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   - b: apple |  | ||||||
| //   - b: sdfsd |  | ||||||
| //   - b: apple`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("(a .- (0 or 1))") |  | ||||||
| // 	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: apple |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	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(". .- (. == apple)") |  | ||||||
| // 	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 TestDataTreeNavigatorFilterWithSplat(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: frog |  | ||||||
| //   b: dally |  | ||||||
| //   c: log`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath(".f | .[] == \"frog\"") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   2 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountAndCollectWithFilterCmd(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: frog |  | ||||||
| //   b: dally |  | ||||||
| //   c: log`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath(".f | .[] == *og ") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   2 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCollectWithFilter(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: frog |  | ||||||
| //   b: dally |  | ||||||
| //   c: log`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("f(collect(. == *og))") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: , Kind: SequenceNode, Anchor: |  | ||||||
| //   - frog |  | ||||||
| // - log |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountWithFilter2(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: frog |  | ||||||
| //   b: dally |  | ||||||
| //   c: log`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("count(f(. == *og))") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   2 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCollectWithFilter2(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: frog |  | ||||||
| //   b: dally |  | ||||||
| //   c: log`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("collect(f(. == *og))") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [] |  | ||||||
| //   Tag: , Kind: SequenceNode, Anchor: |  | ||||||
| //   - frog |  | ||||||
| // - log |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountMultipleMatchesInside(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: [1,2] |  | ||||||
| //   b: dally |  | ||||||
| //   c: [3,4,5]`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("f | count(a or c)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   2 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCollectMultipleMatchesInside(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: [1,2] |  | ||||||
| //   b: dally |  | ||||||
| //   c: [3,4,5]`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("f | collect(a or c)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: , Kind: SequenceNode, Anchor: |  | ||||||
| //   - [1, 2] |  | ||||||
| // - [3, 4, 5] |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountMultipleMatchesInsideSplat(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: [1,2,3] |  | ||||||
| //   b: [1,2,3,4] |  | ||||||
| //   c: [1,2,3,4,5]`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("f(count( (a or c)*))") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   8 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountMultipleMatchesOutside(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `f: |  | ||||||
| //   a: [1,2,3] |  | ||||||
| //   b: [1,2,3,4] |  | ||||||
| //   c: [1,2,3,4,5]`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("f(a or c)(count(*))") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f a] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   3 |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [f c] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   5 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountOfResults(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `- apple |  | ||||||
| // - sdfsd |  | ||||||
| // - apple`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("count(*)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   3 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorCountNoMatches(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `- apple |  | ||||||
| // - sdfsd |  | ||||||
| // - apple`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("count(5)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [] |  | ||||||
| //   Tag: !!int, Kind: ScalarNode, Anchor: |  | ||||||
| //   0 |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteAndWrite(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   - b: apple |  | ||||||
| //   - b: sdfsd |  | ||||||
| //   - { b: apple, c: cat }`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("(a .- (0 or 1)) or (a[0].b := 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] |  | ||||||
| //   Tag: !!seq, Kind: SequenceNode, Anchor: |  | ||||||
| //   - {b: frog, c: cat} |  | ||||||
| 
 |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [a 0 b] |  | ||||||
| //   Tag: !!str, Kind: ScalarNode, Anchor: |  | ||||||
| //   frog |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorDeleteArray(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   - b: apple |  | ||||||
| //   - b: sdfsd |  | ||||||
| //   - b: apple`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a .- (b == a*)") |  | ||||||
| // 	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 TestDataTreeNavigatorArraySimple(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `- b: apple`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("[0]") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [0] |  | ||||||
| //   Tag: !!map, Kind: MappingNode, Anchor: |  | ||||||
| //   b: apple |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorSimpleAssignByFind(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 TestDataTreeNavigatorOrDeDupes(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   cat: apple |  | ||||||
| //   mad: things`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a.(cat or cat)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [a cat] |  | ||||||
| //   Tag: !!str, Kind: ScalarNode, Anchor: |  | ||||||
| //   apple |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| 
 |  | ||||||
| // func TestDataTreeNavigatorAnd(t *testing.T) { |  | ||||||
| 
 |  | ||||||
| // 	nodes := readDoc(t, `a: |  | ||||||
| //   cat: apple |  | ||||||
| //   pat: apple |  | ||||||
| //   cow: apple |  | ||||||
| //   mad: things`) |  | ||||||
| 
 |  | ||||||
| // 	path, errPath := treeCreator.ParsePath("a.(*t and c*)") |  | ||||||
| // 	if errPath != nil { |  | ||||||
| // 		t.Error(errPath) |  | ||||||
| // 	} |  | ||||||
| // 	results, errNav := treeNavigator.GetMatchingNodes(nodes, path) |  | ||||||
| 
 |  | ||||||
| // 	if errNav != nil { |  | ||||||
| // 		t.Error(errNav) |  | ||||||
| // 	} |  | ||||||
| 
 |  | ||||||
| // 	expected := ` |  | ||||||
| // -- Node -- |  | ||||||
| //   Document 0, path: [a cat] |  | ||||||
| //   Tag: !!str, Kind: ScalarNode, Anchor: |  | ||||||
| //   apple |  | ||||||
| // ` |  | ||||||
| 
 |  | ||||||
| // 	test.AssertResult(t, expected, resultsToString(results)) |  | ||||||
| // } |  | ||||||
| @ -17,8 +17,9 @@ type OperationType struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // operators TODO: | // operators TODO: | ||||||
| // - generator doc from operator tests | // - add print test, particular for streams with multilpe docs | ||||||
| // - slurp - stdin, read in sequence, vs read all | // (one that print doc1, then doc 3) in two calls | ||||||
|  | // (one that prints doc1, then doc 3) in one call | ||||||
| // - write in place | // - write in place | ||||||
| // - get path operator (like doc index) | // - get path operator (like doc index) | ||||||
| // - get file index op (like doc index) | // - get file index op (like doc index) | ||||||
|  | |||||||
| @ -47,14 +47,14 @@ var collectObjectOperatorScenarios = []expressionScenario{ | |||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		description:           `Working with multiple documents`, | 		description:           `Working with multiple documents`, | ||||||
|  | 		dontFormatInputForDoc: false, | ||||||
| 		document:              "{name: Mike, pets: [cat, dog]}\n---\n{name: Rosey, pets: [monkey, sheep]}", | 		document:              "{name: Mike, pets: [cat, dog]}\n---\n{name: Rosey, pets: [monkey, sheep]}", | ||||||
| 		expression:            `{.name: .pets[]}`, | 		expression:            `{.name: .pets[]}`, | ||||||
| 		expected: []string{ | 		expected: []string{ | ||||||
| 			"D0, P[], (!!map)::Mike: cat\n", | 			"D0, P[], (!!map)::Mike: cat\n", | ||||||
| 			"D0, P[], (!!map)::Mike: dog\n", | 			"D0, P[], (!!map)::Mike: dog\n", | ||||||
| 			"D1, P[], (!!map)::Rosey: monkey\n", | 			"D0, P[], (!!map)::Rosey: monkey\n", | ||||||
| 			"D1, P[], (!!map)::Rosey: sheep\n", | 			"D0, P[], (!!map)::Rosey: sheep\n", | ||||||
| 			"this is producing incorrect formatted yaml", |  | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ func deleteFromMap(candidate *CandidateNode, nodesToDelete *list.List) { | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		shouldDelete := false | 		shouldDelete := false | ||||||
| 		for el := nodesToDelete.Front(); el != nil && shouldDelete == false; el = el.Next() { | 		for el := nodesToDelete.Front(); el != nil && !shouldDelete; el = el.Next() { | ||||||
| 			if el.Value.(*CandidateNode).GetKey() == childCandidate.GetKey() { | 			if el.Value.(*CandidateNode).GetKey() == childCandidate.GetKey() { | ||||||
| 				shouldDelete = true | 				shouldDelete = true | ||||||
| 			} | 			} | ||||||
| @ -82,7 +82,7 @@ func deleteFromArray(candidate *CandidateNode, nodesToDelete *list.List) { | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		shouldDelete := false | 		shouldDelete := false | ||||||
| 		for el := nodesToDelete.Front(); el != nil && shouldDelete == false; el = el.Next() { | 		for el := nodesToDelete.Front(); el != nil && !shouldDelete; el = el.Next() { | ||||||
| 			if el.Value.(*CandidateNode).GetKey() == childCandidate.GetKey() { | 			if el.Value.(*CandidateNode).GetKey() == childCandidate.GetKey() { | ||||||
| 				shouldDelete = true | 				shouldDelete = true | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -50,6 +50,15 @@ func testScenario(t *testing.T, s *expressionScenario) { | |||||||
| 	test.AssertResultComplexWithContext(t, s.expected, resultsToString(results), fmt.Sprintf("exp: %v\ndoc: %v", s.expression, s.document)) | 	test.AssertResultComplexWithContext(t, s.expected, resultsToString(results), fmt.Sprintf("exp: %v\ndoc: %v", s.expression, s.document)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func resultsToString(results *list.List) []string { | ||||||
|  | 	var pretty []string = make([]string, 0) | ||||||
|  | 	for el := results.Front(); el != nil; el = el.Next() { | ||||||
|  | 		n := el.Value.(*CandidateNode) | ||||||
|  | 		pretty = append(pretty, NodeToString(n)) | ||||||
|  | 	} | ||||||
|  | 	return pretty | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func writeOrPanic(w *bufio.Writer, text string) { | func writeOrPanic(w *bufio.Writer, text string) { | ||||||
| 	_, err := w.WriteString(text) | 	_, err := w.WriteString(text) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ type resultsPrinter struct { | |||||||
| 	printDocSeparators bool | 	printDocSeparators bool | ||||||
| 	writer             io.Writer | 	writer             io.Writer | ||||||
| 	firstTimePrinting  bool | 	firstTimePrinting  bool | ||||||
|  | 	previousDocIndex   uint | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewPrinter(writer io.Writer, outputToJSON bool, unwrapScalar bool, colorsEnabled bool, indent int, printDocSeparators bool) Printer { | func NewPrinter(writer io.Writer, outputToJSON bool, unwrapScalar bool, colorsEnabled bool, indent int, printDocSeparators bool) Printer { | ||||||
| @ -53,6 +54,7 @@ func (p *resultsPrinter) writeString(writer io.Writer, txt string) error { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { | func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { | ||||||
|  | 	log.Debug("PrintResults for %v matches", matchingNodes.Len()) | ||||||
| 	var err error | 	var err error | ||||||
| 	if p.outputToJSON { | 	if p.outputToJSON { | ||||||
| 		explodeOp := Operation{OperationType: Explode} | 		explodeOp := Operation{OperationType: Explode} | ||||||
| @ -70,13 +72,16 @@ func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { | |||||||
| 		log.Debug("no matching results, nothing to print") | 		log.Debug("no matching results, nothing to print") | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 	if p.firstTimePrinting { | ||||||
| 	previousDocIndex := matchingNodes.Front().Value.(*CandidateNode).Document | 		p.previousDocIndex = matchingNodes.Front().Value.(*CandidateNode).Document | ||||||
|  | 		p.firstTimePrinting = false | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	for el := matchingNodes.Front(); el != nil; el = el.Next() { | 	for el := matchingNodes.Front(); el != nil; el = el.Next() { | ||||||
| 		mappedDoc := el.Value.(*CandidateNode) | 		mappedDoc := el.Value.(*CandidateNode) | ||||||
| 
 | 		log.Debug("-- print sep logic: p.firstTimePrinting: %v, previousDocIndex: %v, mappedDoc.Document: %v, printDocSeparators: %v", p.firstTimePrinting, p.previousDocIndex, mappedDoc.Document, p.printDocSeparators) | ||||||
| 		if (!p.firstTimePrinting || (previousDocIndex != mappedDoc.Document)) && p.printDocSeparators { | 		if (p.previousDocIndex != mappedDoc.Document) && p.printDocSeparators { | ||||||
|  | 			log.Debug("-- writing doc sep") | ||||||
| 			if err := p.writeString(bufferedWriter, "---\n"); err != nil { | 			if err := p.writeString(bufferedWriter, "---\n"); err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| @ -87,9 +92,8 @@ func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error { | |||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		previousDocIndex = mappedDoc.Document | 		p.previousDocIndex = mappedDoc.Document | ||||||
| 	} | 	} | ||||||
| 	p.firstTimePrinting = false |  | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user