mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
Fixing null csv bug #1404
This commit is contained in:
parent
0cc5e75432
commit
c887042a1b
@ -1,3 +1,3 @@
|
|||||||
name,numberOfCats,likesApples,height
|
name,numberOfCats,likesApples,height
|
||||||
Gary,1,true,168.8
|
,1,true,168.8
|
||||||
Samantha's Rabbit,2,false,-188.8
|
Samantha's Rabbit,2,false,-188.8
|
|
@ -12,7 +12,9 @@ const csvSimple = `name,numberOfCats,likesApples,height
|
|||||||
Gary,1,true,168.8
|
Gary,1,true,168.8
|
||||||
Samantha's Rabbit,2,false,-188.8
|
Samantha's Rabbit,2,false,-188.8
|
||||||
`
|
`
|
||||||
|
const csvMissing = `name,numberOfCats,likesApples,height
|
||||||
|
,null,,168.8
|
||||||
|
`
|
||||||
const expectedUpdatedSimpleCsv = `name,numberOfCats,likesApples,height
|
const expectedUpdatedSimpleCsv = `name,numberOfCats,likesApples,height
|
||||||
Gary,3,true,168.8
|
Gary,3,true,168.8
|
||||||
Samantha's Rabbit,2,false,-188.8
|
Samantha's Rabbit,2,false,-188.8
|
||||||
@ -110,6 +112,13 @@ var csvScenarios = []formatScenario{
|
|||||||
expected: csvSimpleMissingData,
|
expected: csvSimpleMissingData,
|
||||||
scenarioType: "encode-csv",
|
scenarioType: "encode-csv",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
description: "decode csv missing",
|
||||||
|
skipDoc: true,
|
||||||
|
input: csvMissing,
|
||||||
|
expected: csvMissing,
|
||||||
|
scenarioType: "roundtrip-csv",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
description: "Parse CSV into an array of objects",
|
description: "Parse CSV into an array of objects",
|
||||||
subdescription: "First row is assumed to be the header row.",
|
subdescription: "First row is assumed to be the header row.",
|
||||||
|
@ -249,6 +249,12 @@ func guessTagFromCustomType(node *yaml.Node) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseSnippet(value string) (*yaml.Node, error) {
|
func parseSnippet(value string) (*yaml.Node, error) {
|
||||||
|
if value == "" {
|
||||||
|
return &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!null",
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
decoder := NewYamlDecoder(ConfiguredYamlPreferences)
|
decoder := NewYamlDecoder(ConfiguredYamlPreferences)
|
||||||
err := decoder.Init(strings.NewReader(value))
|
err := decoder.Init(strings.NewReader(value))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
package yqlib
|
package yqlib
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/mikefarah/yq/v4/test"
|
||||||
|
yaml "gopkg.in/yaml.v3"
|
||||||
|
)
|
||||||
|
|
||||||
func TestGetLogger(t *testing.T) {
|
func TestGetLogger(t *testing.T) {
|
||||||
l := GetLogger()
|
l := GetLogger()
|
||||||
@ -8,3 +13,69 @@ func TestGetLogger(t *testing.T) {
|
|||||||
t.Fatal("GetLogger should return the yq logger instance, not a copy")
|
t.Fatal("GetLogger should return the yq logger instance, not a copy")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type parseSnippetScenario struct {
|
||||||
|
snippet string
|
||||||
|
expected *yaml.Node
|
||||||
|
}
|
||||||
|
|
||||||
|
var parseSnippetScenarios = []parseSnippetScenario{
|
||||||
|
{
|
||||||
|
snippet: "",
|
||||||
|
expected: &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!null",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
snippet: "3",
|
||||||
|
expected: &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!int",
|
||||||
|
Value: "3",
|
||||||
|
Line: 1,
|
||||||
|
Column: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
snippet: "cat",
|
||||||
|
expected: &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!str",
|
||||||
|
Value: "cat",
|
||||||
|
Line: 1,
|
||||||
|
Column: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
snippet: "3.1",
|
||||||
|
expected: &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!float",
|
||||||
|
Value: "3.1",
|
||||||
|
Line: 1,
|
||||||
|
Column: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
snippet: "true",
|
||||||
|
expected: &yaml.Node{
|
||||||
|
Kind: yaml.ScalarNode,
|
||||||
|
Tag: "!!bool",
|
||||||
|
Value: "true",
|
||||||
|
Line: 1,
|
||||||
|
Column: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseSnippet(t *testing.T) {
|
||||||
|
for _, tt := range parseSnippetScenarios {
|
||||||
|
actual, err := parseSnippet(tt.snippet)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(tt.snippet)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
test.AssertResultComplexWithContext(t, tt.expected, actual, tt.snippet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -31,7 +31,7 @@ type expressionScenario struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
logging.SetLevel(logging.DEBUG, "")
|
logging.SetLevel(logging.ERROR, "")
|
||||||
Now = func() time.Time {
|
Now = func() time.Time {
|
||||||
return time.Date(2021, time.May, 19, 1, 2, 3, 4, time.UTC)
|
return time.Date(2021, time.May, 19, 1, 2, 3, 4, time.UTC)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user