Class: FigTree::ConfigStruct
- Inherits:
-
Object
- Object
- FigTree::ConfigStruct
- Includes:
- ActiveSupport::Callbacks
- Defined in:
- lib/fig_tree.rb
Overview
Class that defines and keeps the configuration values.
Instance Method Summary collapse
- #clear_removed_fields! ⇒ Object
-
#clone_and_reset ⇒ Object
:nodoc:.
- #default_value?(field) ⇒ Boolean
-
#deprecate(old_config, new_config) ⇒ Object
Mark a configuration as deprecated and replaced with the new config.
-
#initialize(name) ⇒ ConfigStruct
constructor
A new instance of ConfigStruct.
-
#inspect ⇒ Object
:nodoc:.
-
#method_missing(method, *args, &block) ⇒ Object
:nodoc:.
-
#non_default_settings! ⇒ Object
Cuts down the config to only values that don’t match the default values.
-
#reset! ⇒ Object
Reset config back to default values.
- #reset_values ⇒ Object
-
#respond_to_missing?(method, include_all = true) ⇒ Boolean
:nodoc:.
-
#setting(name, default_value = nil, default_proc: nil, removed: false, &block) ⇒ Object
Define a setting with the given name.
-
#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.
- #to_h ⇒ Hash
- #trap_config(&block) ⇒ Object
Constructor Details
#initialize(name) ⇒ ConfigStruct
Returns a new instance of ConfigStruct.
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_reset ⇒ Object
: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
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.
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 |
#inspect ⇒ Object
: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_values ⇒ Object
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:
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.
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.
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_h ⇒ 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 |