Class: ComplexConfig::Settings

Inherits:
BasicObject
Extended by:
Tins::ThreadLocal
Includes:
Kernel, Tins::AskAndSend
Defined in:
lib/complex_config/settings.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash = nil) ⇒ Settings

Returns a new instance of Settings.



44
45
46
47
48
49
50
51
52
53
# File 'lib/complex_config/settings.rb', line 44

def initialize(hash = nil)
  self.name_prefix = self.class.name_prefix
  @table = {}
  if hash
    hash.each_pair do |k, v|
      k = k.to_sym
      @table[k] = v
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(id, *a, &b) ⇒ Object (private)



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'lib/complex_config/settings.rb', line 250

def method_missing(id, *a, &b)
  case
  when id =~ /\?\z/
    begin
      public_send $`.to_sym, *a, &b
    rescue ::ComplexConfig::AttributeMissing
      nil
    end
  when id =~ /=\z/
    @table[$`.to_sym] = a.first
  when value = ::ComplexConfig::Provider.apply_plugins(self, id)
    value
  else
    if attribute_set?(id)
      @table[id]
    else
      raise ::ComplexConfig::AttributeMissing, "no attribute named #{id.inspect}"
    end
  end
end

Instance Attribute Details

#name_prefixObject

Returns the value of attribute name_prefix.



42
43
44
# File 'lib/complex_config/settings.rb', line 42

def name_prefix
  @name_prefix
end

Class Method Details

.[](*a) ⇒ Object



10
11
12
# File 'lib/complex_config/settings.rb', line 10

def [](*a)
  from_hash(*a)
end

.build(name, hash) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/complex_config/settings.rb', line 29

def build(name, hash)
  name.nil? or self.name_prefix = name.to_sym
  hash.respond_to?(:to_hash) or raise TypeError, 'require hash to build'
  from_hash(hash)
ensure
  self.name_prefix = nil
end

.from_hash(object) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/complex_config/settings.rb', line 14

def from_hash(object)
  case
  when object.respond_to?(:to_hash)
    result = new
    object.to_hash.each do |key, value|
      result[key] = from_hash(value)
    end
    result
  when object.respond_to?(:to_ary)
    object.to_ary.map { |a| from_hash(a) }
  else
    object
  end
end

Instance Method Details

#==(other) ⇒ Object



118
119
120
# File 'lib/complex_config/settings.rb', line 118

def ==(other)
  other.respond_to?(:to_h) && to_h == other.to_h
end

#[]=(name, value) ⇒ Object



224
225
226
# File 'lib/complex_config/settings.rb', line 224

def []=(name, value)
  @table[name.to_sym] = value
end

#attribute_get(name) ⇒ Object Also known as: []



204
205
206
207
208
209
210
211
212
# File 'lib/complex_config/settings.rb', line 204

def attribute_get(name)
  if !attribute_set?(name) and
    value = ::ComplexConfig::Provider.apply_plugins(self, name)
  then
    value
  else
    @table[name.to_sym]
  end
end

#attribute_get!(name) ⇒ Object



216
217
218
219
220
221
222
# File 'lib/complex_config/settings.rb', line 216

def attribute_get!(name)
  if attribute_set?(name)
    attribute_get(name)
  else
    raise ::ComplexConfig::AttributeMissing, "no attribute named #{name.inspect}"
  end
end

#attribute_namesObject



65
66
67
# File 'lib/complex_config/settings.rb', line 65

def attribute_names
  @table.keys
end

#attribute_set?(name) ⇒ Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/complex_config/settings.rb', line 61

def attribute_set?(name)
  @table.key?(name.to_sym)
end

#attribute_valuesObject



69
70
71
# File 'lib/complex_config/settings.rb', line 69

def attribute_values
  @table.values
end

#attributes_list(pair_sep: ' = ', path_sep: ?.) ⇒ Object



142
143
144
145
146
147
# File 'lib/complex_config/settings.rb', line 142

def attributes_list(pair_sep: ' = ', path_sep: ?.)
  empty? and return self.class.name
  pathes(path_sep: path_sep).inject('') do |result, (path, value)|
    result + "#{path}#{pair_sep}#{value.inspect}\n"
  end
