Skip to content

Commit

Permalink
Merge pull request #8 from num30/no-env-prefix
Browse files Browse the repository at this point in the history
Don't use prefix for env vars by default
  • Loading branch information
DenisPalnitsky authored May 20, 2022
2 parents 5601d19 + ab8ff19 commit 6bce5a4
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 16 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ Config file type could be any type supported by [viper](https://github.com/spf1
To set a flag via environment variable, make all letters uppercase and replace '.' with '_' in path. For example: app.Server.Port -> APP_SERVER_PORT
Environment variables are prefixed with `config name` by default. For example `NewConfReader("myconf")` will search for environment variables like `MYCONF_DB_HOST`
This behavior could be overridden by setting `NewConfReader("myconf").WithoutPrefix()`
You can set a prefix for environment variables. For example `NewConfReader("myconf").WithPrefix("MYAPP")` will search for environment variables like `MYAPP_DB_HOST`

### Command Line Arguments :computer:

Expand Down Expand Up @@ -128,7 +127,7 @@ For full list of validation tag refer to [validator](https://github.com/go-playg
```
then we can set values for slice in the following ways:
- environment variable
`export SLICE_SLICE="a,b"`
`export SLICE="a,b"`
- command line argument
`myapp --slice", "a", "--slice", "b"`
- config file
Expand Down
7 changes: 4 additions & 3 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func NewConfReader(configName string) *ConfReader {
return &ConfReader{
viper: enviper.New(viper.New()),
configName: configName,
envVarPrefix: strings.ToUpper(configName),
envVarPrefix: "",
}
}

Expand Down Expand Up @@ -258,7 +258,8 @@ func (c *ConfReader) WithSearchDirs(s ...string) *ConfReader {
return c
}

func (c *ConfReader) WithoutPrefix() *ConfReader {
c.envVarPrefix = ""
// WithPrefix sets the prefix for environment variables
func (c *ConfReader) WithPrefix(prefix string) *ConfReader {
c.envVarPrefix = prefix
return c
}
31 changes: 22 additions & 9 deletions config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ func Test_ConfigReader(t *testing.T) {

os.Args = []string{"get", "--id", "10", "--verbose", "--app.overriddenbyarg", fromArgVal}

os.Setenv("MYAPP_APP_FROMENVVAR", valFromVar)
defer os.Unsetenv("MYAPP_APP_FROMENVVAR")
os.Setenv("APP_FROMENVVAR", valFromVar)
defer os.Unsetenv("APP_FROMENVVAR")

os.Setenv("MYAPP_APP_OVERRIDDENBYEVNVAR", overriddenVar)
defer os.Unsetenv("MYAPP_APP_OVERRIDDENBYEVNVAR")
os.Setenv("APP_OVERRIDDENBYEVNVAR", overriddenVar)
defer os.Unsetenv("APP_OVERRIDDENBYEVNVAR")

// act
err := confReader.Read(nc)
Expand Down Expand Up @@ -82,7 +82,7 @@ func Test_ReadFromFile(t *testing.T) {
func Test_EnvVarsNoPrefix(t *testing.T) {
resetFlags()
nc := &FullConfig{}
confReader := NewConfReader("myapp").WithoutPrefix()
confReader := NewConfReader("myapp")
os.Setenv("APP_FROMENVVAR", "valFromEnvVar")

err := confReader.Read(nc)
Expand All @@ -91,6 +91,19 @@ func Test_EnvVarsNoPrefix(t *testing.T) {
}
}

func Test_EnvVarsWithPrefix(t *testing.T) {
resetFlags()
nc := &FullConfig{}
confReader := NewConfReader("myapp").WithPrefix("MYAPP")
os.Setenv("MYAPP_APP_FROMENVVAR", "valFromEnvVar")
defer os.Unsetenv("APP_FROMENVVAR")

err := confReader.Read(nc)
if assert.NoError(t, err) {
assert.Equal(t, "valFromEnvVar", nc.App.FromEnvVar)
}
}

func Test_ReadFromJsonFile(t *testing.T) {
resetFlags()
nc := &FullConfig{}
Expand Down Expand Up @@ -165,8 +178,8 @@ func Test_Validation(t *testing.T) {

t.Run("passes", func(t *testing.T) {
resetFlags()
os.Setenv("MYAPP_HOST", "localhost")
defer os.Unsetenv("MYAPP_HOST")
os.Setenv("HOST", "localhost")
defer os.Unsetenv("HOST")
err := reader.Read(cf)
if assert.NoError(t, err) {
assert.Equal(t, "localhost", cf.Host)
Expand Down Expand Up @@ -254,8 +267,8 @@ func Test_Slice(t *testing.T) {

t.Run("envVar", func(t *testing.T) {
cfg := SliceConf{}
os.Setenv("SLICE_SLICE", "a,b,c")
defer os.Unsetenv("SLICE_SLICE")
os.Setenv("SLICE", "a,b,c")
defer os.Unsetenv("SLICE")
reader := NewConfReader("slice")
err := reader.Read(&cfg)
if assert.NoError(t, err) {
Expand Down
2 changes: 1 addition & 1 deletion examples/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func main() {
// Refer to myconf.yaml for file configuration

// Use env vars to set config keys
os.Setenv("MYCONF_FOO_DURATIONFROMENVVAR", "10m")
os.Setenv("FOO_DURATIONFROMENVVAR", "10m")

// Use command args to set config keys
os.Args = append(os.Args, "--nested", "ThisCameFromAnArg")
Expand Down

0 comments on commit 6bce5a4

Please sign in to comment.