Contains the methods that handle wrapper code generation.

Methods
G
Constants
ARRAY_CLASSNAME = 'SOAP::SOAPArray'
Class Public methods
generate_wrapper_class(version, service)

Generate the wrapper class for a given service. These classes make it easier to invoke the API methods, by removing the need to instance a object, instead allowing passing of the call parameters directly. Here is an example of a generated wrapper class, with one API method and one extension:

 class SampleServiceWrapper

   attr_reader :api

   def initialize(driver, api)
     @driver = driver
     @api = api
   end

   def getSomething(par1, par2)
     begin
       AdWords::Service.validate_param('par1', par1, SOAP::SOAPArray)
       AdWords::Service.validate_param('par2', par2, SOAP::SOAPInt)
       # Construct request object and make API call
       obj = AdWords::V13::GetSomething.new(par1, par2)
       return @driver.getSomething(obj)
     rescue SOAP::FaultError => fault
       raise(AdWords::Error::create_specific_api_error(fault),
           "getSomething Call Failed: " + fault.faultstring.to_s, caller)
     end
   end

   def doSomethingElseExtension(par1, par2)
     return AdWords::Extensions.doSomethingElseExtension(self, par1, par2)
   end
 end

Args:

  • version: the API version (as an integer)

  • service: the service name (as a string)

Returns: The Ruby code for the class, as a string.

     # File lib/adwords4r/generator.rb, line 71
 71:     def self.generate_wrapper_class(version, service)
 72:       wrapper = service + "ServiceWrapper"
 73:       module_name = AdWords::Service.get_module_name(version, service)
 74:       driver = AdWords::Service.get_interface_name(version, service)
 75:       driver_class = eval(driver)
 76: 
 77:       registry = eval("#{module_name}::DefaultMappingRegistry::LiteralRegistry")
 78: 
 79:       class_def = # This file was automatically generated during the "rake generate" step of# library setup.require 'adwords4r/v#{version}/#{service}ServiceDriver.rb'module AdWords  module V#{version}    module #{service}Service      # Wrapper class for the v#{version.to_s} #{service} service.      # This class is automatically generated.      class #{wrapper}        # Holds the AdWords::API object to which the wrapper belongs.        attr_reader :api        # Holds a shortcut to the parent module.        # Use this to avoid typing the full class name when creating classes        # belonging to this service, e.g.        #  service_object.module::ClassName        # instead of        #  AdWords::V#{version.to_s}::#{service}Service::ClassName        # This will make it easier to migrate your code between API versions.        attr_reader :module        public        # Constructor for #{wrapper}.        #        # Args:        # - driver: SOAP::RPC::Driver object with the remote SOAP methods for        #   this service        # - api: the AdWords::API object to which the wrapper belongs        #        def initialize(driver, api)          @driver = driver          @api = api          @module = AdWords::V#{version.to_s}::#{service}Service        end
 80: 
 81:       # Add service methods
 82:       methods = driver_class::Methods
 83:       module_name = AdWords::Service.get_module_name(version, service)
 84:       methods.each do |method|
 85:         name = method[1]
 86:         doc_link = get_doc_link(version, service, name)
 87:         method_def =         # Calls the {#{name}}[#{doc_link}] method of the #{service} service.        # Check {the online documentation for this method}[#{doc_link}].
 88: 
 89:         method_class = eval("#{module_name}::#{fix_case_up(name)}")
 90:         arguments = registry.schema_definition_from_class(method_class).elements
 91: 
 92:         if arguments.size > 0
 93:           method_def +=         #        # Args:
 94:         end
 95: 
 96:         # Add list of arguments to the RDoc comment
 97:         arguments.each_with_index do |elem, index|
 98:           if get_type(elem) == ARRAY_CLASSNAME
 99:             method_def +=         # - #{elem.varname}: #{get_type(elem)} of #{elem.mapped_class}
100:           else
101:             method_def +=         # - #{elem.varname}: #{get_type(elem)}
102:           end
103:         end
104: 
105:         response_class = eval("#{module_name}::#{fix_case_up(name)}Response")
106:         returns = registry.schema_definition_from_class(response_class).elements
107: 
108:         if returns.size > 0
109:           method_def +=         #        # Returns:
110:         end
111: 
112:         # Add list of returns to the RDoc comment
113:         returns.each_with_index do |elem, index|
114:           if get_type(elem) == ARRAY_CLASSNAME
115:             method_def +=         # - #{elem.varname}: #{get_type(elem)} of #{elem.mapped_class}
116:           else
117:             method_def +=         # - #{elem.varname}: #{get_type(elem)}
118:           end
119:         end
120: 
121:         arg_names = []
122:         arguments.each do |elem|
123:           arg_names << elem.varname
124:         end
125:         arg_list = arg_names.join(', ')
126: 
127:         method_def +=         #        # Raises:        # Error::ApiError (or a subclass thereof) if a SOAP fault occurs.        #        def #{name}(#{arg_list})          begin
128: 
129:         # Add validation for every argument
130:         arguments.each_with_index do |elem, index|
131:           method_def +=             AdWords::Service.validate_param('#{elem.varname}',                #{arg_names[index]}, #{get_type(elem)})
132:         end
133: 
134:         method_def +=             # Construct request object and make API call            obj = #{module_name}::#{fix_case_up(name)}.new(#{arg_list})            return @driver.#{name}(obj)          rescue SOAP::FaultError => fault            raise(AdWords::Error::create_specific_api_error(fault),                "#{name} Call Failed: " + fault.faultstring.to_s, caller)          end        end
135:         class_def += method_def
136:       end
137: 
138:       # Add extension methods, if any
139:       extensions = AdWords::Extensions::extensions[[version, service]]
140:       unless extensions.nil?
141:         extensions.each do |ext|
142:           params = AdWords::Extensions::methods[ext].join(', ')
143:           arglist = 'self'
144:           arglist += ", #{params}" if params != ''
145:           method_def =         # <i>Extension method</i> -- Calls the AdWords::Extensions.#{ext} method        # with +self+ as the first parameter.        def #{ext}(#{params})          return AdWords::Extensions.#{ext}(#{arglist})        end
146:           class_def += method_def
147:         end
148:       end
149: 
150:       class_def +=       end    end  endend
151:       return class_def
152:     end