From 313277af993cebfbae49d385327fc7f45e32f737 Mon Sep 17 00:00:00 2001 From: "Tomas R." Date: Sun, 20 Oct 2024 08:54:27 +0200 Subject: [PATCH] Fix the way obsolete messages are stored (#1132) --- babel/messages/pofile.py | 2 +- tests/messages/test_pofile.py | 56 +++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/babel/messages/pofile.py b/babel/messages/pofile.py index b7a524051..ec2d57f7d 100644 --- a/babel/messages/pofile.py +++ b/babel/messages/pofile.py @@ -239,7 +239,7 @@ def _add_message(self) -> None: context=msgctxt) if self.obsolete: if not self.ignore_obsolete: - self.catalog.obsolete[msgid] = message + self.catalog.obsolete[self.catalog._key_for(msgid, msgctxt)] = message else: self.catalog[msgid] = message self.counter += 1 diff --git a/tests/messages/test_pofile.py b/tests/messages/test_pofile.py index 3609b5c2b..f4360ecf1 100644 --- a/tests/messages/test_pofile.py +++ b/tests/messages/test_pofile.py @@ -299,10 +299,62 @@ def test_obsolete_message_with_context(self): catalog = pofile.read_po(buf) assert len(catalog) == 2 assert len(catalog.obsolete) == 1 - message = catalog.obsolete["foo"] + message = catalog.obsolete[("foo", "other")] assert message.context == 'other' assert message.string == 'Voh' + def test_obsolete_messages_with_context(self): + buf = StringIO(''' +# This is an obsolete message +#~ msgctxt "apple" +#~ msgid "foo" +#~ msgstr "Foo" + +# This is an obsolete message with the same id but different context +#~ msgctxt "orange" +#~ msgid "foo" +#~ msgstr "Bar" +''') + catalog = pofile.read_po(buf) + assert len(catalog) == 0 + assert len(catalog.obsolete) == 2 + assert 'foo' not in catalog.obsolete + + apple_msg = catalog.obsolete[('foo', 'apple')] + assert apple_msg.id == 'foo' + assert apple_msg.string == 'Foo' + assert apple_msg.user_comments == ['This is an obsolete message'] + + orange_msg = catalog.obsolete[('foo', 'orange')] + assert orange_msg.id == 'foo' + assert orange_msg.string == 'Bar' + assert orange_msg.user_comments == ['This is an obsolete message with the same id but different context'] + + def test_obsolete_messages_roundtrip(self): + buf = StringIO('''\ +# This message is not obsolete +#: main.py:1 +msgid "bar" +msgstr "Bahr" + +# This is an obsolete message +#~ msgid "foo" +#~ msgstr "Voh" + +# This is an obsolete message +#~ msgctxt "apple" +#~ msgid "foo" +#~ msgstr "Foo" + +# This is an obsolete message with the same id but different context +#~ msgctxt "orange" +#~ msgid "foo" +#~ msgstr "Bar" + +''') + generated_po_file = ''.join(pofile.generate_po(pofile.read_po(buf), omit_header=True)) + assert buf.getvalue() == generated_po_file + def test_multiline_context(self): buf = StringIO(''' msgctxt "a really long " @@ -394,7 +446,7 @@ def test_obsolete_plural_with_square_brackets(self): assert len(catalog) == 0 assert len(catalog.obsolete) == 1 assert catalog.num_plurals == 2 - message = catalog.obsolete[('foo', 'foos')] + message = catalog.obsolete['foo'] assert len(message.string) == 2 assert message.string[0] == 'Voh [text]' assert message.string[1] == 'Vohs [text]'