Class: FigTree::ConfigStruct

Inherits:
Object
  • Object
show all
Includes:
ActiveSupport::Callbacks
Defined in:
lib/fig_tree.rb

Overview

Class that defines and keeps the configuration values.

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ ConfigStruct

Returns a new instance of ConfigStruct.

Parameters:

  • name (String)


54
55
56
57
58
59
# File 'lib/fig_tree.rb', line 54

def initialize(name)
  @name = name
  @settings = {}
  @setting_objects = {}
  @setting_templates = {}
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

:nodoc:



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# File 'lib/fig_tree.rb', line 184

def method_missing(method, *args, &block)
  config_key = method.to_s.sub(/=$/, '').to_sym

  # Return the list of setting objects with the given name
  if config_key.to_s.end_with?('objects')
    return _setting_object_method(config_key)
  end

  # Define a new setting object with the given name
  if @setting_templates.key?(config_key) && block_given?
    return _new_setting_object_method(config_key, &block)
  end

  setting = @settings[config_key]

  if setting&.removed && !FigTree.keep_removed_configs
    puts "[Config] #{config_key} has been removed: #{setting.removed}"
  end

  if setting&.deprecation
    return _deprecated_config_method(method, *args)
  end

  return super unless setting

  if block_given?
    return _block_config_method(config_key, &block)
  end

  _default_config_method(config_key, *args)
end

Instance Method Details

#clear_removed_fields!Object



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

def clear_removed_fields!
  return if FigTree.keep_removed_configs

  @settings.delete_if.each do |setting|
    if setting.value.is_a?(ConfigStruct)
      setting.value.clear_removed_fields!
      false
    else
      setting.removed
    end
  end
  @setting_objects.values.flatten.each(&:clear_removed_fields!)
end

#clone_and_resetObject

:nodoc:



105
106
107
108
109
110
# File 'lib/fig_tree.rb', line 105

def clone_and_reset
  new_config = self.clone
  new_config.setting_objects = new_config.setting_objects.clone
  new_config.settings = new_config.settings.map { |k, v| [k, v.clone_and_reset] }.to_h
  new_config
end

#default_value?(field) ⇒ Boolean

Parameters:

  • field (String)

Returns:

  • (Boolean)


151
152
153
# File 'lib/fig_tree.rb', line 151

def default_value?(field)
  @settings[field].default_value?
end

#deprecate(old_config, new_config) ⇒ Object

Mark a configuration as deprecated and replaced with the new config.

Parameters:

  • old_config (String)
  • new_config (String)


75
76
77
78
# File 'lib/fig_tree.rb', line 75

def deprecate(old_config, new_config)
  @settings[old_config.to_sym] ||= ConfigValue.new
  @settings[old_config.to_sym].deprecation = new_config
end

#inspectObject

:nodoc:



81
82
83
# File 'lib/fig_tree.rb', line 81

def inspect
  "#{@name}: #{@settings.inspect} #{@setting_objects.inspect}"
end

#non_default_settings!Object

Cuts down the config to only values that don’t match the default values. Used to generate a representation of current config only via the changes.



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/fig_tree.rb', line 157

def non_default_settings!
  @settings.delete_if do |key, setting|
    if setting.value.is_a?(ConfigStruct)
      setting.value.non_default_settings!
      setting.value.settings.empty?
    else
      setting.default_value?
    end
  end
  @setting_objects.each do |_, list|
    list.select! do |setting|
      setting.non_default_settings!
      setting.settings.none?
    end
  end
end

#reset!Object

Reset config back to default values.



67
68
69
70
# File 'lib/fig_tree.rb', line 67

def reset!
  reset_values
  run_callbacks(:configure)
end

#reset_valuesObject



61
62
63
64
# File 'lib/fig_tree.rb', line 61

def reset_values
  @setting_objects = @setting_templates.map { |k, _| [k, []] }.to_h
  @settings.values.each(&:reset_values)
end

#respond_to_missing?(method, include_all = true) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


175
176
177
178
179
180
181
# File 'lib/fig_tree.rb', line 175

def respond_to_missing?(method, include_all=true)
  method = method.to_s.sub(/=$/, '')
  method.ends_with?('objects') ||
    @setting_templates.key?(method.to_sym) ||
    @settings.key?(method.to_sym) ||
    super
end

#setting(name, default_value = nil, default_proc: nil, removed: false, &block) ⇒ Object

Define a setting with the given name.

Parameters:

  • name (Symbol)
  • default_value (Object) (defaults to: nil)
  • default_proc (Proc) (defaults to: nil)


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/fig_tree.rb', line 131

def setting(name, default_value=nil, default_proc: nil, removed: false, &block)
  if block_given?
    # Create a nested setting
    setting_config = @settings[name]&.value || ConfigStruct.new("#{@name}.#{name}")
    setting = ConfigValue.new
    setting.value = setting_config
    @settings[name] = setting
    setting_config.instance_eval(&block)
  else
    setting = ConfigValue.new
    setting.default_proc = default_proc
    setting.default_value = default_value
    setting.reset_values
    setting.removed = removed
    @settings[name] = setting
  end
end

#setting_object(name, &block) ⇒ Object

Define a setting template for an array of objects via a block:

setting_object :producer do
  setting :topic
  setting :class_name
end

This will create the ‘producer` method to define these values as well as the `producer_objects` method to retrieve them.

Parameters:

  • name (Symbol)


120
121
122
123
124
125
# File 'lib/fig_tree.rb', line 120

def setting_object(name, &block)
  new_config = ConfigStruct.new("#{@name}.#{name}")
  @setting_objects[name] ||= []
  @setting_templates[name] ||= new_config
  @setting_templates[name].instance_eval(&block)
end

#to_hHash

Returns:

  • (Hash)


86
87
88
# File 'lib/fig_tree.rb', line 86

def to_h
  @settings.map { |k, v| [k, v.value] }.to_h
end

#trap_config(&block) ⇒ Object



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

def trap_config(&block)
  old_settings = @settings.deep_dup
  old_setting_objects = @setting_objects.deep_dup
  block.call
  @settings = old_settings
  @setting_objects = old_setting_objects
end