envied 0.9.1 → 0.9.3
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 +5 -5
- data/.gitignore +13 -17
- data/.gitlab-ci.yml +49 -0
- data/.rspec +1 -2
- data/CHANGELOG.md +13 -0
- data/Gemfile +0 -3
- data/README.md +11 -7
- data/Rakefile +2 -6
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/envied.gemspec +6 -5
- data/examples/extensive_envfile +2 -0
- data/lib/envied/cli.rb +4 -11
- data/lib/envied/coercer/envied_string.rb +51 -2
- data/lib/envied/coercer.rb +7 -11
- data/lib/envied/configuration.rb +24 -17
- data/lib/envied/env_proxy.rb +22 -21
- data/lib/envied/env_var_extractor.rb +2 -2
- data/lib/envied/variable.rb +1 -1
- data/lib/envied/version.rb +1 -1
- data/lib/envied.rb +14 -17
- data/spec/coercer_spec.rb +201 -49
- data/spec/configuration_spec.rb +78 -15
- data/spec/env_var_extractor_spec.rb +1 -3
- data/spec/envied_spec.rb +129 -170
- data/spec/gemspec_spec.rb +17 -0
- data/spec/spec_helper.rb +73 -5
- data/spec/variable_spec.rb +17 -7
- metadata +18 -27
- data/.travis.yml +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dcc781ac6f01f4925045b61ca88d14b41dbccebe46dc34582a391c884bb99e4a
|
4
|
+
data.tar.gz: 542a7c711445013a845478f716cddf7ac82b7834365429ebf24ed36b08462ca2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c976e128a2c3c8ab59c31fbec653aa7fe3b8d01973e92e4da220deff09cdee826c34627ca873d4eb612292f175419914c4235932002422cab3454f72b3da2d8
|
7
|
+
data.tar.gz: f37e48c5f981902d2db3e46dfa2a6101998ef11987e48e59ac9fc8e951d5b48d4e1cc6da756ff9b1860bb01e2abf6c72d0f1563a453f3e412754c2f0b8cfcbbb
|
data/.gitignore
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/_yardoc/
|
4
|
+
/coverage/
|
5
|
+
/doc/
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/tmp/
|
10
|
+
|
11
|
+
# rspec failure tracking
|
12
|
+
.rspec_status
|
13
|
+
|
6
14
|
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
bin
|
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
.rspec: &rspec
|
2
|
+
stage: test
|
3
|
+
tags:
|
4
|
+
- docker
|
5
|
+
before_script:
|
6
|
+
- "echo 'gem: --no-document' > ~/.gemrc"
|
7
|
+
- gem install bundler
|
8
|
+
- 'git -v || apk --update add git'
|
9
|
+
- bundle install -j $(nproc)
|
10
|
+
script:
|
11
|
+
- bundle exec rake
|
12
|
+
|
13
|
+
rspec ruby-2.4:
|
14
|
+
image: ruby:2.4-alpine
|
15
|
+
<<: *rspec
|
16
|
+
|
17
|
+
rspec ruby-2.5:
|
18
|
+
image: ruby:2.5-alpine
|
19
|
+
<<: *rspec
|
20
|
+
|
21
|
+
rspec ruby-2.6:
|
22
|
+
image: ruby:2.6-alpine
|
23
|
+
<<: *rspec
|
24
|
+
|
25
|
+
rspec ruby-2.7:
|
26
|
+
image: ruby:2.7-rc-alpine
|
27
|
+
<<: *rspec
|
28
|
+
|
29
|
+
rspec jruby-9.2:
|
30
|
+
image: jruby:9.2-alpine
|
31
|
+
<<: *rspec
|
32
|
+
only:
|
33
|
+
- 0-9-releases
|
34
|
+
|
35
|
+
release:
|
36
|
+
stage: deploy
|
37
|
+
image: ruby:2.6-alpine
|
38
|
+
tags:
|
39
|
+
- docker
|
40
|
+
script:
|
41
|
+
- "echo 'gem: --no-document' > ~/.gemrc"
|
42
|
+
- gem install bundler
|
43
|
+
- 'git -v || apk --update add git'
|
44
|
+
- bundle install -j $(nproc)
|
45
|
+
- 'ruby -ryaml -e "puts YAML.dump({rubygems_api_key: ENV.fetch(%{RUBYGEMS_API_KEY})})" > ~/.gem/credentials'
|
46
|
+
- chmod 600 ~/.gem/credentials
|
47
|
+
- bundle exec rake release
|
48
|
+
only:
|
49
|
+
- tags
|
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## 0.9.2 / 2019-06-29
|
2
|
+
|
3
|
+
* Project moved to GitLab (https://gitlab.com/envied/envied)
|
4
|
+
* Now requiring Ruby 2.4+ [#48], [#51]
|
5
|
+
* Removed `coercible` dependency as now all coercion functionality is implemented locally. This is a backwards compatible change. [#49]
|
6
|
+
* Lots of refactoring and bringing the project up-to-date
|
7
|
+
|
8
|
+
### Deprecated
|
9
|
+
|
10
|
+
* default values
|
11
|
+
|
12
|
+
See https://gitlab.com/envied/envied/tree/0-9-releases#defaults
|
13
|
+
|
1
14
|
## 0.9.1 / 2017-07-06
|
2
15
|
|
3
16
|
* Updates `envied check:heroku` to support multiline ENV variables [#42](../../pull/42)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# ENVied [](https://gitlab.com/envied/envied/commits/0-9-releases) [](https://envied-rb.zulipchat.com/)
|
2
2
|
|
3
3
|
### TL;DR ensure presence and type of your app's ENV-variables.
|
4
4
|
|
@@ -19,7 +19,6 @@ For the rationale behind this project, see this [blogpost](http://www.gertgoet.c
|
|
19
19
|
* [Groups](#groups)
|
20
20
|
* [Defaults](#defaults)
|
21
21
|
* [More examples](#more-examples)
|
22
|
-
* [Rails](#rails--spring)
|
23
22
|
* [Command-line interface](#command-line-interface)
|
24
23
|
* [How do I...?](#how-do-i)
|
25
24
|
* [Testing](#testing)
|
@@ -91,11 +90,11 @@ The following types are supported:
|
|
91
90
|
* `:time` (e.g. '14:00')
|
92
91
|
* `:hash` (e.g. 'a=1&b=2' becomes `{'a' => '1', 'b' => '2'}`)
|
93
92
|
* `:array` (e.g. 'tag1,tag2' becomes `['tag1', 'tag2']`)
|
94
|
-
* `:uri` (e.g. 'http://www.google.com' becomes `URI.parse('http://www.google.com')`
|
93
|
+
* `:uri` (e.g. 'http://www.google.com' becomes result of `URI.parse('http://www.google.com')`)
|
95
94
|
|
96
95
|
### Groups
|
97
96
|
|
98
|
-
Groups give you more flexibility to define when variables are needed.
|
97
|
+
Groups give you more flexibility to define when variables are needed.
|
99
98
|
It's similar to groups in a Gemfile:
|
100
99
|
|
101
100
|
```ruby
|
@@ -134,6 +133,9 @@ ENVied.require(nil)
|
|
134
133
|
|
135
134
|
### Defaults
|
136
135
|
|
136
|
+
> *NOTE*: default values will be removed in the next minor-release (i.e. > v0.9). See https://gitlab.com/envied/envied/tree/master#what-happened-to-default-values for more information and how to migrate.
|
137
|
+
> While your project depends on this feature it's recommended to pin the gem to 0.9-releases, i.e. `gem 'envied', '~> 0.9.3'`.
|
138
|
+
|
137
139
|
In order to let other developers easily bootstrap the application, you can assign defaults to variables.
|
138
140
|
Defaults can be a value or a `Proc` (see example below).
|
139
141
|
|
@@ -147,7 +149,7 @@ variable :FORCE_SSL, :boolean, default: 'false'
|
|
147
149
|
variable :PORT, :integer, default: proc {|envied| envied.FORCE_SSL ? 443 : 80 }
|
148
150
|
```
|
149
151
|
|
150
|
-
Please remember that ENVied only **reads** from ENV; it doesn't mutate ENV.
|
152
|
+
Please remember that ENVied only **reads** from ENV; it doesn't mutate ENV.
|
151
153
|
Don't let setting a default for, say `RAILS_ENV`, give you the impression that `ENV['RAILS_ENV']` is set.
|
152
154
|
As a rule of thumb you should only use defaults:
|
153
155
|
* for local development
|
@@ -220,12 +222,14 @@ bundle exec rspec
|
|
220
222
|
## Developing
|
221
223
|
|
222
224
|
```bash
|
223
|
-
|
225
|
+
bin/console
|
224
226
|
```
|
225
227
|
|
226
228
|
## Contributing
|
227
229
|
|
228
|
-
|
230
|
+
To suggest a new feature, [open an Issue](https://gitlab.com/envied/envied/issues/new) before opening a PR.
|
231
|
+
|
232
|
+
1. Fork it: https://gitlab.com/envied/envied/-/forks/new
|
229
233
|
2. Create your feature branch: `git checkout -b my-new-feature`
|
230
234
|
3. Commit your changes: `git commit -am 'Add some feature'`
|
231
235
|
4. Push to the branch: `git push origin my-new-feature`
|
data/Rakefile
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require
|
2
|
+
require "rspec/core/rake_task"
|
3
3
|
|
4
|
-
RSpec::Core::RakeTask.new(:spec)
|
5
|
-
s.ruby_opts = %w(-w)
|
6
|
-
s.rspec_opts = '--format progress'
|
7
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
5
|
|
9
|
-
desc "Run the specs"
|
10
6
|
task default: :spec
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "envied"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/envied.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["gert@thinkcreate.nl", "jjfutbol@gmail.com"]
|
11
11
|
spec.summary = %q{Ensure presence and type of ENV-variables}
|
12
12
|
spec.description = %q{Ensure presence and type of your app's ENV-variables.}
|
13
|
-
spec.homepage = "https://
|
13
|
+
spec.homepage = "https://gitlab.com/envied/envied/tree/master#envied"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -18,10 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.required_ruby_version = ">= 2.
|
22
|
-
|
21
|
+
spec.required_ruby_version = ">= 2.4"
|
22
|
+
|
23
23
|
spec.add_dependency "thor", "~> 0.15"
|
24
|
-
|
25
|
-
spec.add_development_dependency "
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
26
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
26
27
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
28
|
end
|
data/examples/extensive_envfile
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- mode: ruby -*-¬
|
2
|
+
# NOTE: defaults are deprecated and will be removed in > v0.9
|
3
|
+
|
2
4
|
# We allow defaults for local development (and local tests), but want our CI
|
3
5
|
# to mimic our production as much as possible.
|
4
6
|
# New developers that don't have RACK_ENV set, will in this way not be presented with a huge
|
data/lib/envied/cli.rb
CHANGED
@@ -43,10 +43,8 @@ class ENVied
|
|
43
43
|
puts "Writing Envfile to #{File.expand_path('Envfile')}"
|
44
44
|
template("Envfile.tt")
|
45
45
|
|
46
|
-
puts
|
47
|
-
|
48
|
-
ENVied.require(*ENV['ENVIED_GROUPS'] || [:default, ENV['RACK_ENV']])
|
49
|
-
INIT
|
46
|
+
puts "Add the following snippet (or similar) to your app's initialization:"
|
47
|
+
puts "ENVied.require(*ENV['ENVIED_GROUPS'] || [:default, ENV['RACK_ENV']])"
|
50
48
|
end
|
51
49
|
|
52
50
|
desc "init:rails", "Generate all files needed for a Rails project"
|
@@ -79,7 +77,6 @@ INIT
|
|
79
77
|
end
|
80
78
|
|
81
79
|
desc "check:heroku", "Checks whether a Heroku config contains required variables"
|
82
|
-
|
83
80
|
long_desc <<-LONG
|
84
81
|
Checks the config of your Heroku app against the local Envfile.
|
85
82
|
|
@@ -96,14 +93,11 @@ INIT
|
|
96
93
|
option :quiet, type: :boolean, desc: 'Communicate success of the check only via the exit status.'
|
97
94
|
define_method "check:heroku" do
|
98
95
|
if STDIN.tty?
|
99
|
-
error
|
100
|
-
Please pipe the contents of `heroku config --json` to this task.
|
101
|
-
I.e. `heroku config --json | bundle exec envied check:heroku`"
|
102
|
-
ERR
|
96
|
+
error "Please pipe to this task i.e. `heroku config --json | bundle exec envied check:heroku`"
|
103
97
|
exit 1
|
104
98
|
end
|
105
99
|
heroku_env = JSON.parse(STDIN.read)
|
106
|
-
ENV.replace(
|
100
|
+
ENV.replace(heroku_env)
|
107
101
|
|
108
102
|
requested_groups = ENV['ENVIED_GROUPS'] || options[:groups]
|
109
103
|
ENVied.require(*requested_groups)
|
@@ -117,7 +111,6 @@ ERR
|
|
117
111
|
Generates a shell script to check the Heroku config against the local Envfile.
|
118
112
|
|
119
113
|
The same as the check:heroku-task, but all in one script (no need to pipe `heroku config --json` to it etc.).
|
120
|
-
|
121
114
|
LONG
|
122
115
|
option :dest, banner: "where to put the script", desc: "Default: bin/<app>-env-check or bin/heroku-env-check"
|
123
116
|
option :app, banner: "name of Heroku app", desc: "uses ENV['HEROKU_APP'] as default if present", default: ENV['HEROKU_APP']
|
@@ -1,15 +1,55 @@
|
|
1
|
-
|
1
|
+
class ENVied::Coercer::ENViedString
|
2
|
+
TRUE_VALUES = %w[1 on t true y yes].freeze
|
3
|
+
FALSE_VALUES = %w[0 off f false n no].freeze
|
4
|
+
BOOLEAN_MAP = (TRUE_VALUES.product([ true ]) + FALSE_VALUES.product([ false ])).to_h.freeze
|
2
5
|
|
3
|
-
class ENVied::Coercer::ENViedString < Coercible::Coercer::String
|
4
6
|
def to_array(str)
|
5
7
|
str.split(/(?<!\\),/).map{|i| i.gsub(/\\,/,',') }
|
6
8
|
end
|
7
9
|
|
10
|
+
def to_boolean(str)
|
11
|
+
BOOLEAN_MAP.fetch(str&.downcase) do
|
12
|
+
raise_unsupported_coercion(str, __method__)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_date(str)
|
17
|
+
require 'date'
|
18
|
+
::Date.parse(str)
|
19
|
+
rescue ArgumentError
|
20
|
+
raise_unsupported_coercion(str, __method__)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_float(str)
|
24
|
+
Float(str)
|
25
|
+
rescue ArgumentError
|
26
|
+
raise_unsupported_coercion(str, __method__)
|
27
|
+
end
|
28
|
+
|
8
29
|
def to_hash(str)
|
9
30
|
require 'cgi'
|
10
31
|
::CGI.parse(str).map { |key, values| [key, values[0]] }.to_h
|
11
32
|
end
|
12
33
|
|
34
|
+
def to_string(str)
|
35
|
+
if str.respond_to?(:to_str)
|
36
|
+
str.public_send(:to_str)
|
37
|
+
else
|
38
|
+
raise_unsupported_coercion(str, __method__)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_symbol(str)
|
43
|
+
str.to_sym
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_time(str)
|
47
|
+
require 'time'
|
48
|
+
::Time.parse(str)
|
49
|
+
rescue ArgumentError
|
50
|
+
raise_unsupported_coercion(str, __method__)
|
51
|
+
end
|
52
|
+
|
13
53
|
def to_uri(str)
|
14
54
|
require 'uri'
|
15
55
|
::URI.parse(str)
|
@@ -20,4 +60,13 @@ class ENVied::Coercer::ENViedString < Coercible::Coercer::String
|
|
20
60
|
rescue ArgumentError
|
21
61
|
raise_unsupported_coercion(str, __method__)
|
22
62
|
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def raise_unsupported_coercion(value, method)
|
67
|
+
raise(
|
68
|
+
ENVied::Coercer::UnsupportedCoercion,
|
69
|
+
"#{self.class}##{method} doesn't know how to coerce #{value.inspect}"
|
70
|
+
)
|
71
|
+
end
|
23
72
|
end
|
data/lib/envied/coercer.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require 'coercible'
|
2
|
-
|
3
1
|
# Responsible for all string to type coercions.
|
4
2
|
class ENVied::Coercer
|
3
|
+
|
4
|
+
UnsupportedCoercion = Class.new(StandardError)
|
5
|
+
|
5
6
|
# Coerce strings to specific type.
|
6
7
|
#
|
7
8
|
# @param string [String] the string to be coerced
|
@@ -14,14 +15,9 @@ class ENVied::Coercer
|
|
14
15
|
# @return [type] the coerced string.
|
15
16
|
def coerce(string, type)
|
16
17
|
unless supported_type?(type)
|
17
|
-
raise ArgumentError, "
|
18
|
+
raise ArgumentError, "The type `#{type.inspect}` is not supported."
|
18
19
|
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def coerce_method_for(type)
|
23
|
-
return nil unless supported_type?(type)
|
24
|
-
coercer.method("to_#{type.downcase}")
|
20
|
+
coercer.public_send("to_#{type.downcase}", string)
|
25
21
|
end
|
26
22
|
|
27
23
|
def self.supported_types
|
@@ -52,7 +48,7 @@ class ENVied::Coercer
|
|
52
48
|
end
|
53
49
|
|
54
50
|
def coercer
|
55
|
-
@coercer ||=
|
51
|
+
@coercer ||= ENViedString.new
|
56
52
|
end
|
57
53
|
|
58
54
|
def coerced?(value)
|
@@ -63,7 +59,7 @@ class ENVied::Coercer
|
|
63
59
|
return false unless supported_type?(type)
|
64
60
|
coerce(string, type)
|
65
61
|
true
|
66
|
-
rescue
|
62
|
+
rescue UnsupportedCoercion
|
67
63
|
false
|
68
64
|
end
|
69
65
|
end
|
data/lib/envied/configuration.rb
CHANGED
@@ -2,21 +2,13 @@ class ENVied
|
|
2
2
|
class Configuration
|
3
3
|
attr_reader :current_group, :defaults_enabled, :coercer
|
4
4
|
|
5
|
-
def initialize(options
|
5
|
+
def initialize(**options, &block)
|
6
6
|
@coercer = options.fetch(:coercer, Coercer.new)
|
7
7
|
@defaults_enabled = options.fetch(:enable_defaults, defaults_enabled_default)
|
8
8
|
instance_eval(&block) if block_given?
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
if ENV['ENVIED_ENABLE_DEFAULTS'].nil?
|
13
|
-
false
|
14
|
-
else
|
15
|
-
@coercer.coerce(ENV['ENVIED_ENABLE_DEFAULTS'], :boolean)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.load(options = {})
|
11
|
+
def self.load(**options)
|
20
12
|
envfile = File.expand_path('Envfile')
|
21
13
|
new(options).tap do |v|
|
22
14
|
v.instance_eval(File.read(envfile), envfile)
|
@@ -24,6 +16,7 @@ class ENVied
|
|
24
16
|
end
|
25
17
|
|
26
18
|
def enable_defaults!(value = true, &block)
|
19
|
+
default_values_deprecation
|
27
20
|
@defaults_enabled = block_given? ? block.call : value
|
28
21
|
end
|
29
22
|
|
@@ -33,13 +26,9 @@ class ENVied
|
|
33
26
|
@defaults_enabled
|
34
27
|
end
|
35
28
|
|
36
|
-
def variable(name,
|
37
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
38
|
-
type = args.first || :string
|
39
|
-
|
29
|
+
def variable(name, type = :string, **options)
|
40
30
|
unless coercer.supported_type?(type)
|
41
|
-
raise ArgumentError,
|
42
|
-
"Variable type (of #{name}) should be one of #{coercer.supported_types}"
|
31
|
+
raise ArgumentError, "#{type.inspect} is not a supported type. Should be one of #{coercer.supported_types}"
|
43
32
|
end
|
44
33
|
options[:group] = current_group if current_group
|
45
34
|
variables << ENVied::Variable.new(name, type, options)
|
@@ -57,6 +46,24 @@ class ENVied
|
|
57
46
|
def variables
|
58
47
|
@variables ||= []
|
59
48
|
end
|
60
|
-
end
|
61
49
|
|
50
|
+
private
|
51
|
+
|
52
|
+
def default_values_deprecation
|
53
|
+
warning = "Default values will be removed in the next minor-release of ENVied (i.e. > v0.9). For more info see https://gitlab.com/envied/envied/tree/0-9-releases#defaults."
|
54
|
+
if defined?(ActiveSupport::Deprecation)
|
55
|
+
ActiveSupport::Deprecation.warn warning
|
56
|
+
else
|
57
|
+
$stderr.puts "DEPRECATION WARNING: #{warning}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def defaults_enabled_default
|
62
|
+
if ENV['ENVIED_ENABLE_DEFAULTS'].nil?
|
63
|
+
false
|
64
|
+
else
|
65
|
+
@coercer.coerce(ENV['ENVIED_ENABLE_DEFAULTS'], :boolean)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
62
69
|
end
|
data/lib/envied/env_proxy.rb
CHANGED
@@ -2,8 +2,9 @@ class ENVied
|
|
2
2
|
# Responsible for anything related to the ENV.
|
3
3
|
class EnvProxy
|
4
4
|
attr_reader :config, :coercer, :groups
|
5
|
+
private :config, :coercer, :groups
|
5
6
|
|
6
|
-
def initialize(config, options
|
7
|
+
def initialize(config, **options)
|
7
8
|
@config = config
|
8
9
|
@coercer = options.fetch(:coercer, ENVied::Coercer.new)
|
9
10
|
@groups = options.fetch(:groups, [])
|
@@ -17,16 +18,6 @@ class ENVied
|
|
17
18
|
variables.reject(&method(:coerced?)).reject(&method(:coercible?))
|
18
19
|
end
|
19
20
|
|
20
|
-
def variables
|
21
|
-
@variables ||= begin
|
22
|
-
config.variables.select {|v| groups.include?(v.group) }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def variables_by_name
|
27
|
-
Hash[variables.map {|v| [v.name, v] }]
|
28
|
-
end
|
29
|
-
|
30
21
|
def [](name)
|
31
22
|
coerce(variables_by_name[name.to_sym])
|
32
23
|
end
|
@@ -35,35 +26,45 @@ class ENVied
|
|
35
26
|
variables_by_name[name.to_sym]
|
36
27
|
end
|
37
28
|
|
38
|
-
def env_value_of(var)
|
39
|
-
ENV[var.name.to_s]
|
40
|
-
end
|
41
|
-
|
42
|
-
def default_value_of(var)
|
43
|
-
var.default_value(ENVied, var)
|
44
|
-
end
|
45
|
-
|
46
29
|
def value_to_coerce(var)
|
47
30
|
return env_value_of(var) unless env_value_of(var).nil?
|
48
31
|
config.defaults_enabled? ? default_value_of(var) : nil
|
49
32
|
end
|
50
33
|
|
34
|
+
private
|
35
|
+
|
51
36
|
def coerce(var)
|
52
37
|
coerced?(var) ?
|
53
38
|
value_to_coerce(var) :
|
54
39
|
coercer.coerce(value_to_coerce(var), var.type)
|
55
40
|
end
|
56
41
|
|
42
|
+
def coerced?(var)
|
43
|
+
coercer.coerced?(value_to_coerce(var))
|
44
|
+
end
|
45
|
+
|
57
46
|
def coercible?(var)
|
58
47
|
coercer.coercible?(value_to_coerce(var), var.type)
|
59
48
|
end
|
60
49
|
|
50
|
+
def default_value_of(var)
|
51
|
+
var.default_value(ENVied, var)
|
52
|
+
end
|
53
|
+
|
54
|
+
def env_value_of(var)
|
55
|
+
ENV[var.name.to_s]
|
56
|
+
end
|
57
|
+
|
61
58
|
def missing?(var)
|
62
59
|
value_to_coerce(var).nil?
|
63
60
|
end
|
64
61
|
|
65
|
-
def
|
66
|
-
|
62
|
+
def variables
|
63
|
+
@variables ||= config.variables.select {|v| groups.include?(v.group) }
|
64
|
+
end
|
65
|
+
|
66
|
+
def variables_by_name
|
67
|
+
@variables_by_name ||= variables.map {|v| [v.name, v] }.to_h
|
67
68
|
end
|
68
69
|
end
|
69
70
|
end
|
@@ -15,12 +15,12 @@ class ENVied
|
|
15
15
|
|
16
16
|
attr_reader :globs, :extensions
|
17
17
|
|
18
|
-
def initialize(options
|
18
|
+
def initialize(**options)
|
19
19
|
@globs = options.fetch(:globs, self.defaults[:globs])
|
20
20
|
@extensions = options.fetch(:extensions, self.defaults[:extensions])
|
21
21
|
end
|
22
22
|
|
23
|
-
def self.extract_from(globs, options
|
23
|
+
def self.extract_from(globs, **options)
|
24
24
|
new(options.merge(globs: Array(globs))).extract
|
25
25
|
end
|
26
26
|
|
data/lib/envied/variable.rb
CHANGED
data/lib/envied/version.rb
CHANGED