module Cistern::Client

Public Class Methods

included(klass) click to toggle source

vanilla include

Calls superclass method
# File lib/cistern/client.rb, line 32
def self.included(klass)
  setup(klass)

  super
end
setup(klass, options = {}) click to toggle source
# File lib/cistern/client.rb, line 38
  def self.setup(klass, options = {})
    request_class    = options[:request] || 'Request'
    collection_class = options[:collection] || 'Collection'
    model_class      = options[:model] || 'Model'
    singular_class   = options[:singular] || 'Singular'

    interface = options[:interface] || :class
    interface_callback = (:class == interface) ? :inherited : :included

    if interface == :class
      Cistern.deprecation(
        %q{'class' interface is deprecated. Use `include Cistern::Client.with(interface: :module). See https://github.com/lanej/cistern#custom-architecture},
        caller[2],
      )
    end

    unless klass.name
      fail ArgumentError, "can't turn anonymous class into a Cistern cistern"
    end

    klass.class_eval <<-EOS, __FILE__, __LINE__
      module Collections
        include ::Cistern::Client::Collections

        def cistern
          Cistern.deprecation(
            '#cistern is deprecated.  Please use #cistern',
            caller[0]
          )
          #{klass.name}
        end

        def cistern
          #{klass.name}
        end
      end

      def self.cistern
        Cistern.deprecation(
          '#cistern is deprecated.  Please use #cistern',
          caller[0]
        )
        #{klass.name}
      end

      def self.cistern
        #{klass.name}
      end

      class Real
        def initialize(options={})
        end

        def mocking?
          false
        end
      end

      class Mock
        def initialize(options={})
        end

        def mocking?
          true
        end
      end

      #{interface} #{model_class}
        def self.#{interface_callback}(klass)
          cistern.models << klass

          klass.send(:include, ::Cistern::Model)

          super
        end

        def self.cistern
          Cistern.deprecation(
            '#cistern is deprecated.  Please use #cistern',
            caller[0]
          )
          #{klass.name}
        end

        def self.cistern
          #{klass.name}
        end
      end

      #{interface} #{singular_class}
        def self.#{interface_callback}(klass)
          cistern.singularities << klass

          klass.send(:include, ::Cistern::Singular)

          super
        end

        def self.service
          Cistern.deprecation(
            '#service is deprecated.  Please use #cistern',
            caller[0]
          )
          #{klass.name}
        end

        def self.cistern
          #{klass.name}
        end
      end

      #{interface} #{collection_class}
        include ::Cistern::Collection

        def self.#{interface_callback}(klass)
          klass.send(:extend, Cistern::Attributes::ClassMethods)
          klass.send(:extend, Cistern::Collection::ClassMethods)
          klass.send(:include, Cistern::Attributes::InstanceMethods)

          cistern.collections << klass

          super
        end

        def self.service
          Cistern.deprecation(
            '#service is deprecated.  Please use #cistern',
            caller[0]
          )
          #{klass.name}
        end

        def self.cistern
          #{klass.name}
        end
      end

      #{interface} #{request_class}
        include ::Cistern::Request

        def self.service
          Cistern.deprecation(
            '#service is deprecated.  Please use #cistern',
            caller[0]
          )
          #{klass.name}
        end

        def self.cistern
          #{klass.name}
        end

        def self.#{interface_callback}(klass)
          klass.extend(::Cistern::Request::ClassMethods)

          cistern.requests << klass

          super
        end
      end
    EOS

    klass.send(:extend, Cistern::Client::ClassMethods)
    klass.send(:const_set, :Timeout, Class.new(Cistern::Error))

    klass::Mock.send(:include, klass::Collections)
    klass::Mock.send(:extend, Cistern::WaitFor)
    klass::Mock.timeout_error = klass::Timeout

    klass::Mock.send(:extend, Cistern::Data)

    klass::Real.send(:include, klass::Collections)
    klass::Real.send(:extend, Cistern::WaitFor)
    klass::Real.timeout_error = klass::Timeout
  end
with(options = {}) click to toggle source

custom include

# File lib/cistern/client.rb, line 15
  def self.with(options = {})
    client_module = Module.new

    custom_include = <<-EOS
      def self.included(klass)
        Cistern::Client.setup(klass, #{options.inspect})

        super
      end
    EOS

    client_module.class_eval(custom_include, __FILE__, __LINE__)

    client_module
  end