[python-polib] Update to commit dbafdc621bf4

Ding-Yi Chen dchen at fedoraproject.org
Tue Nov 1 04:14:48 UTC 2011


commit 2af1362c258bb48e6428f70c0e25371d085850d1
Author: Ding-Yi Chen <dingyichen at gmail.com>
Date:   Tue Nov 1 14:14:33 2011 +1000

    Update to commit dbafdc621bf4

 polib-0.7.0_dbafdc621bf4.patch |  261 ++++++++++++++++++++++++++++++++++++++++
 python-polib.spec              |   12 ++-
 2 files changed, 272 insertions(+), 1 deletions(-)
---
diff --git a/polib-0.7.0_dbafdc621bf4.patch b/polib-0.7.0_dbafdc621bf4.patch
new file mode 100644
index 0000000..3917fb6
--- /dev/null
+++ b/polib-0.7.0_dbafdc621bf4.patch
@@ -0,0 +1,261 @@
+diff -r f3b365199366 docs/conf.py
+--- a/docs/conf.py	Thu Jul 14 14:34:23 2011 +0200
++++ b/docs/conf.py	Tue Nov 01 13:31:57 2011 +1000
+@@ -13,16 +13,18 @@
+ 
+ import sys, os
+ 
+ # If extensions (or modules to document with autodoc) are in another directory,
+ # add these directories to sys.path here. If the directory is relative to the
+ # documentation root, use os.path.abspath to make it absolute, like shown here.
+ sys.path.insert(0, os.path.abspath('..'))
+ 
++import polib
++
+ # -- General configuration -----------------------------------------------------
+ 
+ # If your documentation needs a minimal Sphinx version, state it here.
+ #needs_sphinx = '1.0'
+ 
+ # Add any Sphinx extension module names here, as strings. They can be extensions
+ # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+ extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode']
+@@ -43,19 +45,19 @@ master_doc = 'index'
+ project = u'polib'
+ copyright = u'2011, David Jean Louis <izimobil at gmail.com>'
+ 
+ # The version info for the project you're documenting, acts as replacement for
+ # |version| and |release|, also used in various other places throughout the
+ # built documents.
+ #
+ # The short X.Y version.
+-version = '0.6.0'
++version = polib.__version__
+ # The full version, including alpha/beta/rc tags.
+-release = '0.6.0'
++release = polib.__version__
+ 
+ # The language for content autogenerated by Sphinx. Refer to documentation
+ # for a list of supported languages.
+ #language = None
+ 
+ # There are two options for replacing |today|: either, you set today to some
+ # non-false value, then it is used:
+ #today = ''
+diff -r f3b365199366 polib.py
+--- a/polib.py	Thu Jul 14 14:34:23 2011 +0200
++++ b/polib.py	Tue Nov 01 13:31:57 2011 +1000
+@@ -1181,78 +1181,91 @@ class _POFileParser(object):
+                 self.entry_obsolete = 1
+             else:
+                 self.entry_obsolete = 0
+ 
+             # Take care of keywords like
+             # msgid, msgid_plural, msgctxt & msgstr.
+             if tokens[0] in keywords and nb_tokens > 1:
+                 line = line[len(tokens[0]):].lstrip()
++                if re.search(r'([^\\]|^)"', line[1:-1]):
++                    raise IOError('Syntax error in po file %s (line %s): '\
++                                  'unescaped double quote found' % \
++                                  (self.instance.fpath, i))
+                 self.current_token = line
+                 self.process(keywords[tokens[0]], i)
+                 continue
+ 
+             self.current_token = line
+ 
+             if tokens[0] == '#:' and nb_tokens > 1:
+                 # we are on a occurrences line
+                 self.process('OC', i)
+ 
+             elif line[:1] == '"':
+                 # we are on a continuation line
++                if re.search(r'([^\\]|^)"', line[1:-1]):
++                    raise IOError('Syntax error in po file %s (line %s): '\
++                                  'unescaped double quote found' % \
++                                  (self.instance.fpath, i))
+                 self.process('MC', i)
+ 
+             elif line[:7] == 'msgstr[':
+                 # we are on a msgstr plural
+                 self.process('MX', i)
+ 
+-            elif tokens[0] == '#,' and nb_tokens > 1:
++            elif tokens[0] == '#,' and nb_tokens >= 1:
+                 # we are on a flags line
+                 self.process('FL', i)
+ 
+             elif tokens[0] == '#':
+                 if line == '#': line += ' '
+                 # we are on a translator comment line
+                 self.process('TC', i)
+ 
+-            elif tokens[0] == '#.' and nb_tokens > 1:
++            elif tokens[0] == '#.' and nb_tokens >= 1:
+                 # we are on a generated comment line
+                 self.process('GC', i)
+ 
+             elif tokens[0] == '#|':
+                 if nb_tokens < 2:
+-                    self.process('??', i)
+-                    continue
++                    raise IOError('Syntax error in po file %s (line %s)' % \
++                                  (self.instance.fpath, i))
+ 
+                 # Remove the marker and any whitespace right after that.
+                 line = line[2:].lstrip()
+                 self.current_token = line
+ 
+                 if tokens[1].startswith('"'):
+                     # Continuation of previous metadata.
+                     self.process('MC', i)
+                     continue
+ 
+                 if nb_tokens == 2:
+                     # Invalid continuation line.
+-                    self.process('??', i)
++                    raise IOError('Syntax error in po file %s (line %s): '\
++                                  'invalid continuation line' % \
++                                  (self.instance.fpath, i))
+ 
+                 # we are on a "previous translation" comment line,
+                 if tokens[1] not in prev_keywords:
+                     # Unknown keyword in previous translation comment.
+-                    self.process('??', i)
++                    raise IOError('Syntax error in po file %s (line %s): '\
++                                  'unknown keyword %s' % \
++                                  (self.instance.fpath, i, tokens[1]))
+ 
+                 # Remove the keyword and any whitespace
+                 # between it and the starting quote.
+                 line = line[len(tokens[1]):].lstrip()
+                 self.current_token = line
+                 self.process(prev_keywords[tokens[1]], i)
+ 
+             else:
+-                self.process('??', i)
++                raise IOError('Syntax error in po file %s (line %s)' % \
++                              (self.instance.fpath, i))
+ 
+         if self.current_entry:
+             # since entries are added when another entry is found, we must add
+             # the last entry here (only if there are lines)
+             self.instance.append(self.current_entry)
+         # before returning the instance, check if there's metadata and if 
+         # so extract it in a dict
+         firstentry = self.instance[0]
+diff -r f3b365199366 tests/test_weird_occurrences.po
+--- a/tests/test_weird_occurrences.po	Thu Jul 14 14:34:23 2011 +0200
++++ b/tests/test_weird_occurrences.po	Tue Nov 01 13:31:57 2011 +1000
+@@ -9,16 +9,23 @@ msgstr ""
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "X-Generator: Pootle 1.1.0rc2\n"
+ "X-Launchpad-Export-Date: 2007-12-03 23:40+0000\n"
+ "X-Etoys-Domain: etoys\n"
+ "X-Etoys-SystemVersion: etoys3.0 of 24 February 2008 update 2029\n"
+ 
++#. Test for empty comment lines
++#. 
++#,
++#: main.c:117
++msgid "Override the default prgname"
++msgstr "Override the default prgname"
++
+ #: Balloon-Fills,BitmapFillStyle>>addFillStyleMenuItems:hand:from:
+ msgid "choose new graphic"
+ msgstr "escolher novo gráfico"
+ 
+ #: Balloon-Fills,BitmapFillStyle>>addFillStyleMenuItems:hand:from:
+ msgid "grab new graphic"
+ msgstr "agarrar novo gráfico"
+ 
+diff -r f3b365199366 tests/tests.py
+--- a/tests/tests.py	Thu Jul 14 14:34:23 2011 +0200
++++ b/tests/tests.py	Tue Nov 01 13:31:57 2011 +1000
+@@ -78,16 +78,84 @@ msgstr "bar"
+ 
+     def test_pofile_and_mofile7(self):
+         """
+         Test that encoding is ok when encoding is explicitely given.
+         """
+         po = polib.pofile('tests/test_iso-8859-15.po', encoding='iso-8859-15')
+         self.assertTrue(po.encoding == 'iso-8859-15')
+ 
++    def test_pofile_and_mofile8(self):
++        """
++        Test that weird occurrences are correctly parsed.
++        """
++        po = polib.pofile('tests/test_weird_occurrences.po')
++        self.assertEqual(len(po), 46)
++
++    def test_unescaped_double_quote1(self):
++        """
++        Test that polib reports an error when unescaped double quote is found.
++        """
++        data = r'''
++msgid "Some msgid with \"double\" quotes"
++msgid "Some msgstr with "double\" quotes"
++'''
++        try:
++            po = polib.pofile(data)
++            self.fail("Unescaped quote not detected")
++        except IOError, exc:
++            msg = 'Syntax error in po file None (line 3): unescaped double quote found'
++            self.assertEqual(str(exc), msg)
++
++    def test_unescaped_double_quote2(self):
++        """
++        Test that polib reports an error when unescaped double quote is found.
++        """
++        data = r'''
++msgid "Some msgid with \"double\" quotes"
++msgstr ""
++"Some msgstr with "double\" quotes"
++'''
++        try:
++            po = polib.pofile(data)
++            self.fail("Unescaped quote not detected")
++        except IOError, exc:
++            msg = 'Syntax error in po file None (line 4): unescaped double quote found'
++            self.assertEqual(str(exc), msg)
++
++    def test_unescaped_double_quote3(self):
++        """
++        Test that polib reports an error when unescaped double quote is found at the beginning of the string.
++        """
++        data = r'''
++msgid "Some msgid with \"double\" quotes"
++msgid ""Some msgstr with double\" quotes"
++'''
++        try:
++            po = polib.pofile(data)
++            self.fail("Unescaped quote not detected")
++        except IOError, exc:
++            msg = 'Syntax error in po file None (line 3): unescaped double quote found'
++
++    def test_unescaped_double_quote4(self):
++        """
++        Test that polib reports an error when unescaped double quote is found at the beginning of the string.
++        """
++        data = r'''
++msgid "Some msgid with \"double\" quotes"
++msgstr ""
++""Some msgstr with double\" quotes"
++'''
++        try:
++            po = polib.pofile(data)
++            self.fail("Unescaped quote not detected")
++        except IOError, exc:
++            msg = 'Syntax error in po file None (line 4): unescaped double quote found'
++            self.assertEqual(str(exc), msg)
++    
+     def test_detect_encoding1(self):
+         """
+         Test that given enconding is returned when file has no encoding defined.
+         """
+         self.assertEqual(polib.detect_encoding('tests/test_noencoding.po'), 'utf-8')
+ 
+     def test_detect_encoding2(self):
+         """
diff --git a/python-polib.spec b/python-polib.spec
index 7355d62..d052ade 100644
--- a/python-polib.spec
+++ b/python-polib.spec
@@ -4,7 +4,7 @@
 
 Name:           python-polib
 Version:        0.7.0
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        A library to parse and manage gettext catalogs
 
 Group:          Development/Languages
@@ -12,6 +12,7 @@ License:        MIT
 URL:            http://bitbucket.org/izi/polib/
 Source0:        http://bitbucket.org/izi/polib/downloads/polib-%{version}.tar.gz
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch0:         polib-%{version}_dbafdc621bf4.patch
 
 BuildArch:      noarch
 BuildRequires:  python-devel
@@ -28,6 +29,7 @@ POFile, MOFile, POEntry and MOEntry for creating new files/entries.
 
 %prep
 %setup -q -n polib-%{version}
+%patch0 -p1 -b .%{version}_dbafdc621bf4
 
 %build
 %{__python} setup.py build
@@ -45,6 +47,14 @@ rm -rf $RPM_BUILD_ROOT
 %{python_sitelib}/*
 
 %changelog
+* Tue Nov 01 2011 Ding-Yi Chen <dchen at redhat.com> - 0.7.0-2
+- Update to upstream commit dbafdc621bf4, which include following:
+  * Add check for unescaped quotes at the beginning of the string + unit tests
+  * Fixed issue #27 (polib didn't check unescaped double quote) + better error handling
+  * Fixed typos in previous commit
+  * Fixed issue #26 IOError when parsing empty comments (thanks Türker Sezer)
+  * Do not hardcode polib version in doc conf
+
 * Fri Oct 28 2011 Ding-Yi Chen <dchen at redhat.com> - 0.7.0-1
 - Correct URLs
 - Replace README with README.rst


More information about the scm-commits mailing list