envied 0.9.0 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![
|
1
|
+
# ENVied [![pipeline status](https://gitlab.com/envied/envied/badges/0-9-releases/pipeline.svg)](https://gitlab.com/envied/envied/commits/0-9-releases) [![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](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