(self, api, name, def_dict, parent=None)
Construct a method.

    Methods in REST discovery are inside of a resource. Note that the method
    name and id are calculable from each other. id will always be equal to
    api_name.resource_name[.sub_resource...].method_name.  At least it should
    be, as that is the transformation Discovery makes from the API definition,
    which is essentially a flat list of methods, into a hierarchy of resources.

    Args:
      api: (Api) The Api which owns this Method.
      name: (string) The discovery name of the Method.
      def_dict: (dict) The discovery dictionary for this Method.
      parent: (CodeObject) The resource containing this Method, if any.

    Raises:
      ApiException: If the httpMethod type is not one we know how to
          handle.
Construct a method.
Construct a method .
def __init__(self, api, name, def_dict, parent=None):
    """Construct a method.

    Methods in REST discovery are inside of a resource. Note that the method
    name and id are calculable from each other. id will always be equal to
    api_name.resource_name[.sub_resource...].method_name.  At least it should
    be, as that is the transformation Discovery makes from the API definition,
    which is essentially a flat list of methods, into a hierarchy of resources.

    Args:
      api: (Api) The Api which owns this Method.
      name: (string) The discovery name of the Method.
      def_dict: (dict) The discovery dictionary for this Method.
      parent: (CodeObject) The resource containing this Method, if any.

    Raises:
      ApiException: If the httpMethod type is not one we know how to
          handle.
    """
    super(Method, self).__init__(def_dict, api, parent=(parent or api))
    # TODO(user): Fix java templates to name vs. wireName correctly. Then
    # change the __init__ to have wire_name=def_dict.get('id') or name
    # then eliminate this line.
    self.SetTemplateValue('wireName', name)
    self.ValidateName(name)
    class_name = api.ToClassName(name, self, element_type='method')
    if parent and class_name == parent.values['className']:
      # Some languages complain when the collection name is the same as the
      # method name.
      class_name = '%sRequest' % class_name
    # The name is the key of the dict defining use. The id field is what you
    # have to use to call the method via RPC. That is unique, name might not be.
    self.SetTemplateValue('name', name)
    # Fix up very old discovery, which does not have an id.
    if 'id' not in self.values:
      self.values['id'] = name
    self.SetTemplateValue('className', class_name)
    http_method = def_dict.get('httpMethod', 'POST').upper()
    self.SetTemplateValue('httpMethod', http_method)
    self.SetTemplateValue('rpcMethod',
                          def_dict.get('rpcMethod') or def_dict['id'])
    rest_path = def_dict.get('path') or def_dict.get('restPath')
    # TODO(user): if rest_path is not set, raise a good error and fail fast.
    self.SetTemplateValue('restPath', rest_path)

    # Figure out the input and output types and schemas for this method.
    expected_request = self.values.get('request')
    if expected_request:
      # TODO(user): RequestBody is only used if the schema is anonymous.
      # When we go to nested models, this could be a nested class off the
      # Method, making it unique without the silly name.  Same for ResponseBody.
      request_schema = api.DataTypeFromJson(expected_request,
                                            '%sRequestContent' % name,
                                            parent=self)
      self.SetTemplateValue('requestType', request_schema)

    expected_response = def_dict.get('response') or def_dict.get('returns')
    if expected_response:
      response_schema = api.DataTypeFromJson(expected_response,
                                             '%sResponse' % name,
                                             parent=self)
      if self.values['wireName'] == 'get':
        response_schema.values['associatedResource'] = parent
      self.SetTemplateValue('responseType', response_schema)
    else:
      self.SetTemplateValue('responseType', api.void_type)
    # Make sure we can handle this method type and do any fixups.
    if http_method not in ['DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT',
                           'PROPFIND', 'PROPPATCH', 'REPORT']:
      raise ApiException('Unknown HTTP method: %s' % http_method, def_dict)
    if http_method == 'GET':
      self.SetTemplateValue('requestType', None)

    # Replace parameters dict with Parameters.  We try to order them by their
    # position in the request path so that the generated code can track the
    # more human readable definition, rather than the order of the parameters
    # in the discovery doc.
    order = self.values.get('parameterOrder', [])
    req_parameters = []
    opt_parameters = []
    for name, def_dict in self.values.get('parameters', {}).iteritems():
      param = Parameter(api, name, def_dict, self)
      if name == 'alt':
        # Treat the alt parameter differently
        self.SetTemplateValue('alt', param)
        continue

      # Standard params are part of the generic request class
      # We want to push all parameters that aren't declared inside
      # parameterOrder after those that are.
      if param.values['wireName'] in order:
        req_parameters.append(param)
      else:
        # optional parameters are appended in the order they're declared.
        opt_parameters.append(param)
    # pylint: disable=g-long-lambda
    req_parameters.sort(lambda x, y: cmp(order.index(x.values['wireName']),
                                         order.index(y.values['wireName'])))
    req_parameters.extend(opt_parameters)
    self.SetTemplateValue('parameters', req_parameters)

    self._InitMediaUpload(parent)
    self._InitPageable(api)
    api.AddMethod(self)
