commit 7932884d0e942fffad7f1deb80143fe5b57dcbea Author: Edmund Wong ewongbb@pw-wspx.org Date: Fri Sep 8 20:21:20 2017 +0800
add has_encoding_man() to stem.util.system --- stem/util/system.py | 22 ++++++++++++++++++++-- test/unit/manual.py | 17 +++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/stem/util/system.py b/stem/util/system.py index 47527795..53c06ac8 100644 --- a/stem/util/system.py +++ b/stem/util/system.py @@ -24,6 +24,8 @@ best-effort, providing **None** if the lookup fails. is_bsd - checks if we're running on the bsd family of operating systems is_slackware - checks if we're running on slackware
+ has_encoding_man - checks if the system's man command has --encoding=ascii available + is_available - determines if a command is available on this system is_running - determines if a given process is running size_of - provides the memory usage of an object @@ -311,6 +313,18 @@ class DaemonTask(object): conn.close()
+def has_encoding_man(): + """ + Checks if --encoding=ascii is available for man + """ + retval = True + if is_available('man'): + result = call('man --encoding=ascii man', [], error_return=True) + if 'unrecognized option' in result: + retval = False + return retval + + def is_windows(): """ Checks if we are running on Windows. @@ -1224,7 +1238,8 @@ def files_with_suffix(base_path, suffix): yield os.path.join(root, filename)
-def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = None, cwd = None, env = None): +def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = None, + cwd = None, env = None, error_return = False): """ call(command, default = UNDEFINED, ignore_exit_status = False)
@@ -1296,7 +1311,10 @@ def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = Non exit_status = process.poll()
if not ignore_exit_status and exit_status != 0: - raise OSError('%s returned exit status %i' % (command, exit_status)) + if error_return: + return stderr + else: + OSError('%s returned exit status %i' % (command, exit_status))
if stdout: return stdout.decode('utf-8', 'replace').splitlines() diff --git a/test/unit/manual.py b/test/unit/manual.py index cd850af9..9850e827 100644 --- a/test/unit/manual.py +++ b/test/unit/manual.py @@ -153,8 +153,8 @@ class TestManual(unittest.TestCase): expand our example (or add another). """
- if stem.util.system.is_mac() or stem.util.system.is_bsd() or stem.util.system.is_slackware(): - self.skipTest('(man lacks --encoding arg on OSX and BSD, #18660)') + if not stem.util.system.has_encoding_man(): + self.skipTest('(man lacks --encoding arg on OSX, BSD, and Slackware #18660)') return
manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) @@ -174,7 +174,7 @@ class TestManual(unittest.TestCase): options. Unlike most other tests this doesn't require network access. """
- if stem.util.system.is_mac() or stem.util.system.is_bsd() or stem.util.system.is_slackware(): + if not stem.util.system.has_encoding_man(): self.skipTest('(man lacks --encoding arg on OSX and BSD and Slackware, #18660)') return
@@ -202,8 +202,8 @@ class TestManual(unittest.TestCase): Check that we can save and reload manuals as a config. """
- if stem.util.system.is_mac() or stem.util.system.is_bsd(): - self.skipTest('(man lacks --encoding arg on OSX and BSD, #18660)') + if not stem.util.system.has_encoding_man(): + self.skipTest('(man lacks --encoding arg on OSX, BSD and Slackware, #18660)') return
manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) @@ -219,8 +219,8 @@ class TestManual(unittest.TestCase): Check that we can save and reload manuals as sqlite. """
- if stem.util.system.is_mac() or stem.util.system.is_bsd(): - self.skipTest('(man lacks --encoding arg on OSX and BSD, #18660)') + if not stem.util.system.has_encoding_man(): + self.skipTest('(man lacks --encoding arg on OSX, BSD, and Slackware #18660)') return
manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) @@ -297,8 +297,9 @@ class TestManual(unittest.TestCase): self.assertEqual(b'a2x output', output.getvalue()) call_mock.assert_called_once_with('a2x -f manpage /no/such/path/tor.1.txt')
- @patch('stem.util.system.is_mac', Mock(return_value = False)) + @patch('stem.util.system.has_encoding_man', Mock(return_value = True)) @patch('stem.util.system.is_bsd', Mock(return_value = False)) + @patch('stem.util.system.is_mac', Mock(return_value = False)) @patch('stem.util.system.is_slackware', Mock(return_value = False)) @patch('stem.util.system.call', Mock(side_effect = OSError('man --encoding=ascii -P cat tor returned exit status 16'))) def test_from_man_when_manual_is_unavailable(self):
tor-commits@lists.torproject.org