Sha256: 7e2d5b2013d87a1d3db55dc3c657e8d1aca475457b0c180863e447d76b0d1f58

Contents?: true

Size: 1.72 KB

Versions: 2

Compression:

Stored size: 1.72 KB

Contents

require 'dry/core/class_attributes'

module ROM
  class Schema
    # @api private
    class Inferrer
      extend Dry::Core::ClassAttributes
      extend Initializer

      defines :attributes_inferrer, :attr_class

      MissingAttributesError = Class.new(StandardError) do
        def initialize(name, attributes)
          super("missing attributes in #{name.inspect} schema: #{attributes.map(&:inspect).join(', ')}")
        end
      end

      DEFAULT_ATTRIBUTES = [EMPTY_ARRAY, EMPTY_ARRAY].freeze

      attributes_inferrer -> * { DEFAULT_ATTRIBUTES }

      attr_class Attribute

      include Dry::Equalizer(:options)

      option :attr_class, default: -> { self.class.attr_class }

      option :enabled, default: -> { true }

      alias_method :enabled?, :enabled

      option :attributes_inferrer, default: -> { self.class.attributes_inferrer }

      # @api private
      def call(schema, gateway)
        if enabled?
          inferred, missing = attributes_inferrer.(schema, gateway, options)
        else
          inferred, missing = DEFAULT_ATTRIBUTES
        end

        attributes = merge_attributes(schema.attributes, inferred)

        check_all_attributes_defined(schema, attributes, missing)

        { attributes: attributes }
      end

      # @api private
      def check_all_attributes_defined(schema, all_known, not_inferred)
        not_defined = not_inferred - all_known.map(&:name)

        if not_defined.size > 0
          raise MissingAttributesError.new(schema.name, not_defined)
        end
      end

      # @api private
      def merge_attributes(defined, inferred)
        defined_names = defined.map(&:name)

        defined + inferred.reject { |attr| defined_names.include?(attr.name) }
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-core-4.0.0.beta2 lib/rom/schema/inferrer.rb
rom-core-4.0.0.beta1 lib/rom/schema/inferrer.rb