Sha256: cf3de49bbd6c4e140a9d81f25e1372136d24df7fe3d35e9207eb8866d176b42d

Contents?: true

Size: 1.68 KB

Versions: 22

Compression:

Stored size: 1.68 KB

Contents

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}") }
      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 = Hash.new
      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

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
spina-2.12.0 lib/spina/plugin.rb
spina-2.11.0 lib/spina/plugin.rb
spina-2.10.0 lib/spina/plugin.rb
spina-2.9.1 lib/spina/plugin.rb
spina-2.9.0 lib/spina/plugin.rb
spina-2.8.1 lib/spina/plugin.rb
spina-2.8.0 lib/spina/plugin.rb
spina-2.7.0 lib/spina/plugin.rb
spina-2.6.2 lib/spina/plugin.rb
spina-2.6.1 lib/spina/plugin.rb
spina-2.6.0 lib/spina/plugin.rb
spina-2.5.0 lib/spina/plugin.rb
spina-2.4.0 lib/spina/plugin.rb
spina-2.3.5 lib/spina/plugin.rb
spina-2.3.4 lib/spina/plugin.rb
spina-2.3.3 lib/spina/plugin.rb
spina-2.3.2 lib/spina/plugin.rb
spina-2.3.1 lib/spina/plugin.rb
spina-2.3.0 lib/spina/plugin.rb
spina-2.2.0 lib/spina/plugin.rb