Parse(io.Reader) => map[string]string

pull/36/head
Paul Annesley 2017-08-06 17:23:28 +10:00
parent 3ddb2792f3
commit ebf1036af6
2 changed files with 48 additions and 24 deletions

View File

@ -16,6 +16,7 @@ package godotenv
import ( import (
"bufio" "bufio"
"errors" "errors"
"io"
"os" "os"
"os/exec" "os/exec"
"strings" "strings"
@ -89,6 +90,34 @@ func Read(filenames ...string) (envMap map[string]string, err error) {
return return
} }
// Parse reads an env file from io.Reader, returning a map of keys and values.
func Parse(r io.Reader) (envMap map[string]string, err error) {
envMap = make(map[string]string)
var lines []string
scanner := bufio.NewScanner(r)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err = scanner.Err(); err != nil {
return
}
for _, fullLine := range lines {
if !isIgnoredLine(fullLine) {
var key, value string
key, value, err = parseLine(fullLine)
if err != nil {
return
}
envMap[key] = value
}
}
return
}
// Exec loads env vars from the specified filenames (empty map falls back to default) // Exec loads env vars from the specified filenames (empty map falls back to default)
// then executes the cmd specified. // then executes the cmd specified.
// //
@ -142,30 +171,7 @@ func readFile(filename string) (envMap map[string]string, err error) {
} }
defer file.Close() defer file.Close()
envMap = make(map[string]string) return Parse(file)
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err = scanner.Err(); err != nil {
return
}
for _, fullLine := range lines {
if !isIgnoredLine(fullLine) {
var key, value string
key, value, err = parseLine(fullLine)
if err != nil {
return
}
envMap[key] = value
}
}
return
} }
func parseLine(line string) (key string, value string, err error) { func parseLine(line string) (key string, value string, err error) {

View File

@ -1,6 +1,7 @@
package godotenv package godotenv
import ( import (
"bytes"
"os" "os"
"testing" "testing"
) )
@ -94,6 +95,23 @@ func TestReadPlainEnv(t *testing.T) {
} }
} }
func TestParse(t *testing.T) {
envMap, err := Parse(bytes.NewReader([]byte("ONE=1\nTWO='2'\nTHREE = \"3\"")))
expectedValues := map[string]string{
"ONE": "1",
"TWO": "2",
"THREE": "3",
}
if err != nil {
t.Fatalf("error parsing env: %v", err)
}
for key, value := range expectedValues {
if envMap[key] != value {
t.Errorf("expected %s to be %s, got %s", key, value, envMap[key])
}
}
}
func TestLoadDoesNotOverride(t *testing.T) { func TestLoadDoesNotOverride(t *testing.T) {
envFileName := "fixtures/plain.env" envFileName := "fixtures/plain.env"