Class: Amazon::WebServices::Util::ConvenienceWrapper

Inherits:
Object
  • Object
show all
Includes:
Util::Logging
Defined in:
lib/amazon/webservices/util/convenience_wrapper.rb

Direct Known Subclasses

MechanicalTurkRequester

Constant Summary collapse

REQUIRED_PARAMETERS =
[:ServiceClass]

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util::Logging

#log, #set_log

Constructor Details

#initialize(args) ⇒ ConvenienceWrapper

Returns a new instance of ConvenienceWrapper.



15
16
17
18
19
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 15

def initialize(args)
  missing_parameters = REQUIRED_PARAMETERS - args.keys
  raise "Missing paramters: #{missing_parameters.join(',')}" unless missing_parameters.empty?
  @service = args[:ServiceClass].new( args )
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 25

def method_missing( method, *args )
  if @service.respond_to? method
    callService( method, *args )
  else
    callService( ConvenienceWrapper.real_method( method ), *args )
  end
end

Class Method Details

.paginate(method, elementTag, pageSize = 25) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 54

def self.paginate( method, elementTag, pageSize=25 )
  method = method.to_s
  all_name = ( method[0..0].downcase + method[1..-1] + "All" ).to_sym
  iterator_name = ( method[0..0].downcase + method[1..-1] + "Iterator" ).to_sym
  proactive_name = ( method[0..0].downcase + method[1..-1] + "AllProactive" ).to_sym
  method = ( method[0..0].downcase + method[1..-1] ).to_sym

  raise 'Stop redifining service methods!' if self.instance_methods.include? name.to_s

  processors = { all_name => Amazon::Util::LazyResults,
                 iterator_name => Amazon::Util::PaginatedIterator,
                 proactive_name => Amazon::Util::ProactiveResults }

  processors.each do |name,processor|
    define_method( name ) do |*params|
      userArgs = params[0] || {}
      args = {:PageSize => pageSize}.merge( userArgs ) # allow user to override page size
      return processor.new do |pageNumber|
        pageArgs = args.merge({:PageNumber => pageNumber}) # don't allow override of page number
        res = self.send( method, pageArgs)[elementTag]
        res.nil? ? nil : [res].flatten
      end
    end
  end

end

.real_method(method) ⇒ Object



81
82
83
84
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 81

def self.real_method( method )
  method = method.to_s
  method = ( method[0..0].upcase + method[1..-1] ).to_sym
end

.serviceCall(method, responseTag, defaultArgs = {}) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 33

def self.serviceCall( method, responseTag, defaultArgs={} )
  method = method.to_s
  name = ( method[0..0].downcase + method[1..-1] ).to_sym
  rawName = ( name.to_s + "Raw" ).to_sym
  method = real_method( method )

  raise 'Stop redifining service methods!' if self.instance_methods.include? name.to_s

  define_method( rawName ) do |args|
    log "Sending service request '#{name}' with args: #{args.inspect}"
    result = callService( method, args )
    return result[responseTag]
  end

  define_method( name ) do |*params|
    userArgs = params[0] || {}
    args = defaultArgs.merge( userArgs )
    self.send rawName, args
  end
end

Instance Method Details

#callService(method, *args) ⇒ Object



21
22
23
# File 'lib/amazon/webservices/util/convenience_wrapper.rb', line 21

def callService( method, *args )
  @service.send( method, *args )
end