dotenv 0.9.0 → 2.7.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +187 -24
- data/bin/dotenv +2 -10
- data/lib/dotenv.rb +75 -14
- data/lib/dotenv/cli.rb +80 -0
- data/lib/dotenv/environment.rb +13 -61
- data/lib/dotenv/load.rb +2 -0
- data/lib/dotenv/missing_keys.rb +10 -0
- data/lib/dotenv/parser.rb +98 -0
- data/lib/dotenv/substitutions/command.rb +41 -0
- data/lib/dotenv/substitutions/variable.rb +47 -0
- data/lib/dotenv/tasks.rb +3 -3
- data/lib/dotenv/template.rb +21 -0
- data/lib/dotenv/version.rb +1 -1
- metadata +35 -48
- data/.env +0 -1
- data/.gitignore +0 -8
- data/.travis.yml +0 -6
- data/Changelog.md +0 -83
- data/Gemfile +0 -6
- data/Guardfile +0 -9
- data/Rakefile +0 -30
- data/dotenv-rails.gemspec +0 -17
- data/dotenv.gemspec +0 -20
- data/lib/dotenv-rails.rb +0 -1
- data/lib/dotenv/capistrano.rb +0 -5
- data/lib/dotenv/capistrano/recipes.rb +0 -10
- data/lib/dotenv/format_error.rb +0 -4
- data/lib/dotenv/railtie.rb +0 -14
- data/spec/dotenv/environment_spec.rb +0 -137
- data/spec/dotenv_spec.rb +0 -92
- 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
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/Changelog.md
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# Changelog
|
2
|
-
|
3
|
-
## 0.9.0 - Aug 29, 2013
|
4
|
-
|
5
|
-
* Add support for variable expansion.
|
6
|
-
|
7
|
-
HOST="example.com"
|
8
|
-
URL="http://${USER}@${HOST}"
|
9
|
-
ESCAPED_VARIABLE="this is \$NOT replaced"
|
10
|
-
|
11
|
-
* Allow setting variables without a value.
|
12
|
-
|
13
|
-
BLANK=
|
14
|
-
|
15
|
-
* Add `dotenv` executable to load `.env` for other scripts.
|
16
|
-
|
17
|
-
$ dotenv ./script.py
|
18
|
-
|
19
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.8.0...v0.9.0)
|
20
|
-
|
21
|
-
## 0.8.0 - June 12, 2013
|
22
|
-
|
23
|
-
* Added a capistrano recipe to symlink in `.env` on deploy.
|
24
|
-
|
25
|
-
* Allow inline comments
|
26
|
-
|
27
|
-
VARIABLE=value # this is a comment
|
28
|
-
|
29
|
-
* Raises Dotenv::FormatError when parsing fails
|
30
|
-
|
31
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.7.0...v0.8.0)
|
32
|
-
|
33
|
-
## 0.7.0 - April 15, 2013
|
34
|
-
|
35
|
-
* Remove deprectated autoloading. Upgrade to 0.6 first and fix any warnings.
|
36
|
-
|
37
|
-
* Add Dotenv.load! which raises Errno::ENOENT if the file does not exist
|
38
|
-
|
39
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.6.0...v0.7.0)
|
40
|
-
|
41
|
-
## 0.6.0 - Mar 22, 2013
|
42
|
-
|
43
|
-
* Add dotenv-rails gem for autoloading in a Rails app
|
44
|
-
|
45
|
-
* Deprecated autoloading with plain dotenv gem
|
46
|
-
|
47
|
-
* Support for double quotes
|
48
|
-
|
49
|
-
A="some value"
|
50
|
-
B="with \"escaped\" quotes"
|
51
|
-
C="and newline\n expansion"
|
52
|
-
|
53
|
-
* Support for pow-style variables prefixed with export
|
54
|
-
|
55
|
-
export VARIABLE="some value"
|
56
|
-
|
57
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.5.0...v0.6.0)
|
58
|
-
|
59
|
-
## 0.5.0 - Jan 25, 2013
|
60
|
-
|
61
|
-
* Load immediately on require in Rails instead of waiting for initialization
|
62
|
-
|
63
|
-
* Add YAML-style variables
|
64
|
-
|
65
|
-
VARIABLE: some value
|
66
|
-
|
67
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.4.0...v0.5.0)
|
68
|
-
|
69
|
-
## 0.4.0 - Nov 13, 2012
|
70
|
-
|
71
|
-
* Add support for quoted options, e.g.:
|
72
|
-
|
73
|
-
VARIABLE='some value'
|
74
|
-
|
75
|
-
* Fix rake deprecation warnings
|
76
|
-
|
77
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.3.0...v0.4.0)
|
78
|
-
|
79
|
-
## 0.3.0 - Oct 25, 2012
|
80
|
-
|
81
|
-
* Avoid overriding existing ENV variables so values set before loading the app are maintained.
|
82
|
-
|
83
|
-
[Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.2.0...v0.3.0)
|
data/Gemfile
DELETED
data/Guardfile
DELETED
data/Rakefile
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
|
-
|
3
|
-
require 'bundler/gem_helper'
|
4
|
-
|
5
|
-
namespace 'dotenv' do
|
6
|
-
Bundler::GemHelper.install_tasks :name => 'dotenv'
|
7
|
-
end
|
8
|
-
|
9
|
-
namespace 'dotenv-rails' do
|
10
|
-
class DotenvRailsGemHelper < Bundler::GemHelper
|
11
|
-
def guard_already_tagged; end # noop
|
12
|
-
def tag_version; end # noop
|
13
|
-
end
|
14
|
-
|
15
|
-
DotenvRailsGemHelper.install_tasks :name => 'dotenv-rails'
|
16
|
-
end
|
17
|
-
|
18
|
-
task :build => ["dotenv:build", 'dotenv-rails:build']
|
19
|
-
task :install => ["dotenv:install", 'dotenv-rails:install']
|
20
|
-
task :release => ["dotenv:release", 'dotenv-rails:release']
|
21
|
-
|
22
|
-
require 'rspec/core/rake_task'
|
23
|
-
|
24
|
-
desc "Run all specs"
|
25
|
-
RSpec::Core::RakeTask.new(:spec) do |t|
|
26
|
-
t.rspec_opts = %w[--color]
|
27
|
-
t.verbose = false
|
28
|
-
end
|
29
|
-
|
30
|
-
task :default => :spec
|
data/dotenv-rails.gemspec
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('../lib/dotenv/version', __FILE__)
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.version = Dotenv::VERSION
|
6
|
-
gem.authors = ["Brandon Keepers"]
|
7
|
-
gem.email = ["brandon@opensoul.org"]
|
8
|
-
gem.description = %q{Autoload dotenv in Rails.}
|
9
|
-
gem.summary = %q{Autoload dotenv in Rails.}
|
10
|
-
gem.homepage = "https://github.com/bkeepers/dotenv"
|
11
|
-
|
12
|
-
gem.files = ["lib/dotenv-rails.rb"]
|
13
|
-
gem.name = "dotenv-rails"
|
14
|
-
gem.require_paths = ["lib"]
|
15
|
-
|
16
|
-
gem.add_dependency 'dotenv', Dotenv::VERSION
|
17
|
-
end
|
data/dotenv.gemspec
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('../lib/dotenv/version', __FILE__)
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.version = Dotenv::VERSION
|
6
|
-
gem.authors = ["Brandon Keepers"]
|
7
|
-
gem.email = ["brandon@opensoul.org"]
|
8
|
-
gem.description = %q{Loads environment variables from `.env`.}
|
9
|
-
gem.summary = %q{Loads environment variables from `.env`.}
|
10
|
-
gem.homepage = "https://github.com/bkeepers/dotenv"
|
11
|
-
|
12
|
-
gem.files = `git ls-files`.split($\)
|
13
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
-
gem.name = "dotenv"
|
16
|
-
gem.require_paths = ["lib"]
|
17
|
-
|
18
|
-
gem.add_development_dependency 'rake'
|
19
|
-
gem.add_development_dependency 'rspec'
|
20
|
-
end
|
data/lib/dotenv-rails.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'dotenv/railtie'
|
data/lib/dotenv/capistrano.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
_cset(:dotenv_path){ "#{shared_path}/.env" }
|
3
|
-
|
4
|
-
namespace :dotenv do
|
5
|
-
desc "Symlink shared .env to current release"
|
6
|
-
task :symlink, roles: :app do
|
7
|
-
run "ln -nfs #{dotenv_path} #{release_path}/.env"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
data/lib/dotenv/format_error.rb
DELETED
data/lib/dotenv/railtie.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'dotenv'
|
2
|
-
|
3
|
-
module Dotenv
|
4
|
-
class Railtie < Rails::Railtie
|
5
|
-
rake_tasks do
|
6
|
-
desc 'Load environment settings from .env'
|
7
|
-
task :dotenv do
|
8
|
-
Dotenv.load ".env.#{Rails.env}", '.env'
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
Dotenv.load ".env.#{Rails.env}", '.env'
|
@@ -1,137 +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
|
-
it 'parses unquoted values' do
|
33
|
-
expect(env('FOO=bar')).to eql('FOO' => 'bar')
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'parses values with spaces around equal sign' do
|
37
|
-
expect(env("FOO =bar")).to eql('FOO' => 'bar')
|
38
|
-
expect(env("FOO= bar")).to eql('FOO' => 'bar')
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'parses double quoted values' do
|
42
|
-
expect(env('FOO="bar"')).to eql('FOO' => 'bar')
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'parses single quoted values' do
|
46
|
-
expect(env("FOO='bar'")).to eql('FOO' => 'bar')
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'parses escaped double quotes' do
|
50
|
-
expect(env('FOO="escaped\"bar"')).to eql('FOO' => 'escaped"bar')
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'parses empty values' do
|
54
|
-
expect(env('FOO=')).to eql('FOO' => '')
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'expands variables found in values' do
|
58
|
-
expect(env("FOO=test\nBAR=$FOO")).to eql('FOO' => 'test', 'BAR' => 'test')
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'parses variables wrapped in brackets' do
|
62
|
-
expect(env("FOO=test\nBAR=${FOO}bar")).to eql('FOO' => 'test', 'BAR' => 'testbar')
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'reads variables from ENV when expanding if not found in local env' do
|
66
|
-
ENV['FOO'] = 'test'
|
67
|
-
expect(env('BAR=$FOO')).to eql('BAR' => 'test')
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'expands undefined variables to an empty string' do
|
71
|
-
expect(env('BAR=$FOO')).to eql('BAR' => '')
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'expands variables in quoted strings' do
|
75
|
-
expect(env("FOO=test\nBAR='quote $FOO'")).to eql('FOO' => 'test', 'BAR' => 'quote test')
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'does not expand escaped variables' do
|
79
|
-
expect(env('FOO="foo\$BAR"')).to eql('FOO' => 'foo$BAR')
|
80
|
-
expect(env('FOO="foo\${BAR}"')).to eql('FOO' => 'foo${BAR}')
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'parses yaml style options' do
|
84
|
-
expect(env('OPTION_A: 1')).to eql('OPTION_A' => '1')
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'parses export keyword' do
|
88
|
-
expect(env('export OPTION_A=2')).to eql('OPTION_A' => '2')
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'expands newlines in quoted strings' do
|
92
|
-
expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz")
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'parses varibales with "." in the name' do
|
96
|
-
expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar')
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'strips unquoted values' do
|
100
|
-
expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar '
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'throws an error if line format is incorrect' do
|
104
|
-
expect{env('lol$wut')}.to raise_error(Dotenv::FormatError)
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'ignores empty lines' do
|
108
|
-
expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz')
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'ignores inline comments' do
|
112
|
-
expect(env("foo=bar # this is foo")).to eql('foo' => 'bar')
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'allows # in quoted value' do
|
116
|
-
expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz')
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'ignores comment lines' do
|
120
|
-
expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar')
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'parses # in quoted values' do
|
124
|
-
expect(env('foo="ba#r"')).to eql('foo' => 'ba#r')
|
125
|
-
expect(env("foo='ba#r'")).to eql('foo' => 'ba#r')
|
126
|
-
end
|
127
|
-
|
128
|
-
require 'tempfile'
|
129
|
-
def env(text)
|
130
|
-
file = Tempfile.new('dotenv')
|
131
|
-
file.write text
|
132
|
-
file.close
|
133
|
-
env = Dotenv::Environment.new(file.path)
|
134
|
-
file.unlink
|
135
|
-
env
|
136
|
-
end
|
137
|
-
end
|
data/spec/dotenv_spec.rb
DELETED
@@ -1,92 +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
|
-
Dotenv::Environment.should_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
|
-
File.stub(:exists?){ |arg| arg == expected }
|
21
|
-
Dotenv::Environment.should_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
|
-
def fixture_path(name)
|
86
|
-
File.join(File.expand_path('../fixtures', __FILE__), name)
|
87
|
-
end
|
88
|
-
|
89
|
-
def expand(path)
|
90
|
-
File.expand_path path
|
91
|
-
end
|
92
|
-
end
|