diff --git a/cmd/commands_test.go b/cmd/commands_test.go index 71df5f99..c1c962e1 100644 --- a/cmd/commands_test.go +++ b/cmd/commands_test.go @@ -153,7 +153,7 @@ func TestValidateCmd(t *testing.T) { func TestReadWithAdvancedFilterCmd(t *testing.T) { cmd := getRootCommand() - result := test.RunCmd(cmd, "read -v ../examples/sample.yaml b.e(name==sam).value") + result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e(name==sam).value") if result.Error != nil { t.Error(result.Error) } @@ -162,7 +162,7 @@ func TestReadWithAdvancedFilterCmd(t *testing.T) { func TestReadWithAdvancedFilterMapCmd(t *testing.T) { cmd := getRootCommand() - result := test.RunCmd(cmd, "read -v ../examples/sample.yaml b.e[name==fr*]") + result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e[name==fr*]") if result.Error != nil { t.Error(result.Error) } @@ -183,11 +183,11 @@ func TestReadWithKeyAndValueCmd(t *testing.T) { func TestReadArrayCmd(t *testing.T) { cmd := getRootCommand() - result := test.RunCmd(cmd, "read -p pv ../examples/sample.yaml b.e.1.name") + result := test.RunCmd(cmd, "read -p pv ../examples/sample.yaml b.e[1].name") if result.Error != nil { t.Error(result.Error) } - test.AssertResult(t, "b.e.1.name: sam\n", result.Output) + test.AssertResult(t, "b.e.[1].name: sam\n", result.Output) } func TestReadDeepSplatCmd(t *testing.T) { @@ -337,6 +337,21 @@ func TestReadMergeAnchorsExplodeSimpleArrayCmd(t *testing.T) { test.AssertResult(t, expectedOutput, result.Output) } +func TestReadNumberKeyJsonCmd(t *testing.T) { + content := `data: {"40433437326": 10.833332}` + filename := test.WriteTempYamlFile(content) + defer test.RemoveTempYamlFile(filename) + + cmd := getRootCommand() + result := test.RunCmd(cmd, fmt.Sprintf("read -j %s", filename)) + if result.Error != nil { + t.Error(result.Error) + } + expectedOutput := `{"data":{"40433437326":10.833332}} +` + test.AssertResult(t, expectedOutput, result.Output) +} + func TestReadMergeAnchorsExplodeSimpleArrayJsonCmd(t *testing.T) { content := `- things` filename := test.WriteTempYamlFile(content) @@ -795,15 +810,6 @@ func TestReadCmd_ErrorBadPath(t *testing.T) { test.AssertResult(t, expectedOutput, result.Output) } -func TestReadCmd_Verbose(t *testing.T) { - cmd := getRootCommand() - result := test.RunCmd(cmd, "read -v ../examples/sample.yaml b.c") - if result.Error != nil { - t.Error(result.Error) - } - test.AssertResult(t, "2", result.Output) -} - func TestReadToJsonCmd(t *testing.T) { cmd := getRootCommand() result := test.RunCmd(cmd, "read -j ../examples/sample.yaml b") @@ -1141,25 +1147,6 @@ func TestPrefixCmd_ErrorUnreadableFile(t *testing.T) { test.AssertResult(t, expectedOutput, result.Error.Error()) } -func TestPrefixCmd_Verbose(t *testing.T) { - content := `b: - c: 3 -` - filename := test.WriteTempYamlFile(content) - defer test.RemoveTempYamlFile(filename) - - cmd := getRootCommand() - result := test.RunCmd(cmd, fmt.Sprintf("prefix %s x", filename)) - if result.Error != nil { - t.Error(result.Error) - } - expectedOutput := `x: - b: - c: 3 -` - test.AssertResult(t, expectedOutput, result.Output) -} - func TestPrefixCmd_Inplace(t *testing.T) { content := `b: c: 3 diff --git a/go.mod b/go.mod index ef0a88db..36e4562a 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,26 @@ module github.com/mikefarah/yq/v3 require ( + github.com/cosiner/argv v0.0.1 // indirect + github.com/go-delve/delve v1.4.0 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kylelemons/godebug v1.1.0 + github.com/mattn/go-colorable v0.1.4 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-runewidth v0.0.8 // indirect + github.com/peterh/liner v1.2.0 // indirect github.com/pkg/errors v0.8.1 + github.com/sirupsen/logrus v1.4.2 // indirect github.com/spf13/cobra v0.0.5 + github.com/spf13/pflag v1.0.5 // indirect + go.starlark.net v0.0.0-20200203144150-6677ee5c7211 // indirect + golang.org/x/arch v0.0.0-20191126211547-368ea8f32fff // indirect + golang.org/x/crypto v0.0.0-20200210222208-86ce3cb69678 // indirect + golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 // indirect golang.org/x/tools v0.0.0-20191213221258-04c2e8eff935 // indirect gopkg.in/imdario/mergo.v0 v0.3.7 // indirect gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 + gopkg.in/yaml.v2 v2.2.8 // indirect gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 ) diff --git a/go.sum b/go.sum index 9235f824..b7d0ffb7 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,50 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cosiner/argv v0.0.0-20170225145430-13bacc38a0a5 h1:rIXlvz2IWiupMFlC45cZCXZFvKX/ExBcSLrDy2G0Lp8= +github.com/cosiner/argv v0.0.0-20170225145430-13bacc38a0a5/go.mod h1:p/NrK5tF6ICIly4qwEDsf6VDirFiWWz0FenfYBwJaKQ= +github.com/cosiner/argv v0.0.1 h1:2iAFN+sWPktbZ4tvxm33Ei8VY66FPCxdOxpncUGpAXE= +github.com/cosiner/argv v0.0.1/go.mod h1:p/NrK5tF6ICIly4qwEDsf6VDirFiWWz0FenfYBwJaKQ= +github.com/cpuguy83/go-md2man v1.0.8/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-delve/delve v1.4.0 h1:O+1dw1XBZXqhC6fIPQwGxLlbd2wDRau7NxNhVpw02ag= +github.com/go-delve/delve v1.4.0/go.mod h1:gQM0ReOJLNAvPuKAXfjHngtE93C2yc/ekTbo7YbAHSo= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561 h1:isR/L+BIZ+rqODWYR/f526ygrBMGKZYFhaaFRDGvuZ8= +github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= +github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mikefarah/yaml v2.1.0+incompatible h1:nu2cqmzk4WlWJNgnevY88faMcdrDzYGcsUjYFxEpB7Y= github.com/mikefarah/yaml/v2 v2.4.0 h1:eYqfooY0BnvKTJxr7+ABJs13n3dg9n347GScDaU2Lww= github.com/mikefarah/yaml/v2 v2.4.0/go.mod h1:ahVqZF4n1W4NqwvVnZzC4es67xsW9uR/RRf2RRxieJU= @@ -19,46 +52,97 @@ github.com/mikefarah/yq v2.4.0+incompatible h1:oBxbWy8R9hI3BIUUxEf0CzikWa2AgnGrG github.com/mikefarah/yq/v2 v2.4.1 h1:tajDonaFK6WqitSZExB6fKlWQy/yCkptqxh2AXEe3N4= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b h1:8uaXtUkxiy+T/zdLWuxa/PG4so0TPZDZfafFNNSaptE= +github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.2.0 h1:w/UPXyl5GfahFxcTOz2j9wCIHNI+pUPr2laqpojKNCg= +github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v0.0.0-20170413231811-06b906832ed0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday v0.0.0-20180428102519-11635eb403ff/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sirupsen/logrus v0.0.0-20180523074243-ea8897e79973 h1:3AJZYTzw3gm3TNTt30x0CCKD7GOn2sdd50Hn35fQkGY= +github.com/sirupsen/logrus v0.0.0-20180523074243-ea8897e79973/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.starlark.net v0.0.0-20190702223751-32f345186213 h1:lkYv5AKwvvduv5XWP6szk/bvvgO6aDeUujhZQXIFTes= +go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= +go.starlark.net v0.0.0-20200203144150-6677ee5c7211 h1:Qoe+9POtDT51UBQ8XEnS9QKeHDQzEl2QRh3eok9R4aw= +go.starlark.net v0.0.0-20200203144150-6677ee5c7211/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4 h1:QlVATYS7JBoZMVaf+cNjb90WD/beKVHnIxFKT4QaHVI= +golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= +golang.org/x/arch v0.0.0-20191126211547-368ea8f32fff h1:k/MrR0lKiCokRu1JUDDAWhWZinfBAOZRzz3LkPOkFMs= +golang.org/x/arch v0.0.0-20191126211547-368ea8f32fff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200210222208-86ce3cb69678/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0 h1:s5lp4ug7qHzUccgyFdjsX7OZDzHXRaePrF3B3vmUiuM= golang.org/x/tools v0.0.0-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191213221258-04c2e8eff935 h1:kJQZhwFzSwJS2BxboKjdZzWczQOZx8VuH7Y8hhuGUtM= golang.org/x/tools v0.0.0-20191213221258-04c2e8eff935/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/imdario/mergo.v0 v0.3.7 h1:QDotlIZtaO/p+Um0ok18HRTpq5i5/SAk/qprsor+9c8= gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/pkg/yqlib/data_navigator.go b/pkg/yqlib/data_navigator.go index 98c78e9b..8f4d52f9 100644 --- a/pkg/yqlib/data_navigator.go +++ b/pkg/yqlib/data_navigator.go @@ -1,13 +1,14 @@ package yqlib import ( + "fmt" "strconv" yaml "gopkg.in/yaml.v3" ) type DataNavigator interface { - Traverse(value *yaml.Node, path []string) error + Traverse(value *yaml.Node, path []interface{}) error } type navigator struct { @@ -20,7 +21,7 @@ func NewDataNavigator(NavigationStrategy NavigationStrategy) DataNavigator { } } -func (n *navigator) Traverse(value *yaml.Node, path []string) error { +func (n *navigator) Traverse(value *yaml.Node, path []interface{}) error { realValue := value emptyArray := make([]interface{}, 0) if realValue.Kind == yaml.DocumentNode { @@ -30,7 +31,7 @@ func (n *navigator) Traverse(value *yaml.Node, path []string) error { return n.doTraverse(value, "", path, emptyArray) } -func (n *navigator) doTraverse(value *yaml.Node, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) doTraverse(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { log.Debug("head %v", head) DebugNode(value) @@ -65,23 +66,27 @@ func (n *navigator) getOrReplace(original *yaml.Node, expectedKind yaml.Kind) *y return original } -func (n *navigator) recurse(value *yaml.Node, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) recurse(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { log.Debug("recursing, processing %v, pathStack %v", head, pathStackToString(pathStack)) switch value.Kind { case yaml.MappingNode: log.Debug("its a map with %v entries", len(value.Content)/2) - return n.recurseMap(value, head, tail, pathStack) + headString := fmt.Sprintf("%v", head) + return n.recurseMap(value, headString, tail, pathStack) + case yaml.SequenceNode: log.Debug("its a sequence of %v things!", len(value.Content)) - var index, errorParsingIndex = strconv.ParseInt(head, 10, 64) // nolint - if errorParsingIndex == nil { - return n.recurseArray(value, index, head, tail, pathStack) - } else if head == "+" { - return n.appendArray(value, head, tail, pathStack) - } - return n.splatArray(value, head, tail, pathStack) + switch head := head.(type) { + case int64: + return n.recurseArray(value, head, head, tail, pathStack) + default: + if head == "+" { + return n.appendArray(value, head, tail, pathStack) + } + return n.splatArray(value, head, tail, pathStack) + } case yaml.AliasNode: log.Debug("its an alias!") DebugNode(value.Alias) @@ -95,7 +100,7 @@ func (n *navigator) recurse(value *yaml.Node, head string, tail []string, pathSt } } -func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) recurseMap(value *yaml.Node, head string, tail []interface{}, pathStack []interface{}) error { traversedEntry := false errorVisiting := n.visitMatchingEntries(value, head, tail, pathStack, func(contents []*yaml.Node, indexInMap int) error { log.Debug("recurseMap: visitMatchingEntries for %v", contents[indexInMap].Value) @@ -125,18 +130,27 @@ func (n *navigator) recurseMap(value *yaml.Node, head string, tail []string, pat return nil } + _, errorParsingInt := strconv.ParseInt(head, 10, 64) + mapEntryKey := yaml.Node{Value: head, Kind: yaml.ScalarNode} + + if errorParsingInt == nil { + // fixes a json encoding problem where keys that look like numbers + // get treated as numbers and cannot be used in a json map + mapEntryKey.Style = yaml.LiteralStyle + } + value.Content = append(value.Content, &mapEntryKey) mapEntryValue := yaml.Node{Kind: guessKind(head, tail, 0)} value.Content = append(value.Content, &mapEntryValue) - log.Debug("adding new node %v", head) + log.Debug("adding a new node %v - def a string", head) return n.doTraverse(&mapEntryValue, head, tail, append(pathStack, head)) } // need to pass the node in, as it may be aliased type mapVisitorFn func(contents []*yaml.Node, index int) error -func (n *navigator) visitDirectMatchingEntries(node *yaml.Node, head string, tail []string, pathStack []interface{}, visit mapVisitorFn) error { +func (n *navigator) visitDirectMatchingEntries(node *yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { var contents = node.Content for index := 0; index < len(contents); index = index + 2 { content := contents[index] @@ -151,7 +165,7 @@ func (n *navigator) visitDirectMatchingEntries(node *yaml.Node, head string, tai return nil } -func (n *navigator) visitMatchingEntries(node *yaml.Node, head string, tail []string, pathStack []interface{}, visit mapVisitorFn) error { +func (n *navigator) visitMatchingEntries(node *yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { var contents = node.Content log.Debug("visitMatchingEntries %v", head) DebugNode(node) @@ -167,7 +181,7 @@ func (n *navigator) visitMatchingEntries(node *yaml.Node, head string, tail []st return n.visitAliases(contents, head, tail, pathStack, visit) } -func (n *navigator) visitAliases(contents []*yaml.Node, head string, tail []string, pathStack []interface{}, visit mapVisitorFn) error { +func (n *navigator) visitAliases(contents []*yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { // merge aliases are defined first, but we only want to traverse them // if we don't find a match on this node first. // traverse them backwards so that the last alias overrides the preceding. @@ -198,7 +212,7 @@ func (n *navigator) visitAliases(contents []*yaml.Node, head string, tail []stri return nil } -func (n *navigator) visitAliasSequence(possibleAliasArray []*yaml.Node, head string, tail []string, pathStack []interface{}, visit mapVisitorFn) error { +func (n *navigator) visitAliasSequence(possibleAliasArray []*yaml.Node, head string, tail []interface{}, pathStack []interface{}, visit mapVisitorFn) error { // need to search this backwards too, so that aliases defined last override the preceding. for aliasIndex := len(possibleAliasArray) - 1; aliasIndex >= 0; aliasIndex = aliasIndex - 1 { child := possibleAliasArray[aliasIndex] @@ -214,7 +228,7 @@ func (n *navigator) visitAliasSequence(possibleAliasArray []*yaml.Node, head str return nil } -func (n *navigator) splatArray(value *yaml.Node, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) splatArray(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { for index, childValue := range value.Content { log.Debug("processing") DebugNode(childValue) @@ -234,14 +248,14 @@ func (n *navigator) splatArray(value *yaml.Node, head string, tail []string, pat return nil } -func (n *navigator) appendArray(value *yaml.Node, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) appendArray(value *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) error { var newNode = yaml.Node{Kind: guessKind(head, tail, 0)} value.Content = append(value.Content, &newNode) log.Debug("appending a new node, %v", value.Content) return n.doTraverse(&newNode, head, tail, append(pathStack, len(value.Content)-1)) } -func (n *navigator) recurseArray(value *yaml.Node, index int64, head string, tail []string, pathStack []interface{}) error { +func (n *navigator) recurseArray(value *yaml.Node, index int64, head interface{}, tail []interface{}, pathStack []interface{}) error { for int64(len(value.Content)) <= index { value.Content = append(value.Content, &yaml.Node{Kind: guessKind(head, tail, 0)}) } diff --git a/pkg/yqlib/delete_navigation_strategy.go b/pkg/yqlib/delete_navigation_strategy.go index 4520befe..4c64cf01 100644 --- a/pkg/yqlib/delete_navigation_strategy.go +++ b/pkg/yqlib/delete_navigation_strategy.go @@ -1,12 +1,10 @@ package yqlib import ( - "strconv" - yaml "gopkg.in/yaml.v3" ) -func DeleteNavigationStrategy(pathElementToDelete string) NavigationStrategy { +func DeleteNavigationStrategy(pathElementToDelete interface{}) NavigationStrategy { parser := NewPathParser() return &NavigationStrategyImpl{ visitedNodes: []*NodeContext{}, @@ -34,12 +32,12 @@ func DeleteNavigationStrategy(pathElementToDelete string) NavigationStrategy { }, } } -func deleteFromMap(pathParser PathParser, contents []*yaml.Node, pathStack []interface{}, pathElementToDelete string) []*yaml.Node { +func deleteFromMap(pathParser PathParser, contents []*yaml.Node, pathStack []interface{}, pathElementToDelete interface{}) []*yaml.Node { newContents := make([]*yaml.Node, 0) for index := 0; index < len(contents); index = index + 2 { keyNode := contents[index] valueNode := contents[index+1] - if !pathParser.MatchesNextPathElement(NewNodeContext(keyNode, pathElementToDelete, []string{}, pathStack), keyNode.Value) { + if !pathParser.MatchesNextPathElement(NewNodeContext(keyNode, pathElementToDelete, make([]interface{}, 0), pathStack), keyNode.Value) { log.Debug("adding node %v", keyNode.Value) newContents = append(newContents, keyNode, valueNode) } else { @@ -49,21 +47,23 @@ func deleteFromMap(pathParser PathParser, contents []*yaml.Node, pathStack []int return newContents } -func deleteFromArray(pathParser PathParser, content []*yaml.Node, pathStack []interface{}, pathElementToDelete string) []*yaml.Node { +func deleteFromArray(pathParser PathParser, content []*yaml.Node, pathStack []interface{}, pathElementToDelete interface{}) []*yaml.Node { - var indexToDelete, err = strconv.ParseInt(pathElementToDelete, 10, 64) // nolint - if err == nil { - return deleteIndexInArray(content, indexToDelete) - } - log.Debug("%v is not a numeric index, finding matching patterns", pathElementToDelete) - var newArray = make([]*yaml.Node, 0) + switch pathElementToDelete := pathElementToDelete.(type) { + case int64: + return deleteIndexInArray(content, pathElementToDelete) + default: + log.Debug("%v is not a numeric index, finding matching patterns", pathElementToDelete) + var newArray = make([]*yaml.Node, 0) - for _, childValue := range content { - if !pathParser.MatchesNextPathElement(NewNodeContext(childValue, pathElementToDelete, []string{}, pathStack), childValue.Value) { - newArray = append(newArray, childValue) + for _, childValue := range content { + if !pathParser.MatchesNextPathElement(NewNodeContext(childValue, pathElementToDelete, make([]interface{}, 0), pathStack), childValue.Value) { + newArray = append(newArray, childValue) + } } + return newArray } - return newArray + } func deleteIndexInArray(content []*yaml.Node, index int64) []*yaml.Node { diff --git a/pkg/yqlib/lib.go b/pkg/yqlib/lib.go index 612a80e5..667371a6 100644 --- a/pkg/yqlib/lib.go +++ b/pkg/yqlib/lib.go @@ -43,7 +43,7 @@ func mergePathStackToString(pathStack []interface{}, appendArrays bool) string { var sb strings.Builder for index, path := range pathStack { switch path.(type) { - case int: + case int, int64: if appendArrays { sb.WriteString("[+]") } else { @@ -52,13 +52,15 @@ func mergePathStackToString(pathStack []interface{}, appendArrays bool) string { default: s := fmt.Sprintf("%v", path) + var _, errParsingInt = strconv.ParseInt(s, 10, 64) // nolint + hasDot := strings.Contains(s, ".") - if hasDot { - sb.WriteString("[") + if hasDot || errParsingInt == nil { + sb.WriteString("\"") } sb.WriteString(s) - if hasDot { - sb.WriteString("]") + if hasDot || errParsingInt == nil { + sb.WriteString("\"") } } @@ -66,34 +68,41 @@ func mergePathStackToString(pathStack []interface{}, appendArrays bool) string { sb.WriteString(".") } } - return sb.String() + var pathString = sb.String() + log.Debug("got a path string: %v", pathString) + return pathString } -func guessKind(head string, tail []string, guess yaml.Kind) yaml.Kind { - log.Debug("tail %v", tail) +func guessKind(head interface{}, tail []interface{}, guess yaml.Kind) yaml.Kind { + log.Debug("guessKind: tail %v", tail) if len(tail) == 0 && guess == 0 { log.Debug("end of path, must be a scalar") return yaml.ScalarNode } else if len(tail) == 0 { return guess } - - var _, errorParsingInt = strconv.ParseInt(tail[0], 10, 64) - if tail[0] == "+" || errorParsingInt == nil { + var next = tail[0] + switch next.(type) { + case int64: return yaml.SequenceNode + default: + var nextString = fmt.Sprintf("%v", next) + if nextString == "+" { + return yaml.SequenceNode + } + pathParser := NewPathParser() + if (pathParser.IsPathExpression(nextString) || head == "**") && (guess == yaml.SequenceNode || guess == yaml.MappingNode) { + return guess + } + if guess == yaml.AliasNode { + log.Debug("guess was an alias, okey doke.") + return guess + } + log.Debug("forcing a mapping node") + log.Debug("yaml.SequenceNode %v", guess == yaml.SequenceNode) + log.Debug("yaml.ScalarNode %v", guess == yaml.ScalarNode) + return yaml.MappingNode } - pathParser := NewPathParser() - if (pathParser.IsPathExpression(tail[0]) || head == "**") && (guess == yaml.SequenceNode || guess == yaml.MappingNode) { - return guess - } - if guess == yaml.AliasNode { - log.Debug("guess was an alias, okey doke.") - return guess - } - log.Debug("forcing a mapping node") - log.Debug("yaml.SequenceNode %v", guess == yaml.SequenceNode) - log.Debug("yaml.ScalarNode %v", guess == yaml.ScalarNode) - return yaml.MappingNode } type YqLib interface { diff --git a/pkg/yqlib/navigation_strategy.go b/pkg/yqlib/navigation_strategy.go index 03bdaf4a..8f5efc53 100644 --- a/pkg/yqlib/navigation_strategy.go +++ b/pkg/yqlib/navigation_strategy.go @@ -8,13 +8,13 @@ import ( type NodeContext struct { Node *yaml.Node - Head string - Tail []string + Head interface{} + Tail []interface{} PathStack []interface{} } -func NewNodeContext(node *yaml.Node, head string, tail []string, pathStack []interface{}) NodeContext { - newTail := make([]string, len(tail)) +func NewNodeContext(node *yaml.Node, head interface{}, tail []interface{}, pathStack []interface{}) NodeContext { + newTail := make([]interface{}, len(tail)) copy(newTail, tail) newPathStack := make([]interface{}, len(pathStack)) diff --git a/pkg/yqlib/path_parser.go b/pkg/yqlib/path_parser.go index ae680a80..384e2196 100644 --- a/pkg/yqlib/path_parser.go +++ b/pkg/yqlib/path_parser.go @@ -1,12 +1,13 @@ package yqlib import ( + "fmt" "strconv" "strings" ) type PathParser interface { - ParsePath(path string) []string + ParsePath(path string) []interface{} MatchesNextPathElement(nodeContext NodeContext, nodeKey string) bool IsPathExpression(pathElement string) bool } @@ -42,9 +43,11 @@ func (p *pathParser) MatchesNextPathElement(nodeContext NodeContext, nodeKey str if head == "**" || head == "*" { return true } - if strings.Contains(head, "==") { + var headString = fmt.Sprintf("%v", head) + + if strings.Contains(headString, "==") { log.Debug("ooh deep recursion time") - result := strings.SplitN(head, "==", 2) + result := strings.SplitN(headString, "==", 2) path := strings.TrimSpace(result[0]) value := strings.TrimSpace(result[1]) log.Debug("path %v", path) @@ -70,17 +73,18 @@ func (p *pathParser) MatchesNextPathElement(nodeContext NodeContext, nodeKey str } } - return matchesString(head, nodeKey) + return matchesString(headString, nodeKey) } -func (p *pathParser) ParsePath(path string) []string { +func (p *pathParser) ParsePath(path string) []interface{} { + var paths = make([]interface{}, 0) if path == "" { - return []string{} + return paths } - return p.parsePathAccum([]string{}, path) + return p.parsePathAccum(paths, path) } -func (p *pathParser) parsePathAccum(paths []string, remaining string) []string { +func (p *pathParser) parsePathAccum(paths []interface{}, remaining string) []interface{} { head, tail := p.nextYamlPath(remaining) if tail == "" { return append(paths, head) @@ -88,11 +92,16 @@ func (p *pathParser) parsePathAccum(paths []string, remaining string) []string { return p.parsePathAccum(append(paths, head), tail) } -func (p *pathParser) nextYamlPath(path string) (pathElement string, remaining string) { +func (p *pathParser) nextYamlPath(path string) (pathElement interface{}, remaining string) { switch path[0] { case '[': // e.g [0].blah.cat -> we need to return "0" and "blah.cat" - return p.search(path[1:], []uint8{']'}, true) + var value, remainingBit = p.search(path[1:], []uint8{']'}, true) + var number, errParsingInt = strconv.ParseInt(value, 10, 64) // nolint + if errParsingInt == nil { + return number, remainingBit + } + return value, remainingBit case '"': // e.g "a.b".blah.cat -> we need to return "a.b" and "blah.cat" return p.search(path[1:], []uint8{'"'}, true) diff --git a/pkg/yqlib/path_parser_test.go b/pkg/yqlib/path_parser_test.go index f4212275..7af12667 100644 --- a/pkg/yqlib/path_parser_test.go +++ b/pkg/yqlib/path_parser_test.go @@ -10,20 +10,21 @@ var parser = NewPathParser() var parsePathsTests = []struct { path string - expectedPaths []string + expectedPaths []interface{} }{ - {"a.b", []string{"a", "b"}}, - {"a.b.**", []string{"a", "b", "**"}}, - {"a.b.*", []string{"a", "b", "*"}}, - {"a.b[0]", []string{"a", "b", "0"}}, - {"a.b.d[+]", []string{"a", "b", "d", "+"}}, - {"a", []string{"a"}}, - {"a.b.c", []string{"a", "b", "c"}}, - {"\"a.b\".c", []string{"a.b", "c"}}, - {"a.\"b.c\".d", []string{"a", "b.c", "d"}}, - {"[1].a.d", []string{"1", "a", "d"}}, - {"a[0].c", []string{"a", "0", "c"}}, - {"[0]", []string{"0"}}, + {"a.b", append(make([]interface{}, 0), "a", "b")}, + {"a.b.**", append(make([]interface{}, 0), "a", "b", "**")}, + {"a.b.*", append(make([]interface{}, 0), "a", "b", "*")}, + {"a.b[0]", append(make([]interface{}, 0), "a", "b", int64(0))}, + {"a.b.0", append(make([]interface{}, 0), "a", "b", "0")}, + {"a.b.d[+]", append(make([]interface{}, 0), "a", "b", "d", "+")}, + {"a", append(make([]interface{}, 0), "a")}, + {"a.b.c", append(make([]interface{}, 0), "a", "b", "c")}, + {"\"a.b\".c", append(make([]interface{}, 0), "a.b", "c")}, + {"a.\"b.c\".d", append(make([]interface{}, 0), "a", "b.c", "d")}, + {"[1].a.d", append(make([]interface{}, 0), int64(1), "a", "d")}, + {"a[0].c", append(make([]interface{}, 0), "a", int64(0), "c")}, + {"[0]", append(make([]interface{}, 0), int64(0))}, } func TestPathParserParsePath(t *testing.T) {