Class: SuperConfig::Base
- Inherits:
-
Object
- Object
- SuperConfig::Base
- 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
- #array(type = string) ⇒ Object
- #bigdecimal ⇒ Object
- #bool ⇒ Object
- #credential(name, &block) ⇒ Object
- #float ⇒ Object
-
#initialize(env: ENV, raise_exception: true, stderr: $stderr, &block) ⇒ Base
constructor
A new instance of Base.
- #int ⇒ Object
- #json ⇒ Object
- #mandatory(name, type, aliases: [], description: nil) ⇒ Object
- #optional(name, type, default = nil, aliases: [], description: nil) ⇒ Object
-
#property(name, func = nil, cache: true, description: nil, &block) ⇒ Object
rubocop:disable Lint/UnusedMethodArgument.
- #report ⇒ Object
- #set(name, type, default = nil, required: false, aliases: [], description: nil) ⇒ Object
- #string ⇒ Object
- #symbol ⇒ Object
- #to_s ⇒ Object (also: #inspect)
- #validate!(env_var, required, description) ⇒ Object
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 |
#bigdecimal ⇒ Object
133 134 135 136 |
# File 'lib/superconfig.rb', line 133 def bigdecimal require "bigdecimal" :bigdecimal end |
#bool ⇒ Object
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 |
#float ⇒ Object
129 130 131 |
# File 'lib/superconfig.rb', line 129 def float :float end |
#int ⇒ Object
113 114 115 |
# File 'lib/superconfig.rb', line 113 def int :int end |
#json ⇒ Object
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 |
#report ⇒ Object
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, = 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, , "(#{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(env_var, type, @env[env_var]) end aliases.each do |alias_name| define_singleton_method(alias_name, method(name)) end end |
#string ⇒ Object
117 118 119 |
# File 'lib/superconfig.rb', line 117 def string :string end |
#symbol ⇒ Object
125 126 127 |
# File 'lib/superconfig.rb', line 125 def symbol :symbol end |
#to_s ⇒ Object 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) = env_var.to_s << " (#{description})" if description << " is not defined." raise MissingEnvironmentVariable, if @raise_exception = "[SUPERCONF] #{}" = "\e[31m#{}\e[0m" if @stderr.tty? @stderr << << "\n" end |