Class: ENVied

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

Defined Under Namespace

Modules: Arrayable, Hashable Classes: Configuration

Constant Summary collapse

VERSION =
'0.5.0'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.required_groupsObject

Returns the value of attribute required_groups.



61
62
63
# File 'lib/envied.rb', line 61

def required_groups
  @required_groups
end

Class Method Details

.build_configuration(&block) ⇒ Object



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

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

.configuration(options = {}, &block) ⇒ Object Also known as: configure



50
51
52
53
54
55
56
57
# File 'lib/envied.rb', line 50

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

.configured_variablesObject



145
146
147
# File 'lib/envied.rb', line 145

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.



125
126
127
# File 'lib/envied.rb', line 125

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

.defaults_enabled?Boolean

Returns:

  • (Boolean)


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

def self.defaults_enabled?
  configuration.enable_defaults
end

.envObject



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

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

.env_value(variable) ⇒ Object



109
110
111
# File 'lib/envied.rb', line 109

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

.env_value_or_default(variable) ⇒ Object



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

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

.error_on_missing_variables!Object



90
91
92
93
94
# File 'lib/envied.rb', line 90

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



96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/envied.rb', line 96

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



186
187
188
# File 'lib/envied.rb', line 186

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

.missing_variable_namesObject



166
167
168
169
170
# File 'lib/envied.rb', line 166

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



172
173
174
# File 'lib/envied.rb', line 172

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

.non_coercible_variablesObject



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

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

.provided_variable_namesObject



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

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

.require(*groups) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/envied.rb', line 70

def self.require(*groups)
  groups.compact!
  @instance = nil
  if groups.any?
    self.required_groups = groups.map(&:to_sym)
  else
    self.required_groups = [:default]
  end
  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.configured_variable_names
# => [:DATABASE_URL]

Returns:

  • (Array<Symbol>)

    the list of variable names



136
137
138
# File 'lib/envied.rb', line 136

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

.required_variablesObject



140
141
142
143
# File 'lib/envied.rb', line 140

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



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

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)


190
191
192
# File 'lib/envied.rb', line 190

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

.variable_coercible?(variable) ⇒ Boolean

Returns:

  • (Boolean)


157
158
159
160
161
162
163
164
# File 'lib/envied.rb', line 157

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