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 =
'_'.freeze

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.



49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/bbk/utils/config.rb', line 49

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

Instance Method Details

#[](key) ⇒ Object



121
122
123
# File 'lib/bbk/utils/config.rb', line 121

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

#[]=(key, value) ⇒ Object



125
126
127
# File 'lib/bbk/utils/config.rb', line 125

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

#as_json(*_args) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/bbk/utils/config.rb', line 166

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



129
130
131
132
133
134
135
136
# File 'lib/bbk/utils/config.rb', line 129

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



138
139
140
141
142
143
144
145
146
# File 'lib/bbk/utils/config.rb', line 138

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) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/bbk/utils/config.rb', line 63

def map(env, file, required: true, desc: nil, bool: false, key: nil)
  @store[full_prefixed_key(env)] = {
    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) ⇒ Object

Raises:

  • (ArgumentError)


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

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

  type = BBK::Utils::Config::BooleanCaster.singleton_method(:cast) if bool
  @store[full_prefixed_key(env)] = {
    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) ⇒ Object

Raises:

  • (ArgumentError)


74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/bbk/utils/config.rb', line 74

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

  type = BBK::Config::BooleanCaster.singleton_method(:cast) if bool
  @store[full_prefixed_key(env)] = {
    env:      full_prefixed_key(key || env),
    file:     nil,
    required: true,
    desc:     desc,
    bool:     bool,
    type:     type
  }
end

#root?Boolean

Returns:

  • (Boolean)


184
185
186
# File 'lib/bbk/utils/config.rb', line 184

def root?
  @parent.nil?
end

#run!(source = ENV) ⇒ Object



103
104
105
106
107
108
109
# File 'lib/bbk/utils/config.rb', line 103

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) ⇒ Object

Raises:

  • (ArgumentError)


111
112
113
114
115
116
117
118
119
# File 'lib/bbk/utils/config.rb', line 111

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
  if block_given?
    yield sub
  end
  sub
end

#to_json(*_args) ⇒ Object



176
177
178
# File 'lib/bbk/utils/config.rb', line 176

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

#to_sObject



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/bbk/utils/config.rb', line 148

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



180
181
182
# File 'lib/bbk/utils/config.rb', line 180

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