lib/spina/plugin.rb
module Spina
class Plugin
attr_accessor :name, :namespace, :settings
def create_setting_class!
class_settings = data_mapped_settings_hash
plugin_name = namespace
klass = Class.new(::Spina::Setting) do
include AttrJson::Record
include Spina::AttrJsonMonkeypatch
class_settings.each do |setting|
attr_json(*setting, container_attribute: "preferences")
attr_json_setter_monkeypatch setting.first
end
default_scope { where(plugin: plugin_name.to_s) }
end
"Spina::#{namespace_class}".constantize.const_set :Setting, klass
end
private
def map_data_type(type)
type = type.is_a?(Hash) ? type.first.first : type
case type
when :wysiwyg then :text
else type
end
end
def namespace_class
namespace.split("_").map { |part| part.camelize }.join
end
def data_mapped_settings_hash
hash = {}
settings.each do |key, value|
hash[key] = map_data_type(value)
end
hash
end
class << self
def all
::Spina::PLUGINS
end
def find_by(opts = {})
all.find do |plugin|
matches = true
opts.each do |key, value|
matches = false unless plugin.send(key) == value
end
plugin if matches
end
end
def register
plugin = new
yield plugin
raise "Missing plugin name" if plugin.name.nil?
raise "Missing plugin namespace" if plugin.namespace.nil?
if plugin.settings.present?
plugin.create_setting_class!
end
all << plugin
plugin
end
end
end
end