Class: BBK::Utils::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/bbk/utils/config.rb

Defined Under Namespace

Classes: BooleanCaster, KeyError

Constant Summary collapse

PREFIX_SEP =
'_'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name: nil, prefix: nil, parent: nil) ⇒ Config

Returns a new instance of Config.



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/bbk/utils/config.rb', line 53

def initialize(name: nil, prefix: nil, parent: nil)
  @name = name
  @store = {}
  @parent = parent
  @subconfigs = []
  @prefix = normalize_key(prefix)
  @prefixes = if parent.nil?
    [@prefix]
  else
    parent.prefixes.dup + [@prefix]
  end.compact
  @env_prefix = normalize_key(@prefixes.join(PREFIX_SEP))
end

Instance Attribute Details

#env_prefixObject (readonly)

Returns the value of attribute env_prefix.



10
11
12
# File 'lib/bbk/utils/config.rb', line 10

def env_prefix
  @env_prefix
end

#nameObject

Returns the value of attribute name.



9
10
11
# File 'lib/bbk/utils/config.rb', line 9

def name
  @name
end

#parentObject (readonly)

Returns the value of attribute parent.



10
11
12
# File 'lib/bbk/utils/config.rb', line 10

def parent
  @parent
end

#prefixObject (readonly)

Returns the value of attribute prefix.



10
11
12
# File 'lib/bbk/utils/config.rb', line 10

def prefix
  @prefix
end

#storeObject

Returns the value of attribute store.



9
10
11
# File 'lib/bbk/utils/config.rb', line 9

def store
  @store
end

Class Method Details

.instance(prefix: nil) ⇒ Object



37
38
39
# File 'lib/bbk/utils/config.rb', line 37

def self.instance(prefix: nil)
  @instance ||= new(prefix: prefix)
end

.parse_bool_value(value) ⇒ Object



41
42
43
# File 'lib/bbk/utils/config.rb', line 41

def self.parse_bool_value(value)
  BooleanCaster.cast(value)
end

Instance Method Details

#[](key) ⇒ Object



133
134
135
# File 'lib/bbk/utils/config.rb', line 133

def [](key)
  self.get(key, search_up: true, search_down: true)[:value]
end

#[]=(key, value) ⇒ Object



137
138
139
# File 'lib/bbk/utils/config.rb', line 137

def []=(key, value)
  @store[normalize_key(key)][:value] = value
end

#as_json(*_args) ⇒ Object



178
179
180
181
182
183
184
185
186
# File 'lib/bbk/utils/config.rb', line 178

def as_json(*_args)
  values = store_with_subconfigs.values.sort_by do |item|
    [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
  end.reduce({}) do |ret, item|
    ret.merge(item[:env] => item)
  end

  @name ? { @name => values } : values
end

#content(key) ⇒ Object



141
142
143
144
145
146
147
148
# File 'lib/bbk/utils/config.rb', line 141

def content(key)
  item = @store[normalize_key(key)]
  if (file = item[:file])
    File.read(file)
  else
    item[:value]
  end
end

#fetch(key, default = nil) ⇒ Object



150
151
152
153
154
155
156
157
158
# File 'lib/bbk/utils/config.rb', line 150

def fetch(key, default = nil)
  if (rec = self.get(key, search_up: true, search_down: true)) && rec.key?(:value)
    rec[:value]
  else
    default
  end
rescue KeyError
  default
end

#map(env, file, required: true, desc: nil, bool: false, key: nil, rewrite: true) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/bbk/utils/config.rb', line 67

def map(env, file, required: true, desc: nil, bool: false, key: nil, rewrite: true)
  conf_key = full_prefixed_key(env)
  return if @store.key?(conf_key) && !rewrite

  @store[conf_key] = {
    env:      full_prefixed_key(key || env),
    file:     file,
    required: required,
    desc:     desc,
    bool:     bool,
    type:     nil
  }
end

#optional(env, default: nil, desc: nil, bool: false, type: nil, key: nil, rewrite: true) ⇒ Object

Raises:

  • (ArgumentError)


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/bbk/utils/config.rb', line 98

def optional(env, default: nil, desc: nil, bool: false, type: nil, key: nil, rewrite: true)
  raise ArgumentError.new('Specified type and bool') if bool && type.present?

  type = BBK::Utils::Config::BooleanCaster.singleton_method(:cast) if bool
  conf_key = full_prefixed_key(env)
  return if @store.key?(conf_key) && !rewrite

  @store[conf_key] = {
    env:      full_prefixed_key(key || env),
    file:     nil,
    required: false,
    default:  default,
    desc:     desc,
    bool:     true,
    type:     type
  }
end

#require(env, desc: nil, bool: false, type: nil, key: nil, rewrite: true) ⇒ Object

Raises:

  • (ArgumentError)


81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/bbk/utils/config.rb', line 81

def require(env, desc: nil, bool: false, type: nil, key: nil, rewrite: true)
  raise ArgumentError.new('Specified type and bool') if bool && type.present?

  type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
  conf_key = full_prefixed_key(env)
  return if @store.key?(conf_key) && !rewrite

  @store[conf_key] = {
    env:      full_prefixed_key(key || env),
    file:     nil,
    required: true,
    desc:     desc,
    bool:     bool,
    type:     type
  }
end

#root?Boolean

Returns:

  • (Boolean)


196
197
198
# File 'lib/bbk/utils/config.rb', line 196

def root?
  @parent.nil?
end

#run!(source = ENV) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/bbk/utils/config.rb', line 116

def run!(source = ENV)
  @store.each_value do |item|
    process(source, item)
  end
  @subconfigs.each {|sub| sub.run!(source) }
  nil
end

#subconfig(prefix:, name: nil) {|sub| ... } ⇒ Object

Yields:

  • (sub)

Raises:

  • (ArgumentError)


124
125
126
127
128
129
130
131
# File 'lib/bbk/utils/config.rb', line 124

def subconfig(prefix:, name: nil)
  raise ArgumentError.new("Subconfig with prefix #{prefix} already exists") if @subconfigs.any? {|sub| sub.prefix == prefix.to_s }

  sub = self.class.new(name: name, prefix: prefix, parent: self)
  @subconfigs << sub
  yield sub if block_given?
  sub
end

#to_json(*_args) ⇒ Object



188
189
190
# File 'lib/bbk/utils/config.rb', line 188

def to_json(*_args)
  JSON.pretty_generate(as_json)
end

#to_sObject



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/bbk/utils/config.rb', line 160

def to_s
  result = StringIO.new
  result.puts "Environment variables#{@name ? " for #{@name}" : ''}:"
  padding = ' ' * 3
  sorted = store_with_subconfigs.values.sort_by do |item|
    [item[:file].present? ? 0 : 1, item[:required] ? 0 : 1]
  end

  sorted.each do |item|
    if item[:file]
      result.puts print_file_item(item, padding)
    else
      result.puts print_item(item, padding)
    end
  end
  result.string
end

#to_yaml(*_args) ⇒ Object



192
193
194
# File 'lib/bbk/utils/config.rb', line 192

def to_yaml(*_args)
  JSON.parse(to_json).to_yaml
end