lib/and-son/client.rb in and-son-0.1.1 vs lib/and-son/client.rb in and-son-0.2.1
- old
+ new
@@ -1,9 +1,10 @@
require 'ostruct'
require 'sanford-protocol'
require 'and-son/connection'
require 'and-son/response'
+require 'and-son/stored_responses'
module AndSon
module CallRunnerMethods
@@ -29,49 +30,64 @@
hash.inject({}){|h, (k, v)| h.merge({ k.to_s => v }) }
end
end
- class Client < Struct.new(:host, :port, :version)
+ class Client
include CallRunnerMethods
DEFAULT_TIMEOUT = 60 #seconds
+ attr_reader :host, :port, :version, :responses
+
+ def initialize(host, port, version)
+ @host, @port, @version = host, port, version
+ @responses = AndSon::StoredResponses.new
+ end
+
# proxy the call method to the call runner
def call(*args, &block); self.call_runner.call(*args, &block); end
def call_runner
# always start with this default CallRunner
CallRunner.new({
- :host => host,
- :port => port,
- :version => version,
+ :host => host,
+ :port => port,
+ :version => version,
:timeout_value => (ENV['ANDSON_TIMEOUT'] || DEFAULT_TIMEOUT).to_f,
- :params_value => {}
+ :params_value => {},
+ :responses => @responses,
})
end
end
- class CallRunner < OpenStruct # {:host, :port, :version, :timeout_value, :params_value}
+ class CallRunner < OpenStruct
+ # {:host, :port, :version, :timeout_value, :params_value, :responses}
include CallRunnerMethods
# chain runner methods by returning itself
def call_runner; self; end
- def call(name, params = {})
+ def call(name, params = nil)
+ params ||= {}
if !params.kind_of?(Hash)
- raise ArgumentError, "expected params to be a Hash instead of a #{hash.class}"
+ raise ArgumentError, "expected params to be a Hash instead of a #{params.class}"
end
+ client_response = self.responses.find(name, params) if ENV['ANDSON_TEST_MODE']
+ client_response ||= self.call!(name, params)
+
+ if block_given?
+ yield client_response.protocol_response
+ else
+ client_response.data
+ end
+ end
+
+ def call!(name, params)
call_params = self.params_value.merge(params)
AndSon::Connection.new(host, port).open do |connection|
connection.write(Sanford::Protocol::Request.new(version, name, call_params).to_hash)
- client_response = AndSon::Response.parse(connection.read(timeout_value))
-
- if block_given?
- yield client_response.protocol_response
- else
- client_response.data
- end
+ AndSon::Response.parse(connection.read(timeout_value))
end
end
end