Skip to content

Commit 313277a

Browse files
authored
Fix the way obsolete messages are stored (#1132)
1 parent 8e12f54 commit 313277a

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

babel/messages/pofile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def _add_message(self) -> None:
239239
context=msgctxt)
240240
if self.obsolete:
241241
if not self.ignore_obsolete:
242-
self.catalog.obsolete[msgid] = message
242+
self.catalog.obsolete[self.catalog._key_for(msgid, msgctxt)] = message
243243
else:
244244
self.catalog[msgid] = message
245245
self.counter += 1

tests/messages/test_pofile.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,62 @@ def test_obsolete_message_with_context(self):
299299
catalog = pofile.read_po(buf)
300300
assert len(catalog) == 2
301301
assert len(catalog.obsolete) == 1
302-
message = catalog.obsolete["foo"]
302+
message = catalog.obsolete[("foo", "other")]
303303
assert message.context == 'other'
304304
assert message.string == 'Voh'
305305

306+
def test_obsolete_messages_with_context(self):
307+
buf = StringIO('''
308+
# This is an obsolete message
309+
#~ msgctxt "apple"
310+
#~ msgid "foo"
311+
#~ msgstr "Foo"
312+
313+
# This is an obsolete message with the same id but different context
314+
#~ msgctxt "orange"
315+
#~ msgid "foo"
316+
#~ msgstr "Bar"
317+
''')
318+
catalog = pofile.read_po(buf)
319+
assert len(catalog) == 0
320+
assert len(catalog.obsolete) == 2
321+
assert 'foo' not in catalog.obsolete
322+
323+
apple_msg = catalog.obsolete[('foo', 'apple')]
324+
assert apple_msg.id == 'foo'
325+
assert apple_msg.string == 'Foo'
326+
assert apple_msg.user_comments == ['This is an obsolete message']
327+
328+
orange_msg = catalog.obsolete[('foo', 'orange')]
329+
assert orange_msg.id == 'foo'
330+
assert orange_msg.string == 'Bar'
331+
assert orange_msg.user_comments == ['This is an obsolete message with the same id but different context']
332+
333+
def test_obsolete_messages_roundtrip(self):
334+
buf = StringIO('''\
335+
# This message is not obsolete
336+
#: main.py:1
337+
msgid "bar"
338+
msgstr "Bahr"
339+
340+
# This is an obsolete message
341+
#~ msgid "foo"
342+
#~ msgstr "Voh"
343+
344+
# This is an obsolete message
345+
#~ msgctxt "apple"
346+
#~ msgid "foo"
347+
#~ msgstr "Foo"
348+
349+
# This is an obsolete message with the same id but different context
350+
#~ msgctxt "orange"
351+
#~ msgid "foo"
352+
#~ msgstr "Bar"
353+
354+
''')
355+
generated_po_file = ''.join(pofile.generate_po(pofile.read_po(buf), omit_header=True))
356+
assert buf.getvalue() == generated_po_file
357+
306358
def test_multiline_context(self):
307359
buf = StringIO('''
308360
msgctxt "a really long "
@@ -394,7 +446,7 @@ def test_obsolete_plural_with_square_brackets(self):
394446
assert len(catalog) == 0
395447
assert len(catalog.obsolete) == 1
396448
assert catalog.num_plurals == 2
397-
message = catalog.obsolete[('foo', 'foos')]
449+
message = catalog.obsolete['foo']
398450
assert len(message.string) == 2
399451
assert message.string[0] == 'Voh [text]'
400452
assert message.string[1] == 'Vohs [text]'

0 commit comments

Comments
 (0)