From 928c37a97239191dc3f7ac329beccaf651a4da8c Mon Sep 17 00:00:00 2001 From: Tobias Witek Date: Sun, 23 Jun 2019 16:51:28 +0200 Subject: [PATCH] [core+tests] Improved poll handling - mock poll instead of epoll - increase timeout for poll (1ms is a lot of system load for nothing) --- bumblebee/input.py | 10 +++++----- bumblebee/modules/datetimetz.py | 23 ++++++++++++++++------- tests/mocks.py | 10 +++++----- tests/test_i3barinput.py | 6 +++--- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/bumblebee/input.py b/bumblebee/input.py index cbc4150..710589e 100644 --- a/bumblebee/input.py +++ b/bumblebee/input.py @@ -25,15 +25,15 @@ def is_terminated(): def read_input(inp): """Read i3bar input and execute callbacks""" - epoll = select.poll() - epoll.register(sys.stdin.fileno()) + poll = select.poll() + poll.register(sys.stdin.fileno(), select.POLLIN) log.debug("starting click event processing") while inp.running: if is_terminated(): return try: - events = epoll.poll(1) + events = poll.poll(1000) except Exception: continue for fileno, event in events: @@ -52,8 +52,8 @@ def read_input(inp): except ValueError as e: log.debug("failed to parse event: {}".format(e)) log.debug("exiting click event processing") - epoll.unregister(sys.stdin.fileno()) - epoll.close() + poll.unregister(sys.stdin.fileno()) + poll.close() inp.has_event = True inp.clean_exit = True diff --git a/bumblebee/modules/datetimetz.py b/bumblebee/modules/datetimetz.py index e546ace..e298249 100644 --- a/bumblebee/modules/datetimetz.py +++ b/bumblebee/modules/datetimetz.py @@ -17,8 +17,11 @@ Parameters: from __future__ import absolute_import import datetime import locale -import pytz -import tzlocal +try: + import pytz + import tzlocal +except: + pass import bumblebee.input import bumblebee.output import bumblebee.engine @@ -40,7 +43,10 @@ class Module(bumblebee.engine.Module): engine.input.register_callback(self, button=bumblebee.input.LEFT_MOUSE, cmd=self.next_tz) engine.input.register_callback(self, button=bumblebee.input.RIGHT_MOUSE, cmd=self.prev_tz) self._fmt = self.parameter("format", default_format(self.name)) - self._timezones = self.parameter("timezone", tzlocal.get_localzone().zone).split(",") + try: + self._timezones = self.parameter("timezone", tzlocal.get_localzone().zone).split(",") + except: + self._timezones = "" self._current_tz = 0 l = locale.getdefaultlocale() @@ -54,10 +60,13 @@ class Module(bumblebee.engine.Module): def get_time(self, widget): try: - tz = pytz.timezone(self._timezones[self._current_tz].strip()) - retval = datetime.datetime.now(tz=tzlocal.get_localzone()).astimezone(tz).strftime(self._fmt) - except pytz.exceptions.UnknownTimeZoneError: - retval = "[Unknown timezone: {}]".format(self._timezones[self._current_tz].strip()) + try: + tz = pytz.timezone(self._timezones[self._current_tz].strip()) + retval = datetime.datetime.now(tz=tzlocal.get_localzone()).astimezone(tz).strftime(self._fmt) + except pytz.exceptions.UnknownTimeZoneError: + retval = "[Unknown timezone: {}]".format(self._timezones[self._current_tz].strip()) + except: + retval = "[n/a]" enc = locale.getpreferredencoding() if hasattr(retval, "decode"): diff --git a/tests/mocks.py b/tests/mocks.py index f5be753..38f1583 100644 --- a/tests/mocks.py +++ b/tests/mocks.py @@ -14,7 +14,7 @@ def rand(cnt): return "".join(random.choice("abcdefghijklmnopqrstuvwxyz0123456789") for i in range(cnt)) def setup_test(test, Module): - test._stdin, test._select, test.stdin, test.select = epoll_mock("bumblebee.input") + test._stdin, test._select, test.stdin, test.select = poll_mock("bumblebee.input") test.popen = MockPopen() @@ -33,19 +33,19 @@ def teardown_test(test): test._select.stop() test.popen.cleanup() -def epoll_mock(module=""): +def poll_mock(module=""): if len(module) > 0: module = "{}.".format(module) stdin = mock.patch("{}sys.stdin".format(module)) select = mock.patch("{}select".format(module)) - epoll = mock.Mock() + poll = mock.Mock() stdin_mock = stdin.start() select_mock = select.start() stdin_mock.fileno.return_value = 1 - select_mock.epoll.return_value = epoll - epoll.poll.return_value = [(stdin_mock.fileno.return_value, 100)] + select_mock.poll.return_value = poll + poll.poll.return_value = [(stdin_mock.fileno.return_value, 100)] return stdin, select, stdin_mock, select_mock diff --git a/tests/test_i3barinput.py b/tests/test_i3barinput.py index 6852f97..23ac566 100644 --- a/tests/test_i3barinput.py +++ b/tests/test_i3barinput.py @@ -20,10 +20,10 @@ class TestI3BarInput(unittest.TestCase): self.popen = mocks.MockPopen() self.stdin.fileno.return_value = 1 - epoll = mock.Mock() - self.select.epoll.return_value = epoll + poll = mock.Mock() + self.select.poll.return_value = poll - epoll.poll.return_value = [(self.stdin.fileno.return_value, 2)] + poll.poll.return_value = [(self.stdin.fileno.return_value, 2)] self.anyModule = mock.Mock() self.anyModule.id = mocks.rand(10)