dotenv 0.10.0 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +176 -30
- data/bin/dotenv +2 -9
- data/lib/dotenv/cli.rb +57 -0
- data/lib/dotenv/environment.rb +10 -52
- data/lib/dotenv/load.rb +2 -0
- data/lib/dotenv/missing_keys.rb +10 -0
- data/lib/dotenv/parser.rb +109 -0
- data/lib/dotenv/substitutions/command.rb +18 -9
- data/lib/dotenv/substitutions/variable.rb +29 -21
- data/lib/dotenv/tasks.rb +3 -3
- data/lib/dotenv/template.rb +26 -0
- data/lib/dotenv/version.rb +1 -1
- data/lib/dotenv.rb +72 -19
- metadata +32 -42
- data/.env +0 -1
- data/.gitignore +0 -8
- data/.travis.yml +0 -10
- data/Changelog.md +0 -95
- data/Gemfile +0 -12
- data/Guardfile +0 -9
- data/Rakefile +0 -30
- data/dotenv-rails.gemspec +0 -18
- data/dotenv.gemspec +0 -21
- data/lib/dotenv/capistrano/recipes.rb +0 -12
- data/lib/dotenv/capistrano.rb +0 -11
- data/lib/dotenv/format_error.rb +0 -4
- data/lib/dotenv/railtie.rb +0 -14
- data/lib/dotenv-rails.rb +0 -1
- data/spec/dotenv/environment_spec.rb +0 -175
- data/spec/dotenv_spec.rb +0 -103
- data/spec/fixtures/exported.env +0 -2
- data/spec/fixtures/plain.env +0 -5
- data/spec/fixtures/quoted.env +0 -8
- data/spec/fixtures/yaml.env +0 -4
- data/spec/spec_helper.rb +0 -7
@@ -1,175 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Dotenv::Environment do
|
4
|
-
subject { env("OPTION_A=1\nOPTION_B=2") }
|
5
|
-
|
6
|
-
describe 'initialize' do
|
7
|
-
it 'reads the file' do
|
8
|
-
expect(subject['OPTION_A']).to eq('1')
|
9
|
-
expect(subject['OPTION_B']).to eq('2')
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'fails if file does not exist' do
|
13
|
-
expect {
|
14
|
-
Dotenv::Environment.new('.does_not_exists')
|
15
|
-
}.to raise_error(Errno::ENOENT)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe 'apply' do
|
20
|
-
it 'sets variables in ENV' do
|
21
|
-
subject.apply
|
22
|
-
expect(ENV['OPTION_A']).to eq('1')
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'does not override defined variables' do
|
26
|
-
ENV['OPTION_A'] = 'predefined'
|
27
|
-
subject.apply
|
28
|
-
expect(ENV['OPTION_A']).to eq('predefined')
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe 'apply!' do
|
33
|
-
it 'sets variables in the ENV' do
|
34
|
-
subject.apply
|
35
|
-
expect(ENV['OPTION_A']).to eq('1')
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'overrides defined variables' do
|
39
|
-
ENV['OPTION_A'] = 'predefined'
|
40
|
-
subject.apply!
|
41
|
-
expect(ENV['OPTION_A']).to eq('1')
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'parses unquoted values' do
|
46
|
-
expect(env('FOO=bar')).to eql('FOO' => 'bar')
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'parses values with spaces around equal sign' do
|
50
|
-
expect(env("FOO =bar")).to eql('FOO' => 'bar')
|
51
|
-
expect(env("FOO= bar")).to eql('FOO' => 'bar')
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'parses double quoted values' do
|
55
|
-
expect(env('FOO="bar"')).to eql('FOO' => 'bar')
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'parses single quoted values' do
|
59
|
-
expect(env("FOO='bar'")).to eql('FOO' => 'bar')
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'parses escaped double quotes' do
|
63
|
-
expect(env('FOO="escaped\"bar"')).to eql('FOO' => 'escaped"bar')
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'parses empty values' do
|
67
|
-
expect(env('FOO=')).to eql('FOO' => '')
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'expands variables found in values' do
|
71
|
-
expect(env("FOO=test\nBAR=$FOO")).to eql('FOO' => 'test', 'BAR' => 'test')
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'parses variables wrapped in brackets' do
|
75
|
-
expect(env("FOO=test\nBAR=${FOO}bar")).to eql('FOO' => 'test', 'BAR' => 'testbar')
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'reads variables from ENV when expanding if not found in local env' do
|
79
|
-
ENV['FOO'] = 'test'
|
80
|
-
expect(env('BAR=$FOO')).to eql('BAR' => 'test')
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'expands undefined variables to an empty string' do
|
84
|
-
expect(env('BAR=$FOO')).to eql('BAR' => '')
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'expands variables in quoted strings' do
|
88
|
-
expect(env("FOO=test\nBAR='quote $FOO'")).to eql('FOO' => 'test', 'BAR' => 'quote test')
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'does not expand escaped variables' do
|
92
|
-
expect(env('FOO="foo\$BAR"')).to eql('FOO' => 'foo$BAR')
|
93
|
-
expect(env('FOO="foo\${BAR}"')).to eql('FOO' => 'foo${BAR}')
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'parses yaml style options' do
|
97
|
-
expect(env('OPTION_A: 1')).to eql('OPTION_A' => '1')
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'parses export keyword' do
|
101
|
-
expect(env('export OPTION_A=2')).to eql('OPTION_A' => '2')
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'expands newlines in quoted strings' do
|
105
|
-
expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz")
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'parses variables with "." in the name' do
|
109
|
-
expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar')
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'strips unquoted values' do
|
113
|
-
expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar '
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'throws an error if line format is incorrect' do
|
117
|
-
expect{env('lol$wut')}.to raise_error(Dotenv::FormatError)
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'ignores empty lines' do
|
121
|
-
expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz')
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'ignores inline comments' do
|
125
|
-
expect(env("foo=bar # this is foo")).to eql('foo' => 'bar')
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'allows # in quoted value' do
|
129
|
-
expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz')
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'ignores comment lines' do
|
133
|
-
expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar')
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'parses # in quoted values' do
|
137
|
-
expect(env('foo="ba#r"')).to eql('foo' => 'ba#r')
|
138
|
-
expect(env("foo='ba#r'")).to eql('foo' => 'ba#r')
|
139
|
-
end
|
140
|
-
|
141
|
-
if RUBY_VERSION > '1.8.7'
|
142
|
-
it 'parses shell commands interpolated in $()' do
|
143
|
-
expect(env('ruby_v=$(ruby -v)')).to eql('ruby_v' => RUBY_DESCRIPTION)
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'allows balanced parentheses within interpolated shell commands' do
|
147
|
-
expect(env('ruby_v=$(echo "$(echo "$(echo "$(ruby -v)")")")')).to eql('ruby_v' => RUBY_DESCRIPTION)
|
148
|
-
end
|
149
|
-
|
150
|
-
it "doesn't interpolate shell commands when escape says not to" do
|
151
|
-
expect(env('ruby_v=escaped-\$(ruby -v)')).to eql('ruby_v' => 'escaped-$(ruby -v)')
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'is not thrown off by quotes in interpolated shell commands' do
|
155
|
-
expect(env('interp=$(echo "Quotes won\'t be a problem")')['interp']).to eql("Quotes won't be a problem")
|
156
|
-
end
|
157
|
-
|
158
|
-
# This functionality is not supported on JRuby or Rubinius
|
159
|
-
if (!defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby') && !defined?(Rubinius)
|
160
|
-
it 'substitutes shell variables within interpolated shell commands' do
|
161
|
-
expect(env(%(VAR1=var1\ninterp=$(echo "VAR1 is $VAR1")))['interp']).to eql("VAR1 is var1")
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
require 'tempfile'
|
167
|
-
def env(text)
|
168
|
-
file = Tempfile.new('dotenv')
|
169
|
-
file.write text
|
170
|
-
file.close
|
171
|
-
env = Dotenv::Environment.new(file.path)
|
172
|
-
file.unlink
|
173
|
-
env
|
174
|
-
end
|
175
|
-
end
|
data/spec/dotenv_spec.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Dotenv do
|
4
|
-
shared_examples 'load' do
|
5
|
-
context 'with no args' do
|
6
|
-
let(:env_files) { [] }
|
7
|
-
|
8
|
-
it 'defaults to .env' do
|
9
|
-
expect(Dotenv::Environment).to receive(:new).with(expand('.env')).
|
10
|
-
and_return(double(:apply => {}))
|
11
|
-
subject
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'with a tilde path' do
|
16
|
-
let(:env_files) { ['~/.env'] }
|
17
|
-
|
18
|
-
it 'expands the path' do
|
19
|
-
expected = expand("~/.env")
|
20
|
-
allow(File).to receive(:exists?){ |arg| arg == expected }
|
21
|
-
expect(Dotenv::Environment).to receive(:new).with(expected).
|
22
|
-
and_return(double(:apply => {}))
|
23
|
-
subject
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with multiple files' do
|
28
|
-
let(:env_files) { ['.env', fixture_path('plain.env')] }
|
29
|
-
|
30
|
-
let(:expected) do
|
31
|
-
{ 'OPTION_A' => '1',
|
32
|
-
'OPTION_B' => '2',
|
33
|
-
'OPTION_C' => '3',
|
34
|
-
'OPTION_D' => '4',
|
35
|
-
'OPTION_E' => '5',
|
36
|
-
'DOTENV' => 'true' }
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'loads all files' do
|
40
|
-
subject
|
41
|
-
expected.each do |key, value|
|
42
|
-
expect(ENV[key]).to eq(value)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'returns hash of loaded environments' do
|
47
|
-
expect(subject).to eq(expected)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe 'load' do
|
53
|
-
subject { Dotenv.load(*env_files) }
|
54
|
-
|
55
|
-
it_behaves_like 'load'
|
56
|
-
|
57
|
-
context 'when the file does not exist' do
|
58
|
-
let(:env_files) { ['.env_does_not_exist'] }
|
59
|
-
|
60
|
-
it 'fails silently' do
|
61
|
-
expect { subject }.not_to raise_error
|
62
|
-
expect(ENV.keys).to eq(@env_keys)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe 'load!' do
|
68
|
-
subject { Dotenv.load!(*env_files) }
|
69
|
-
|
70
|
-
it_behaves_like 'load'
|
71
|
-
|
72
|
-
context 'when one file exists and one does not' do
|
73
|
-
let(:env_files) { ['.env', '.env_does_not_exist'] }
|
74
|
-
|
75
|
-
it 'raises an Errno::ENOENT error and does not load any files' do
|
76
|
-
expect do
|
77
|
-
expect do
|
78
|
-
subject
|
79
|
-
end.to raise_error(Errno::ENOENT)
|
80
|
-
end.to_not change { ENV.keys }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe 'overload' do
|
86
|
-
it 'overrides any existing ENV variables' do
|
87
|
-
ENV['OPTION_A'] = 'predefined'
|
88
|
-
path = fixture_path 'plain.env'
|
89
|
-
|
90
|
-
Dotenv.overload(path)
|
91
|
-
|
92
|
-
expect(ENV['OPTION_A']).to eq('1')
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def fixture_path(name)
|
97
|
-
File.join(File.expand_path('../fixtures', __FILE__), name)
|
98
|
-
end
|
99
|
-
|
100
|
-
def expand(path)
|
101
|
-
File.expand_path path
|
102
|
-
end
|
103
|
-
end
|
data/spec/fixtures/exported.env
DELETED
data/spec/fixtures/plain.env
DELETED
data/spec/fixtures/quoted.env
DELETED
data/spec/fixtures/yaml.env
DELETED