require 'net/http' require 'uri' module Frank module Cucumber class Gateway DEFAULT_BASE_URL = "http://localhost:37265/" def initialize( base_url = nil ) @base_url = URI.parse( (base_url || DEFAULT_BASE_URL).to_s ) end def ping send_get('') return true rescue FrankNetworkError return false end class << self def build_operation_map( method_sig, method_args ) num_args_according_to_method_sig = method_sig.count(':') if num_args_according_to_method_sig != method_args.count raise <<-EOS The method you've specified - #{method_sig} - wants #{num_args_according_to_method_sig} arguments, but you've supplied #{method_args.count} arguments. EOS end if num_args_according_to_method_sig > 0 && !method_sig.end_with?(':') raise <<-EOS The method signature you've specified - #{method_sig} - is invalid. Objective C method signatures which take parameters must end with a : EOS end { :method_name => method_sig, :arguments => method_args, } end def evaluate_frankly_response( json, req_desc ) res = JSON.parse( json ) if res['outcome'] != 'SUCCESS' raise "#{req_desc} failed because: #{res['reason']}\n#{res['details']}" end res['results'] end end #taken from Ian Dee's Encumber def send_post( verb, command_hash ) url = frank_url_for( verb ) req = Net::HTTP::Post.new url.path req.body = command_hash.to_json make_http_request( url, req ) end def send_get( verb ) url = frank_url_for( verb ) req = Net::HTTP::Get.new url.path make_http_request( url, req ) end private def frank_url_for( verb ) url = @base_url.clone url.path = '/'+verb url end def make_http_request( url, req ) http = Net::HTTP.new(url.host, url.port) begin res = http.start do |sess| sess.request req end res.body rescue Errno::ECONNREFUSED raise FrankNetworkError rescue EOFError raise FrankNetworkError end end end class FrankNetworkError < RuntimeError OVERLY_VERBOSE_YET_HELPFUL_ERROR_MESSAGE = <