Skip to content

Commit

Permalink
Fix a Python bug: when package is empty, DescriptorDatabase FindFileC…
Browse files Browse the repository at this point in the history
…ontainingSymbol method will able to find symbol names not start with '.'

The old behavior requires a prefix of '.' for empty packages like '.Foo'. To not break old behaviors, both 'Foo' and '.Foo' will be supported. The support for leading '.' will be removed around 2026 Jan.

For example:
db.FindFileContainingSymbol('Foo')
db.FindFileContainingSymbol('.Foo') # with a warning
will have same result

PiperOrigin-RevId: 695493356
  • Loading branch information
anandolee authored and copybara-github committed Nov 11, 2024
1 parent 0df15fc commit 610702e
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 23 deletions.
17 changes: 0 additions & 17 deletions csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs

This file was deleted.

26 changes: 22 additions & 4 deletions python/google/protobuf/descriptor_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,24 @@ def Add(self, file_desc_proto):
for name in _ExtractSymbols(message, package):
self._AddSymbol(name, file_desc_proto)
for enum in file_desc_proto.enum_type:
self._AddSymbol(('.'.join((package, enum.name))), file_desc_proto)
self._AddSymbol(
('.'.join((package, enum.name)) if package else enum.name),
file_desc_proto,
)
for enum_value in enum.value:
self._file_desc_protos_by_symbol[
'.'.join((package, enum_value.name))] = file_desc_proto
'.'.join((package, enum_value.name)) if package else enum_value.name
] = file_desc_proto
for extension in file_desc_proto.extension:
self._AddSymbol(('.'.join((package, extension.name))), file_desc_proto)
self._AddSymbol(
('.'.join((package, extension.name)) if package else extension.name),
file_desc_proto,
)
for service in file_desc_proto.service:
self._AddSymbol(('.'.join((package, service.name))), file_desc_proto)
self._AddSymbol(
('.'.join((package, service.name)) if package else service.name),
file_desc_proto,
)

def FindFileByName(self, name):
"""Finds the file descriptor proto by file name.
Expand Down Expand Up @@ -102,6 +112,14 @@ def FindFileContainingSymbol(self, symbol):
Raises:
KeyError if no file contains the specified symbol.
"""
if symbol.count('.') == 1 and symbol[0] == '.':
symbol = symbol.lstrip('.')
warnings.warn(
'Please remove the leading "." when '
'FindFileContainingSymbol, this will turn to error '
'in 2026 Jan.',
RuntimeWarning,
)
try:
return self._file_desc_protos_by_symbol[symbol]
except KeyError:
Expand Down
27 changes: 25 additions & 2 deletions python/google/protobuf/internal/descriptor_database_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,26 @@ def testAdd(self):
'google.protobuf.python.internal.Factory2Enum.FACTORY_2_VALUE_0'))
self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
'google.protobuf.python.internal.FACTORY_2_VALUE_0'))
self.assertEqual(file_desc_proto2, db.FindFileContainingSymbol(
'.NO_PACKAGE_VALUE_0'))
self.assertEqual(
file_desc_proto2, db.FindFileContainingSymbol('NO_PACKAGE_VALUE_0')
)
self.assertEqual(
file_desc_proto2, db.FindFileContainingSymbol('.NO_PACKAGE_VALUE_0')
)
self.assertEqual(
file_desc_proto2, db.FindFileContainingSymbol('NoPackageMessage')
)
self.assertEqual(
file_desc_proto2, db.FindFileContainingSymbol('.NoPackageMessage')
)
self.assertEqual(
file_desc_proto2,
db.FindFileContainingSymbol('NoPackageEnum'),
)
self.assertEqual(
file_desc_proto2,
db.FindFileContainingSymbol('.NoPackageEnum'),
)
# Can find top level extension.
self.assertEqual(file_desc_proto, db.FindFileContainingSymbol(
'google.protobuf.python.internal.another_field'))
Expand All @@ -80,6 +98,11 @@ def testAdd(self):
with self.assertRaisesRegex(KeyError, r'\'protobuf_unittest\.NoneMessage\''):
db.FindFileContainingSymbol('protobuf_unittest.NoneMessage')

with self.assertRaises(KeyError):
db.FindFileContainingSymbol(
'.google.protobuf.python.internal.FACTORY_2_VALUE_0'
)

def testConflictRegister(self):
db = descriptor_database.DescriptorDatabase()
unittest_fd = descriptor_pb2.FileDescriptorProto.FromString(
Expand Down

0 comments on commit 610702e

Please sign in to comment.