From 5f3fae041aa24e4b5926f0b3a3ceed41d6387ee0 Mon Sep 17 00:00:00 2001 From: Guillaume Lours Date: Thu, 2 Jun 2022 16:43:30 +0200 Subject: [PATCH] allow '.' (dot) in environment variable name Signed-off-by: Guillaume Lours --- dotenv/parser.go | 4 ++-- loader/example1.env | 2 ++ loader/full-struct_test.go | 14 ++++++++++---- loader/loader_test.go | 10 ++++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/dotenv/parser.go b/dotenv/parser.go index fab656bf..4ca6bd0d 100644 --- a/dotenv/parser.go +++ b/dotenv/parser.go @@ -105,9 +105,9 @@ loop: offset = i + 1 inherited = char == '\n' break loop - case '_': + case '_', '.': default: - // variable name should match [A-Za-z0-9_] + // variable name should match [A-Za-z0-9_.] if unicode.IsLetter(rchar) || unicode.IsNumber(rchar) { continue } diff --git a/loader/example1.env b/loader/example1.env index f19ec0df..61716e93 100644 --- a/loader/example1.env +++ b/loader/example1.env @@ -1,5 +1,7 @@ # passed through FOO=foo_from_env_file +ENV.WITH.DOT=ok +ENV_WITH_UNDERSCORE=ok # overridden in example2.env BAR=bar_from_env_file diff --git a/loader/full-struct_test.go b/loader/full-struct_test.go index 9bdb6370..28da93c3 100644 --- a/loader/full-struct_test.go +++ b/loader/full-struct_test.go @@ -164,10 +164,12 @@ func services(workingDir, homeDir string) []types.ServiceConfig { DomainName: "foo.com", Entrypoint: []string{"/code/entrypoint.sh", "-p", "3000"}, Environment: map[string]*string{ - "FOO": strPtr("foo_from_env_file"), - "BAR": strPtr("this is a secret"), - "BAZ": strPtr("baz_from_service_def"), - "QUX": strPtr("qux_from_environment"), + "FOO": strPtr("foo_from_env_file"), + "BAR": strPtr("this is a secret"), + "BAZ": strPtr("baz_from_service_def"), + "QUX": strPtr("qux_from_environment"), + "ENV.WITH.DOT": strPtr("ok"), + "ENV_WITH_UNDERSCORE": strPtr("ok"), }, EnvFile: []string{ "./example1.env", @@ -691,6 +693,8 @@ services: environment: BAR: this is a secret BAZ: baz_from_service_def + ENV.WITH.DOT: ok + ENV_WITH_UNDERSCORE: ok FOO: foo_from_env_file QUX: qux_from_environment env_file: @@ -1261,6 +1265,8 @@ func fullExampleJSON(workingDir, homeDir string) string { "environment": { "BAR": "this is a secret", "BAZ": "baz_from_service_def", + "ENV.WITH.DOT": "ok", + "ENV_WITH_UNDERSCORE": "ok", "FOO": "foo_from_env_file", "QUX": "qux_from_environment" }, diff --git a/loader/loader_test.go b/loader/loader_test.go index 60569b2c..ca64d98b 100644 --- a/loader/loader_test.go +++ b/loader/loader_test.go @@ -766,10 +766,12 @@ func TestDiscardEnvFileOption(t *testing.T) { - example2.env ` expectedEnvironmentMap := types.MappingWithEquals{ - "FOO": strPtr("foo_from_env_file"), - "BAZ": strPtr("baz_from_env_file"), - "BAR": strPtr("bar_from_env_file_2"), // Original value is overwritten by example2.env - "QUX": strPtr("quz_from_env_file_2"), + "FOO": strPtr("foo_from_env_file"), + "BAZ": strPtr("baz_from_env_file"), + "BAR": strPtr("bar_from_env_file_2"), // Original value is overwritten by example2.env + "QUX": strPtr("quz_from_env_file_2"), + "ENV.WITH.DOT": strPtr("ok"), + "ENV_WITH_UNDERSCORE": strPtr("ok"), } configDetails := buildConfigDetails(dict, nil)