dotenv 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +4 -0
- data/Changelog.md +12 -0
- data/Gemfile +9 -3
- data/README.md +32 -7
- data/bin/dotenv +3 -4
- data/dotenv-rails.gemspec +1 -0
- data/dotenv.gemspec +1 -0
- data/lib/dotenv.rb +8 -0
- data/lib/dotenv/capistrano.rb +9 -3
- data/lib/dotenv/capistrano/recipes.rb +3 -1
- data/lib/dotenv/environment.rb +12 -18
- data/lib/dotenv/substitutions/command.rb +32 -0
- data/lib/dotenv/substitutions/variable.rb +35 -0
- data/lib/dotenv/version.rb +1 -1
- data/spec/dotenv/environment_spec.rb +39 -1
- data/spec/dotenv_spec.rb +14 -3
- metadata +15 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bd2cbf743caa9a52aa0be269a6d85623a429e63f
|
4
|
+
data.tar.gz: 8dbb6133dbb68670820f783469d680052b7ad6b9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e214586a73a311cf7544a1e2141f2653fba3bcead5a43b5dadd865732a16d9aaed54c0f063f5bade068971191c915fe8917d8da7bcf16eaaf8c8b843642e404c
|
7
|
+
data.tar.gz: 4b689ee34f098e79858a84ec03944d1a365905e9d896ccabbe41bb4181b6272466d97dded85ff58b4ddbdc86412090170ac853a6529ead2088a03ae4fa1e9ab0
|
data/.travis.yml
CHANGED
data/Changelog.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.10.0 - Feb 22, 2014
|
4
|
+
|
5
|
+
* Add support for executing interpolated commands. (Ruby >= 1.9 only)
|
6
|
+
|
7
|
+
HEAD_SHA=$(git rev-parse HEAD)
|
8
|
+
|
9
|
+
* Add `dotenv_role` option in Capistrano.
|
10
|
+
|
11
|
+
set :dotenv_role, [:app, web]
|
12
|
+
|
13
|
+
* Add `Dotenv.overload` to overwrite existing environment values.
|
14
|
+
|
3
15
|
## 0.9.0 - Aug 29, 2013
|
4
16
|
|
5
17
|
* Add support for variable expansion.
|
data/Gemfile
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec :name => 'dotenv'
|
3
3
|
|
4
|
-
|
5
|
-
gem 'guard-
|
6
|
-
gem '
|
4
|
+
group :guard do
|
5
|
+
gem 'guard-rspec'
|
6
|
+
gem 'guard-bundler'
|
7
|
+
gem 'rb-fsevent'
|
8
|
+
end
|
9
|
+
|
10
|
+
platforms :rbx do
|
11
|
+
gem 'rubysl', '~> 2.0' # if using anything in the ruby standard library
|
12
|
+
end
|
data/README.md
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
# dotenv [![Build Status](https://secure.travis-ci.org/bkeepers/dotenv.png)](https://travis-ci.org/bkeepers/dotenv)
|
1
|
+
# dotenv [![Build Status](https://secure.travis-ci.org/bkeepers/dotenv.png?branch=master)](https://travis-ci.org/bkeepers/dotenv)
|
2
2
|
|
3
3
|
Dotenv loads environment variables from `.env` into `ENV`.
|
4
4
|
|
5
5
|
Storing [configuration in the environment](http://www.12factor.net/config) is one of the tenets of a [twelve-factor app](http://www.12factor.net/). Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables.
|
6
6
|
|
7
|
-
But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a `.env` file into ENV when the environment is bootstrapped.
|
7
|
+
But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a `.env` file into `ENV` when the environment is bootstrapped.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
11
|
### Rails
|
12
12
|
|
13
|
-
Add this line to your application's Gemfile:
|
13
|
+
Add this line to the top of your application's Gemfile:
|
14
14
|
|
15
15
|
```ruby
|
16
16
|
gem 'dotenv-rails', :groups => [:development, :test]
|
@@ -18,13 +18,19 @@ gem 'dotenv-rails', :groups => [:development, :test]
|
|
18
18
|
|
19
19
|
And then execute:
|
20
20
|
|
21
|
-
|
21
|
+
```shell
|
22
|
+
$ bundle
|
23
|
+
```
|
24
|
+
|
25
|
+
It should be listed in the Gemfile before any other gems that use environment variables, otherwise those gems will get initialized with the wrong values.
|
22
26
|
|
23
27
|
### Sinatra or Plain ol' Ruby
|
24
28
|
|
25
29
|
Install the gem:
|
26
30
|
|
27
|
-
|
31
|
+
```shell
|
32
|
+
$ gem install dotenv
|
33
|
+
```
|
28
34
|
|
29
35
|
As early as possible in your application bootstrap process, load `.env`:
|
30
36
|
|
@@ -33,6 +39,12 @@ require 'dotenv'
|
|
33
39
|
Dotenv.load
|
34
40
|
```
|
35
41
|
|
42
|
+
Alternatively, you can use the `dotenv` executable to launch your application:
|
43
|
+
|
44
|
+
```shell
|
45
|
+
$ dotenv ./script.py
|
46
|
+
```
|
47
|
+
|
36
48
|
To ensure `.env` is loaded in rake, load the tasks:
|
37
49
|
|
38
50
|
```ruby
|
@@ -74,13 +86,26 @@ config.fog_directory = ENV['S3_BUCKET']
|
|
74
86
|
|
75
87
|
## Capistrano integration
|
76
88
|
|
77
|
-
|
89
|
+
If you want to use Dotenv with Capistrano in your production environment, make sure the dotenv gem is included in your Gemfile `:production` group.
|
90
|
+
|
91
|
+
### Capistrano version 2.x.x
|
92
|
+
|
93
|
+
Add the gem to your `config/deploy.rb` file:
|
78
94
|
|
79
95
|
```ruby
|
80
96
|
require "dotenv/capistrano"
|
81
97
|
```
|
82
98
|
|
83
|
-
It will symlink the `.env` located in `/path/to/shared` in the new release.
|
99
|
+
It will symlink the `.env` located in `/path/to/shared` in the new release.
|
100
|
+
|
101
|
+
|
102
|
+
### Capistrano version 3.x.x
|
103
|
+
|
104
|
+
Just add `.env` to the list of linked files, for example:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
set :linked_files, %w{config/database.yml .env}
|
108
|
+
```
|
84
109
|
|
85
110
|
## Should I commit my .env file?
|
86
111
|
|
data/bin/dotenv
CHANGED
data/dotenv-rails.gemspec
CHANGED
@@ -8,6 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.description = %q{Autoload dotenv in Rails.}
|
9
9
|
gem.summary = %q{Autoload dotenv in Rails.}
|
10
10
|
gem.homepage = "https://github.com/bkeepers/dotenv"
|
11
|
+
gem.license = 'MIT'
|
11
12
|
|
12
13
|
gem.files = ["lib/dotenv-rails.rb"]
|
13
14
|
gem.name = "dotenv-rails"
|
data/dotenv.gemspec
CHANGED
@@ -8,6 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.description = %q{Loads environment variables from `.env`.}
|
9
9
|
gem.summary = %q{Loads environment variables from `.env`.}
|
10
10
|
gem.homepage = "https://github.com/bkeepers/dotenv"
|
11
|
+
gem.license = 'MIT'
|
11
12
|
|
12
13
|
gem.files = `git ls-files`.split($\)
|
13
14
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/dotenv.rb
CHANGED
@@ -8,6 +8,14 @@ module Dotenv
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
# same as `load`, but will override existing values in `ENV`
|
12
|
+
def self.overload(*filenames)
|
13
|
+
default_if_empty(filenames).inject({}) do |hash, filename|
|
14
|
+
filename = File.expand_path filename
|
15
|
+
hash.merge(File.exists?(filename) ? Environment.new(filename).apply! : {})
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
11
19
|
# same as `load`, but raises Errno::ENOENT if any files don't exist
|
12
20
|
def self.load!(*filenames)
|
13
21
|
load(
|
data/lib/dotenv/capistrano.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
|
-
require '
|
1
|
+
require 'capistrano/version'
|
2
2
|
|
3
|
-
Capistrano::
|
4
|
-
|
3
|
+
if defined?(Capistrano::VERSION) && Capistrano::VERSION >= '3.0'
|
4
|
+
raise 'Please read https://github.com/bkeepers/dotenv#capistrano-integration to update your dotenv configuration for new Capistrano version'
|
5
|
+
else
|
6
|
+
require 'dotenv/capistrano/recipes'
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
before "deploy:finalize_update", "dotenv:symlink"
|
10
|
+
end
|
5
11
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
Capistrano::Configuration.instance(:must_exist).load do
|
2
2
|
_cset(:dotenv_path){ "#{shared_path}/.env" }
|
3
3
|
|
4
|
+
symlink_args = (role = fetch(:dotenv_role, nil) ? {:roles => role} : {})
|
5
|
+
|
4
6
|
namespace :dotenv do
|
5
7
|
desc "Symlink shared .env to current release"
|
6
|
-
task :symlink,
|
8
|
+
task :symlink, symlink_args do
|
7
9
|
run "ln -nfs #{dotenv_path} #{release_path}/.env"
|
8
10
|
end
|
9
11
|
end
|
data/lib/dotenv/environment.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require 'dotenv/format_error'
|
2
|
+
require 'dotenv/substitutions/variable'
|
3
|
+
if RUBY_VERSION > '1.8.7'
|
4
|
+
require 'dotenv/substitutions/command'
|
5
|
+
end
|
2
6
|
|
3
7
|
module Dotenv
|
4
8
|
class Environment < Hash
|
9
|
+
@@substitutions = Substitutions.constants.map { |const| Substitutions.const_get(const) }
|
10
|
+
|
5
11
|
LINE = /
|
6
12
|
\A
|
7
13
|
(?:export\s+)? # optional export
|
@@ -17,15 +23,6 @@ module Dotenv
|
|
17
23
|
(?:\s*\#.*)? # optional comment
|
18
24
|
\z
|
19
25
|
/x
|
20
|
-
VARIABLE = /
|
21
|
-
(\\)?
|
22
|
-
(\$)
|
23
|
-
( # collect braces with var for sub
|
24
|
-
\{? # allow brace wrapping
|
25
|
-
([A-Z0-9_]+) # match the variable
|
26
|
-
\}? # closing brace
|
27
|
-
)
|
28
|
-
/xi
|
29
26
|
|
30
27
|
def initialize(filename)
|
31
28
|
@filename = filename
|
@@ -47,15 +44,8 @@ module Dotenv
|
|
47
44
|
value = value.gsub(/\\([^$])/, '\1')
|
48
45
|
end
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
if parts.first == '\\'
|
53
|
-
replace = parts[1...-1].join('')
|
54
|
-
else
|
55
|
-
replace = self.fetch(parts.last) { ENV[parts.last] }
|
56
|
-
end
|
57
|
-
|
58
|
-
value = value.sub(parts[0...-1].join(''), replace || '')
|
47
|
+
@@substitutions.each do |proc|
|
48
|
+
value = proc.call(value, self)
|
59
49
|
end
|
60
50
|
|
61
51
|
self[key] = value
|
@@ -72,5 +62,9 @@ module Dotenv
|
|
72
62
|
def apply
|
73
63
|
each { |k,v| ENV[k] ||= v }
|
74
64
|
end
|
65
|
+
|
66
|
+
def apply!
|
67
|
+
each { |k,v| ENV[k] = v }
|
68
|
+
end
|
75
69
|
end
|
76
70
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Dotenv
|
2
|
+
module Substitutions
|
3
|
+
module Command
|
4
|
+
class << self
|
5
|
+
|
6
|
+
INTERPOLATED_SHELL_COMMAND = /
|
7
|
+
(?<backslash>\\)?
|
8
|
+
\$
|
9
|
+
(?<cmd> # collect command content for eval
|
10
|
+
\( # require opening paren
|
11
|
+
([^()]|\g<cmd>)+ # allow any number of non-parens, or balanced parens (by nesting the <cmd> expression recursively)
|
12
|
+
\) # require closing paren
|
13
|
+
)
|
14
|
+
/x
|
15
|
+
|
16
|
+
def call(value, env)
|
17
|
+
# Process interpolated shell commands
|
18
|
+
value.gsub(INTERPOLATED_SHELL_COMMAND) do |*|
|
19
|
+
command = $~[:cmd][1..-2] # Eliminate opening and closing parentheses
|
20
|
+
|
21
|
+
if $~[:backslash]
|
22
|
+
$~[0][1..-1]
|
23
|
+
else
|
24
|
+
`#{command}`.chomp
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Dotenv
|
2
|
+
module Substitutions
|
3
|
+
module Variable
|
4
|
+
class << self
|
5
|
+
|
6
|
+
VARIABLE = /
|
7
|
+
(\\)?
|
8
|
+
(\$)
|
9
|
+
( # collect braces with var for sub
|
10
|
+
\{? # allow brace wrapping
|
11
|
+
([A-Z0-9_]+) # match the variable
|
12
|
+
\}? # closing brace
|
13
|
+
)
|
14
|
+
/xi
|
15
|
+
|
16
|
+
def call(value, env)
|
17
|
+
# Process embedded variables
|
18
|
+
value.scan(VARIABLE).each do |parts|
|
19
|
+
if parts.first == '\\'
|
20
|
+
replace = parts[1...-1].join('')
|
21
|
+
else
|
22
|
+
replace = env.fetch(parts.last) { ENV[parts.last] }
|
23
|
+
end
|
24
|
+
|
25
|
+
value = value.sub(parts[0...-1].join(''), replace || '')
|
26
|
+
end
|
27
|
+
|
28
|
+
value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/lib/dotenv/version.rb
CHANGED
@@ -29,6 +29,19 @@ describe Dotenv::Environment do
|
|
29
29
|
end
|
30
30
|
end
|
31
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
|
+
|
32
45
|
it 'parses unquoted values' do
|
33
46
|
expect(env('FOO=bar')).to eql('FOO' => 'bar')
|
34
47
|
end
|
@@ -92,7 +105,7 @@ describe Dotenv::Environment do
|
|
92
105
|
expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz")
|
93
106
|
end
|
94
107
|
|
95
|
-
it 'parses
|
108
|
+
it 'parses variables with "." in the name' do
|
96
109
|
expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar')
|
97
110
|
end
|
98
111
|
|
@@ -125,6 +138,31 @@ describe Dotenv::Environment do
|
|
125
138
|
expect(env("foo='ba#r'")).to eql('foo' => 'ba#r')
|
126
139
|
end
|
127
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
|
+
|
128
166
|
require 'tempfile'
|
129
167
|
def env(text)
|
130
168
|
file = Tempfile.new('dotenv')
|
data/spec/dotenv_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Dotenv do
|
|
6
6
|
let(:env_files) { [] }
|
7
7
|
|
8
8
|
it 'defaults to .env' do
|
9
|
-
Dotenv::Environment.
|
9
|
+
expect(Dotenv::Environment).to receive(:new).with(expand('.env')).
|
10
10
|
and_return(double(:apply => {}))
|
11
11
|
subject
|
12
12
|
end
|
@@ -17,8 +17,8 @@ describe Dotenv do
|
|
17
17
|
|
18
18
|
it 'expands the path' do
|
19
19
|
expected = expand("~/.env")
|
20
|
-
File.
|
21
|
-
Dotenv::Environment.
|
20
|
+
allow(File).to receive(:exists?){ |arg| arg == expected }
|
21
|
+
expect(Dotenv::Environment).to receive(:new).with(expected).
|
22
22
|
and_return(double(:apply => {}))
|
23
23
|
subject
|
24
24
|
end
|
@@ -82,6 +82,17 @@ describe Dotenv do
|
|
82
82
|
end
|
83
83
|
end
|
84
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
|
+
|
85
96
|
def fixture_path(name)
|
86
97
|
File.join(File.expand_path('../fixtures', __FILE__), name)
|
87
98
|
end
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dotenv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.10.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Brandon Keepers
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: Loads environment variables from `.env`.
|
@@ -70,6 +65,8 @@ files:
|
|
70
65
|
- lib/dotenv/environment.rb
|
71
66
|
- lib/dotenv/format_error.rb
|
72
67
|
- lib/dotenv/railtie.rb
|
68
|
+
- lib/dotenv/substitutions/command.rb
|
69
|
+
- lib/dotenv/substitutions/variable.rb
|
73
70
|
- lib/dotenv/tasks.rb
|
74
71
|
- lib/dotenv/version.rb
|
75
72
|
- spec/dotenv/environment_spec.rb
|
@@ -80,28 +77,28 @@ files:
|
|
80
77
|
- spec/fixtures/yaml.env
|
81
78
|
- spec/spec_helper.rb
|
82
79
|
homepage: https://github.com/bkeepers/dotenv
|
83
|
-
licenses:
|
80
|
+
licenses:
|
81
|
+
- MIT
|
82
|
+
metadata: {}
|
84
83
|
post_install_message:
|
85
84
|
rdoc_options: []
|
86
85
|
require_paths:
|
87
86
|
- lib
|
88
87
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
88
|
requirements:
|
91
|
-
- -
|
89
|
+
- - '>='
|
92
90
|
- !ruby/object:Gem::Version
|
93
91
|
version: '0'
|
94
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
93
|
requirements:
|
97
|
-
- -
|
94
|
+
- - '>='
|
98
95
|
- !ruby/object:Gem::Version
|
99
96
|
version: '0'
|
100
97
|
requirements: []
|
101
98
|
rubyforge_project:
|
102
|
-
rubygems_version:
|
99
|
+
rubygems_version: 2.0.3
|
103
100
|
signing_key:
|
104
|
-
specification_version:
|
101
|
+
specification_version: 4
|
105
102
|
summary: Loads environment variables from `.env`.
|
106
103
|
test_files:
|
107
104
|
- spec/dotenv/environment_spec.rb
|