diff --git a/godotenv.go b/godotenv.go index dd1b4ca..9193694 100644 --- a/godotenv.go +++ b/godotenv.go @@ -76,8 +76,25 @@ func parseLine(line string) (key string, value string, err error) { } key = strings.Trim(key, " ") - value = strings.Trim(splitString[1], " \"'") - value = strings.Replace(value, "\\\"", "\"", -1) + value = splitString[1] + + // ditch the comments + if strings.Contains(value, "#") { + value = strings.Trim(strings.Split(value, "#")[0], " ") + } + + // check if we've got quoted values + if strings.Count(value, "\"") == 2 || strings.Count(value, "'") == 2 { + // pull the quotes off the edge + value = strings.Trim(value, "\"'") + + // expand quotes + value = strings.Replace(value, "\\\"", "\"", -1) + // expand newlines + value = strings.Replace(value, "\\n", "\n", -1) + } + // trim + value = strings.Trim(value, " ") return } diff --git a/godotenv_test.go b/godotenv_test.go index bb31049..d748538 100644 --- a/godotenv_test.go +++ b/godotenv_test.go @@ -70,45 +70,36 @@ func TestParsing(t *testing.T) { // parses export keyword parseAndCompare(t, "export OPTION_A=2", "OPTION_A", "2") - /* - The rest of my TODO list + // it 'expands newlines in quoted strings' do + // expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz") + parseAndCompare(t, "FOO=\"bar\\nbaz\"", "FOO", "bar\nbaz") - it 'expands newlines in quoted strings' do - expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz") - end + // it 'parses varibales with "." in the name' do + // expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar') + parseAndCompare(t, "FOO.BAR=foobar", "FOO.BAR", "foobar") - it 'parses varibales with "." in the name' do - expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar') - end + // it 'strips unquoted values' do + // expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar ' + parseAndCompare(t, "FOO=bar ", "FOO", "bar") - it 'strips unquoted values' do - expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar ' - end + // it 'ignores inline comments' do + // expect(env("foo=bar # this is foo")).to eql('foo' => 'bar') + parseAndCompare(t, "FOO=bar # this is foo", "FOO", "bar") - it 'throws an error if line format is incorrect' do - expect{env('lol$wut')}.to raise_error(Dotenv::FormatError) - end + // it 'allows # in quoted value' do + // expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz') + parseAndCompare(t, "FOO=\"bar#baz\" # comment", "FOO", "bar#baz") - it 'ignores empty lines' do - expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz') - end + // it 'ignores comment lines' do + // expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar') - it 'ignores inline comments' do - expect(env("foo=bar # this is foo")).to eql('foo' => 'bar') - end + // it 'parses # in quoted values' do + // expect(env('foo="ba#r"')).to eql('foo' => 'ba#r') + // expect(env("foo='ba#r'")).to eql('foo' => 'ba#r') - it 'allows # in quoted value' do - expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz') - end + // it 'throws an error if line format is incorrect' do + // expect{env('lol$wut')}.to raise_error(Dotenv::FormatError) - it 'ignores comment lines' do - expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar') - end - - it 'parses # in quoted values' do - expect(env('foo="ba#r"')).to eql('foo' => 'ba#r') - expect(env("foo='ba#r'")).to eql('foo' => 'ba#r') - end - - */ + // it 'ignores empty lines' do + // expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz') }