joekhoobyar/cardiac

View on GitHub
lib/cardiac/resource/subresource.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Cardiac
  
  # If a subresource has any path or query values, it will treat the base resource's path
  # as being a *directory*.  
  class Subresource < Resource
    
    def initialize(base)
      @_base_resource = base
      super base.base_value
      self.method_value = base.method_value
    end
     
    # Overridden to enforce the appending of subresource paths.
    def base_value
      base_path = @_base_resource.build_path
      base_path+='/' if @path_values.any? && base_path[-1]!='/'
      super.merge URI::Generic.build(path: base_path)
    end
  
    # Lazily builds the parent module, then redefines this method as an attr_reader.
    def __parent_module__
      build_parent_module
    ensure
      singleton_class.class_eval "attr_reader :__parent_module__"
    end
      
  protected
  
    def build_scheme
      @https_value.nil? ? @_base_resource.build_scheme : super
    end
    
    def build_host
      @host_value.nil? ? @_base_resource.build_host : super
    end
    
    def build_port(scheme=nil)
      @port_value.nil? ? @_base_resource.build_port(scheme) : super
    end
    
    def build_query_values
      @_base_resource.build_query_values + @query_values.select(&:present?)
    end
  
    def build_options(base_options=nil)
      super @_base_resource.send(:build_options, base_options||{})
    end
    
    def build_headers(base_headers=nil)
      super @_base_resource.send(:build_headers, base_headers||{})
    end
    
    def build_config(base_config=nil)
      super @_base_resource.send(:build_config, base_config||{})
    end
    
    def build_parent_module
      @__parent_module__ ||= Module.new.tap{|x| @_base_resource.build_extensions_for_module x }
    end
    
        def build_encoder(*previous)
            result = @_base_resource.send :build_encoder, *previous
            result[0] = encoder_search_value || result[0]
            result
        end
    
  private
  
    # Overridden to omit any subresources.    
    def apply_extensions_to_module! mod=Module.new
      mod.send :include, __parent_module__
      super mod
    end
      
  end
end