class TransactionUpdateRequest(messages.Message): type = messages.StringField(1) payment_type = messages.StringField(2) amount = messages.FloatField(3) transaction_date = messages.IntegerField(4) borrower_id = messages.StringField(5) interest_rate = messages.FloatField(6)
class MoveRequest(messages.Message): board_id = messages.StringField(1) item_id = messages.StringField(2) x = messages.IntegerField(3) y = messages.IntegerField(4) z = messages.IntegerField(5) client_id = messages.StringField(6) lock_token = messages.StringField(7) is_release = messages.BooleanField(8, default=False)
class TransactionResponse(messages.Message): type = messages.StringField(1) payment_type = messages.StringField(2) amount = messages.FloatField(3) transaction_date = messages.IntegerField(4) borrower_id = messages.StringField(5) borrower_name = messages.StringField(6) interest_rate = messages.FloatField(7) transaction_id = messages.StringField(8)
class OverviewResponse(messages.Message): borrower_name = messages.StringField(1) outstanding_principal = messages.FloatField(2) outstanding_interest = messages.FloatField(3) paid_interest = messages.FloatField(4) paid_principal = messages.FloatField(5) date = messages.IntegerField(6) last_transaction_date = messages.IntegerField(7) borrower_id = messages.StringField(8)
class MultipleParameterEndpoint(remote.Service): @endpoints.method(endpoints.ResourceContainer( message_types.VoidMessage, parent = messages.StringField(1, required=True), query = messages.StringField(2, required=False), child = messages.StringField(3, required=True), queryb = messages.StringField(4, required=True), querya = messages.StringField(5, required=True), ), message_types.VoidMessage, name='param', path='param/{parent}/{child}') def param(self, request): pass
def testUrlGeneration(self): IATA_RESOURCE = resource_container.ResourceContainer( iata=messages.StringField(1)) class IataParam(messages.Message): iata = messages.StringField(1) class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True) @api_config.api(name='iata', version='1.6.9') class IataApi(remote.Service): @api_config.method(IATA_RESOURCE, Airport, path='airport/{iata}', http_method='GET', name='get_airport') def get_airport(self, request): return Airport(iata=request.iata, name='irrelevant') doc = self.generator.get_discovery_doc([IataApi], hostname='iata.appspot.com') assert doc['baseUrl'] == 'https://iata.appspot.com/_ah/api/iata/v1/' assert doc['rootUrl'] == 'https://iata.appspot.com/_ah/api/' assert doc['servicePath'] == 'iata/v1/'
class AllTypes(messages.Message): """Contains all field types.""" class SimpleEnum(messages.Enum): """Simple enumeration type.""" VAL1 = 1 VAL2 = 2 bool_value = messages.BooleanField(1, variant=messages.Variant.BOOL) bytes_value = messages.BytesField(2, variant=messages.Variant.BYTES) double_value = messages.FloatField(3, variant=messages.Variant.DOUBLE) enum_value = messages.EnumField(SimpleEnum, 4) float_value = messages.FloatField(5, variant=messages.Variant.FLOAT) int32_value = messages.IntegerField(6, variant=messages.Variant.INT32) int64_value = messages.IntegerField(7, variant=messages.Variant.INT64) string_value = messages.StringField( 8, variant=messages.Variant.STRING) uint32_value = messages.IntegerField( 9, variant=messages.Variant.UINT32) uint64_value = messages.IntegerField( 10, variant=messages.Variant.UINT64) int_value = messages.IntegerField(11) # Default variant is INT64. datetime_value = message_types.DateTimeField(12) repeated_datetime_value = message_types.DateTimeField( 13, repeated=True)
def testDefaultScope(self): IATA_RESOURCE = resource_container.ResourceContainer( iata=messages.StringField(1)) class IataParam(messages.Message): iata = messages.StringField(1) class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True) @api_config.api(name='iata', version='v1', auth_level=api_config.AUTH_LEVEL.REQUIRED, allowed_client_ids=users_id_token.SKIP_CLIENT_ID_CHECK) class IataApi(remote.Service): @api_config.method(IATA_RESOURCE, Airport, path='airport/{iata}', http_method='GET', name='get_airport') def get_airport(self, request): return Airport(iata=request.iata, name='irrelevant') doc = self.generator.get_discovery_doc([IataApi]) auth = doc['auth'] assert auth == { 'oauth2': { 'scopes': { 'https://www.googleapis.com/auth/userinfo.email': { 'description': 'View your email address' } } } }
class AllFields(messages.Message): """Documentation for AllFields.""" string = messages.StringField(1) string_required = messages.StringField(2, required=True) string_default_required = messages.StringField(3, required=True, default='Foo') string_repeated = messages.StringField(4, repeated=True) class SimpleEnum(messages.Enum): """Simple enumeration type.""" VAL1 = 1 VAL2 = 2 enum_value = messages.EnumField(SimpleEnum, 5, default=SimpleEnum.VAL2)
def make_collection(cls): return type( 'Collection_{}'.format(cls.__name__), (messages.Message,), { 'items': messages.MessageField(cls, 1, repeated=True), 'nextPageToken': messages.StringField(2) })
class AllBasicFields(messages.Message): """Contains all field types.""" bool_value = messages.BooleanField(1, variant=messages.Variant.BOOL) bytes_value = messages.BytesField(2, variant=messages.Variant.BYTES) double_value = messages.FloatField(3, variant=messages.Variant.DOUBLE) float_value = messages.FloatField(5, variant=messages.Variant.FLOAT) int32_value = messages.IntegerField(6, variant=messages.Variant.INT32) int64_value = messages.IntegerField(7, variant=messages.Variant.INT64) string_value = messages.StringField(8, variant=messages.Variant.STRING) uint32_value = messages.IntegerField(9, variant=messages.Variant.UINT32) uint64_value = messages.IntegerField(10, variant=messages.Variant.UINT64) sint32_value = messages.IntegerField(11, variant=messages.Variant.SINT32) sint64_value = messages.IntegerField(12, variant=messages.Variant.SINT64) datetime_value = message_types.DateTimeField(14)
def testMultipleClassService(self): '''If multiple classes of a single service are passed to the generator, the document should show all methods from all classes.''' class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True) IATA_RESOURCE = resource_container.ResourceContainer( iata=messages.StringField(1, required=True)) class AirportList(messages.Message): airports = messages.MessageField(Airport, 1, repeated=True) @api_config.api(name='iata', version='v1') class ServicePart1(remote.Service): @api_config.method(message_types.VoidMessage, AirportList, path='airports', http_method='GET', name='list_airports') def list_airports(self, request): return AirportList(airports=[ Airport(iata=u'DEN', name=u'Denver International Airport'), Airport(iata=u'SEA', name=u'Seattle Tacoma International Airport'), ]) @api_config.api(name='iata', version='v1') class ServicePart2(remote.Service): @api_config.method(IATA_RESOURCE, Airport, path='airport/{iata}', http_method='GET', name='get_airport') def get_airport(self, request): airports = {'DEN': 'Denver International Airport'} if request.iata not in airports: raise endpoints.NotFoundException() return Airport(iata=request.iata, name=airports[request.iata]) doc = self.generator.get_discovery_doc([ServicePart1, ServicePart2]) self.assertItemsEqual(doc['methods'].keys(), [u'get_airport', u'list_airports'])
def testCustomScope(self): SCOPE = endpoints_types.OAuth2Scope( scope='https://www.googleapis.com/auth/santa', description='Access your letter to Santa') IATA_RESOURCE = resource_container.ResourceContainer( iata=messages.StringField(1)) class IataParam(messages.Message): iata = messages.StringField(1) class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True) @api_config.api(name='iata', version='v1', scopes=[SCOPE], auth_level=api_config.AUTH_LEVEL.REQUIRED, allowed_client_ids=users_id_token.SKIP_CLIENT_ID_CHECK) class IataApi(remote.Service): @api_config.method(IATA_RESOURCE, Airport, path='airport/{iata}', http_method='GET', name='get_airport') def get_airport(self, request): return Airport(iata=request.iata, name='irrelevant') doc = self.generator.get_discovery_doc([IataApi]) auth = doc['auth'] assert auth == { 'oauth2': { 'scopes': { SCOPE.scope: { 'description': SCOPE.description } } } }
class EchoResponse(messages.Message): """A proto Message that contains a simple string field.""" message = messages.StringField(1)
class Foo(messages.Message): name = messages.StringField(1) value = messages.IntegerField(2, variant=messages.Variant.INT32)
class Bar(messages.Message): name = messages.StringField(1, default='Jimothy') value = messages.IntegerField(2, default=42, variant=messages.Variant.INT32) active = messages.BooleanField(3, default=True)
with open(test_file) as f: return json.loads(f.read()) except IOError as e: print 'Could not find expected output file ' + test_file raise e class Foo(messages.Message): name = messages.StringField(1) value = messages.IntegerField(2, variant=messages.Variant.INT32) FooCollection = make_collection(Foo) FooResource = endpoints.ResourceContainer( Foo, id=messages.StringField(1, required=True), ) FooIdResource = endpoints.ResourceContainer( message_types.VoidMessage, id=messages.StringField(1, required=True), ) FooNResource = endpoints.ResourceContainer( message_types.VoidMessage, n=messages.IntegerField(1, required=True, variant=messages.Variant.INT32), ) @endpoints.api(name='foo', version='v1', audiences=['audiences'], title='The Foo API',
def add_event_request_type(): """"Return the request object for addEvent API method""" return endpoints.ResourceContainer( AddEventRequest, customerId=messages.StringField(1))
class ReviewMessage(messages.Message): message = messages.StringField(1)
class ReviewRequest(messages.Message): product_id = messages.IntegerField(1, required=True) name = messages.StringField(2, required=True) review = messages.StringField(3, required=True) stars = messages.IntegerField(4, required=True)
class EchoRequest(messages.Message): message = messages.StringField(1)
class Recursive(messages.Message): """Message which can contain itself.""" desc = messages.StringField(1) subrecursive = messages.MessageField('Recursive', 2, repeated=True)
class Greeting(messages.Message): """Greeting that stores a message.""" message = messages.StringField(1)
def testAllFieldTypes(self): class PutRequest(messages.Message): """Message with just a body field.""" body = messages.MessageField(AllFields, 1) # pylint: disable=invalid-name class ItemsPutRequest(messages.Message): """Message with path params and a body field.""" body = messages.MessageField(AllFields, 1) entryId = messages.StringField(2, required=True) class ItemsPutRequestForContainer(messages.Message): """Message with path params and a body field.""" body = messages.MessageField(AllFields, 1) items_put_request_container = resource_container.ResourceContainer( ItemsPutRequestForContainer, entryId=messages.StringField(2, required=True)) # pylint: disable=invalid-name class EntryPublishRequest(messages.Message): """Message with two required params, one in path, one in body.""" title = messages.StringField(1, required=True) entryId = messages.StringField(2, required=True) class EntryPublishRequestForContainer(messages.Message): """Message with two required params, one in path, one in body.""" title = messages.StringField(1, required=True) entry_publish_request_container = resource_container.ResourceContainer( EntryPublishRequestForContainer, entryId=messages.StringField(2, required=True)) class BooleanMessageResponse(messages.Message): result = messages.BooleanField(1, required=True) @api_config.api(name='root', hostname='example.appspot.com', version='v1', description='This is an API') class MyService(remote.Service): """Describes MyService.""" @api_config.method(message_types.VoidMessage, BooleanMessageResponse, path='toplevel:withcolon', http_method='GET', name='toplevelwithcolon') def toplevel(self, unused_request): return BooleanMessageResponse(result=True) @api_config.method(AllFields, message_types.VoidMessage, path='entries', http_method='GET', name='entries.get') def entries_get(self, unused_request): """All field types in the query parameters.""" return message_types.VoidMessage() @api_config.method(ALL_FIELDS_AS_PARAMETERS, message_types.VoidMessage, path='entries/container', http_method='GET', name='entries.getContainer') def entries_get_container(self, unused_request): """All field types in the query parameters.""" return message_types.VoidMessage() @api_config.method(PutRequest, BooleanMessageResponse, path='entries', name='entries.put') def entries_put(self, unused_request): """Request body is in the body field.""" return BooleanMessageResponse(result=True) @api_config.method(AllFields, message_types.VoidMessage, path='process', name='entries.process') def entries_process(self, unused_request): """Message is the request body.""" return message_types.VoidMessage() @api_config.method(message_types.VoidMessage, message_types.VoidMessage, name='entries.nested.collection.action', path='nested') def entries_nested_collection_action(self, unused_request): """A VoidMessage for a request body.""" return message_types.VoidMessage() @api_config.method(AllFields, AllFields, name='entries.roundtrip', path='roundtrip') def entries_roundtrip(self, unused_request): """All field types in the request and response.""" pass # Test a method with a required parameter in the request body. @api_config.method(EntryPublishRequest, message_types.VoidMessage, path='entries/{entryId}/publish', name='entries.publish') def entries_publish(self, unused_request): """Path has a parameter and request body has a required param.""" return message_types.VoidMessage() @api_config.method(entry_publish_request_container, message_types.VoidMessage, path='entries/container/{entryId}/publish', name='entries.publishContainer') def entries_publish_container(self, unused_request): """Path has a parameter and request body has a required param.""" return message_types.VoidMessage() # Test a method with a parameter in the path and a request body. @api_config.method(ItemsPutRequest, message_types.VoidMessage, path='entries/{entryId}/items', name='entries.items.put') def items_put(self, unused_request): """Path has a parameter and request body is in the body field.""" return message_types.VoidMessage() @api_config.method(items_put_request_container, message_types.VoidMessage, path='entries/container/{entryId}/items', name='entries.items.putContainer') def items_put_container(self, unused_request): """Path has a parameter and request body is in the body field.""" return message_types.VoidMessage() api = json.loads(self.generator.pretty_print_config_to_json(MyService)) try: pwd = os.path.dirname(os.path.realpath(__file__)) test_file = os.path.join(pwd, 'testdata', 'discovery', 'allfields.json') with open(test_file) as f: expected_discovery = json.loads(f.read()) except IOError as e: print 'Could not find expected output file ' + test_file raise e test_util.AssertDictEqual(expected_discovery, api, self)
class Review(messages.Message): name = messages.StringField(1) review = messages.StringField(2) stars = messages.IntegerField(3) date = message_types.DateTimeField(4)
class ItemsPutRequest(messages.Message): """Message with path params and a body field.""" body = messages.MessageField(AllFields, 1) entryId = messages.StringField(2, required=True)
class AddEventRequest(messages.Message): """"Request object for addEvent API method""" content_id = messages.StringField(1) time = messages.FloatField(2) user_info = messages.MessageField(UserInfo.__name__, 3)
"""This is a sample Airport Information service implemented using Google Cloud Endpoints Frameworks for Python.""" # [START imports] import endpoints from endpoints import message_types from endpoints import messages from endpoints import remote from data import AIRPORTS # [END imports] # [START messages] IATA_RESOURCE = endpoints.ResourceContainer( iata=messages.StringField(1, required=True) ) class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True) IATA_AIRPORT_RESOURCE = endpoints.ResourceContainer( Airport, iata=messages.StringField(1, required=True) ) class AirportList(messages.Message):
class UserInfo(messages.Message): """"User information of request object for addEvent API method""" ip = messages.StringField(1) user_agent = messages.StringField(2) location = messages.StringField(3)
class Airport(messages.Message): iata = messages.StringField(1, required=True) name = messages.StringField(2, required=True)