Class: SuperConfig::Base

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

Constant Summary collapse

BOOL_TRUE =
["yes", "true", "1", true].freeze
BOOL_FALSE =
%w[no false].freeze

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Base.



17
18
19
20
21
22
23
24
# File 'lib/superconfig.rb', line 17

def initialize(env: ENV, raise_exception: true, stderr: $stderr, &block)
  @env = env
  @raise_exception = raise_exception
  @stderr = stderr
  @attributes = {}
  @__cache__ = {}
  instance_eval(&block)
end

Instance Method Details

#array(type = string) ⇒ Object



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

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

#bigdecimalObject



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

def bigdecimal
  require "bigdecimal"
  :bigdecimal
end

#boolObject



121
122
123
# File 'lib/superconfig.rb', line 121

def bool
  :bool
end

#credential(name, &block) ⇒ Object



104
105
106
107
108
109
110
111
# File 'lib/superconfig.rb', line 104

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



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

def float
  :float
end

#intObject



113
114
115
# File 'lib/superconfig.rb', line 113

def int
  :int
end

#jsonObject



142
143
144
# File 'lib/superconfig.rb', line 142

def json
  :json
end

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



74
75
76
77
78
79
80
81
82
# File 'lib/superconfig.rb', line 74

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



84
85
86
# File 'lib/superconfig.rb', line 84

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



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/superconfig.rb', line 88

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

#reportObject



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/superconfig.rb', line 146

def report
  attrs = @attributes.sort

  report = attrs.each_with_object([]) do |(env_var, info), buffer|
    icon, message = if @env.key?(env_var)
                      ["", "is set"]
                    elsif info[:required]
                      ["", "is not set"]
                    elsif !info[:required] && !info[:default].nil?
                      ["", "is not set, but has default value"]
                    else
                      ["⚠️", "is not set"]
                    end

    label = if info[:required]
              "mandatory"
            else
              "optional"
            end

    buffer << [icon, env_var, message, "(#{label})"].join(" ")
  end

  "#{report.join("\n")}\n"
end

#set(name, type, default = nil, required: false, aliases: [], description: nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/superconfig.rb', line 31

def set(
  name,
  type,
  default = nil,
  required: false,
  aliases: [],
  description: nil
)
  name = name.to_s
  env_var = name.upcase

  @attributes[env_var] = {required: required, default: default}

  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



117
118
119
# File 'lib/superconfig.rb', line 117

def string
  :string
end

#symbolObject



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

def symbol
  :symbol
end

#to_sObject Also known as: inspect



26
27
28
# File 'lib/superconfig.rb', line 26

def to_s
  "#<SuperConfig>"
end

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



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/superconfig.rb', line 59

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 = "[SUPERCONF] #{message}"
  message = "\e[31m#{message}\e[0m" if @stderr.tty?
  @stderr << message << "\n"
end