Breaking change: Python nested message class __qualname__ now contains 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
pull/19150/head
Jie Luo 4 months ago committed by Copybara-Service
parent a3733ac14d
commit 0720536eca
  1. 17
      csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs
  2. 7
      python/google/protobuf/internal/builder.py
  3. 12
      python/google/protobuf/internal/message_test.py

@ -1,17 +0,0 @@
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#endregion
namespace Google.Protobuf.Reflection;
internal sealed partial class FeatureSetDescriptor
{
// Canonical serialized form of the edition defaults, generated by embed_edition_defaults.
private const string DefaultsBase64 =
"ChMYhAciACoMCAEQAhgCIAMoATACChMY5wciACoMCAIQARgBIAIoATABChMY6AciDAgBEAEYASACKAEwASoAIOYHKOgH";
}

@ -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)
@ -83,7 +84,7 @@ def BuildTopDescriptorsAndMessages(file_des, module_name, module):
# 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):

@ -1337,6 +1337,18 @@ class MessageTest(unittest.TestCase):
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

Loading…
Cancel
Save