from babel.messages.catalog import Catalog, Message
from babel.util import wraptext
+from babel._compat import text_type
__all__ = ['read_po', 'write_po']
:param string: the string to unescape
:return: the unescaped string
- :rtype: `str` or `unicode`
"""
def replace_escapes(match):
m = match.group(1)
for lineno, line in enumerate(fileobj.readlines()):
line = line.strip()
- if not isinstance(line, unicode):
+ if not isinstance(line, text_type):
line = line.decode(catalog.charset)
if line.startswith('#'):
in_msgid[0] = in_msgstr[0] = False
:param string: the string to escape
:return: the escaped string
- :rtype: `str` or `unicode`
"""
return '"%s"' % string.replace('\\', '\\\\') \
.replace('\t', '\\t') \
:param width: the maximum line width; use `None`, 0, or a negative number
to completely disable line wrapping
:return: the normalized string
- :rtype: `unicode`
"""
if width and width > 0:
prefixlen = len(prefix)
<Message...>
>>> catalog.add((u'bar', u'baz'), locations=[('main.py', 3)])
<Message...>
- >>> from StringIO import StringIO
- >>> buf = StringIO()
+ >>> from io import BytesIO
+ >>> buf = BytesIO()
>>> write_po(buf, catalog, omit_header=True)
>>> print buf.getvalue()
#: main.py:1
return normalize(key, prefix=prefix, width=width)
def _write(text):
- if isinstance(text, unicode):
+ if isinstance(text, text_type):
text = text.encode(catalog.charset, 'backslashreplace')
fileobj.write(text)
from babel.messages.catalog import Catalog, Message
from babel.messages import pofile
from babel.util import FixedOffsetTimezone
-from babel._compat import StringIO
+from babel._compat import StringIO, BytesIO
class ReadPoTestCase(unittest.TestCase):
self.assertEqual('Menu', message.context)
# And verify it pass through write_po
- out_buf = StringIO()
+ out_buf = BytesIO()
pofile.write_po(out_buf, catalog, omit_header=True)
assert out_buf.getvalue().strip() == buf.getvalue().strip(), \
out_buf.getvalue()
self.assertEqual('Mannu', message.context)
# And verify it pass through write_po
- out_buf = StringIO()
+ out_buf = BytesIO()
pofile.write_po(out_buf, catalog, omit_header=True)
assert out_buf.getvalue().strip() == buf.getvalue().strip(), out_buf.getvalue()
catalog = Catalog()
catalog.add(u'foo', locations=[('main.py', 1)])
catalog.add(u'foo', locations=[('utils.py', 3)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
self.assertEqual('''#: main.py:1 utils.py:3
msgid "foo"
def test_write_po_file_with_specified_charset(self):
catalog = Catalog(charset='iso-8859-1')
catalog.add('foo', u'äöü', locations=[('main.py', 1)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=False)
po_file = buf.getvalue().strip()
assert r'"Content-Type: text/plain; charset=iso-8859-1\n"' in po_file
catalog = Catalog()
catalog.add(u'foo', auto_comments=['A comment'])
catalog.add(u'foo', auto_comments=['A comment'])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
- self.assertEqual('''#. A comment
+ self.assertEqual(b'''#. A comment
msgid "foo"
msgstr ""''', buf.getvalue().strip())
"""
catalog = Catalog()
catalog.add(text, locations=[('main.py', 1)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, no_location=True, omit_header=True,
width=42)
- self.assertEqual(r'''msgid ""
-"Here's some text where\n"
+ self.assertEqual(b'''msgid ""
+"Here's some text where\\n"
"white space and line breaks matter, and"
-" should\n"
-"\n"
-"not be removed\n"
-"\n"
+" should\\n"
+"\\n"
+"not be removed\\n"
+"\\n"
msgstr ""''', buf.getvalue().strip())
def test_wrap_long_lines_with_long_word(self):
"""
catalog = Catalog()
catalog.add(text, locations=[('main.py', 1)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, no_location=True, omit_header=True,
width=32)
- self.assertEqual(r'''msgid ""
-"Here's some text that\n"
+ self.assertEqual(b'''msgid ""
+"Here's some text that\\n"
"includesareallylongwordthatmightbutshouldnt"
" throw us into an infinite "
-"loop\n"
+"loop\\n"
msgstr ""''', buf.getvalue().strip())
def test_wrap_long_lines_in_header(self):
"""
catalog = Catalog(project='AReallyReallyLongNameForAProject',
revision_date=datetime(2007, 4, 1))
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog)
- self.assertEqual('''\
+ self.assertEqual(b'''\
# Translations template for AReallyReallyLongNameForAProject.
# Copyright (C) 2007 ORGANIZATION
# This file is distributed under the same license as the
catalog.add(u'foo', locations=[
('doupy/templates/job-offers/helpers.html', 22)
])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
- self.assertEqual('''#: doupy/templates/base/navmenu.inc.html.py:60
+ self.assertEqual(b'''#: doupy/templates/base/navmenu.inc.html.py:60
#: doupy/templates/job-offers/helpers.html:22
msgid "foo"
msgstr ""''', buf.getvalue().strip())
catalog.add("Pretty dam long message id, which must really be big "
"to test this wrap behaviour, if not it won't work.",
locations=[("fake.py", n) for n in range(1, 30)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, width=None, omit_header=True)
- self.assertEqual("""\
+ self.assertEqual(b"""\
#: fake.py:1 fake.py:2 fake.py:3 fake.py:4 fake.py:5 fake.py:6 fake.py:7
#: fake.py:8 fake.py:9 fake.py:10 fake.py:11 fake.py:12 fake.py:13 fake.py:14
#: fake.py:15 fake.py:16 fake.py:17 fake.py:18 fake.py:19 fake.py:20 fake.py:21
msgstr ""
""", buf.getvalue().lower())
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, width=100, omit_header=True)
- self.assertEqual("""\
+ self.assertEqual(b"""\
#: fake.py:1 fake.py:2 fake.py:3 fake.py:4 fake.py:5 fake.py:6 fake.py:7 fake.py:8 fake.py:9 fake.py:10
#: fake.py:11 fake.py:12 fake.py:13 fake.py:14 fake.py:15 fake.py:16 fake.py:17 fake.py:18 fake.py:19
#: fake.py:20 fake.py:21 fake.py:22 fake.py:23 fake.py:24 fake.py:25 fake.py:26 fake.py:27 fake.py:28
catalog.add(u'bar', locations=[('utils.py', 3)],
user_comments=['Comment About `bar` with',
'multiple lines.'])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
- self.assertEqual('''#. Comment About `foo`
+ self.assertEqual(b'''#. Comment About `foo`
#: main.py:1
msgid "foo"
msgstr ""
catalog.obsolete['bar'] = Message(u'bar', u'Bahr',
locations=[('utils.py', 3)],
user_comments=['User comment'])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
- self.assertEqual('''#: main.py:1
+ self.assertEqual(b'''#: main.py:1
msgid "foo"
msgstr "Voh"
"""
catalog.obsolete[msgid] = Message(msgid, msgstr,
locations=[('utils.py', 3)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True)
- self.assertEqual(r'''#: main.py:1
+ self.assertEqual(b'''#: main.py:1
msgid "foo"
msgstr "Voh"
#~ msgid ""
-#~ "Here's a message that covers\n"
-#~ "multiple lines, and should still be handled\n"
-#~ "correctly.\n"
+#~ "Here's a message that covers\\n"
+#~ "multiple lines, and should still be handled\\n"
+#~ "correctly.\\n"
#~ msgstr ""
-#~ "Here's a message that covers\n"
-#~ "multiple lines, and should still be handled\n"
-#~ "correctly.\n"''', buf.getvalue().strip())
+#~ "Here's a message that covers\\n"
+#~ "multiple lines, and should still be handled\\n"
+#~ "correctly.\\n"''', buf.getvalue().strip())
def test_po_with_obsolete_message_ignored(self):
catalog = Catalog()
catalog.obsolete['bar'] = Message(u'bar', u'Bahr',
locations=[('utils.py', 3)],
user_comments=['User comment'])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True, ignore_obsolete=True)
- self.assertEqual('''#: main.py:1
+ self.assertEqual(b'''#: main.py:1
msgid "foo"
msgstr "Voh"''', buf.getvalue().strip())
catalog = Catalog()
catalog.add(u'foo', u'Voh', locations=[('main.py', 1)],
previous_id=u'fo')
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True, include_previous=True)
- self.assertEqual('''#: main.py:1
+ self.assertEqual(b'''#: main.py:1
#| msgid "fo"
msgid "foo"
msgstr "Voh"''', buf.getvalue().strip())
catalog = Catalog()
catalog.add((u'foo', u'foos'), (u'Voh', u'Voeh'),
locations=[('main.py', 1)], previous_id=(u'fo', u'fos'))
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, omit_header=True, include_previous=True)
- self.assertEqual('''#: main.py:1
+ self.assertEqual(b'''#: main.py:1
#| msgid "fo"
#| msgid_plural "fos"
msgid "foo"
'multiple lines.'])
catalog.add((u'foo', u'foos'), (u'Voh', u'Voeh'),
locations=[('main.py', 1)])
- buf = StringIO()
+ buf = BytesIO()
pofile.write_po(buf, catalog, sort_output=True)
value = buf.getvalue().strip()
- assert '''\
+ assert b'''\
# Comment About `bar` with
# multiple lines.
#: utils.py:3
assert value.find('msgid ""') < value.find('msgid "bar"') < value.find('msgid "foo"')
def test_silent_location_fallback(self):
- buf = StringIO('''\
+ buf = BytesIO(b'''\
#: broken_file.py
msgid "missing line number"
msgstr ""