envied 0.9.3 → 0.10.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.envrc.sample +9 -0
- data/.github/pull_request_template.md +2 -0
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +4 -3
- data/.rspec +1 -0
- data/CHANGELOG.md +13 -1
- data/LICENSE.txt +1 -1
- data/README.md +154 -54
- data/bin/bundle +105 -0
- data/bin/console +2 -6
- data/bin/envied +3 -2
- data/bin/rspec +29 -0
- data/envied.gemspec +15 -5
- data/examples/extensive_envfile +0 -2
- data/exe/envied +4 -0
- data/lib/envied.rb +17 -0
- data/lib/envied/cli.rb +9 -0
- data/lib/envied/coercer.rb +1 -1
- data/lib/envied/coercer/envied_string.rb +4 -0
- data/lib/envied/configuration.rb +14 -32
- data/lib/envied/env_interceptor.rb +19 -0
- data/lib/envied/env_proxy.rb +8 -5
- data/lib/envied/templates/Envfile.tt +5 -3
- data/lib/envied/variable.rb +2 -11
- data/lib/envied/version.rb +1 -1
- metadata +32 -27
- data/spec/coercer_spec.rb +0 -274
- data/spec/configuration_spec.rb +0 -113
- data/spec/env_var_extractor_spec.rb +0 -22
- data/spec/envied_spec.rb +0 -339
- data/spec/gemspec_spec.rb +0 -17
- data/spec/spec_helper.rb +0 -74
- data/spec/variable_spec.rb +0 -25
data/bin/console
CHANGED
@@ -6,9 +6,5 @@ require "envied"
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
9
|
+
require 'pry'
|
10
|
+
Pry.start
|
data/bin/envied
CHANGED
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/envied.gemspec
CHANGED
@@ -6,23 +6,33 @@ require "envied/version"
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "envied"
|
8
8
|
spec.version = ENVied::VERSION
|
9
|
-
spec.authors = ["Gert Goet"
|
10
|
-
spec.email = ["gert@thinkcreate.nl"
|
9
|
+
spec.authors = ["Gert Goet"]
|
10
|
+
spec.email = ["gert@thinkcreate.nl"]
|
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
13
|
spec.homepage = "https://gitlab.com/envied/envied/tree/master#envied"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
-
spec.
|
17
|
-
spec.
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://gitlab.com/envied/envied.git"
|
18
|
+
spec.metadata["changelog_uri"] = "https://gitlab.com/envied/envied/blob/master/CHANGELOG.md"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
end
|
25
|
+
spec.bindir = 'exe'
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
27
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
28
|
spec.require_paths = ["lib"]
|
20
29
|
|
21
30
|
spec.required_ruby_version = ">= 2.4"
|
22
31
|
|
23
|
-
spec.add_dependency "thor", "~> 0.
|
32
|
+
spec.add_dependency "thor", "~> 0.20"
|
24
33
|
|
25
34
|
spec.add_development_dependency "bundler", "~> 2.0"
|
35
|
+
spec.add_development_dependency "pry", "~> 0.12"
|
26
36
|
spec.add_development_dependency "rake", "~> 12.0"
|
27
37
|
spec.add_development_dependency "rspec", "~> 3.0"
|
28
38
|
end
|
data/examples/extensive_envfile
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
# -*- mode: ruby -*-¬
|
2
|
-
# NOTE: defaults are deprecated and will be removed in > v0.9
|
3
|
-
|
4
2
|
# We allow defaults for local development (and local tests), but want our CI
|
5
3
|
# to mimic our production as much as possible.
|
6
4
|
# New developers that don't have RACK_ENV set, will in this way not be presented with a huge
|
data/exe/envied
ADDED
data/lib/envied.rb
CHANGED
@@ -5,6 +5,7 @@ require 'envied/coercer'
|
|
5
5
|
require 'envied/coercer/envied_string'
|
6
6
|
require 'envied/variable'
|
7
7
|
require 'envied/configuration'
|
8
|
+
require 'envied/env_interceptor'
|
8
9
|
|
9
10
|
class ENVied
|
10
11
|
class << self
|
@@ -18,6 +19,7 @@ class ENVied
|
|
18
19
|
error_on_missing_variables!(options)
|
19
20
|
error_on_uncoercible_variables!(options)
|
20
21
|
|
22
|
+
intercept_env_vars!
|
21
23
|
ensure_spring_after_fork_require(args, options)
|
22
24
|
end
|
23
25
|
|
@@ -52,6 +54,20 @@ class ENVied
|
|
52
54
|
result.any? ? result.map(&:to_sym) : [:default]
|
53
55
|
end
|
54
56
|
|
57
|
+
def self.env_keys_to_intercept
|
58
|
+
config.variables.select {|var| var.type == :env }.map{|var| var.name.to_s }
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.intercept_env_vars!
|
62
|
+
if (keys = env_keys_to_intercept).any?
|
63
|
+
ENV.instance_eval { @__envied_env_keys = keys }
|
64
|
+
class << ENV
|
65
|
+
prepend(ENVied::EnvInterceptor)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
private_class_method :intercept_env_vars!, :env_keys_to_intercept
|
70
|
+
|
55
71
|
def self.ensure_spring_after_fork_require(args, **options)
|
56
72
|
if spring_enabled? && !options[:via_spring]
|
57
73
|
Spring.after_fork { ENVied.require(args, options.merge(via_spring: true)) }
|
@@ -83,4 +99,5 @@ class ENVied
|
|
83
99
|
def self.respond_to_missing?(method, include_private = false)
|
84
100
|
(env && env.has_key?(method)) || super
|
85
101
|
end
|
102
|
+
|
86
103
|
end
|
data/lib/envied/cli.rb
CHANGED
@@ -70,6 +70,9 @@ class ENVied
|
|
70
70
|
option :groups, type: :array, desc: "uses ENV['ENVIED_GROUPS'] as default if present", default: ENV['ENVIED_GROUPS'] || %w(default), banner: 'default production'
|
71
71
|
option :quiet, type: :boolean, desc: 'Communicate success of the check only via the exit status.'
|
72
72
|
def check
|
73
|
+
if rails_project?
|
74
|
+
require File.expand_path 'config/environment.rb'
|
75
|
+
end
|
73
76
|
ENVied.require(*options[:groups])
|
74
77
|
unless options[:quiet]
|
75
78
|
puts "All variables for group(s) #{options[:groups]} are present and valid"
|
@@ -126,5 +129,11 @@ class ENVied
|
|
126
129
|
template("heroku-env-check.tt", full_dest)
|
127
130
|
FileUtils.chmod 0755, full_dest
|
128
131
|
end
|
132
|
+
|
133
|
+
no_tasks do
|
134
|
+
def rails_project?
|
135
|
+
File.exists?('config/environment.rb')
|
136
|
+
end
|
137
|
+
end
|
129
138
|
end
|
130
139
|
end
|
data/lib/envied/coercer.rb
CHANGED
@@ -22,7 +22,7 @@ class ENVied::Coercer
|
|
22
22
|
|
23
23
|
def self.supported_types
|
24
24
|
@supported_types ||= begin
|
25
|
-
[:hash, :array, :time, :date, :symbol, :boolean, :integer, :string, :uri, :float].sort
|
25
|
+
[:env, :hash, :array, :time, :date, :symbol, :boolean, :integer, :string, :uri, :float].sort
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
data/lib/envied/configuration.rb
CHANGED
@@ -1,13 +1,25 @@
|
|
1
1
|
class ENVied
|
2
2
|
class Configuration
|
3
|
-
attr_reader :current_group, :
|
3
|
+
attr_reader :current_group, :coercer
|
4
4
|
|
5
5
|
def initialize(**options, &block)
|
6
6
|
@coercer = options.fetch(:coercer, Coercer.new)
|
7
|
-
@
|
7
|
+
@key_alias = options[:key_alias]
|
8
8
|
instance_eval(&block) if block_given?
|
9
9
|
end
|
10
10
|
|
11
|
+
def key_alias!(value = false, &block)
|
12
|
+
@key_alias = block_given? ? block.call : value
|
13
|
+
end
|
14
|
+
|
15
|
+
def key_alias
|
16
|
+
@key_alias && @key_alias.to_s.upcase
|
17
|
+
end
|
18
|
+
|
19
|
+
def enable_defaults!(*args)
|
20
|
+
raise "Defaults are no longer supported. See https://gitlab.com/envied/envied/tree/master#what-happened-to-default-values for the recommended upgrade-path, or pin the gem to 0.9-release (e.g. `gem 'envied', '~> 0.9.2'`) to keep using defaults."
|
21
|
+
end
|
22
|
+
|
11
23
|
def self.load(**options)
|
12
24
|
envfile = File.expand_path('Envfile')
|
13
25
|
new(options).tap do |v|
|
@@ -15,17 +27,6 @@ class ENVied
|
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
|
-
def enable_defaults!(value = true, &block)
|
19
|
-
default_values_deprecation
|
20
|
-
@defaults_enabled = block_given? ? block.call : value
|
21
|
-
end
|
22
|
-
|
23
|
-
def defaults_enabled?
|
24
|
-
@defaults_enabled.respond_to?(:call) ?
|
25
|
-
@defaults_enabled.call :
|
26
|
-
@defaults_enabled
|
27
|
-
end
|
28
|
-
|
29
30
|
def variable(name, type = :string, **options)
|
30
31
|
unless coercer.supported_type?(type)
|
31
32
|
raise ArgumentError, "#{type.inspect} is not a supported type. Should be one of #{coercer.supported_types}"
|
@@ -46,24 +47,5 @@ class ENVied
|
|
46
47
|
def variables
|
47
48
|
@variables ||= []
|
48
49
|
end
|
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
50
|
end
|
69
51
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class ENVied
|
2
|
+
module EnvInterceptor
|
3
|
+
def [](key)
|
4
|
+
if @__envied_env_keys.include?(key)
|
5
|
+
ENVied.public_send(key)
|
6
|
+
else
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch(key, *args)
|
12
|
+
if @__envied_env_keys.include?(key)
|
13
|
+
ENVied.public_send(key)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/envied/env_proxy.rb
CHANGED
@@ -28,7 +28,6 @@ class ENVied
|
|
28
28
|
|
29
29
|
def value_to_coerce(var)
|
30
30
|
return env_value_of(var) unless env_value_of(var).nil?
|
31
|
-
config.defaults_enabled? ? default_value_of(var) : nil
|
32
31
|
end
|
33
32
|
|
34
33
|
private
|
@@ -47,12 +46,16 @@ class ENVied
|
|
47
46
|
coercer.coercible?(value_to_coerce(var), var.type)
|
48
47
|
end
|
49
48
|
|
50
|
-
def
|
51
|
-
|
49
|
+
def env_value_of(var)
|
50
|
+
ENV.values_at(*env_keys(var, key_alias: config.key_alias)).compact.first
|
52
51
|
end
|
53
52
|
|
54
|
-
def
|
55
|
-
|
53
|
+
def env_keys(var, key_alias: nil)
|
54
|
+
base_key = var.name.to_s
|
55
|
+
|
56
|
+
result = [base_key]
|
57
|
+
result.unshift "#{base_key}_#{key_alias}" if key_alias
|
58
|
+
result
|
56
59
|
end
|
57
60
|
|
58
61
|
def missing?(var)
|
@@ -1,7 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
1
|
+
#
|
2
|
+
# Allow ENV['FOO_<key_alias>'] to provide for ENVied.FOO (with ENV['FOO']
|
3
|
+
# as fallback).
|
4
|
+
# key_alias! { Rails.env }
|
3
5
|
|
4
|
-
# variable :REDIS_URL, :string
|
6
|
+
# variable :REDIS_URL, :string
|
5
7
|
#
|
6
8
|
# group :production do
|
7
9
|
# variable :SECRET_KEY_BASE
|
data/lib/envied/variable.rb
CHANGED
@@ -1,23 +1,14 @@
|
|
1
1
|
class ENVied::Variable
|
2
|
-
attr_reader :name, :type, :group
|
2
|
+
attr_reader :name, :type, :group
|
3
3
|
|
4
4
|
def initialize(name, type, **options)
|
5
5
|
@name = name.to_sym
|
6
6
|
@type = type.to_sym
|
7
7
|
@group = options.fetch(:group, :default).to_sym
|
8
|
-
@default = options[:default]
|
9
|
-
|
10
|
-
#if !@default.is_a? String
|
11
|
-
# raise ArgumentError, "Default values should be strings (variable #{@name})"
|
12
|
-
#end
|
13
|
-
end
|
14
|
-
|
15
|
-
def default_value(*args)
|
16
|
-
default.respond_to?(:call) ? default[*args] : default
|
17
8
|
end
|
18
9
|
|
19
10
|
def ==(other)
|
20
11
|
self.class == other.class &&
|
21
|
-
[name, type, group
|
12
|
+
[name, type, group] == [other.name, other.type, other.group]
|
22
13
|
end
|
23
14
|
end
|
data/lib/envied/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: envied
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0.alpha1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gert Goet
|
8
|
-
- Javier Julio
|
9
8
|
autorequire:
|
10
|
-
bindir:
|
9
|
+
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date: 2019-
|
11
|
+
date: 2019-07-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: thor
|
@@ -17,14 +16,14 @@ dependencies:
|
|
17
16
|
requirements:
|
18
17
|
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
|
-
version: '0.
|
19
|
+
version: '0.20'
|
21
20
|
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
24
|
- - "~>"
|
26
25
|
- !ruby/object:Gem::Version
|
27
|
-
version: '0.
|
26
|
+
version: '0.20'
|
28
27
|
- !ruby/object:Gem::Dependency
|
29
28
|
name: bundler
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,6 +38,20 @@ dependencies:
|
|
39
38
|
- - "~>"
|
40
39
|
- !ruby/object:Gem::Version
|
41
40
|
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.12'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.12'
|
42
55
|
- !ruby/object:Gem::Dependency
|
43
56
|
name: rake
|
44
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,14 +83,13 @@ dependencies:
|
|
70
83
|
description: Ensure presence and type of your app's ENV-variables.
|
71
84
|
email:
|
72
85
|
- gert@thinkcreate.nl
|
73
|
-
- jjfutbol@gmail.com
|
74
86
|
executables:
|
75
|
-
- console
|
76
87
|
- envied
|
77
|
-
- setup
|
78
88
|
extensions: []
|
79
89
|
extra_rdoc_files: []
|
80
90
|
files:
|
91
|
+
- ".envrc.sample"
|
92
|
+
- ".github/pull_request_template.md"
|
81
93
|
- ".gitignore"
|
82
94
|
- ".gitlab-ci.yml"
|
83
95
|
- ".rspec"
|
@@ -86,33 +98,33 @@ files:
|
|
86
98
|
- LICENSE.txt
|
87
99
|
- README.md
|
88
100
|
- Rakefile
|
101
|
+
- bin/bundle
|
89
102
|
- bin/console
|
90
103
|
- bin/envied
|
104
|
+
- bin/rspec
|
91
105
|
- bin/setup
|
92
106
|
- envied.gemspec
|
93
107
|
- examples/extensive_envfile
|
108
|
+
- exe/envied
|
94
109
|
- lib/envied.rb
|
95
110
|
- lib/envied/cli.rb
|
96
111
|
- lib/envied/coercer.rb
|
97
112
|
- lib/envied/coercer/envied_string.rb
|
98
113
|
- lib/envied/configuration.rb
|
114
|
+
- lib/envied/env_interceptor.rb
|
99
115
|
- lib/envied/env_proxy.rb
|
100
116
|
- lib/envied/env_var_extractor.rb
|
101
117
|
- lib/envied/templates/Envfile.tt
|
102
118
|
- lib/envied/templates/heroku-env-check.tt
|
103
119
|
- lib/envied/variable.rb
|
104
120
|
- lib/envied/version.rb
|
105
|
-
- spec/coercer_spec.rb
|
106
|
-
- spec/configuration_spec.rb
|
107
|
-
- spec/env_var_extractor_spec.rb
|
108
|
-
- spec/envied_spec.rb
|
109
|
-
- spec/gemspec_spec.rb
|
110
|
-
- spec/spec_helper.rb
|
111
|
-
- spec/variable_spec.rb
|
112
121
|
homepage: https://gitlab.com/envied/envied/tree/master#envied
|
113
122
|
licenses:
|
114
123
|
- MIT
|
115
|
-
metadata:
|
124
|
+
metadata:
|
125
|
+
homepage_uri: https://gitlab.com/envied/envied/tree/master#envied
|
126
|
+
source_code_uri: https://gitlab.com/envied/envied.git
|
127
|
+
changelog_uri: https://gitlab.com/envied/envied/blob/master/CHANGELOG.md
|
116
128
|
post_install_message:
|
117
129
|
rdoc_options: []
|
118
130
|
require_paths:
|
@@ -124,19 +136,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
136
|
version: '2.4'
|
125
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
138
|
requirements:
|
127
|
-
- - "
|
139
|
+
- - ">"
|
128
140
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
141
|
+
version: 1.3.1
|
130
142
|
requirements: []
|
131
143
|
rubygems_version: 3.0.3
|
132
144
|
signing_key:
|
133
145
|
specification_version: 4
|
134
146
|
summary: Ensure presence and type of ENV-variables
|
135
|
-
test_files:
|
136
|
-
- spec/coercer_spec.rb
|
137
|
-
- spec/configuration_spec.rb
|
138
|
-
- spec/env_var_extractor_spec.rb
|
139
|
-
- spec/envied_spec.rb
|
140
|
-
- spec/gemspec_spec.rb
|
141
|
-
- spec/spec_helper.rb
|
142
|
-
- spec/variable_spec.rb
|
147
|
+
test_files: []
|