Class: ENVied

Inherits:
Object
  • Object
show all
Defined in:
lib/envied.rb,
lib/envied/cli.rb,
lib/envied/version.rb

Defined Under Namespace

Modules: Arrayable, Hashable Classes: Cli, Configuration

Constant Summary collapse

VERSION =
'0.6.2'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.required_groupsObject

Returns the value of attribute required_groups.



72
73
74
# File 'lib/envied.rb', line 72

def required_groups
  @required_groups
end

Class Method Details

.build_configuration(&block) ⇒ Object



75
76
77
78
79
# File 'lib/envied.rb', line 75

def self.build_configuration(&block)
  Class.new(Configuration).tap do |c|
    c.instance_eval(&block) if block_given?
  end
end

.configuration(options = {}, &block) ⇒ Object



57
58
59
60
61
62
63
64
# File 'lib/envied.rb', line 57

def self.configuration(options = {}, &block)
  if block_given?
    @configuration = build_configuration(&block).tap do |c|
      options.each {|k, v| c.public_send("#{k}=", v) }
    end
  end
  @configuration ||= build_configuration
end

.configure(options = {}, &block) ⇒ Object



66
67
68
69
# File 'lib/envied.rb', line 66

def self.configure(options = {}, &block)
  deprecation_warning "ENVied.configure will be deprecated. Please generate an Envfile instead (see the envied command)."
  configuration(options, &block)
end

.configure_via_envfileObject



115
116
117
# File 'lib/envied.rb', line 115

def self.configure_via_envfile
  configuration { eval(File.read(ENVied.envfile)) }
end

.configured_variablesObject



174
175
176
# File 'lib/envied.rb', line 174

def self.configured_variables
  configuration.attribute_set.dup#.to_a.keep_if(&var_from_required_group)
end

.default_value(variable) ⇒ Object

Yields the assigned default for the variable. When defaults are disabled, nil is returned.



154
155
156
# File 'lib/envied.rb', line 154

def self.default_value(variable)
  defaults_enabled? ? variable.default_value.value : nil
end

.defaults_enabled?Boolean

Returns:

  • (Boolean)


211
212
213
# File 'lib/envied.rb', line 211

def self.defaults_enabled?
  configuration.enable_defaults
end

.deprecation_warning(msg) ⇒ Object



223
224
225
# File 'lib/envied.rb', line 223

def self.deprecation_warning(msg)
  puts "DEPRECATION WARNING: #{msg}"
end

.ensure_configured!Object



102
103
104
105
# File 'lib/envied.rb', line 102

def self.ensure_configured!
  # Backward compat: load Envfile only when it's present
  configure_via_envfile if envfile_exist?
end

.envObject



142
143
144
145
146
# File 'lib/envied.rb', line 142

def self.env
  @env ||= begin
    Hash[ENV.to_hash.map {|k,v| [k, v.dup.extend(Hashable, Arrayable)] }]
  end
end

.env_value(variable) ⇒ Object



138
139
140
# File 'lib/envied.rb', line 138

def self.env_value(variable)
  env[variable.name.to_s]
end

.env_value_or_default(variable) ⇒ Object



148
149
150
# File 'lib/envied.rb', line 148

def self.env_value_or_default(variable)
  env_value(variable) || default_value(variable)
end

.envfileObject



107
108
109
# File 'lib/envied.rb', line 107

def self.envfile
  File.expand_path('Envfile')
end

.envfile_exist?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/envied.rb', line 111

def self.envfile_exist?
  File.exist?(envfile)
end

.error_on_missing_variables!Object



119
120
121
122
123
# File 'lib/envied.rb', line 119

def self.error_on_missing_variables!
  if missing_variable_names.any?
    raise "Please set the following ENV-variables: #{missing_variable_names.sort.join(',')}"
  end
end

.error_on_uncoercible_variables!Object



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/envied.rb', line 125

def self.error_on_uncoercible_variables!
  # TODO default values should have defined type
  if non_coercible_variables.any?
    single_error = "ENV['%{name}'] ('%{value}' can't be coerced to %{type})"
    errors = non_coercible_variables.map do |v|
      var_type = v.type.to_s.split("::").last
      single_error % { name: v.name, value: env_value_or_default(v), type: var_type }
    end.join ", "

    raise "Some ENV-variables are not coercible: #{errors}"
  end
end

.method_missing(method, *args, &block) ⇒ Object



215
216
217
# File 'lib/envied.rb', line 215

def self.method_missing(method, *args, &block)
  respond_to_missing?(method) ? @instance.public_send(method, *args, &block) : super
end

.missing_variable_namesObject



195
196
197
198
199
# File 'lib/envied.rb', line 195

def self.missing_variable_names
  unprovided = required_variable_names - provided_variable_names
  unprovided -= names_of_required_variables_with_defaults if defaults_enabled?
  unprovided
end

.names_of_required_variables_with_defaultsObject



201
202
203
# File 'lib/envied.rb', line 201

def self.names_of_required_variables_with_defaults
  required_variables_with_defaults.map(&:name).map(&:to_sym)
end

.non_coercible_variablesObject



182
183
184
# File 'lib/envied.rb', line 182

def self.non_coercible_variables
  required_variables.reject(&method(:variable_coercible?))
end

.provided_variable_namesObject



178
179
180
# File 'lib/envied.rb', line 178

def self.provided_variable_names
  ENV.keys.map(&:to_sym)
end

.require(*groups) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/envied.rb', line 81

def self.require(*groups)
  groups.compact!
  @instance = nil
  if groups.any?
    self.required_groups = groups.map(&:to_sym)
  else
    self.required_groups = [:default]
  end
  ensure_configured!
  error_on_missing_variables!
  error_on_uncoercible_variables!

  _required_variables = required_variables
  group_configuration = build_configuration do
    _required_variables.each do |v|
      @attribute_set << v
    end
  end
  @instance = group_configuration.new(env)
end

.required_variable_namesArray<Symbol>

A list of all configured variable names.

Examples:

ENVied.required_variable_names
# => [:DATABASE_URL]

Returns:

  • (Array<Symbol>)

    the list of variable names



165
166
167
# File 'lib/envied.rb', line 165

def self.required_variable_names
  required_variables.map(&:name).map(&:to_sym)
end

.required_variablesObject



169
170
171
172
# File 'lib/envied.rb', line 169

def self.required_variables
  from_required_group = ->(var){ self.required_groups.include?(var.options[:group]) }
  configured_variables.to_a.keep_if(&from_required_group)
end

.required_variables_with_defaultsObject



205
206
207
208
209
# File 'lib/envied.rb', line 205

def self.required_variables_with_defaults
  required_variables.map do |v|
    v unless v.default_value.value.nil?
  end.compact
end

.respond_to_missing?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


219
220
221
# File 'lib/envied.rb', line 219

def self.respond_to_missing?(method, include_private = false)
  @instance.respond_to?(method) || super
end

.variable_coercible?(variable) ⇒ Boolean

Returns:

  • (Boolean)


186
187
188
189
190
191
192
193
# File 'lib/envied.rb', line 186

def self.variable_coercible?(variable)
  var_value = env_value_or_default(variable)
  return true if var_value.respond_to?(:call)

  variable.coerce var_value
rescue Virtus::CoercionError
  return false
end