annotate babel/messages/tests/pofile.py @ 352:90849c44c531

More work on msgctxt support (#54).
author cmlenz
date Mon, 16 Jun 2008 16:49:56 +0000
parents 662d332c0a2b
children c82ad0f5ff65
rev   line source
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
2 #
337
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
3 # Copyright (C) 2007-2008 Edgewall Software
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
4 # All rights reserved.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
5 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
9 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
13
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
14 from datetime import datetime
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
15 import doctest
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
16 from StringIO import StringIO
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
17 import unittest
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
18
183
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
19 from babel.messages.catalog import Catalog, Message
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 53
diff changeset
20 from babel.messages import pofile
293
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
21 from babel.util import FixedOffsetTimezone, LOCALTZ
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
22
19
762a5de6faae Recognize python-format messages also for unnamed parameters.
cmlenz
parents: 14
diff changeset
23
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
24 class ReadPoTestCase(unittest.TestCase):
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
25
198
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
26 def test_preserve_locale(self):
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
27 buf = StringIO(r'''msgid "foo"
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
28 msgstr "Voh"''')
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
29 catalog = pofile.read_po(buf, locale='en_US')
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
30 self.assertEqual('en_US', catalog.locale)
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
31
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
32 def test_preserve_domain(self):
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
33 buf = StringIO(r'''msgid "foo"
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
34 msgstr "Voh"''')
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
35 catalog = pofile.read_po(buf, domain='mydomain')
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
36 self.assertEqual('mydomain', catalog.domain)
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
37
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
38 def test_read_multiline(self):
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
39 buf = StringIO(r'''msgid ""
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
40 "Here's some text that\n"
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
41 "includesareallylongwordthatmightbutshouldnt"
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
42 " throw us into an infinite "
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
43 "loop\n"
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
44 msgstr ""''')
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
45 catalog = pofile.read_po(buf)
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
46 self.assertEqual(1, len(catalog))
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
47 message = list(catalog)[1]
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
48 self.assertEqual("Here's some text that\nincludesareallylongwordthat"
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
49 "mightbutshouldnt throw us into an infinite loop\n",
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
50 message.id)
198
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
51
177
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
52 def test_fuzzy_header(self):
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
53 buf = StringIO(r'''\
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
54 # Translations template for AReallyReallyLongNameForAProject.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
55 # Copyright (C) 2007 ORGANIZATION
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
56 # This file is distributed under the same license as the
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
57 # AReallyReallyLongNameForAProject project.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
58 # FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
59 #
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
60 #, fuzzy
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
61 ''')
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
62 catalog = pofile.read_po(buf)
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
63 self.assertEqual(1, len(list(catalog)))
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
64 self.assertEqual(True, list(catalog)[0].fuzzy)
198
982d7e704fdc Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 193
diff changeset
65
177
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
66 def test_not_fuzzy_header(self):
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
67 buf = StringIO(r'''\
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
68 # Translations template for AReallyReallyLongNameForAProject.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
69 # Copyright (C) 2007 ORGANIZATION
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
70 # This file is distributed under the same license as the
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
71 # AReallyReallyLongNameForAProject project.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
72 # FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
73 #
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
74 ''')
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
75 catalog = pofile.read_po(buf)
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
76 self.assertEqual(1, len(list(catalog)))
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 108
diff changeset
77 self.assertEqual(False, list(catalog)[0].fuzzy)
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
78
293
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
79 def test_header_entry(self):
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
80 buf = StringIO(r'''\
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
81 # SOME DESCRIPTIVE TITLE.
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
82 # Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
83 # This file is distributed under the same license as the PACKAGE package.
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
84 # FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
85 #
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
86 #, fuzzy
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
87 msgid ""
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
88 msgstr ""
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
89 "Project-Id-Version: 3.15\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
90 "Report-Msgid-Bugs-To: Fliegender Zirkus <fliegender@zirkus.de>\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
91 "POT-Creation-Date: 2007-09-27 11:19+0700\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
92 "PO-Revision-Date: 2007-09-27 21:42-0700\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
93 "Last-Translator: John <cleese@bavaria.de>\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
94 "Language-Team: German Lang <de@babel.org>\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
95 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
96 "MIME-Version: 1.0\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
97 "Content-Type: text/plain; charset=iso-8859-2\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
98 "Content-Transfer-Encoding: 8bit\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
99 "Generated-By: Babel 1.0dev-r313\n"
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
100 ''')
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
101 catalog = pofile.read_po(buf)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
102 self.assertEqual(1, len(list(catalog)))
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
103 self.assertEqual(u'3.15', catalog.version)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
104 self.assertEqual(u'Fliegender Zirkus <fliegender@zirkus.de>',
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
105 catalog.msgid_bugs_address)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
106 self.assertEqual(datetime(2007, 9, 27, 11, 19,
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
107 tzinfo=FixedOffsetTimezone(7 * 60)),
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
108 catalog.creation_date)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
109 self.assertEqual(u'John <cleese@bavaria.de>', catalog.last_translator)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
110 self.assertEqual(u'German Lang <de@babel.org>', catalog.language_team)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
111 self.assertEqual(u'iso-8859-2', catalog.charset)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
112 self.assertEqual(True, list(catalog)[0].fuzzy)
62d4f85d33ea fix catalogs' charset values not being recognized
pjenvey
parents: 251
diff changeset
113
201
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
114 def test_obsolete_message(self):
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
115 buf = StringIO(r'''# This is an obsolete message
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
116 #~ msgid "foo"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
117 #~ msgstr "Voh"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
118
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
119 # This message is not obsolete
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
120 #: main.py:1
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
121 msgid "bar"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
122 msgstr "Bahr"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
123 ''')
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
124 catalog = pofile.read_po(buf)
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
125 self.assertEqual(1, len(catalog))
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
126 self.assertEqual(1, len(catalog.obsolete))
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
127 message = catalog.obsolete[u'foo']
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
128 self.assertEqual(u'foo', message.id)
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
129 self.assertEqual(u'Voh', message.string)
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
130 self.assertEqual(['This is an obsolete message'], message.user_comments)
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
131
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
132 def test_obsolete_message_ignored(self):
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
133 buf = StringIO(r'''# This is an obsolete message
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
134 #~ msgid "foo"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
135 #~ msgstr "Voh"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
136
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
137 # This message is not obsolete
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
138 #: main.py:1
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
139 msgid "bar"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
140 msgstr "Bahr"
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
141 ''')
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
142 catalog = pofile.read_po(buf, ignore_obsolete=True)
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
143 self.assertEqual(1, len(catalog))
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
144 self.assertEqual(0, len(catalog.obsolete))
10e8d072e2d1 Handle obsolete messages when parsing catalogs. Closes #32.
cmlenz
parents: 198
diff changeset
145
337
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
146 def test_with_context(self):
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
147 buf = StringIO(r'''# Some string in the menu
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
148 #: main.py:1
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
149 msgctxt "Menu"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
150 msgid "foo"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
151 msgstr "Voh"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
152
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
153 # Another string in the menu
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
154 #: main.py:2
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
155 msgctxt "Menu"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
156 msgid "bar"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
157 msgstr "Bahr"
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
158 ''')
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
159 catalog = pofile.read_po(buf, ignore_obsolete=True)
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
160 self.assertEqual(2, len(catalog))
352
90849c44c531 More work on msgctxt support (#54).
cmlenz
parents: 337
diff changeset
161 message = catalog.get('foo', context='Menu')
337
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
162 self.assertEqual('Menu', message.context)
352
90849c44c531 More work on msgctxt support (#54).
cmlenz
parents: 337
diff changeset
163 message = catalog.get('bar', context='Menu')
337
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
164 self.assertEqual('Menu', message.context)
662d332c0a2b More preparation for msgctxt support (#54).
cmlenz
parents: 317
diff changeset
165
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
166
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
167 class WritePoTestCase(unittest.TestCase):
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
168
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
169 def test_join_locations(self):
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
170 catalog = Catalog()
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
171 catalog.add(u'foo', locations=[('main.py', 1)])
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
172 catalog.add(u'foo', locations=[('utils.py', 3)])
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
173 buf = StringIO()
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
174 pofile.write_po(buf, catalog, omit_header=True)
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
175 self.assertEqual('''#: main.py:1 utils.py:3
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
176 msgid "foo"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
177 msgstr ""''', buf.getvalue().strip())
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
178
230
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
179 def test_duplicate_comments(self):
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
180 catalog = Catalog()
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
181 catalog.add(u'foo', auto_comments=['A comment'])
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
182 catalog.add(u'foo', auto_comments=['A comment'])
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
183 buf = StringIO()
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
184 pofile.write_po(buf, catalog, omit_header=True)
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
185 self.assertEqual('''#. A comment
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
186 msgid "foo"
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
187 msgstr ""''', buf.getvalue().strip())
aaf36f409166 Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents: 205
diff changeset
188
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
189 def test_wrap_long_lines(self):
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
190 text = """Here's some text where
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
191 white space and line breaks matter, and should
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
192
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
193 not be removed
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
194
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
195 """
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
196 catalog = Catalog()
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
197 catalog.add(text, locations=[('main.py', 1)])
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
198 buf = StringIO()
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
199 pofile.write_po(buf, catalog, no_location=True, omit_header=True,
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
200 width=42)
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
201 self.assertEqual(r'''msgid ""
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
202 "Here's some text where \n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
203 "white space and line breaks matter, and"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
204 " should\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
205 "\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
206 "not be removed\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
207 "\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
208 msgstr ""''', buf.getvalue().strip())
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
209
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
210 def test_wrap_long_lines_with_long_word(self):
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
211 text = """Here's some text that
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
212 includesareallylongwordthatmightbutshouldnt throw us into an infinite loop
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
213 """
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
214 catalog = Catalog()
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
215 catalog.add(text, locations=[('main.py', 1)])
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
216 buf = StringIO()
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
217 pofile.write_po(buf, catalog, no_location=True, omit_header=True,
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 56
diff changeset
218 width=32)
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
219 self.assertEqual(r'''msgid ""
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
220 "Here's some text that\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
221 "includesareallylongwordthatmightbutshouldnt"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
222 " throw us into an infinite "
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
223 "loop\n"
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
224 msgstr ""''', buf.getvalue().strip())
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
225
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
226 def test_wrap_long_lines_in_header(self):
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
227 """
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
228 Verify that long lines in the header comment are wrapped correctly.
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
229 """
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
230 catalog = Catalog(project='AReallyReallyLongNameForAProject',
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
231 revision_date=datetime(2007, 4, 1))
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
232 buf = StringIO()
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
233 pofile.write_po(buf, catalog)
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
234 self.assertEqual('''\
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
235 # Translations template for AReallyReallyLongNameForAProject.
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
236 # Copyright (C) 2007 ORGANIZATION
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
237 # This file is distributed under the same license as the
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
238 # AReallyReallyLongNameForAProject project.
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
239 # FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
240 #
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
241 #, fuzzy''', '\n'.join(buf.getvalue().splitlines()[:7]))
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 82
diff changeset
242
317
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
243 def test_wrap_locations_with_hyphens(self):
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
244 catalog = Catalog()
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
245 catalog.add(u'foo', locations=[
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
246 ('doupy/templates/base/navmenu.inc.html.py', 60)
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
247 ])
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
248 catalog.add(u'foo', locations=[
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
249 ('doupy/templates/job-offers/helpers.html', 22)
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
250 ])
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
251 buf = StringIO()
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
252 pofile.write_po(buf, catalog, omit_header=True)
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
253 self.assertEqual('''#: doupy/templates/base/navmenu.inc.html.py:60
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
254 #: doupy/templates/job-offers/helpers.html:22
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
255 msgid "foo"
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
256 msgstr ""''', buf.getvalue().strip())
b997f09256c9 Fix for #79 (location lines wrapping at hyphens).
cmlenz
parents: 293
diff changeset
257
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
258 def test_pot_with_translator_comments(self):
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
259 catalog = Catalog()
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
260 catalog.add(u'foo', locations=[('main.py', 1)],
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
261 auto_comments=['Comment About `foo`'])
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
262 catalog.add(u'bar', locations=[('utils.py', 3)],
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
263 user_comments=['Comment About `bar` with',
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
264 'multiple lines.'])
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
265 buf = StringIO()
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
266 pofile.write_po(buf, catalog, omit_header=True)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
267 self.assertEqual('''#. Comment About `foo`
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
268 #: main.py:1
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
269 msgid "foo"
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
270 msgstr ""
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
271
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
272 # Comment About `bar` with
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
273 # multiple lines.
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
274 #: utils.py:3
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
275 msgid "bar"
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 58
diff changeset
276 msgstr ""''', buf.getvalue().strip())
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
277
192
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
278 def test_po_with_obsolete_message(self):
183
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
279 catalog = Catalog()
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
280 catalog.add(u'foo', u'Voh', locations=[('main.py', 1)])
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
281 catalog.obsolete['bar'] = Message(u'bar', u'Bahr',
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
282 locations=[('utils.py', 3)],
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
283 user_comments=['User comment'])
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
284 buf = StringIO()
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
285 pofile.write_po(buf, catalog, omit_header=True)
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
286 self.assertEqual('''#: main.py:1
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
287 msgid "foo"
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
288 msgstr "Voh"
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
289
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
290 # User comment
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
291 #~ msgid "bar"
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
292 #~ msgstr "Bahr"''', buf.getvalue().strip())
e927dffc9ab4 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 177
diff changeset
293
192
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
294 def test_po_with_multiline_obsolete_message(self):
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
295 catalog = Catalog()
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
296 catalog.add(u'foo', u'Voh', locations=[('main.py', 1)])
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
297 msgid = r"""Here's a message that covers
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
298 multiple lines, and should still be handled
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
299 correctly.
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
300 """
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
301 msgstr = r"""Here's a message that covers
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
302 multiple lines, and should still be handled
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
303 correctly.
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
304 """
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
305 catalog.obsolete[msgid] = Message(msgid, msgstr,
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
306 locations=[('utils.py', 3)])
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
307 buf = StringIO()
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
308 pofile.write_po(buf, catalog, omit_header=True)
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
309 self.assertEqual(r'''#: main.py:1
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
310 msgid "foo"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
311 msgstr "Voh"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
312
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
313 #~ msgid ""
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
314 #~ "Here's a message that covers\n"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
315 #~ "multiple lines, and should still be handled\n"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
316 #~ "correctly.\n"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
317 #~ msgstr ""
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
318 #~ "Here's a message that covers\n"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
319 #~ "multiple lines, and should still be handled\n"
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
320 #~ "correctly.\n"''', buf.getvalue().strip())
8f5805197198 Correctly write out obsolete messages spanning multiple lines. Fixes #33.
cmlenz
parents: 183
diff changeset
321
193
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
322 def test_po_with_obsolete_message_ignored(self):
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
323 catalog = Catalog()
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
324 catalog.add(u'foo', u'Voh', locations=[('main.py', 1)])
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
325 catalog.obsolete['bar'] = Message(u'bar', u'Bahr',
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
326 locations=[('utils.py', 3)],
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
327 user_comments=['User comment'])
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
328 buf = StringIO()
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
329 pofile.write_po(buf, catalog, omit_header=True, ignore_obsolete=True)
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
330 self.assertEqual('''#: main.py:1
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
331 msgid "foo"
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
332 msgstr "Voh"''', buf.getvalue().strip())
b5e58a22ebd2 Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents: 192
diff changeset
333
205
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
334 def test_po_with_previous_msgid(self):
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
335 catalog = Catalog()
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
336 catalog.add(u'foo', u'Voh', locations=[('main.py', 1)],
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
337 previous_id=u'fo')
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
338 buf = StringIO()
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
339 pofile.write_po(buf, catalog, omit_header=True, include_previous=True)
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
340 self.assertEqual('''#: main.py:1
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
341 #| msgid "fo"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
342 msgid "foo"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
343 msgstr "Voh"''', buf.getvalue().strip())
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
344
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
345 def test_po_with_previous_msgid_plural(self):
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
346 catalog = Catalog()
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
347 catalog.add((u'foo', u'foos'), (u'Voh', u'Voeh'),
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
348 locations=[('main.py', 1)], previous_id=(u'fo', u'fos'))
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
349 buf = StringIO()
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
350 pofile.write_po(buf, catalog, omit_header=True, include_previous=True)
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
351 self.assertEqual('''#: main.py:1
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
352 #| msgid "fo"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
353 #| msgid_plural "fos"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
354 msgid "foo"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
355 msgid_plural "foos"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
356 msgstr[0] "Voh"
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
357 msgstr[1] "Voeh"''', buf.getvalue().strip())
aefe4ac123a2 Minor changes to how previous msgids are processed.
cmlenz
parents: 201
diff changeset
358
251
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
359 def test_sorted_po(self):
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
360 catalog = Catalog()
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
361 catalog.add(u'bar', locations=[('utils.py', 3)],
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
362 user_comments=['Comment About `bar` with',
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
363 'multiple lines.'])
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
364 catalog.add((u'foo', u'foos'), (u'Voh', u'Voeh'),
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
365 locations=[('main.py', 1)])
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
366 buf = StringIO()
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
367 pofile.write_po(buf, catalog, sort_output=True)
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
368 value = buf.getvalue().strip()
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
369 assert '''\
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
370 # Comment About `bar` with
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
371 # multiple lines.
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
372 #: utils.py:3
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
373 msgid "bar"
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
374 msgstr ""
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
375
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
376 #: main.py:1
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
377 msgid "foo"
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
378 msgid_plural "foos"
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
379 msgstr[0] "Voh"
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
380 msgstr[1] "Voeh"''' in value
3b9d993b7aa3 added test cases for correct po/mofile sorting, following up r264
pjenvey
parents: 230
diff changeset
381 assert value.find('msgid ""') < value.find('msgid "bar"') < value.find('msgid "foo"')
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 19
diff changeset
382
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
383 def suite():
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
384 suite = unittest.TestSuite()
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
385 suite.addTest(doctest.DocTestSuite(pofile))
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
386 suite.addTest(unittest.makeSuite(ReadPoTestCase))
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
387 suite.addTest(unittest.makeSuite(WritePoTestCase))
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
388 return suite
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
389
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
390 if __name__ == '__main__':
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
391 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software