Skip to content

Commit 3918894

Browse files
authored
Minor optimization of recursive_field_types (#347)
1 parent 7457c37 commit 3918894

3 files changed

Lines changed: 22 additions & 4 deletions

File tree

packages/gapic-generator/gapic/cli/generate.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def generate(
3737
request: typing.BinaryIO,
3838
output: typing.BinaryIO) -> None:
3939
"""Generate a full API client description."""
40-
4140
# Load the protobuf CodeGeneratorRequest.
4241
req = plugin_pb2.CodeGeneratorRequest.FromString(request.read())
4342

packages/gapic-generator/gapic/schema/metadata.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ def __eq__(self, other) -> bool:
5252
return all([getattr(self, i) == getattr(other, i) for i
5353
in ('name', 'module', 'module_path', 'package', 'parent')])
5454

55+
def __hash__(self):
56+
# Do NOT include collisions; they are not relevant.
57+
return hash(
58+
(
59+
self.name,
60+
self.module,
61+
self.module_path,
62+
self.package,
63+
self.parent,
64+
self.api_naming,
65+
)
66+
)
67+
5568
def __str__(self) -> str:
5669
"""Return the Python identifier for this type.
5770

packages/gapic-generator/gapic/schema/wrappers.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ def __getattr__(self, name):
221221
return getattr(self.message_pb, name)
222222

223223
def __hash__(self):
224-
return hash(self.name)
224+
# Identity is sufficiently unambiguous.
225+
return hash(self.ident)
225226

226227
@utils.cached_property
227228
def field_types(self) -> Sequence[Union['MessageType', 'EnumType']]:
@@ -238,15 +239,16 @@ def recursive_field_types(self) -> Sequence[
238239
Union['MessageType', 'EnumType']
239240
]:
240241
"""Return all composite fields used in this proto's messages."""
241-
types: List[Union['MessageType', 'EnumType']] = []
242+
types: Set[Union['MessageType', 'EnumType']] = set()
243+
242244
stack = [iter(self.fields.values())]
243245
while stack:
244246
fields_iter = stack.pop()
245247
for field in fields_iter:
246248
if field.message and field.type not in types:
247249
stack.append(iter(field.message.fields.values()))
248250
if not field.is_primitive:
249-
types.append(field.type)
251+
types.add(field.type)
250252

251253
return tuple(types)
252254

@@ -391,6 +393,10 @@ class EnumType:
391393
default_factory=metadata.Metadata,
392394
)
393395

396+
def __hash__(self):
397+
# Identity is sufficiently unambiguous.
398+
return hash(self.ident)
399+
394400
def __getattr__(self, name):
395401
return getattr(self.enum_pb, name)
396402

0 commit comments

Comments
 (0)