class WebMock::RequestStub

def self.from_request_signature(signature)

def self.from_request_signature(signature)
  stub = self.new(signature.method.to_sym, signature.uri.to_s)
  if signature.body.to_s != ''
    body = if signature.url_encoded?
      WebMock::Util::QueryMapper.query_to_values(signature.body, notation: Config.instance.query_values_notation)
    else
      signature.body
    end
    stub.with(body: body)
  end
  if (signature.headers && !signature.headers.empty?)
    stub.with(headers: signature.headers)
  end
  stub
end

def has_responses?

def has_responses?
  !@responses_sequences.empty?
end

def initialize(method, uri)

def initialize(method, uri)
  @request_pattern = RequestPattern.new(method, uri)
  @responses_sequences = []
  self
end

def matches?(request_signature)

def matches?(request_signature)
  self.request_pattern.matches?(request_signature)
end

def response

def response
  if @responses_sequences.empty?
    WebMock::Response.new
  elsif @responses_sequences.length > 1
    @responses_sequences.shift if @responses_sequences.first.end?
    @responses_sequences.first.next_response
  else
    @responses_sequences[0].next_response
  end
end

def then

def then
  self
end

def times(number)

def times(number)
  raise "times(N) accepts integers >= 1 only" if !number.is_a?(Integer) || number < 1
  if @responses_sequences.empty?
    raise "Invalid WebMock stub declaration." +
      " times(N) can be declared only after response declaration."
  end
  @responses_sequences.last.times_to_repeat += number-1
  self
end

def to_rack(app, options={})

def to_rack(app, options={})
  @responses_sequences << ResponsesSequence.new([RackResponse.new(app)])
end

def to_raise(*exceptions)

def to_raise(*exceptions)
  @responses_sequences << ResponsesSequence.new([*exceptions].flatten.map {|e|
    ResponseFactory.response_for(exception: e)
  })
  self
end

def to_return(*response_hashes, &block)

def to_return(*response_hashes, &block)
  if block
    @responses_sequences << ResponsesSequence.new([ResponseFactory.response_for(block)])
  else
    @responses_sequences << ResponsesSequence.new([*response_hashes].flatten.map {|r| ResponseFactory.response_for(r)})
  end
  self
end

def to_return_json(*response_hashes)

def to_return_json(*response_hashes)
  raise ArgumentError, '#to_return_json does not support passing a block' if block_given?
  json_response_hashes = [*response_hashes].flatten.map do |resp_h|
    headers, body = resp_h.values_at(:headers, :body)
    json_body = if body.respond_to?(:call)
      ->(request_signature) {
        b = if body.respond_to?(:arity) && body.arity == 1
          body.call(request_signature)
        else
          body.call
        end
        b = b.to_json unless b.is_a?(String)
        b
      }
    elsif !body.is_a?(String)
      body.to_json
    else
      body
    end
    resp_h.merge(
      headers: {content_type: 'application/json'}.merge(headers.to_h),
      body: json_body
    )
  end
  to_return(json_response_hashes)
end

def to_s

def to_s
  self.request_pattern.to_s
end

def to_timeout

def to_timeout
  @responses_sequences << ResponsesSequence.new([ResponseFactory.response_for(should_timeout: true)])
  self
end

def with(params = {}, &block)

def with(params = {}, &block)
  @request_pattern.with(params, &block)
  self
end