From be396deae1635c4a567adafdd02485d65e500d78 Mon Sep 17 00:00:00 2001 From: Tom Morelly Date: Sun, 12 May 2024 16:28:41 +0700 Subject: [PATCH] feat(export): switch to treeprint for multiline support in base export format --- cmd/root_test.go | 1 + go.mod | 1 + go.sum | 2 ++ pkg/printer/engine/engine_printer.go | 4 +-- pkg/printer/engine/engine_printer_test.go | 1 - pkg/printer/namespace/namespace_printer.go | 6 ++-- .../namespace/namespace_printer_test.go | 1 - pkg/printer/secret/base.go | 31 +++++++++++++------ pkg/printer/secret/base_test.go | 23 ++++++++++++++ pkg/printer/secret/json.go | 3 +- pkg/printer/secret/json_test.go | 6 ++-- 11 files changed, 58 insertions(+), 21 deletions(-) diff --git a/cmd/root_test.go b/cmd/root_test.go index d4f1a400..ba8facc8 100644 --- a/cmd/root_test.go +++ b/cmd/root_test.go @@ -67,6 +67,7 @@ func (s *VaultSuite) TestMode() { expected: `e2e/ [type=kv2] ├── sub [v=1] │ └── user=******** +│ └── sub2 [v=1] └── key=***** `, diff --git a/go.mod b/go.mod index 3a6a9a0f..0df82ddb 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/stretchr/testify v1.9.0 github.com/testcontainers/testcontainers-go v0.31.0 github.com/testcontainers/testcontainers-go/modules/vault v0.31.0 + github.com/xlab/treeprint v1.2.0 gotest.tools/gotestsum v1.11.0 ) diff --git a/go.sum b/go.sum index 39585633..f534099e 100644 --- a/go.sum +++ b/go.sum @@ -761,6 +761,8 @@ github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvni github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= diff --git a/pkg/printer/engine/engine_printer.go b/pkg/printer/engine/engine_printer.go index c22404ce..e6f2d7e1 100644 --- a/pkg/printer/engine/engine_printer.go +++ b/pkg/printer/engine/engine_printer.go @@ -112,14 +112,14 @@ func (p *Printer) Out(engines map[string][]string) error { return err } - fmt.Fprintln(p.writer, string(out)) + fmt.Fprint(p.writer, string(out)) case JSON: out, err := utils.ToJSON(map[string]interface{}{"engines": utils.RemoveDuplicates(engineList)}) if err != nil { return err } - fmt.Fprintln(p.writer, string(out)) + fmt.Fprint(p.writer, string(out)) case Base: for _, k := range utils.RemoveDuplicates(engineList) { fmt.Fprintln(p.writer, k) diff --git a/pkg/printer/engine/engine_printer_test.go b/pkg/printer/engine/engine_printer_test.go index 681c1703..b35cdabd 100644 --- a/pkg/printer/engine/engine_printer_test.go +++ b/pkg/printer/engine/engine_printer_test.go @@ -98,7 +98,6 @@ a1 expected: `engines: - a - b - `, }, { diff --git a/pkg/printer/namespace/namespace_printer.go b/pkg/printer/namespace/namespace_printer.go index d51ec4fa..7a1a0760 100644 --- a/pkg/printer/namespace/namespace_printer.go +++ b/pkg/printer/namespace/namespace_printer.go @@ -77,7 +77,7 @@ func NewPrinter(opts ...Option) *Printer { return p } -// Out prits out namespaces in various formats. +// Out prints out namespaces in various formats. // nolint: cyclop func (p *Printer) Out(ns map[string][]string) error { nsList := p.buildNamespaceList(ns) @@ -104,14 +104,14 @@ func (p *Printer) Out(ns map[string][]string) error { return err } - fmt.Fprintln(p.writer, string(out)) + fmt.Fprint(p.writer, string(out)) case JSON: out, err := utils.ToJSON(map[string]interface{}{"namespaces": utils.RemoveDuplicates(nsList)}) if err != nil { return err } - fmt.Fprintln(p.writer, string(out)) + fmt.Fprint(p.writer, string(out)) case Base: for _, k := range utils.RemoveDuplicates(nsList) { fmt.Fprintln(p.writer, k) diff --git a/pkg/printer/namespace/namespace_printer_test.go b/pkg/printer/namespace/namespace_printer_test.go index b28d5b06..bbe6d94b 100644 --- a/pkg/printer/namespace/namespace_printer_test.go +++ b/pkg/printer/namespace/namespace_printer_test.go @@ -106,7 +106,6 @@ a/a2 expected: `namespaces: - a - b - `, }, { diff --git a/pkg/printer/secret/base.go b/pkg/printer/secret/base.go index 6ecadc2b..1fcb6699 100644 --- a/pkg/printer/secret/base.go +++ b/pkg/printer/secret/base.go @@ -4,15 +4,16 @@ import ( "fmt" "net/url" "path" + "strconv" "strings" "github.com/FalcoSuessgott/vkv/pkg/utils" - "github.com/disiqueira/gotree/v3" "github.com/savioxavier/termlink" + "github.com/xlab/treeprint" ) func (p *Printer) printBase(enginePath string, secrets map[string]interface{}) error { - var tree gotree.Tree + var tree treeprint.Tree m := make(map[string]interface{}) @@ -39,37 +40,47 @@ func (p *Printer) printBase(enginePath string, secrets map[string]interface{}) e } } - tree = gotree.New(baseName) + tree = treeprint.NewWithRoot(baseName) m = utils.ToMapStringInterface(secrets[k]) } for _, i := range utils.SortMapKeys(m) { //nolint: forcetypeassert - tree.AddTree(p.printTree(enginePath, i, m[i].(map[string]interface{}))) + tree.AddBranch(p.printTree(enginePath, i, m[i].(map[string]interface{}))) } - fmt.Fprint(p.writer, tree.Print()) + fmt.Fprintln(p.writer, strings.TrimSpace(tree.String())) return nil } -func (p *Printer) printTree(rootPath, subPath string, m map[string]interface{}) gotree.Tree { - tree := gotree.New(p.buildTreeName(rootPath, subPath)) +func (p *Printer) printTree(rootPath, subPath string, m map[string]interface{}) treeprint.Tree { + tree := treeprint.NewWithRoot(p.buildTreeName(rootPath, subPath)) + //nolint: nestif if strings.HasSuffix(subPath, utils.Delimiter) { for _, i := range utils.SortMapKeys(m) { //nolint: forcetypeassert - tree.AddTree(p.printTree(rootPath, subPath+i, m[i].(map[string]interface{}))) + tree.AddBranch(p.printTree(rootPath, subPath+i, m[i].(map[string]interface{}))) } } else { for _, k := range utils.SortMapKeys(m) { if p.onlyKeys { - tree.Add(k) + tree.AddNode(k) } if !p.onlyKeys && !p.onlyPaths { - tree.Add(fmt.Sprintf("%s=%v", k, m[k])) + //nolint:forcetypeassert + value := m[k].(string) + + // https://stackoverflow.com/a/69693440 + t, err := strconv.Unquote("\"" + value + "\"") + if err == nil { + value = t + } + + tree.AddNode(fmt.Sprintf("%s=%v", k, value)) } } } diff --git a/pkg/printer/secret/base_test.go b/pkg/printer/secret/base_test.go index efa73619..2690de09 100644 --- a/pkg/printer/secret/base_test.go +++ b/pkg/printer/secret/base_test.go @@ -89,6 +89,29 @@ func TestPrintBase(t *testing.T) { └── secret ├── key └── user +`, + }, + { + name: "test: multiple lines", + rootPath: "root", + s: map[string]interface{}{ + "secret": map[string]interface{}{ + "key": "value", + "user": "hey\nthis\nis\na\nmultiline", + }, + }, + opts: []Option{ + ToFormat(Base), + ShowValues(true), + }, + output: `root/ +└── secret + ├── key=value + └── user=hey + this + is + a + multiline `, }, } diff --git a/pkg/printer/secret/json.go b/pkg/printer/secret/json.go index f44cdf4d..b1a1c5a2 100644 --- a/pkg/printer/secret/json.go +++ b/pkg/printer/secret/json.go @@ -2,7 +2,6 @@ package secret import ( "fmt" - "strings" "github.com/FalcoSuessgott/vkv/pkg/utils" ) @@ -13,7 +12,7 @@ func (p *Printer) printJSON(secrets map[string]interface{}) error { return err } - fmt.Fprint(p.writer, strings.TrimSuffix(string(out), "\n")) + fmt.Fprint(p.writer, string(out)) return nil } diff --git a/pkg/printer/secret/json_test.go b/pkg/printer/secret/json_test.go index 5c713467..d897f72a 100644 --- a/pkg/printer/secret/json_test.go +++ b/pkg/printer/secret/json_test.go @@ -37,7 +37,8 @@ func TestPrintJSON(t *testing.T) { "user": "password" } } -}`, +} +`, }, { name: "test: normal map to json only keys", @@ -59,7 +60,8 @@ func TestPrintJSON(t *testing.T) { "user": "" } } -}`, +} +`, }, }