end

#attributes_update(other) ⇒ Object



73
74
75
76
77
78
# File 'lib/complex_config/settings.rb', line 73

def attributes_update(other)
  unless other.is_a? self.class
    other = self.class.from_hash(other)
  end
  @table.update(other.table)
end

#attributes_update_if_nil(other) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/complex_config/settings.rb', line 80

def attributes_update_if_nil(other)
  unless other.is_a? self.class
    other = self.class.from_hash(other)
  end
  @table.update(other.table) do |key, oldval, newval|
    @table.key?(key) ? oldval : newval
  end
end

#deep_freezeObject



197
198
199
200
201
202
# File 'lib/complex_config/settings.rb', line 197

def deep_freeze
  table_enumerator.each do |_, v|
    v.ask_and_send(:deep_freeze) || (v.freeze rescue v)
  end
  freeze
end

#each(&block) ⇒ Object



228
229
230
# File 'lib/complex_config/settings.rb', line 228

def each(&block)
  table_enumerator.each(&block)
end

#empty?Boolean

Returns:

  • (Boolean)


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

def empty?
  size == 0
end

#freezeObject



192
193
194
195
# File 'lib/complex_config/settings.rb', line 192

def freeze
  @table.freeze
  super
end

#initialize_copy(orig) ⇒ Object



55
56
57
58
59
# File 'lib/complex_config/settings.rb', line 55

def initialize_copy(orig)
  super
  @table = @table.dup
  self
end

#pathes(hash = table, path_sep: ?., prefix: name_prefix.to_s, result: {}) ⇒ Object



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/complex_config/settings.rb', line 154

def pathes(hash = table, path_sep: ?., prefix: name_prefix.to_s, result: {})
  hash.each do |key, value|
    path = prefix.empty? ? key.to_s : "#{prefix}#{path_sep}#{key}"
    case value
    when ::ComplexConfig::Settings
      pathes(
        value,
        path_sep: path_sep,
        prefix:   path,
        result:   result
      )
    when ::Array
      value.each_with_index do |v, i|
        sub_path = path + "[#{i}]"
        if ::ComplexConfig::Settings === v
          pathes(
            v,
            path_sep: path_sep,
            prefix:   sub_path,
            result:   result
          )
        else
          result[sub_path] = v
        end
      end
    else
      result[path] = value
    end
  end
  result
end

#pretty_print(q) ⇒ Object



188
189
190
# File 'lib/complex_config/settings.rb', line 188

def pretty_print(q)
  q.text inspect
end

#replace_attributes(hash) ⇒ Object



89
90
91
92
# File 'lib/complex_config/settings.rb', line 89

def replace_attributes(hash)
  @table = self.class.from_hash(hash).table
  self
end

#sizeObject



134
135
136
# File 'lib/complex_config/settings.rb', line 134

def size
  each.count
end

#to_hObject

def write_config(encrypt: false, store_key: false)

::ComplexConfig::Provider.write_config(
  name_prefix, self, encrypt: encrypt, store_key: store_key
)
self

end



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/complex_config/settings.rb', line 101

def to_h
  table_enumerator.each_with_object({}) do |(k, v), h|
    h[k] =
      if ::Array === v
        v.to_ary.map { |x| (x.ask_and_send(:to_h) rescue x) || x }
      elsif v.respond_to?(:to_h)
        if v.nil?
          nil
        else
          v.ask_and_send(:to_h) rescue v
        end
      else
        v
      end
  end
end

#to_json(*a) ⇒ Object



126
127
128
# File 'lib/complex_config/settings.rb', line 126

def to_json(*a)
  to_h.to_json(*a)
end

#to_sObject Also known as: inspect



149
150
151
152
# File 'lib/complex_config/settings.rb', line 149

def to_s(*)
  empty? and return self.class.name
  to_tree.to_s
end

#to_treeObject



130
131
132
# File 'lib/complex_config/settings.rb', line 130

def to_tree
  ::ComplexConfig::Tree.convert(name_prefix, self)
end

#to_yamlObject



122
123
124
# File 'lib/complex_config/settings.rb', line 122

def to_yaml
  to_h.to_yaml
end