Sha256: e74651802aa0eac605f7adc3c2a0b790a923d21fe0474e1f59897e033dfae880

Contents?: true

Size: 1.79 KB

Versions: 6

Compression:

Stored size: 1.79 KB

Contents

module FakeWeb
  class Registry #:nodoc:
    include Singleton

    attr_accessor :uri_map

    def initialize
      clean_registry
    end

    def clean_registry
      self.uri_map = Hash.new do |hash, key|
        hash[key] = Hash.new(&hash.default_proc)
      end
    end

    def register_uri(method, uri, options)
      uri_map[normalize_uri(uri)][method] = [*[options]].flatten.collect do |option|
        FakeWeb::Responder.new(method, uri, option, option[:times])
      end
    end

    def registered_uri?(method, uri)
      normalized_uri = normalize_uri(uri)
      uri_map[normalized_uri].has_key?(method) || uri_map[normalized_uri].has_key?(:any)
    end

    def registered_uri(method, uri)
      uri = normalize_uri(uri)
      registered = registered_uri?(method, uri)
      if registered && uri_map[uri].has_key?(method)
        uri_map[uri][method]
      elsif registered
        uri_map[uri][:any]
      else
        nil
      end
    end

    def response_for(method, uri, &block)
      responders = registered_uri(method, uri)
      return nil if responders.nil?
      pick_responder(responders).response(&block)
    end

    private

    def normalize_uri(uri)
      case uri
      when URI then uri
      else
        uri = 'http://' + uri unless uri.match('^https?://')
        parsed_uri = URI.parse(uri)
        parsed_uri.query = sort_query_params(parsed_uri.query)
        parsed_uri
      end
    end

    def sort_query_params(query)
      if query.nil? || query.empty?
        nil
      else
        query.split('&').sort.join('&')
      end
    end
    
    def pick_responder(responders)
      if next_responder = responders.find { |responder| responder.times > 0 }
        next_responder.times -= 1
      else
        next_responder = responders.last
      end

      next_responder
    end

  end
end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
aeden-contacts-0.2.15 vendor/fakeweb/lib/fake_web/registry.rb
aeden-contacts-0.2.16 vendor/fakeweb/lib/fake_web/registry.rb
aeden-contacts-0.2.18 vendor/fakeweb/lib/fake_web/registry.rb
aeden-contacts-0.2.19 vendor/fakeweb/lib/fake_web/registry.rb
aeden-contacts-0.2.20 vendor/fakeweb/lib/fake_web/registry.rb
mislav-fakeweb-1.1.2.6 lib/fake_web/registry.rb