Class: Env::Vars

Inherits:
Object
  • Object
show all
Defined in:
lib/env_vars.rb

Constant Summary collapse

VERSION =
"2.0.0"
BOOL_TRUE =
["yes", "true", "1", true].freeze
BOOL_FALSE =
%w[no false].freeze
MissingEnvironmentVariable =
Class.new(StandardError)
MissingCallable =
Class.new(StandardError)

Instance Method Summary collapse

Constructor Details

#initialize(env: ENV, raise_exception: true, stderr: $stderr, &block) ⇒ Vars

Returns a new instance of Vars.



12
13
14
15
16
17
18
# 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

Instance Method Details

#array(type = string) ⇒ Object



129
130
131
# File 'lib/env_vars.rb', line 129

def array(type = string)
  [:array, type]
end

#bigdecimalObject



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

def bigdecimal
  require "bigdecimal"
  :bigdecimal
end

#boolObject



112
113
114
# File 'lib/env_vars.rb', line 112

def bool
  :bool
end

#credential(name, &block) ⇒ Object



95
96
97
98
99
100
101
102
# 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

#floatObject



120
121
122
# File 'lib/env_vars.rb', line 120

def float
  :float
end

#intObject



104
105
106
# File 'lib/env_vars.rb', line 104

def int
  :int
end

#jsonObject



133
134
135
# File 'lib/env_vars.rb', line 133

def json
  :json
end

#mandatory(name, type, aliases: [], description: nil) ⇒ Object



65
66
67
68
69
70
71
72
73
# 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) ⇒ Object



75
76
77
# 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) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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

#stringObject



108
109
110
# File 'lib/env_vars.rb', line 108

def string
  :string
end

#symbolObject



116
117
118
# File 'lib/env_vars.rb', line 116

def symbol
  :symbol
end

#to_sObject Also known as: inspect



20
21
22
# File 'lib/env_vars.rb', line 20

def to_s
  "#<Env::Vars>"
end

#validate!(env_var, required, description) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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