Sha256: f9e2a942faed67ce8293145ab2bfd1a19a759ad842f36811ca33b919e32e00f6

Contents?: true

Size: 1.7 KB

Versions: 12

Compression:

Stored size: 1.7 KB

Contents

module JSONAPIonify::Api
  class ContextDelegate
    class Mock
      def initialize(**attrs)
        attrs.each do |attr, value|
          define_singleton_method(attr) { value }
        end
      end

      def method_missing(*)
        self
      end
    end

    attr_reader :request

    def initialize(request, resource_instance, definitions, **overrides)
      @memo              = {}
      @request           = request
      @persisted_memo    = {}
      @definitions       = definitions
      @overrides         = overrides
      @resource_instance = resource_instance
      delegate           = self

      %i{initialize_dup initialize_clone}.each do |method|
        define_singleton_method method do |copy|
          @memo.each do |k, v|
            copy.public_send "#{k}=", v
          end
        end
      end

      definitions.each do |name, context|
        raise Errors::ReservedContextName if respond_to? name
        define_singleton_method name do
          return @overrides[name] if @overrides.has_key? name
          return @persisted_memo[name] if @persisted_memo.has_key? name
          return @memo[name] if @memo.has_key? name
          write_memo = (context.persisted? ? @persisted_memo : @memo)
          write_memo[name] = context.call(@resource_instance, delegate)
        end

        define_singleton_method "#{name}=" do |value|
          @persisted_memo[name] = value
        end unless context.readonly?
      end
      freeze
    end

    def reset key
      @memo.delete(key)
    end

    def clear
      @memo.clear
    end

    def inspect
      to_s.chomp('>') << " memoed: #{@memo.keys.inspect}, persisted: #{@persisted_memo.keys.inspect}, overridden: #{@overrides.keys}" << '>'
    end

  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
jsonapionify-0.11.11 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.10 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.9 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.8 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.7 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.6 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.5 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.11.0 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.10.2 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.10.1 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.10.0 lib/jsonapionify/api/context_delegate.rb
jsonapionify-0.9.3 lib/jsonapionify/api/context_delegate.rb