0
0
Fork 0

Change user settings to be stored in a more optimal way (#23630)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
Eugen Rochko 2023-03-30 14:44:00 +02:00 committed by GitHub
parent e7c3e55874
commit a9b5598c97
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 817 additions and 525 deletions

View file

@ -0,0 +1,37 @@
# frozen_string_literal: true
module UserSettings::DSL
module ClassMethods
def setting(key, options = {})
@definitions ||= {}
UserSettings::Setting.new(key, options).tap do |s|
@definitions[s.key] = s
end
end
def namespace(key, &block)
@definitions ||= {}
UserSettings::Namespace.new(key).configure(&block).tap do |n|
@definitions.merge!(n.definitions)
end
end
def keys
@definitions.keys
end
def definition_for(key)
@definitions[key.to_sym]
end
def definition_for?(key)
@definitions.key?(key.to_sym)
end
end
def self.included(base)
base.extend ClassMethods
end
end

View file

@ -0,0 +1,23 @@
# frozen_string_literal: true
module UserSettings::Glue
def to_model
self
end
def to_key
''
end
def persisted?
false
end
def type_for_attribute(key)
self.class.definition_for(key)&.type
end
def has_attribute?(key) # rubocop:disable Naming/PredicateName
self.class.definition_for?(key)
end
end

View file

@ -0,0 +1,21 @@
# frozen_string_literal: true
class UserSettings::Namespace
attr_reader :name, :definitions
def initialize(name)
@name = name.to_sym
@definitions = {}
end
def configure(&block)
instance_eval(&block)
self
end
def setting(key, options = {})
UserSettings::Setting.new(key, options.merge(namespace: name)).tap do |s|
@definitions[s.key] = s
end
end
end

View file

@ -0,0 +1,48 @@
# frozen_string_literal: true
class UserSettings::Setting
attr_reader :name, :namespace, :in
def initialize(name, options = {})
@name = name.to_sym
@default_value = options[:default]
@namespace = options[:namespace]
@in = options[:in]
end
def default_value
if @default_value.respond_to?(:call)
@default_value.call
else
@default_value
end
end
def type
if @default_value.is_a?(TrueClass) || @default_value.is_a?(FalseClass)
ActiveModel::Type::Boolean.new
else
ActiveModel::Type::String.new
end
end
def type_cast(value)
if type.respond_to?(:cast)
type.cast(value)
else
value
end
end
def to_a
[key, default_value]
end
def key
if namespace
"#{namespace}.#{name}".to_sym
else
name
end
end
end