From f4a7377c5d3a22c19af32b549827f8a0509a76ab Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Mon, 31 Jul 2017 22:50:41 -0400 Subject: Moving getenv to separate package Signed-off-by: Dave Henderson --- docs/content/functions/env.md | 26 ++++++++++++++++++++++++++ docs/content/functions/general.md | 18 ------------------ docs/content/syntax.md | 2 +- env.go | 19 ------------------- env/env.go | 15 +++++++++++++++ env/env_test.go | 14 ++++++++++++++ env_test.go | 15 --------------- funcs.go | 3 +-- funcs/env.go | 34 ++++++++++++++++++++++++++++++++++ funcs/env_test.go | 16 ++++++++++++++++ gomplate_test.go | 2 +- main.go | 2 +- test/integration/envvars.bats | 6 ++++++ 13 files changed, 115 insertions(+), 57 deletions(-) create mode 100644 docs/content/functions/env.md delete mode 100644 env.go create mode 100644 env/env.go create mode 100644 env/env_test.go delete mode 100644 env_test.go create mode 100644 funcs/env.go create mode 100644 funcs/env_test.go diff --git a/docs/content/functions/env.md b/docs/content/functions/env.md new file mode 100644 index 00000000..ebbf8427 --- /dev/null +++ b/docs/content/functions/env.md @@ -0,0 +1,26 @@ +--- +title: env functions +menu: + main: + parent: functions +--- + +## `env.Getenv` + +**Alias:** `getenv` + +Exposes the [os.Getenv](https://golang.org/pkg/os/#Getenv) function. + +This is a more forgiving alternative to using `.Env`, since missing keys will +return an empty string. + +An optional default value can be given as well. + +#### Example + +```console +$ gomplate -i 'Hello, {{env.Getenv "USER"}}' +Hello, hairyhenderson +$ gomplate -i 'Hey, {{getenv "FIRSTNAME" "you"}}!' +Hey, you! +``` \ No newline at end of file diff --git a/docs/content/functions/general.md b/docs/content/functions/general.md index 32aa6820..ab362573 100644 --- a/docs/content/functions/general.md +++ b/docs/content/functions/general.md @@ -5,24 +5,6 @@ menu: parent: functions --- -## `getenv` - -Exposes the [os.Getenv](https://golang.org/pkg/os/#Getenv) function. - -This is a more forgiving alternative to using `.Env`, since missing keys will -return an empty string. - -An optional default value can be given as well. - -#### Example - -```console -$ gomplate -i 'Hello, {{getenv "USER"}}' -Hello, hairyhenderson -$ gomplate -i 'Hey, {{getenv "FIRSTNAME" "you"}}!' -Hey, you! -``` - ## `bool` Converts a true-ish string to a boolean. Can be used to simplify conditional statements based on environment variables or other text input. diff --git a/docs/content/syntax.md b/docs/content/syntax.md index e68af3b5..cbd63f4c 100644 --- a/docs/content/syntax.md +++ b/docs/content/syntax.md @@ -13,7 +13,7 @@ will fail and `gomplate` will exit with an error condition. Sometimes, this behaviour is desired; if the output is unusable without certain strings, this is a sure way to know that variables are missing! -If you want different behaviour, try [`getenv`](../functions/#getenv). +If you want different behaviour, try [`getenv`](../functions/env/#env-getenv). ## Built-in functions diff --git a/env.go b/env.go deleted file mode 100644 index 29aeba19..00000000 --- a/env.go +++ /dev/null @@ -1,19 +0,0 @@ -package main - -import "os" - -// Env - functions that deal with the environment -type Env struct { -} - -// Getenv retrieves the value of the environment variable named by the key. -// It returns the value, or the default (or an emptry string) if the variable is -// not set. -func (e *Env) Getenv(key string, def ...string) string { - val := os.Getenv(key) - if val == "" && len(def) > 0 { - return def[0] - } - - return val -} diff --git a/env/env.go b/env/env.go new file mode 100644 index 00000000..6966150a --- /dev/null +++ b/env/env.go @@ -0,0 +1,15 @@ +package env + +import "os" + +// Getenv retrieves the value of the environment variable named by the key. +// It returns the value, or the default (or an emptry string) if the variable is +// not set. +func Getenv(key string, def ...string) string { + val := os.Getenv(key) + if val == "" && len(def) > 0 { + return def[0] + } + + return val +} diff --git a/env/env_test.go b/env/env_test.go new file mode 100644 index 00000000..ba971d82 --- /dev/null +++ b/env/env_test.go @@ -0,0 +1,14 @@ +package env + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetenv(t *testing.T) { + assert.Empty(t, Getenv("FOOBARBAZ")) + assert.Equal(t, os.Getenv("USER"), Getenv("USER")) + assert.Equal(t, "default value", Getenv("BLAHBLAHBLAH", "default value")) +} diff --git a/env_test.go b/env_test.go deleted file mode 100644 index a01fbcdb..00000000 --- a/env_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetenv(t *testing.T) { - e := &Env{} - assert.Empty(t, e.Getenv("FOOBARBAZ")) - assert.Equal(t, os.Getenv("USER"), e.Getenv("USER")) - assert.Equal(t, "default value", e.Getenv("BLAHBLAHBLAH", "default value")) -} diff --git a/funcs.go b/funcs.go index b65170a3..aa98f029 100644 --- a/funcs.go +++ b/funcs.go @@ -9,11 +9,9 @@ import ( // initFuncs - The function mappings are defined here! func initFuncs(data *Data) template.FuncMap { - env := &Env{} typeconv := &TypeConv{} f := template.FuncMap{ - "getenv": env.Getenv, "bool": typeconv.Bool, "has": typeconv.Has, "json": typeconv.JSON, @@ -42,5 +40,6 @@ func initFuncs(data *Data) template.FuncMap { funcs.AddNetFuncs(f) funcs.AddReFuncs(f) funcs.AddStringFuncs(f) + funcs.AddEnvFuncs(f) return f } diff --git a/funcs/env.go b/funcs/env.go new file mode 100644 index 00000000..40c10ff9 --- /dev/null +++ b/funcs/env.go @@ -0,0 +1,34 @@ +package funcs + +import ( + "sync" + + "github.com/hairyhenderson/gomplate/env" +) + +var ( + ef *EnvFuncs + efInit sync.Once +) + +// EnvNS - the Env namespace +func EnvNS() *EnvFuncs { + efInit.Do(func() { ef = &EnvFuncs{} }) + return ef +} + +// AddEnvFuncs - +func AddEnvFuncs(f map[string]interface{}) { + f["env"] = EnvNS + + // global aliases - for backwards compatibility + f["getenv"] = EnvNS().Getenv +} + +// EnvFuncs - +type EnvFuncs struct{} + +// Getenv - +func (f *EnvFuncs) Getenv(key string, def ...string) string { + return env.Getenv(key, def...) +} diff --git a/funcs/env_test.go b/funcs/env_test.go new file mode 100644 index 00000000..95db230b --- /dev/null +++ b/funcs/env_test.go @@ -0,0 +1,16 @@ +package funcs + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEnvGetenv(t *testing.T) { + ef := &EnvFuncs{} + expected := os.Getenv("USER") + assert.Equal(t, expected, ef.Getenv("USER")) + + assert.Equal(t, "foo", ef.Getenv("bogusenvvar", "foo")) +} diff --git a/gomplate_test.go b/gomplate_test.go index 1d55751b..cd940d30 100644 --- a/gomplate_test.go +++ b/gomplate_test.go @@ -9,6 +9,7 @@ import ( "text/template" "github.com/hairyhenderson/gomplate/aws" + "github.com/hairyhenderson/gomplate/env" "github.com/stretchr/testify/assert" ) @@ -19,7 +20,6 @@ func testTemplate(g *Gomplate, template string) string { } func TestGetenvTemplates(t *testing.T) { - env := &Env{} typeconv := &TypeConv{} g := &Gomplate{ funcMap: template.FuncMap{ diff --git a/main.go b/main.go index 3df4d15e..1cd5675e 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/hairyhenderson/gomplate/env" "github.com/hairyhenderson/gomplate/version" "github.com/spf13/cobra" ) @@ -83,7 +84,6 @@ func initFlags(command *cobra.Command) { command.Flags().StringArrayVarP(&opts.dataSources, "datasource", "d", nil, "`datasource` in alias=URL form. Specify multiple times to add multiple sources.") command.Flags().StringArrayVarP(&opts.dataSourceHeaders, "datasource-header", "H", nil, "HTTP `header` field in 'alias=Name: value' form to be provided on HTTP-based data sources. Multiples can be set.") - env := &Env{} ldDefault := env.Getenv("GOMPLATE_LEFT_DELIM", "{{") rdDefault := env.Getenv("GOMPLATE_RIGHT_DELIM", "}}") command.Flags().StringVar(&opts.lDelim, "left-delim", ldDefault, "override the default left-`delimiter` [$GOMPLATE_LEFT_DELIM]") diff --git a/test/integration/envvars.bats b/test/integration/envvars.bats index c8a69ddd..316f2572 100644 --- a/test/integration/envvars.bats +++ b/test/integration/envvars.bats @@ -44,3 +44,9 @@ load helper [ "$status" -eq 0 ] [[ "${output}" == "${HOME}" ]] } + +@test "existant env var using env.Getenv" { + gomplate -i '{{env.Getenv "HOME"}}' + [ "$status" -eq 0 ] + [[ "${output}" == "${HOME}" ]] +} -- cgit v1.2.3