From 2aca2b4fe1a3faee1e4653c6ef10848aab6cd257 Mon Sep 17 00:00:00 2001 From: Teddy Sommavilla Date: Fri, 31 Jan 2025 10:08:31 +0100 Subject: [PATCH 1/3] feat: add field name on unexported field name error --- envconfig.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envconfig.go b/envconfig.go index 9df9228..4f46ef5 100644 --- a/envconfig.go +++ b/envconfig.go @@ -155,7 +155,7 @@ func readStruct(value reflect.Value, ctx *context) (nonNil bool, err error) { tag := parseTag(fieldInfo.Tag.Get("envconfig")) if tag.skip || !field.CanSet() { if !field.CanSet() && !ctx.allowUnexported { - return false, ErrUnexportedField + return false, fmt.Errorf("%w %q", ErrUnexportedField, name) } continue } From 19bf7c9a8720afe6a2b0379d3023d73c760b0666 Mon Sep 17 00:00:00 2001 From: Teddy Sommavilla Date: Fri, 31 Jan 2025 10:09:39 +0100 Subject: [PATCH 2/3] chore: update github.com/stretchr/testify/require --- go.mod | 4 +--- go.sum | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 26119b0..9155305 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,8 @@ module github.com/vrischmann/envconfig go 1.12 require ( - github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/stretchr/testify v1.6.1 + github.com/stretchr/testify v1.10.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) diff --git a/go.sum b/go.sum index c26bc2b..86c770e 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -13,13 +11,17 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e95d54e95b65fe871966a83db7e303e20ae813cf Mon Sep 17 00:00:00 2001 From: Teddy Sommavilla Date: Fri, 31 Jan 2025 10:12:42 +0100 Subject: [PATCH 3/3] test: use named testify/require helpers --- envconfig_test.go | 62 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/envconfig_test.go b/envconfig_test.go index 0494265..4a929c9 100644 --- a/envconfig_test.go +++ b/envconfig_test.go @@ -29,7 +29,7 @@ func TestParseSimpleConfig(t *testing.T) { os.Setenv("LOG_PATH", "/var/log/foobar") err = envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", conf.Name) require.Equal(t, "/var/log/foobar", conf.Log.Path) @@ -53,7 +53,7 @@ func TestParseIntegerConfig(t *testing.T) { os.Setenv("VERSION", "2") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 80, conf.Port) require.Equal(t, uint64(timestamp), conf.Long) @@ -68,7 +68,7 @@ func TestParseBoolConfig(t *testing.T) { os.Setenv("DOIT", "true") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, true, conf.DoIt) } @@ -80,7 +80,7 @@ func TestParseBytesConfig(t *testing.T) { os.Setenv("DATA", "Rk9PQkFS") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, []byte("FOOBAR"), conf.Data) } @@ -94,7 +94,7 @@ func TestParseFloatConfig(t *testing.T) { os.Setenv("DELTAV", "400.20000000001") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, float32(0.02), conf.Delta) require.Equal(t, float64(400.20000000001), conf.DeltaV) } @@ -114,7 +114,7 @@ func TestParseSliceConfig(t *testing.T) { os.Setenv("SHARDS", "{foobar,localhost:2929},{barbaz,localhost:2828}") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 2, len(conf.Names)) require.Equal(t, "foobar", conf.Names[0]) @@ -192,7 +192,7 @@ func TestDurationConfig(t *testing.T) { os.Setenv("TIMEOUT", "1m") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, time.Minute*1, conf.Timeout) } @@ -205,7 +205,7 @@ func TestInvalidDurationConfig(t *testing.T) { os.Setenv("TIMEOUT", "foo") err := envconfig.Init(&conf) - require.NotNil(t, err) + require.Error(t, err) } func TestAllPointerConfig(t *testing.T) { @@ -237,7 +237,7 @@ func TestAllPointerConfig(t *testing.T) { os.Setenv("TIMEOUT", "1m") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", *conf.Name) require.Equal(t, 9000, *conf.Port) @@ -284,7 +284,7 @@ func TestUnmarshaler(t *testing.T) { os.Setenv("LOGMODE", "file") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, logFile, conf.LogMode) var conf2 struct { @@ -292,7 +292,7 @@ func TestUnmarshaler(t *testing.T) { } err = envconfig.Init(&conf2) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, logFile, *conf2.LogMode) } @@ -323,7 +323,7 @@ func TestParseOptionalConfig(t *testing.T) { os.Setenv("STRUCT_A", "") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "", conf.Name) os.Setenv("NAME", "foobar") @@ -332,7 +332,7 @@ func TestParseOptionalConfig(t *testing.T) { os.Setenv("STRUCT_B", "1") err = envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", conf.Name) require.Equal(t, []string{"a", "b"}, conf.Slice) require.Equal(t, "foobar", conf.Struct.A) @@ -347,7 +347,7 @@ func TestParseSkippableConfig(t *testing.T) { os.Setenv("FLAG", "true") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, false, conf.Flag) } @@ -359,7 +359,7 @@ func TestParseCustomNameConfig(t *testing.T) { os.Setenv("customName", "foobar") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", conf.Name) } @@ -373,7 +373,7 @@ func TestParseOptionalStruct(t *testing.T) { os.Setenv("MASTER_NAME", "") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "", conf.Master.Name) } @@ -387,11 +387,11 @@ func TestParsePrefixedStruct(t *testing.T) { os.Setenv("NAME", "bad") err := envconfig.InitWithPrefix(&conf, "FOO") - require.NotNil(t, err) + require.Error(t, err) os.Setenv("FOO_NAME", "good") err = envconfig.InitWithPrefix(&conf, "FOO") - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "good", conf.Name) } @@ -403,10 +403,10 @@ func TestUnexportedField(t *testing.T) { os.Setenv("NAME", "foobar") err := envconfig.Init(&conf) - require.Equal(t, envconfig.ErrUnexportedField, err) + require.ErrorIs(t, err, envconfig.ErrUnexportedField) err = envconfig.InitWithOptions(&conf, envconfig.Options{AllowUnexported: true}) - require.Equal(t, nil, err) + require.NoError(t, err) } func TestNestedUnexportedField(t *testing.T) { @@ -421,10 +421,10 @@ func TestNestedUnexportedField(t *testing.T) { os.Setenv("FOO_BAR_BAZ", "foobar") err := envconfig.Init(&conf) - require.Equal(t, envconfig.ErrUnexportedField, err) + require.ErrorIs(t, err, envconfig.ErrUnexportedField) err = envconfig.InitWithOptions(&conf, envconfig.Options{AllowUnexported: true}) - require.Equal(t, nil, err) + require.NoError(t, err) } type sliceWithUnmarshaler []int @@ -451,7 +451,7 @@ func TestSliceTypeWithUnmarshaler(t *testing.T) { os.Setenv("DATA", "1.2.3") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 3, len(conf.Data)) require.Equal(t, 1, conf.Data[0]) require.Equal(t, 2, conf.Data[1]) @@ -471,7 +471,7 @@ func TestParseDefaultVal(t *testing.T) { } err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "localhost", conf.MySQL.Master.Address) require.Equal(t, 3306, conf.MySQL.Master.Port) require.Equal(t, time.Minute*1, conf.MySQL.Timeout) @@ -480,7 +480,7 @@ func TestParseDefaultVal(t *testing.T) { os.Setenv("myTimeout2", "20m") err = envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "localhost", conf.MySQL.Master.Address) require.Equal(t, 3306, conf.MySQL.Master.Port) require.Equal(t, time.Minute*2, conf.MySQL.Timeout) @@ -502,7 +502,7 @@ func TestDefaultSlice(t *testing.T) { os.Setenv("SHARDS", "") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 2, len(conf.Names)) require.Equal(t, "foobar", conf.Names[0]) @@ -533,7 +533,7 @@ func TestInitPointerToAPointer(t *testing.T) { os.Setenv("NAME", "foobar") err := envconfig.Init(&tmp) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", tmp.Name) } @@ -573,7 +573,7 @@ func TestParseEmptyTag(t *testing.T) { os.Setenv("NAME", "foobar") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, "foobar", conf.Name) } @@ -588,7 +588,7 @@ func TestLeaveNil(t *testing.T) { AllOptional: true, LeaveNil: true, }) - require.Nil(t, err) + require.NoError(t, err) require.Nil(t, conf.MySQL) } @@ -607,7 +607,7 @@ func TestParseMapType(t *testing.T) { os.Setenv("MAP", "a") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 1, conf.Map["a"]) } @@ -624,7 +624,7 @@ func TestSliceOverwrite(t *testing.T) { os.Setenv("MORE", "3,4") err := envconfig.Init(&conf) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, []string{"baz"}, conf.Single) require.Equal(t, []int{3, 4}, conf.More) }