def __init__ ( self , api , name , def_dict , parent = None ) : super ( Method , self ) . __init__ ( def_dict , api , parent = ( parent or api ) ) # TODO(user): Fix java templates to name vs. wireName correctly. Then # change the __init__ to have wire_name=def_dict.get('id') or name # then eliminate this line. self . SetTemplateValue ( 'wireName' , name ) self . ValidateName ( name ) class_name = api . ToClassName ( name , self , element_type = 'method' ) if parent and class_name == parent . values [ 'className' ] : # Some languages complain when the collection name is the same as the # method name. class_name = '%sRequest' % class_name # The name is the key of the dict defining use. The id field is what you # have to use to call the method via RPC. That is unique, name might not be. self . SetTemplateValue ( 'name' , name ) # Fix up very old discovery, which does not have an id. if 'id' not in self . values : self . values [ 'id' ] = name self . SetTemplateValue ( 'className' , class_name ) http_method = def_dict . get ( 'httpMethod' , 'POST' ) . upper ( ) self . SetTemplateValue ( 'httpMethod' , http_method ) self . SetTemplateValue ( 'rpcMethod' , def_dict . get ( 'rpcMethod' ) or def_dict [ 'id' ] ) rest_path = def_dict . get ( 'path' ) or def_dict . get ( 'restPath' ) # TODO(user): if rest_path is not set, raise a good error and fail fast. self . SetTemplateValue ( 'restPath' , rest_path ) # Figure out the input and output types and schemas for this method. expected_request = self . values . get ( 'request' ) if expected_request : # TODO(user): RequestBody is only used if the schema is anonymous. # When we go to nested models, this could be a nested class off the # Method, making it unique without the silly name.  Same for ResponseBody. request_schema = api . DataTypeFromJson ( expected_request , '%sRequestContent' % name , parent = self ) self . SetTemplateValue ( 'requestType' , request_schema ) expected_response = def_dict . get ( 'response' ) or def_dict . get ( 'returns' ) if expected_response : response_schema = api . DataTypeFromJson ( expected_response , '%sResponse' % name , parent = self ) if self . values [ 'wireName' ] == 'get' : response_schema . values [ 'associatedResource' ] = parent self . SetTemplateValue ( 'responseType' , response_schema ) else : self . SetTemplateValue ( 'responseType' , api . void_type ) # Make sure we can handle this method type and do any fixups. if http_method not in [ 'DELETE' , 'GET' , 'OPTIONS' , 'PATCH' , 'POST' , 'PUT' , 'PROPFIND' , 'PROPPATCH' , 'REPORT' ] : raise ApiException ( 'Unknown HTTP method: %s' % http_method , def_dict ) if http_method == 'GET' : self . SetTemplateValue ( 'requestType' , None ) # Replace parameters dict with Parameters.  We try to order them by their # position in the request path so that the generated code can track the # more human readable definition, rather than the order of the parameters # in the discovery doc. order = self . values . get ( 'parameterOrder' , [ ] ) req_parameters = [ ] opt_parameters = [ ] for name , def_dict in self . values . get ( 'parameters' , { } ) . iteritems ( ) : param = Parameter ( api , name , def_dict , self ) if name == 'alt' : # Treat the alt parameter differently self . SetTemplateValue ( 'alt' , param ) continue # Standard params are part of the generic request class # We want to push all parameters that aren't declared inside # parameterOrder after those that are. if param . values [ 'wireName' ] in order : req_parameters . append ( param ) else : # optional parameters are appended in the order they're declared. opt_parameters . append ( param ) # pylint: disable=g-long-lambda req_parameters . sort ( lambda x , y : cmp ( order . index ( x . values [ 'wireName' ] ) , order . index ( y . values [ 'wireName' ] ) ) ) req_parameters . extend ( opt_parameters ) self . SetTemplateValue ( 'parameters' , req_parameters ) self . _InitMediaUpload ( parent ) self . _InitPageable ( api ) api . AddMethod ( self )