envied 0.9.0 → 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 +17 -0
- data/Gemfile +0 -3
- data/README.md +10 -6
- 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 +8 -18
- data/lib/envied/coercer/envied_string.rb +72 -0
- data/lib/envied/coercer.rb +5 -26
- 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/templates/heroku-env-check.tt +2 -2
- data/lib/envied/variable.rb +1 -1
- data/lib/envied/version.rb +1 -1
- data/lib/envied.rb +15 -17
- data/spec/coercer_spec.rb +213 -55
- data/spec/configuration_spec.rb +78 -15
- data/spec/env_var_extractor_spec.rb +1 -3
- data/spec/envied_spec.rb +137 -178
- data/spec/gemspec_spec.rb +17 -0
- data/spec/spec_helper.rb +73 -5
- data/spec/variable_spec.rb +17 -7
- metadata +19 -27
- data/.travis.yml +0 -18
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,20 @@
|
|
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
|
+
|
14
|
+
## 0.9.1 / 2017-07-06
|
15
|
+
|
16
|
+
* Updates `envied check:heroku` to support multiline ENV variables [#42](../../pull/42)
|
17
|
+
|
1
18
|
## 0.9.0 / 2017-03-01
|
2
19
|
|
3
20
|
* Support multiple groups [#16](../../pull/16)
|
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,7 +90,7 @@ 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
|
|
@@ -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
|
|
@@ -192,7 +194,7 @@ It assumes a standard project layout (see the default value for the globs-option
|
|
192
194
|
The easiest/quickest is to run:
|
193
195
|
|
194
196
|
```
|
195
|
-
$ heroku config | bundle exec envied check:heroku
|
197
|
+
$ heroku config --json | bundle exec envied check:heroku
|
196
198
|
```
|
197
199
|
|
198
200
|
This is equivalent to having the heroku config as your local environment and running `envied check:heroku --groups default production`.
|
@@ -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
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'thor'
|
2
|
+
require 'json'
|
2
3
|
require 'envied/env_var_extractor'
|
3
4
|
|
4
5
|
class ENVied
|
@@ -42,10 +43,8 @@ class ENVied
|
|
42
43
|
puts "Writing Envfile to #{File.expand_path('Envfile')}"
|
43
44
|
template("Envfile.tt")
|
44
45
|
|
45
|
-
puts
|
46
|
-
|
47
|
-
ENVied.require(*ENV['ENVIED_GROUPS'] || [:default, ENV['RACK_ENV']])
|
48
|
-
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']])"
|
49
48
|
end
|
50
49
|
|
51
50
|
desc "init:rails", "Generate all files needed for a Rails project"
|
@@ -78,13 +77,12 @@ INIT
|
|
78
77
|
end
|
79
78
|
|
80
79
|
desc "check:heroku", "Checks whether a Heroku config contains required variables"
|
81
|
-
|
82
80
|
long_desc <<-LONG
|
83
81
|
Checks the config of your Heroku app against the local Envfile.
|
84
82
|
|
85
83
|
The Heroku config should be piped to this task:
|
86
84
|
|
87
|
-
heroku config | bundle exec envied check:heroku
|
85
|
+
heroku config --json | bundle exec envied check:heroku
|
88
86
|
|
89
87
|
Use the check:heroku:binstub-task to turn this into a bash-script.
|
90
88
|
|
@@ -95,18 +93,11 @@ INIT
|
|
95
93
|
option :quiet, type: :boolean, desc: 'Communicate success of the check only via the exit status.'
|
96
94
|
define_method "check:heroku" do
|
97
95
|
if STDIN.tty?
|
98
|
-
error
|
99
|
-
Please pipe the contents of `heroku config` to this task.
|
100
|
-
I.e. `heroku config | bundle exec envied check:heroku`"
|
101
|
-
ERR
|
96
|
+
error "Please pipe to this task i.e. `heroku config --json | bundle exec envied check:heroku`"
|
102
97
|
exit 1
|
103
98
|
end
|
104
|
-
|
105
|
-
|
106
|
-
res << i.split(":", 2).map(&:strip)
|
107
|
-
end]
|
108
|
-
|
109
|
-
ENV.replace({}).update(heroku_env)
|
99
|
+
heroku_env = JSON.parse(STDIN.read)
|
100
|
+
ENV.replace(heroku_env)
|
110
101
|
|
111
102
|
requested_groups = ENV['ENVIED_GROUPS'] || options[:groups]
|
112
103
|
ENVied.require(*requested_groups)
|
@@ -119,8 +110,7 @@ ERR
|
|
119
110
|
long_desc <<-LONG
|
120
111
|
Generates a shell script to check the Heroku config against the local Envfile.
|
121
112
|
|
122
|
-
The same as the check:heroku-task, but all in one script (no need to pipe `heroku config` to it etc.).
|
123
|
-
|
113
|
+
The same as the check:heroku-task, but all in one script (no need to pipe `heroku config --json` to it etc.).
|
124
114
|
LONG
|
125
115
|
option :dest, banner: "where to put the script", desc: "Default: bin/<app>-env-check or bin/heroku-env-check"
|
126
116
|
option :app, banner: "name of Heroku app", desc: "uses ENV['HEROKU_APP'] as default if present", default: ENV['HEROKU_APP']
|
@@ -0,0 +1,72 @@
|
|
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
|
5
|
+
|
6
|
+
def to_array(str)
|
7
|
+
str.split(/(?<!\\),/).map{|i| i.gsub(/\\,/,',') }
|
8
|
+
end
|
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
|
+
|
29
|
+
def to_hash(str)
|
30
|
+
require 'cgi'
|
31
|
+
::CGI.parse(str).map { |key, values| [key, values[0]] }.to_h
|
32
|
+
end
|
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
|
+
|
53
|
+
def to_uri(str)
|
54
|
+
require 'uri'
|
55
|
+
::URI.parse(str)
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_integer(str)
|
59
|
+
Integer(str)
|
60
|
+
rescue ArgumentError
|
61
|
+
raise_unsupported_coercion(str, __method__)
|
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
|
72
|
+
end
|
data/lib/envied/coercer.rb
CHANGED
@@ -1,23 +1,7 @@
|
|
1
|
-
require 'coercible'
|
2
|
-
|
3
1
|
# Responsible for all string to type coercions.
|
4
2
|
class ENVied::Coercer
|
5
|
-
module CoercerExts
|
6
|
-
def to_array(str)
|
7
|
-
str.split(/(?<!\\),/).map{|i| i.gsub(/\\,/,',') }
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_hash(str)
|
11
|
-
require 'cgi'
|
12
|
-
::CGI.parse(str).map { |key, values| [key, values[0]] }.to_h
|
13
|
-
end
|
14
3
|
|
15
|
-
|
16
|
-
require 'uri'
|
17
|
-
::URI.parse(str)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
Coercible::Coercer::String.send(:include, CoercerExts)
|
4
|
+
UnsupportedCoercion = Class.new(StandardError)
|
21
5
|
|
22
6
|
# Coerce strings to specific type.
|
23
7
|
#
|
@@ -31,14 +15,9 @@ class ENVied::Coercer
|
|
31
15
|
# @return [type] the coerced string.
|
32
16
|
def coerce(string, type)
|
33
17
|
unless supported_type?(type)
|
34
|
-
raise ArgumentError, "
|
18
|
+
raise ArgumentError, "The type `#{type.inspect}` is not supported."
|
35
19
|
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def coerce_method_for(type)
|
40
|
-
return nil unless supported_type?(type)
|
41
|
-
coercer.method("to_#{type.downcase}")
|
20
|
+
coercer.public_send("to_#{type.downcase}", string)
|
42
21
|
end
|
43
22
|
|
44
23
|
def self.supported_types
|
@@ -69,7 +48,7 @@ class ENVied::Coercer
|
|
69
48
|
end
|
70
49
|
|
71
50
|
def coercer
|
72
|
-
@coercer ||=
|
51
|
+
@coercer ||= ENViedString.new
|
73
52
|
end
|
74
53
|
|
75
54
|
def coerced?(value)
|
@@ -80,7 +59,7 @@ class ENVied::Coercer
|
|
80
59
|
return false unless supported_type?(type)
|
81
60
|
coerce(string, type)
|
82
61
|
true
|
83
|
-
rescue
|
62
|
+
rescue UnsupportedCoercion
|
84
63
|
false
|
85
64
|
end
|
86
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
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# Check the config of a Heroku app against the defined variables in `Envfile`
|
4
4
|
|
5
5
|
<%- if @app %>
|
6
|
-
HEROKU_APP=<%= @app %> exec heroku config | bundle exec envied check:heroku --groups <%= @groups.join(" ") %>
|
6
|
+
HEROKU_APP=<%= @app %> exec heroku config --json | bundle exec envied check:heroku --groups <%= @groups.join(" ") %>
|
7
7
|
<%- else %>
|
8
|
-
exec heroku config | bundle exec envied check:heroku --groups <%= @groups.join(" ") %>
|
8
|
+
exec heroku config --json | bundle exec envied check:heroku --groups <%= @groups.join(" ") %>
|
9
9
|
<%- end %>
|
data/lib/envied/variable.rb
CHANGED
data/lib/envied/version.rb
CHANGED