dotenv 1.0.2 → 2.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cce545159cfd5b2760d935e32c63de6d00351b75
4
- data.tar.gz: d28a58b874827bd2419da6a186d0553563cc0a7f
3
+ metadata.gz: 082cf9f284dde0511d6c31a21bd1b7f93b9804c3
4
+ data.tar.gz: bcacb89f7cbf92eea2a2e12764db45a64c7909b1
5
5
  SHA512:
6
- metadata.gz: 5983f239a869fa1480d0604ba55bcc98f3306af3aed5ec6251ceb685460adda7d691975eaefa5bffeb1b3fa8dbd4eaee9df855a6c62251893d8c61274c2fafd0
7
- data.tar.gz: f709294d266b13935e00551f427f9a433fe4b996d786df20e4af9b37fc41ea3a3f8d4d3f10aae83b50c7c05e28f012ae610422006e1fe93b16c241b61c5a9195
6
+ metadata.gz: 79fd1380227329afe5da7c1d2291e297106ba9f54cab22b204068e035f029bee4bec34289f424d70d3bfa92ce81f772b2632a4a5c1328b1ddd7e3e3938fcc290
7
+ data.tar.gz: bb84a49f6a65088eec50233de800118fea98de0eb097c63b88ada013d474375b1565548570982254866e93ac836ec25df9bf3a1884d4f866cd7355862954eb1d
data/README.md CHANGED
@@ -6,8 +6,6 @@ Storing [configuration in the environment](http://www.12factor.net/config) is on
6
6
 
7
7
  But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. dotenv loads variables from a `.env` file into `ENV` when the environment is bootstrapped.
8
8
 
9
- dotenv is intended to be used in development. If you would like to use it in production or other environments, see [dotenv-deployment](https://github.com/bkeepers/dotenv-deployment)
10
-
11
9
  ## Installation
12
10
 
13
11
  ### Rails
@@ -103,6 +101,14 @@ Whenever your application loads, these variables will be available in `ENV`:
103
101
  config.fog_directory = ENV['S3_BUCKET']
104
102
  ```
105
103
 
104
+ ## Multiple Rails Environments
105
+
106
+ dotenv was originally created to load configuration variables into `ENV` in *development*. There are typically better ways to manage configuration in production environments environments—such as `/etc/environment` managed by [Puppet](https://github.com/puppetlabs/puppet) or [Chef](https://github.com/opscode/chef), `heroku config`, etc.
107
+
108
+ However, some find dotenv to be a convenient way to configure Rails applications in staging and production environments, and you can do that by defining environment-specific files like `.env.production` or `.env.test`.
109
+
110
+ You can also `.env.local` for local overrides.
111
+
106
112
  ## Should I commit my .env file?
107
113
 
108
114
  Credentials should only be accessible on the machines that need access to them. Never commit sensitive information to a repository that is not needed by every development machine and server.
data/bin/dotenv CHANGED
@@ -1,11 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dotenv'
4
-
5
- begin
6
- Dotenv.load!
7
- rescue Errno::ENOENT => e
8
- abort e.message
9
- else
10
- exec *ARGV unless ARGV.empty?
11
- end
3
+ require 'dotenv/cli'
4
+ Dotenv::CLI.new(ARGV).run
@@ -2,24 +2,41 @@ require 'dotenv/parser'
2
2
  require 'dotenv/environment'
3
3
 
4
4
  module Dotenv
5
- def self.load(*filenames)
6
- with(*filenames) { |f| Environment.new(f).apply if File.exist?(f) }
5
+ extend self
6
+
7
+ attr_accessor :instrumenter
8
+
9
+ def load(*filenames)
10
+ with(*filenames) do |f|
11
+ if File.exist?(f)
12
+ env = Environment.new(f)
13
+ instrument('dotenv.load', :env => env) { env.apply }
14
+ end
15
+ end
7
16
  end
8
17
 
9
18
  # same as `load`, but raises Errno::ENOENT if any files don't exist
10
- def self.load!(*filenames)
11
- with(*filenames) { |f| Environment.new(f).apply }
19
+ def load!(*filenames)
20
+ with(*filenames) do |f|
21
+ env = Environment.new(f)
22
+ instrument('dotenv.load', :env => env) { env.apply }
23
+ end
12
24
  end
13
25
 
14
26
  # same as `load`, but will override existing values in `ENV`
15
- def self.overload(*filenames)
16
- with(*filenames) { |f| Environment.new(f).apply! if File.exist?(f) }
27
+ def overload(*filenames)
28
+ with(*filenames) do |f|
29
+ if File.exist?(f)
30
+ env = Environment.new(f)
31
+ instrument('dotenv.overload', :env => env) { env.apply! }
32
+ end
33
+ end
17
34
  end
18
35
 
19
36
  # Internal: Helper to expand list of filenames.
20
37
  #
21
38
  # Returns a hash of all the loaded environment variables.
22
- def self.with(*filenames, &block)
39
+ def with(*filenames, &block)
23
40
  filenames << '.env' if filenames.empty?
24
41
 
25
42
  {}.tap do |hash|
@@ -28,4 +45,12 @@ module Dotenv
28
45
  end
29
46
  end
30
47
  end
48
+
49
+ def instrument(name, payload = {}, &block)
50
+ if instrumenter
51
+ instrumenter.instrument(name, payload, &block)
52
+ else
53
+ block.call
54
+ end
55
+ end
31
56
  end
@@ -0,0 +1,31 @@
1
+ require 'dotenv'
2
+
3
+ module Dotenv
4
+ class CLI
5
+ attr_reader :argv
6
+
7
+ def initialize(argv = [])
8
+ @argv = argv.dup
9
+ end
10
+
11
+ def run
12
+ filenames = if pos = argv.index('-f')
13
+ # drop the -f
14
+ argv.delete_at pos
15
+ # parse one or more comma-separated .env files
16
+ require 'csv'
17
+ CSV.parse_line argv.delete_at(pos)
18
+ else
19
+ []
20
+ end
21
+
22
+ begin
23
+ Dotenv.load! *filenames
24
+ rescue Errno::ENOENT => e
25
+ abort e.message
26
+ else
27
+ exec *argv unless argv.empty?
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,6 @@
1
1
  module Dotenv
2
2
  class Environment < Hash
3
+ attr_reader :filename
3
4
 
4
5
  def initialize(filename)
5
6
  @filename = filename
@@ -55,6 +55,9 @@ module Dotenv
55
55
  end
56
56
 
57
57
  hash[key] = value
58
+ elsif line.split.first == 'export'
59
+ # looks like you want to export after declaration, I guess that is ok
60
+ raise FormatError, "Line #{line.inspect} has a variable that is not set" unless line.split[1..-1].all?{ |var| hash.member?(var) }
58
61
  elsif line !~ /\A\s*(?:#.*)?\z/ # not comment or blank line
59
62
  raise FormatError, "Line #{line.inspect} doesn't match format"
60
63
  end
@@ -1,3 +1,3 @@
1
1
  module Dotenv
2
- VERSION = '1.0.2'
2
+ VERSION = '2.0.0.beta'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-14 00:00:00.000000000 Z
11
+ date: 2015-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -46,32 +46,17 @@ executables:
46
46
  extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
- - ".env"
50
- - ".gitignore"
51
- - ".travis.yml"
52
- - Changelog.md
53
- - Gemfile
54
- - Guardfile
55
49
  - LICENSE
56
50
  - README.md
57
- - Rakefile
58
51
  - bin/dotenv
59
- - dotenv.gemspec
60
52
  - lib/dotenv.rb
53
+ - lib/dotenv/cli.rb
61
54
  - lib/dotenv/environment.rb
62
55
  - lib/dotenv/parser.rb
63
56
  - lib/dotenv/substitutions/command.rb
64
57
  - lib/dotenv/substitutions/variable.rb
65
58
  - lib/dotenv/tasks.rb
66
59
  - lib/dotenv/version.rb
67
- - spec/dotenv/environment_spec.rb
68
- - spec/dotenv/parser_spec.rb
69
- - spec/dotenv_spec.rb
70
- - spec/fixtures/exported.env
71
- - spec/fixtures/plain.env
72
- - spec/fixtures/quoted.env
73
- - spec/fixtures/yaml.env
74
- - spec/spec_helper.rb
75
60
  homepage: https://github.com/bkeepers/dotenv
76
61
  licenses:
77
62
  - MIT
@@ -87,21 +72,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
72
  version: '0'
88
73
  required_rubygems_version: !ruby/object:Gem::Requirement
89
74
  requirements:
90
- - - ">="
75
+ - - ">"
91
76
  - !ruby/object:Gem::Version
92
- version: '0'
77
+ version: 1.3.1
93
78
  requirements: []
94
79
  rubyforge_project:
95
80
  rubygems_version: 2.2.2
96
81
  signing_key:
97
82
  specification_version: 4
98
83
  summary: Loads environment variables from `.env`.
99
- test_files:
100
- - spec/dotenv/environment_spec.rb
101
- - spec/dotenv/parser_spec.rb
102
- - spec/dotenv_spec.rb
103
- - spec/fixtures/exported.env
104
- - spec/fixtures/plain.env
105
- - spec/fixtures/quoted.env
106
- - spec/fixtures/yaml.env
107
- - spec/spec_helper.rb
84
+ test_files: []
data/.env DELETED
@@ -1 +0,0 @@
1
- DOTENV=true
data/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- tmp
8
- vendor
@@ -1,9 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.1.0
4
- - 2.0.0
5
- - 1.9.3
6
- - 1.8.7
7
- - ree
8
- - rbx-2
9
- bundler_args: --without=guard
@@ -1,142 +0,0 @@
1
- # Changelog
2
-
3
- ## 1.0.2 - Oct 14, 2014
4
-
5
- * Define `#load` on `Dotenv::Railtie`, which can be called to manually load `dotenv` before Rails has initialized.
6
-
7
- * add `dotenv/rails-now`, which can be required in the `Gemfile` to immidately load dotenv.
8
-
9
- gem 'dotenv-rails', :require => 'dotenv/rails-now'
10
- gem 'gem-that-requires-env-variables'
11
-
12
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v1.0.1...v1.0.2)
13
-
14
- ## 1.0.1 - Oct 4, 2014
15
-
16
- * Fix load error with Spring when running `rails server` ([#140](https://github.com/bkeepers/dotenv/issues/140))
17
-
18
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v1.0.0...v1.0.1)
19
-
20
- ## 1.0.0 - Oct 3, 2014
21
-
22
- * dotenv-rails is now loaded during the `before_configuration` callback, which is fired when the `Application` constant is defined (`class Application < Rails::Application`).
23
-
24
- * Remove deprecated features. Upgrade to 0.11.0 and fix deprecation warnings before upgrading to 1.0.0.
25
-
26
- * Watch .env for changes with Spring in Rails 4 ([#118](https://github.com/bkeepers/dotenv/pull/118))
27
-
28
- * Fix deprecation warnings for `File.exists?` ([#121](https://github.com/bkeepers/dotenv/pull/121/))
29
-
30
- * Use `Rails.root` to find `.env` ([#122](https://github.com/bkeepers/dotenv/pull/122/files))
31
-
32
- * Avoid substitutions inside single quotes ([#124](https://github.com/bkeepers/dotenv/pull/124))
33
-
34
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.11.1...v1.0.0)
35
-
36
- ## 0.11.1 - Apr 22, 2014
37
-
38
- * Depend on dotenv-deployment ~>0.0.2, which fixes issues with 0.0.1
39
-
40
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.11.0...v0.11.1)
41
-
42
- ## 0.11.0 - Apr 21, 2014
43
-
44
- * Extract dotenv-deployment gem. https://github.com/bkeepers/dotenv-deployment
45
-
46
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.10.0...v0.11.0)
47
-
48
- ## 0.10.0 - Feb 22, 2014
49
-
50
- * Add support for executing interpolated commands. (Ruby >= 1.9 only)
51
-
52
- HEAD_SHA=$(git rev-parse HEAD)
53
-
54
- * Add `dotenv_role` option in Capistrano.
55
-
56
- set :dotenv_role, [:app, web]
57
-
58
- * Add `Dotenv.overload` to overwrite existing environment values.
59
-
60
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.9.0...v0.10.0)
61
-
62
- ## 0.9.0 - Aug 29, 2013
63
-
64
- * Add support for variable expansion.
65
-
66
- HOST="example.com"
67
- URL="http://${USER}@${HOST}"
68
- ESCAPED_VARIABLE="this is \$NOT replaced"
69
-
70
- * Allow setting variables without a value.
71
-
72
- BLANK=
73
-
74
- * Add `dotenv` executable to load `.env` for other scripts.
75
-
76
- $ dotenv ./script.py
77
-
78
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.8.0...v0.9.0)
79
-
80
- ## 0.8.0 - June 12, 2013
81
-
82
- * Added a capistrano recipe to symlink in `.env` on deploy.
83
-
84
- * Allow inline comments
85
-
86
- VARIABLE=value # this is a comment
87
-
88
- * Raises Dotenv::FormatError when parsing fails
89
-
90
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.7.0...v0.8.0)
91
-
92
- ## 0.7.0 - April 15, 2013
93
-
94
- * Remove deprectated autoloading. Upgrade to 0.6 first and fix any warnings.
95
-
96
- * Add Dotenv.load! which raises Errno::ENOENT if the file does not exist
97
-
98
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.6.0...v0.7.0)
99
-
100
- ## 0.6.0 - Mar 22, 2013
101
-
102
- * Add dotenv-rails gem for autoloading in a Rails app
103
-
104
- * Deprecated autoloading with plain dotenv gem
105
-
106
- * Support for double quotes
107
-
108
- A="some value"
109
- B="with \"escaped\" quotes"
110
- C="and newline\n expansion"
111
-
112
- * Support for pow-style variables prefixed with export
113
-
114
- export VARIABLE="some value"
115
-
116
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.5.0...v0.6.0)
117
-
118
- ## 0.5.0 - Jan 25, 2013
119
-
120
- * Load immediately on require in Rails instead of waiting for initialization
121
-
122
- * Add YAML-style variables
123
-
124
- VARIABLE: some value
125
-
126
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.4.0...v0.5.0)
127
-
128
- ## 0.4.0 - Nov 13, 2012
129
-
130
- * Add support for quoted options, e.g.:
131
-
132
- VARIABLE='some value'
133
-
134
- * Fix rake deprecation warnings
135
-
136
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.3.0...v0.4.0)
137
-
138
- ## 0.3.0 - Oct 25, 2012
139
-
140
- * Avoid overriding existing ENV variables so values set before loading the app are maintained.
141
-
142
- [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.2.0...v0.3.0)
data/Gemfile DELETED
@@ -1,15 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec :name => 'dotenv'
3
- gemspec :name => 'dotenv-rails'
4
-
5
- gem 'dotenv-deployment', :github => 'bkeepers/dotenv-deployment'
6
-
7
- group :guard do
8
- gem 'guard-rspec'
9
- gem 'guard-bundler'
10
- gem 'rb-fsevent'
11
- end
12
-
13
- platforms :rbx do
14
- gem 'rubysl', '~> 2.0' # if using anything in the ruby standard library
15
- end
data/Guardfile DELETED
@@ -1,9 +0,0 @@
1
- guard 'bundler' do
2
- watch('Gemfile')
3
- end
4
-
5
- guard 'rspec' do
6
- watch(%r{^spec/.+_spec\.rb$})
7
- watch(%r{^spec/spec_helper.rb$}) { "spec" }
8
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
9
- end
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
@@ -1,21 +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
- gem.license = 'MIT'
12
-
13
- gem.files = `git ls-files | grep -v rails`.split($\)
14
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
- gem.name = "dotenv"
17
- gem.require_paths = ["lib"]
18
-
19
- gem.add_development_dependency 'rake'
20
- gem.add_development_dependency 'rspec'
21
- end
@@ -1,54 +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
- require 'tempfile'
46
- def env(text)
47
- file = Tempfile.new('dotenv')
48
- file.write text
49
- file.close
50
- env = Dotenv::Environment.new(file.path)
51
- file.unlink
52
- env
53
- end
54
- end
@@ -1,133 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Dotenv::Parser do
4
- def env(string)
5
- Dotenv::Parser.call(string)
6
- end
7
-
8
- it 'parses unquoted values' do
9
- expect(env('FOO=bar')).to eql('FOO' => 'bar')
10
- end
11
-
12
- it 'parses values with spaces around equal sign' do
13
- expect(env("FOO =bar")).to eql('FOO' => 'bar')
14
- expect(env("FOO= bar")).to eql('FOO' => 'bar')
15
- end
16
-
17
- it 'parses double quoted values' do
18
- expect(env('FOO="bar"')).to eql('FOO' => 'bar')
19
- end
20
-
21
- it 'parses single quoted values' do
22
- expect(env("FOO='bar'")).to eql('FOO' => 'bar')
23
- end
24
-
25
- it 'parses escaped double quotes' do
26
- expect(env('FOO="escaped\"bar"')).to eql('FOO' => 'escaped"bar')
27
- end
28
-
29
- it 'parses empty values' do
30
- expect(env('FOO=')).to eql('FOO' => '')
31
- end
32
-
33
- it 'expands variables found in values' do
34
- expect(env("FOO=test\nBAR=$FOO")).to eql('FOO' => 'test', 'BAR' => 'test')
35
- end
36
-
37
- it 'parses variables wrapped in brackets' do
38
- expect(env("FOO=test\nBAR=${FOO}bar")).to eql('FOO' => 'test', 'BAR' => 'testbar')
39
- end
40
-
41
- it 'reads variables from ENV when expanding if not found in local env' do
42
- ENV['FOO'] = 'test'
43
- expect(env('BAR=$FOO')).to eql('BAR' => 'test')
44
- end
45
-
46
- it 'expands undefined variables to an empty string' do
47
- expect(env('BAR=$FOO')).to eql('BAR' => '')
48
- end
49
-
50
- it 'expands variables in double quoted strings' do
51
- expect(env("FOO=test\nBAR=\"quote $FOO\"")).to eql('FOO' => 'test', 'BAR' => 'quote test')
52
- end
53
-
54
- it 'does not expand variables in single quoted strings' do
55
- expect(env("BAR='quote $FOO'")).to eql('BAR' => 'quote $FOO')
56
- end
57
-
58
- it 'does not expand escaped variables' do
59
- expect(env('FOO="foo\$BAR"')).to eql('FOO' => 'foo$BAR')
60
- expect(env('FOO="foo\${BAR}"')).to eql('FOO' => 'foo${BAR}')
61
- end
62
-
63
- it 'parses yaml style options' do
64
- expect(env('OPTION_A: 1')).to eql('OPTION_A' => '1')
65
- end
66
-
67
- it 'parses export keyword' do
68
- expect(env('export OPTION_A=2')).to eql('OPTION_A' => '2')
69
- end
70
-
71
- it 'expands newlines in quoted strings' do
72
- expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz")
73
- end
74
-
75
- it 'parses variables with "." in the name' do
76
- expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar')
77
- end
78
-
79
- it 'strips unquoted values' do
80
- expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar '
81
- end
82
-
83
- it 'throws an error if line format is incorrect' do
84
- expect{env('lol$wut')}.to raise_error(Dotenv::FormatError)
85
- end
86
-
87
- it 'ignores empty lines' do
88
- expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz')
89
- end
90
-
91
- it 'ignores inline comments' do
92
- expect(env("foo=bar # this is foo")).to eql('foo' => 'bar')
93
- end
94
-
95
- it 'allows # in quoted value' do
96
- expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz')
97
- end
98
-
99
- it 'ignores comment lines' do
100
- expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar')
101
- end
102
-
103
- it 'parses # in quoted values' do
104
- expect(env('foo="ba#r"')).to eql('foo' => 'ba#r')
105
- expect(env("foo='ba#r'")).to eql('foo' => 'ba#r')
106
- end
107
-
108
- if RUBY_VERSION > '1.8.7'
109
- it 'parses shell commands interpolated in $()' do
110
- expect(env('ruby_v=$(ruby -v)')).to eql('ruby_v' => RUBY_DESCRIPTION)
111
- end
112
-
113
- it 'allows balanced parentheses within interpolated shell commands' do
114
- expect(env('ruby_v=$(echo "$(echo "$(echo "$(ruby -v)")")")')).to eql('ruby_v' => RUBY_DESCRIPTION)
115
- end
116
-
117
- it "doesn't interpolate shell commands when escape says not to" do
118
- expect(env('ruby_v=escaped-\$(ruby -v)')).to eql('ruby_v' => 'escaped-$(ruby -v)')
119
- end
120
-
121
- it 'is not thrown off by quotes in interpolated shell commands' do
122
- expect(env('interp=$(echo "Quotes won\'t be a problem")')['interp']).to eql("Quotes won't be a problem")
123
- end
124
-
125
- # This functionality is not supported on JRuby or Rubinius
126
- if (!defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby') && !defined?(Rubinius)
127
- it 'substitutes shell variables within interpolated shell commands' do
128
- expect(env(%(VAR1=var1\ninterp=$(echo "VAR1 is $VAR1")))['interp']).to eql("VAR1 is var1")
129
- end
130
- end
131
- end
132
-
133
- end
@@ -1,102 +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 => {}, :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(:exist?){ |arg| arg == expected }
21
- expect(Dotenv::Environment).to receive(:new).with(expected).
22
- and_return(double(:apply => {}, :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' do
76
- expect { subject }.to raise_error(Errno::ENOENT)
77
- end
78
- end
79
- end
80
-
81
- describe 'overload' do
82
- let(:env_files) { [fixture_path('plain.env')] }
83
- subject { Dotenv.overload(*env_files) }
84
- it_behaves_like 'load'
85
-
86
- it 'overrides any existing ENV variables' do
87
- ENV['OPTION_A'] = 'predefined'
88
-
89
- subject
90
-
91
- expect(ENV['OPTION_A']).to eq('1')
92
- end
93
- end
94
-
95
- def fixture_path(name)
96
- File.join(File.expand_path('../fixtures', __FILE__), name)
97
- end
98
-
99
- def expand(path)
100
- File.expand_path path
101
- end
102
- end
@@ -1,2 +0,0 @@
1
- export OPTION_A=2
2
- export OPTION_B='\n'
@@ -1,5 +0,0 @@
1
- OPTION_A=1
2
- OPTION_B=2
3
- OPTION_C= 3
4
- OPTION_D =4
5
- OPTION_E = 5
@@ -1,8 +0,0 @@
1
- OPTION_A='1'
2
- OPTION_B='2'
3
- OPTION_C=''
4
- OPTION_D='\n'
5
- OPTION_E="1"
6
- OPTION_F="2"
7
- OPTION_G=""
8
- OPTION_H="\n"
@@ -1,4 +0,0 @@
1
- OPTION_A: 1
2
- OPTION_B: '2'
3
- OPTION_C: ''
4
- OPTION_D: '\n'
@@ -1,7 +0,0 @@
1
- require 'dotenv'
2
-
3
- RSpec.configure do |config|
4
- # Restore the state of ENV after each spec
5
- config.before { @env_keys = ENV.keys }
6
- config.after { ENV.delete_if { |k,v| !@env_keys.include?(k) } }
7
- end