jenkins-bot has submitted this change and it was merged.

Change subject: pywikibot.tools: Raise error if bz2 not found
......................................................................


pywikibot.tools: Raise error if bz2 not found

bz2 is required in pywikibot to open compressed files. But,
sometimes python is not compiled with bz2. This causes pywikibot
to fail while it is being imported.

This commit shows a warning in such cases and tries to use
bz2file as an alternative. If both are not found, it raises an
error lazily (i.e. only when bz2 is needed to open a compressed
file).

Bug: T123092
Change-Id: Iace28a5b356cff19118983fd089770c75a1b4dff
---
M pywikibot/tools/__init__.py
M requirements.txt
M setup.py
M tests/tools_tests.py
4 files changed, 49 insertions(+), 3 deletions(-)

Approvals:
  John Vandenberg: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/pywikibot/tools/__init__.py b/pywikibot/tools/__init__.py
index c2c5bba..0c5bcee 100644
--- a/pywikibot/tools/__init__.py
+++ b/pywikibot/tools/__init__.py
@@ -8,7 +8,6 @@
 from __future__ import absolute_import, print_function, unicode_literals
 __version__ = '$Id$'
 
-import bz2
 import collections
 import gzip
 import inspect
@@ -38,6 +37,15 @@
 
 from pywikibot.logging import debug
 
+try:
+    import bz2
+except ImportError as bz2_import_error:
+    try:
+        import bz2file as bz2
+        warn('package bz2 was not found; using bz2file', ImportWarning)
+    except ImportError:
+        warn('package bz2 and bz2file were not found', ImportWarning)
+        bz2 = bz2_import_error
 
 if PYTHON_VERSION < (3, 5):
     # although deprecated in 3 completely no message was emitted until 3.5
@@ -988,6 +996,8 @@
             extension = ''
 
     if extension == 'bz2':
+        if isinstance(bz2, ImportError):
+            raise bz2
         return wrap(bz2.BZ2File(filename, mode), 1)
     elif extension == 'gz':
         return wrap(gzip.open(filename, mode), 0)
diff --git a/requirements.txt b/requirements.txt
index 1e6945e..3658030 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -91,3 +91,8 @@
 
 # scripts/weblinkchecker.py
 memento_client>=0.5.1
+
+# tools/__init__.py
+# pywikibot prefers using the inbuilt bz2 module if python was compiled with
+# bz2 support. But if it wasn't, bz2file is used instead.
+# bz2file
diff --git a/setup.py b/setup.py
index f56eab6..97f121a 100644
--- a/setup.py
+++ b/setup.py
@@ -41,7 +41,7 @@
 if not python_is_supported():
     raise RuntimeError(versions_required_message % sys.version)
 
-test_deps = []
+test_deps = ['bz2file']
 
 dependencies = ['requests']
 
@@ -141,6 +141,12 @@
 
     script_deps['data_ingestion.py'] = extra_deps['csv']
 
+try:
+    import bz2  # noqa: unused import
+except ImportError:
+    # Use bz2file if the python is not compiled with bz2 support.
+    dependencies.append('bz2file')
+
 # Some of the ui_tests depend on accessing the console window's menu
 # to set the console font and copy and paste, achieved using pywinauto
 # which depends on pywin32.
diff --git a/tests/tools_tests.py b/tests/tools_tests.py
index 2d0935e..ed039b5 100644
--- a/tests/tools_tests.py
+++ b/tests/tools_tests.py
@@ -20,7 +20,9 @@
 from pywikibot import tools
 
 from tests import join_xml_data_path
-from tests.aspects import unittest, DeprecationTestCase, TestCase, 
MetaTestCaseClass
+from tests.aspects import (
+    unittest, require_modules, DeprecationTestCase, TestCase, MetaTestCaseClass
+)
 from tests.utils import expected_failure_if, add_metaclass
 
 
@@ -106,6 +108,29 @@
         self.assertEqual(self._get_content(self.base_file + '.bz2', 
use_extension=False),
                          self.original_content)
 
+    @require_modules('bz2file')
+    def test_open_archive_with_bz2file(self):
+        """Test open_archive when bz2file library."""
+        old_bz2 = tools.bz2
+        try:
+            tools.bz2 = __import__('bz2file')
+            self.assertEqual(self._get_content(self.base_file + '.bz2'),
+                             self.original_content)
+            self.assertEqual(self._get_content(self.base_file + '.bz2',
+                                               use_extension=False),
+                             self.original_content)
+        finally:
+            tools.bz2 = old_bz2
+
+    def test_open_archive_without_bz2(self):
+        """Test open_archive when bz2 and bz2file are not available."""
+        old_bz2 = tools.bz2
+        try:
+            tools.bz2 = ImportError()
+            self.assertRaises(ImportError, self._get_content, self.base_file + 
'.bz2')
+        finally:
+            tools.bz2 = old_bz2
+
     def test_open_archive_gz(self):
         """Test open_archive with gz compressor in the standard library."""
         self.assertEqual(self._get_content(self.base_file + '.gz'), 
self.original_content)

-- 
To view, visit https://gerrit.wikimedia.org/r/277207
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iace28a5b356cff19118983fd089770c75a1b4dff
Gerrit-PatchSet: 9
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: AbdealiJK <abdealikoth...@gmail.com>
Gerrit-Reviewer: AbdealiJK <abdealikoth...@gmail.com>
Gerrit-Reviewer: John Vandenberg <jay...@gmail.com>
Gerrit-Reviewer: Mpaa <mpaa.w...@gmail.com>
Gerrit-Reviewer: XZise <commodorefabia...@gmx.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
Pywikibot-commits mailing list
Pywikibot-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits

Reply via email to