|
28 | 28 |
|
29 | 29 | from google.api_core import exceptions # type: ignore |
30 | 30 | from google.api import resource_pb2 # type: ignore |
| 31 | +from google.gapic.metadata import gapic_metadata_pb2 # type: ignore |
31 | 32 | from google.longrunning import operations_pb2 # type: ignore |
32 | 33 | from google.protobuf import descriptor_pb2 |
| 34 | +from google.protobuf.json_format import MessageToJson |
33 | 35 |
|
34 | 36 | import grpc # type: ignore |
35 | 37 |
|
@@ -392,6 +394,45 @@ def subpackages(self) -> Mapping[str, 'API']: |
392 | 394 | ) |
393 | 395 | return answer |
394 | 396 |
|
| 397 | + def gapic_metadata(self, options: Options) -> gapic_metadata_pb2.GapicMetadata: |
| 398 | + gm = gapic_metadata_pb2.GapicMetadata( |
| 399 | + schema="1.0", |
| 400 | + comment="This file maps proto services/RPCs to the corresponding library clients/methods", |
| 401 | + language="python", |
| 402 | + proto_package=self.naming.proto_package, |
| 403 | + library_package=".".join( |
| 404 | + self.naming.module_namespace + |
| 405 | + (self.naming.versioned_module_name,) |
| 406 | + ), |
| 407 | + ) |
| 408 | + |
| 409 | + for service in sorted(self.services.values(), key=lambda s: s.name): |
| 410 | + service_desc = gm.services.get_or_create(service.name) |
| 411 | + |
| 412 | + # At least one of "grpc" or "rest" is guaranteed to be present because |
| 413 | + # of the way that Options instances are created. |
| 414 | + # This assumes the options are generated by the class method factory. |
| 415 | + transports = [] |
| 416 | + if "grpc" in options.transport: |
| 417 | + transports.append(("grpc", service.client_name)) |
| 418 | + transports.append(("grpc-async", service.async_client_name)) |
| 419 | + |
| 420 | + if "rest" in options.transport: |
| 421 | + transports.append(("rest", service.client_name)) |
| 422 | + |
| 423 | + methods = sorted(service.methods.values(), key=lambda m: m.name) |
| 424 | + for tprt, client_name in transports: |
| 425 | + transport = service_desc.clients.get_or_create(tprt) |
| 426 | + transport.library_client = client_name |
| 427 | + for method in methods: |
| 428 | + method_desc = transport.rpcs.get_or_create(method.name) |
| 429 | + method_desc.methods.append(to_snake_case(method.name)) |
| 430 | + |
| 431 | + return gm |
| 432 | + |
| 433 | + def gapic_metadata_json(self, options: Options) -> str: |
| 434 | + return MessageToJson(self.gapic_metadata(options), sort_keys=True) |
| 435 | + |
395 | 436 | def requires_package(self, pkg: Tuple[str, ...]) -> bool: |
396 | 437 | return any( |
397 | 438 | message.ident.package == pkg |
|
0 commit comments