Sha256: a6e56d565616167bb486ed51bd39697b413eb3430e6b58aa35394643dbfa9f2f

Contents?: true

Size: 1.79 KB

Versions: 92

Compression:

Stored size: 1.79 KB

Contents

module EasyML
  module Concerns
    module Configurable
      extend ActiveSupport::Concern

      included do
        is_model = ancestors.include?(ActiveRecord::Base)
        self.filter_attributes += [:configuration] if is_model
        class_attribute :configuration_attributes, instance_writer: false, default: []

        after_initialize :read_from_configuration if is_model
        before_save :store_in_configuration if is_model
      end

      class_methods do
        def add_configuration_attributes(*attrs)
          self.configuration_attributes += attrs
          self.configuration_attributes = self.configuration_attributes.uniq

          # Define attr_accessor for each configuration attribute
          attrs.each do |attr|
            attr_accessor attr unless method_defined?(attr)
          end
        end
      end

      private

      def read_from_configuration
        return unless configuration

        self.class.configuration_attributes.each do |attr|
          next unless configuration.key?(attr.to_s)

          instance_variable_set("@#{attr}", configuration[attr.to_s])
        end
      end

      def store_in_configuration
        serialized = self.class.configuration_attributes.each_with_object({}) do |attr, hash|
          value = public_send(attr)
          hash[attr] = serialize_value(value)
        end

        self.configuration = (configuration || {}).merge(serialized)
      end

      def serialize_value(value)
        return value if basic_type?(value)
        return value.to_h if value.respond_to?(:to_h)
        return value.as_json if value.respond_to?(:as_json)

        value.to_s
      end

      def basic_type?(value)
        [String, Symbol, Integer, Float, TrueClass, FalseClass, NilClass, Hash, Array].any? { |type| value.is_a?(type) }
      end
    end
  end
end

Version data entries

92 entries across 92 versions & 1 rubygems

Version Path
easy_ml-0.2.0.pre.rc105 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc104 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc103 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc102 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc101 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc100 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc99 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc98 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc97 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc96 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc95 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc94 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc93 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc92 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc91 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc90 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc89 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc88 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc85 app/models/easy_ml/concerns/configurable.rb
easy_ml-0.2.0.pre.rc84 app/models/easy_ml/concerns/configurable.rb