dotenv 2.2.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '079d89e03db53d20559c906bba1df9b109b8b413'
4
- data.tar.gz: 03cdc7e8319aee4eadcbedeab9f42b57d742b32e
3
+ metadata.gz: cbd76e5c6ca084e248496b42e52b9108a0107e2d
4
+ data.tar.gz: d59561a4c5ece858dc36bf61194b8eda14064770
5
5
  SHA512:
6
- metadata.gz: 6ac9590786f3f371c1e4e856fa3a9f8a5447dff0922389e12d6a9d893e1d9244eaa39104d1ad8f15f49a81dc0299f196a59256c829c6981135c5d120a2df0db5
7
- data.tar.gz: ad9f0a6f301755e4116b133188a30ae31273991c815d3bb0ca42e471954bdc7fda6405f00a3a89228c847d5796bcf433064d62933e529ca78094597d8be03c5d
6
+ metadata.gz: 1c2fa80964b37fb1dfefb578945b93f0b2bac3476ddfb8429ab72835db67bec5d8c197ec27949a84769bca3895fd9c51916a1bc78eb864d76ce172634ffff7b5
7
+ data.tar.gz: f8caadc5aec3fef268b085a99cc032d7e102deb2121239fe2cb5d721414a71d1b428de288d15b8cb51989559b9fac96de245489ba9f1f27c94a5534d8ecae78f
data/README.md CHANGED
@@ -1,6 +1,4 @@
1
- # dotenv [![Build Status](https://secure.travis-ci.org/bkeepers/dotenv.png?branch=master)](https://travis-ci.org/bkeepers/dotenv)
2
-
3
- [![Join the chat at https://gitter.im/bkeepers/dotenv](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bkeepers/dotenv?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
1
+ # dotenv [![Build Status](https://secure.travis-ci.org/bkeepers/dotenv.png?branch=master)](https://travis-ci.org/bkeepers/dotenv) [![Gem Version](https://badge.fury.io/rb/dotenv.svg)](https://badge.fury.io/rb/dotenv) [![Join the chat at https://gitter.im/bkeepers/dotenv](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bkeepers/dotenv?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
2
 
5
3
  Shim to load environment variables from `.env` into `ENV` in *development*.
6
4
 
@@ -75,6 +73,12 @@ Alternatively, you can use the `dotenv` executable to launch your application:
75
73
  $ dotenv ./script.rb
76
74
  ```
77
75
 
76
+ The `dotenv` executable also accepts a single flag, `-f`. Its value should be a comma-separated list of configuration files, in the order of most important to least. All of the files must exist. There _must_ be a space between the flag and its value.
77
+
78
+ ```
79
+ $ dotenv -f ".env.local,.env" ./script.rb
80
+ ```
81
+
78
82
  To ensure `.env` is loaded in rake, load the tasks:
79
83
 
80
84
  ```ruby
@@ -112,9 +116,21 @@ export SECRET_KEY=YOURSECRETKEYGOESHERE
112
116
  If you need multiline variables, for example private keys, you can double quote strings and use the `\n` character for newlines:
113
117
 
114
118
  ```shell
115
- PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nHkVN9…\n-----END DSA PRIVATE KEY-----\n"
119
+ PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nHkVN9...\n-----END DSA PRIVATE KEY-----\n"
116
120
  ```
117
121
 
122
+ Alternatively, multi-line values with line breaks are now supported for quoted values.
123
+
124
+ ```shell
125
+ PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
126
+ ...
127
+ HkVN9...
128
+ ...
129
+ -----END DSA PRIVATE KEY-----"
130
+ ```
131
+
132
+ This is particularly helpful when using the Heroku command line plugin [`heroku-config`](https://github.com/xavdid/heroku-config) to pull configuration variables down that may have line breaks.
133
+
118
134
  ### Command Substitution
119
135
 
120
136
  You need to add the output of a command in one of your variables? Simply add it with `$(your_command)`:
@@ -12,7 +12,7 @@ module Dotenv
12
12
  def load(*filenames)
13
13
  with(*filenames) do |f|
14
14
  ignoring_nonexistent_files do
15
- env = Environment.new(f)
15
+ env = Environment.new(f, true)
16
16
  instrument("dotenv.load", env: env) { env.apply }
17
17
  end
18
18
  end
@@ -21,7 +21,7 @@ module Dotenv
21
21
  # same as `load`, but raises Errno::ENOENT if any files don't exist
22
22
  def load!(*filenames)
23
23
  with(*filenames) do |f|
24
- env = Environment.new(f)
24
+ env = Environment.new(f, true)
25
25
  instrument("dotenv.load", env: env) { env.apply }
26
26
  end
27
27
  end
@@ -30,7 +30,7 @@ module Dotenv
30
30
  def overload(*filenames)
31
31
  with(*filenames) do |f|
32
32
  ignoring_nonexistent_files do
33
- env = Environment.new(f)
33
+ env = Environment.new(f, false)
34
34
  instrument("dotenv.overload", env: env) { env.apply! }
35
35
  end
36
36
  end
@@ -4,13 +4,13 @@ module Dotenv
4
4
  class Environment < Hash
5
5
  attr_reader :filename
6
6
 
7
- def initialize(filename)
7
+ def initialize(filename, is_load)
8
8
  @filename = filename
9
- load
9
+ load(is_load)
10
10
  end
11
11
 
12
- def load
13
- update Parser.call(read)
12
+ def load(is_load)
13
+ update Parser.call(read, is_load)
14
14
  end
15
15
 
16
16
  def read
@@ -12,38 +12,42 @@ module Dotenv
12
12
  [Dotenv::Substitutions::Variable, Dotenv::Substitutions::Command]
13
13
 
14
14
  LINE = /
15
- \A
16
15
  \s*
17
16
  (?:export\s+)? # optional export
18
17
  ([\w\.]+) # key
19
18
  (?:\s*=\s*|:\s+?) # separator
20
19
  ( # optional value begin
21
- '(?:\'|[^'])*' # single quoted value
20
+ '(?:\\'|[^'])*' # single quoted value
22
21
  | # or
23
- "(?:\"|[^"])*" # double quoted value
22
+ "(?:\\"|[^"])*" # double quoted value
24
23
  | # or
25
- [^#\n]+ # unquoted value
24
+ [^#\r\n]+ # unquoted value
26
25
  )? # value end
27
26
  \s*
28
27
  (?:\#.*)? # optional comment
29
- \z
30
28
  /x
31
29
 
32
30
  class << self
33
31
  attr_reader :substitutions
34
32
 
35
- def call(string)
36
- new(string).call
33
+ def call(string, is_load)
34
+ new(string, is_load).call
37
35
  end
38
36
  end
39
37
 
40
- def initialize(string)
38
+ def initialize(string, is_load)
41
39
  @string = string
42
40
  @hash = {}
41
+ @is_load = is_load
43
42
  end
44
43
 
45
44
  def call
46
- @string.split(/[\n\r]+/).each do |line|
45
+ # Process matches
46
+ @string.scan(LINE).each do |key, value|
47
+ @hash[key] = parse_value(value || "")
48
+ end
49
+ # Process non-matches
50
+ @string.gsub(LINE, "").split(/[\n\r]+/).each do |line|
47
51
  parse_line(line)
48
52
  end
49
53
  @hash
@@ -52,21 +56,16 @@ module Dotenv
52
56
  private
53
57
 
54
58
  def parse_line(line)
55
- if (match = line.match(LINE))
56
- key, value = match.captures
57
- @hash[key] = parse_value(value || "")
58
- elsif line.split.first == "export"
59
+ if line.split.first == "export"
59
60
  if variable_not_set?(line)
60
61
  raise FormatError, "Line #{line.inspect} has an unset variable"
61
62
  end
62
- elsif line !~ /\A\s*(?:#.*)?\z/ # not comment or blank line
63
- raise FormatError, "Line #{line.inspect} doesn't match format"
64
63
  end
65
64
  end
66
65
 
67
66
  def parse_value(value)
68
67
  # Remove surrounding quotes
69
- value = value.strip.sub(/\A(['"])(.*)\1\z/, '\2')
68
+ value = value.strip.sub(/\A(['"])(.*)\1\z/m, '\2')
70
69
 
71
70
  if Regexp.last_match(1) == '"'
72
71
  value = unescape_characters(expand_newlines(value))
@@ -74,7 +73,7 @@ module Dotenv
74
73
 
75
74
  if Regexp.last_match(1) != "'"
76
75
  self.class.substitutions.each do |proc|
77
- value = proc.call(value, @hash)
76
+ value = proc.call(value, @hash, @is_load)
78
77
  end
79
78
  end
80
79
  value
@@ -20,7 +20,7 @@ module Dotenv
20
20
  )
21
21
  /x
22
22
 
23
- def call(value, _env)
23
+ def call(value, _env, _is_load)
24
24
  # Process interpolated shell commands
25
25
  value.gsub(INTERPOLATED_SHELL_COMMAND) do |*|
26
26
  # Eliminate opening and closing parentheses
@@ -18,17 +18,27 @@ module Dotenv
18
18
  \}? # closing brace
19
19
  /xi
20
20
 
21
- def call(value, env)
21
+ def call(value, env, is_load)
22
+ combined_env = if is_load
23
+ env.merge(ENV)
24
+ else
25
+ ENV.to_h.merge(env)
26
+ end
22
27
  value.gsub(VARIABLE) do |variable|
23
28
  match = $LAST_MATCH_INFO
29
+ substitute(match, variable, combined_env)
30
+ end
31
+ end
32
+
33
+ private
24
34
 
25
- if match[1] == '\\'
26
- variable[1..-1]
27
- elsif match[3]
28
- env.fetch(match[3]) { ENV[match[3]] }
29
- else
30
- variable
31
- end
35
+ def substitute(match, variable, env)
36
+ if match[1] == '\\'
37
+ variable[1..-1]
38
+ elsif match[3]
39
+ env.fetch(match[3], "")
40
+ else
41
+ variable
32
42
  end
33
43
  end
34
44
  end
@@ -1,3 +1,3 @@
1
1
  module Dotenv
2
- VERSION = "2.2.2".freeze
2
+ VERSION = "2.3.0".freeze
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: 2.2.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-09 00:00:00.000000000 Z
11
+ date: 2018-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.6.8
95
+ rubygems_version: 2.6.11
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: Loads environment variables from `.env`.