Sha256: df46ffba656bcfe371b8fd1bfbf3e78d3f813c8b535e7eda811c3d1f553572f8

Contents?: true

Size: 1.47 KB

Versions: 3

Compression:

Stored size: 1.47 KB

Contents

require 'synchronisable/dsl/macro'

module Synchronisable
  module DSL
    module Associations
      # Association builder.
      # Subclasses must implement #macro method.
      class Association
        include Synchronisable::DSL::Macro

        attribute :key_suffix, default: -> { raise NotImplementedError }

        class << self
          attr_accessor :valid_options

          def create(synchronizer, name, options)
            new(synchronizer, name).create(options)
          end
        end

        self.valid_options = %i(key class_name required)

        attr_reader :name, :model, :key, :required

        def initialize(synchronizer, name)
          @synchronizer, @name = synchronizer, name.to_sym
        end

        def create(options)
          validate_options(options)

          @key = options[:key]
          @required = options[:required]

          if options[:class_name].present?
            @model = options[:class_name].constantize
          end

          set_defaults

          @synchronizer.associations[@key] = self
        end

        def macro
          raise NotImplementedError
        end

        protected

        def set_defaults
          @required ||= false

          @model ||= @name.to_s.classify.constantize
          @key = "#{@name}_#{self.class.key_suffix}" unless @key.present?
        end

        private

        def validate_options(options)
          options.assert_valid_keys(Association.valid_options)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
synchronisable-1.0.2 lib/synchronisable/dsl/associations/association.rb
synchronisable-1.0.1 lib/synchronisable/dsl/associations/association.rb
synchronisable-1.0.0 lib/synchronisable/dsl/associations/association.rb