lib/rails-settings/base.rb in rails-settings-cached-2.8.3 vs lib/rails-settings/base.rb in rails-settings-cached-2.9.0

- old
+ new

@@ -6,11 +6,10 @@ super("Can't use #{key} as setting key.") end end class Base < ActiveRecord::Base - SEPARATOR_REGEXP = /[\n,;]+/ PROTECTED_KEYS = %w[var value] self.table_name = table_name_prefix + "settings" # get the value field, YAML decoded def value @@ -53,11 +52,11 @@ yield block @scope = nil end def get_field(key) - @defined_fields.find { |field| field[:key] == key.to_s } || {} + @defined_fields.find { |field| field.key == key.to_s }.to_h || {} end def cache_prefix(&block) @cache_prefix = block end @@ -67,19 +66,19 @@ key_parts << @cache_prefix.call if @cache_prefix key_parts.join("/") end def keys - @defined_fields.map { |field| field[:key] } + @defined_fields.map(&:key) end def editable_keys - @defined_fields.reject { |field| field[:readonly] }.map { |field| field[:key] } + @defined_fields.reject(&:readonly).map(&:key) end def readonly_keys - @defined_fields.select { |field| field[:readonly] }.map { |field| field[:key] } + @defined_fields.select(&:readonly).map(&:key) end attr_reader :defined_fields private @@ -87,60 +86,27 @@ def _define_field(key, default: nil, type: :string, readonly: false, separator: nil, validates: nil, **opts) key = key.to_s raise ProtectedKeyError.new(key) if PROTECTED_KEYS.include?(key) + field = ::RailsSettings::Fields::Base.generate( + scope: @scope, key: key, default: default, + type: type, readonly: readonly, options: opts, + separator: separator, parent: self + ) @defined_fields ||= [] - @defined_fields << { - scope: @scope, - key: key, - default: default, - type: type || :string, - readonly: readonly.nil? ? false : readonly, - options: opts - } + @defined_fields << field - if readonly - define_singleton_method(key) do - result = default.is_a?(Proc) ? default.call : default - send(:_convert_string_to_typeof_value, type, result, separator: separator) - end - else - define_singleton_method(key) do - val = send(:_value_of, key) - result = nil - if !val.nil? - result = val - else - result = default - result = default.call if default.is_a?(Proc) - end + define_singleton_method(key) { field.read } - result = send(:_convert_string_to_typeof_value, type, result, separator: separator) + unless readonly + define_singleton_method("#{key}=") { |value| field.save!(value: value) } - result - end - - define_singleton_method("#{key}=") do |value| - var_name = key - - record = find_by(var: var_name) || new(var: var_name) - value = send(:_convert_string_to_typeof_value, type, value, separator: separator) - - record.value = value - record.save! - - value - end - if validates validates[:if] = proc { |item| item.var.to_s == key } send(:validates, key, **validates) - - define_method(:read_attribute_for_validation) do |_key| - self.value - end + define_method(:read_attribute_for_validation) { |_key| self.value } end end if type == :boolean define_singleton_method("#{key}?") do @@ -152,52 +118,9 @@ # setting = Setting.new # setting.admin_emails define_method(key) do self.class.public_send(key) end - end - - def _convert_string_to_typeof_value(type, value, separator: nil) - return value unless [String, Integer, Float, BigDecimal].include?(value.class) - - case type - when :boolean - ["true", "1", 1, true].include?(value) - when :array - value.split(separator || SEPARATOR_REGEXP).reject { |str| str.empty? }.map(&:strip) - when :hash - value = begin - YAML.safe_load(value).to_h - rescue - {} - end - value.deep_stringify_keys! - ActiveSupport::HashWithIndifferentAccess.new(value) - when :integer - value.to_i - when :float - value.to_f - when :big_decimal - value.to_d - else - value - end - end - - def _value_of(var_name) - unless _table_exists? - # Fallback to default value if table was not ready (before migrate) - puts "WARNING: table: \"#{table_name}\" does not exist or not database connection, `#{name}.#{var_name}` fallback to returns the default value." - return nil - end - - _all_settings[var_name] - end - - def _table_exists? - table_exists? - rescue - false end def rails_initialized? Rails.application&.initialized? end