class Env::Vars

Constants

BOOL_FALSE
BOOL_TRUE
MissingCallable
MissingEnvironmentVariable
VERSION

Public Class Methods

new(env: ENV, raise_exception: true, stderr: $stderr, &block) click to toggle source
# File lib/env_vars.rb, line 12
def initialize(env: ENV, raise_exception: true, stderr: $stderr, &block)
  @env = env
  @raise_exception = raise_exception
  @stderr = stderr
  @__cache__ = {}
  instance_eval(&block)
end

Public Instance Methods

array(type = string) click to toggle source
# File lib/env_vars.rb, line 129
def array(type = string)
  [:array, type]
end
bigdecimal() click to toggle source
# File lib/env_vars.rb, line 124
def bigdecimal
  require "bigdecimal"
  :bigdecimal
end
bool() click to toggle source
# File lib/env_vars.rb, line 112
def bool
  :bool
end
credential(name, &block) click to toggle source
# File lib/env_vars.rb, line 95
def credential(name, &block)
  define_singleton_method(name) do
    @__cache__["_credential_#{name}".to_sym] ||= begin
      value = Rails.application.credentials.fetch(name)
      block ? block.call(value) : value # rubocop:disable Performance/RedundantBlockCall
    end
  end
end
float() click to toggle source
# File lib/env_vars.rb, line 120
def float
  :float
end
inspect()
Alias for: to_s
int() click to toggle source
# File lib/env_vars.rb, line 104
def int
  :int
end
json() click to toggle source
# File lib/env_vars.rb, line 133
def json
  :json
end
mandatory(name, type, aliases: [], description: nil) click to toggle source
# File lib/env_vars.rb, line 65
def mandatory(name, type, aliases: [], description: nil)
  set(
    name,
    type,
    required: true,
    aliases: aliases,
    description: description
  )
end
optional(name, type, default = nil, aliases: [], description: nil) click to toggle source
# File lib/env_vars.rb, line 75
def optional(name, type, default = nil, aliases: [], description: nil)
  set(name, type, default, aliases: aliases, description: description)
end
property(name, func = nil, cache: true, description: nil, &block) click to toggle source
# File lib/env_vars.rb, line 79
def property(name, func = nil, cache: true, description: nil, &block) # rubocop:disable Lint/UnusedMethodArgument
  callable = (func || block)

  unless callable
    raise MissingCallable, "arg[1] must respond to #call or pass a block"
  end

  if cache
    define_singleton_method(name) do
      @__cache__[name.to_sym] ||= callable.call
    end
  else
    define_singleton_method(name) { callable.call }
  end
end
set( name, type, default = nil, required: false, aliases: [], description: nil ) click to toggle source
# File lib/env_vars.rb, line 25
def set(
  name,
  type,
  default = nil,
  required: false,
  aliases: [],
  description: nil
)
  name = name.to_s
  env_var = name.upcase
  name = "#{name}?" if type == bool

  validate!(env_var, required, description)

  define_singleton_method(name) do
    return default unless @env.key?(env_var)

    coerce(type, @env[env_var])
  end

  aliases.each do |alias_name|
    define_singleton_method(alias_name, method(name))
  end
end
string() click to toggle source
# File lib/env_vars.rb, line 108
def string
  :string
end
symbol() click to toggle source
# File lib/env_vars.rb, line 116
def symbol
  :symbol
end
to_s() click to toggle source
# File lib/env_vars.rb, line 20
def to_s
  "#<Env::Vars>"
end
Also aliased as: inspect
validate!(env_var, required, description) click to toggle source
# File lib/env_vars.rb, line 50
def validate!(env_var, required, description)
  return unless required
  return if @env.key?(env_var)

  message = env_var.to_s
  message << " (#{description})" if description
  message << " is not defined."

  raise MissingEnvironmentVariable, message if @raise_exception

  message = "[ENV_VARS] #{message}"
  message = "\e[31m#{message}\e[0m" if @stderr.tty?
  @stderr << message << "\n"
end

Private Instance Methods

coerce(type, value) click to toggle source
# File lib/env_vars.rb, line 169
        def coerce(type, value)
  main_type, sub_type = type
  args = [value]
  args << sub_type if sub_type

  send("coerce_to_#{main_type}", *args)
end
coerce_to_array(value, type) click to toggle source
# File lib/env_vars.rb, line 161
        def coerce_to_array(value, type)
  value&.split(/, */)&.map {|v| coerce(type, v) }
end
coerce_to_bigdecimal(value) click to toggle source
# File lib/env_vars.rb, line 153
        def coerce_to_bigdecimal(value)
  BigDecimal(value) if value
end
coerce_to_bool(value) click to toggle source
# File lib/env_vars.rb, line 141
        def coerce_to_bool(value)
  BOOL_TRUE.include?(value)
end
coerce_to_float(value) click to toggle source
# File lib/env_vars.rb, line 149
        def coerce_to_float(value)
  Float(value) if value
end
coerce_to_int(value) click to toggle source
# File lib/env_vars.rb, line 145
        def coerce_to_int(value)
  Integer(value) if !BOOL_FALSE.include?(value) && value
end
coerce_to_json(value) click to toggle source
# File lib/env_vars.rb, line 165
        def coerce_to_json(value)
  value && JSON.parse(value)
end
coerce_to_string(value) click to toggle source
# File lib/env_vars.rb, line 137
        def coerce_to_string(value)
  value
end
coerce_to_symbol(value) click to toggle source
# File lib/env_vars.rb, line 157
        def coerce_to_symbol(value)
  value&.to_sym
end