Skip to content

Commit

Permalink
Breaking change: Python nested message class __qualname__ now contain…
Browse files Browse the repository at this point in the history
…s the outer message name. (Previous __qualname__ has the same result with __name__ for nested message that outer message name was not included)

example:

message Foo {
  message Bar {
    bool bool_field = 1;
  }
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before
PiperOrigin-RevId: 695817876
  • Loading branch information
anandolee authored and copybara-github committed Nov 12, 2024
1 parent a3733ac commit 0720536
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 20 deletions.
17 changes: 0 additions & 17 deletions csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs

This file was deleted.

7 changes: 4 additions & 3 deletions python/google/protobuf/internal/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,13 @@ def BuildTopDescriptorsAndMessages(file_des, module_name, module):
module: Generated _pb2 module
"""

def BuildMessage(msg_des):
def BuildMessage(msg_des, prefix):
create_dict = {}
for (name, nested_msg) in msg_des.nested_types_by_name.items():
create_dict[name] = BuildMessage(nested_msg)
create_dict[name] = BuildMessage(nested_msg, prefix + msg_des.name + '.')
create_dict['DESCRIPTOR'] = msg_des
create_dict['__module__'] = module_name
create_dict['__qualname__'] = prefix + msg_des.name
message_class = _reflection.GeneratedProtocolMessageType(
msg_des.name, (_message.Message,), create_dict)
_sym_db.RegisterMessage(message_class)
Expand All @@ -83,7 +84,7 @@ def BuildMessage(msg_des):

# Build messages.
for (name, msg_des) in file_des.message_types_by_name.items():
module[name] = BuildMessage(msg_des)
module[name] = BuildMessage(msg_des, '')


def AddHelpersToExtensions(file_des):
Expand Down
12 changes: 12 additions & 0 deletions python/google/protobuf/internal/message_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1337,6 +1337,18 @@ def testIn(self, message_module):
self.assertIn('oneof_bytes', m)
self.assertNotIn('oneof_string', m)

def testMessageClassName(self, message_module):
m = message_module.TestAllTypes()
self.assertEqual('TestAllTypes', type(m).__name__)
self.assertEqual('TestAllTypes', m.__class__.__qualname__)

nested = message_module.TestAllTypes.NestedMessage()
self.assertEqual('NestedMessage', type(nested).__name__)
self.assertEqual('NestedMessage', nested.__class__.__name__)
self.assertEqual(
'TestAllTypes.NestedMessage', nested.__class__.__qualname__
)


# Class to test proto2-only features (required, extensions, etc.)
@testing_refleaks.TestCase
Expand Down

0 comments on commit 0720536

Please sign in to comment.