From 97c2f292f759759857c6cc5879842158b12bde70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Mand=C3=A1k?= Date: Thu, 26 Nov 2015 21:14:18 +0100 Subject: [PATCH 1/2] Added options to change logfile and internet check server. --- i3pystatus/core/__init__.py | 35 +++++++++++++++++++++++++---------- i3pystatus/core/util.py | 30 ++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/i3pystatus/core/__init__.py b/i3pystatus/core/__init__.py index 9a580b5..d92d6e9 100644 --- a/i3pystatus/core/__init__.py +++ b/i3pystatus/core/__init__.py @@ -1,10 +1,11 @@ -import sys +import logging import os +import sys from threading import Thread -from i3pystatus.core.exceptions import ConfigError -from i3pystatus.core.imputil import ClassFinder from i3pystatus.core import io, util +from i3pystatus.core.exceptions import ConfigError +from i3pystatus.core.imputil import ClassFinder from i3pystatus.core.modules import Module @@ -39,17 +40,31 @@ class Status: """ The main class used for registering modules and managing I/O - :param standalone: Whether i3pystatus should read i3status-compatible input from `input_stream` - :param interval: Update interval in seconds + :param bool standalone: Whether i3pystatus should read i3status-compatible input from `input_stream`. + :param int interval: Update interval in seconds. :param input_stream: A file-like object that provides the input stream, if `standalone` is False. - :param click_events: Enable click events + :param bool click_events: Enable click events, if `standalone` is True. + :param str logfile: Path to log file that will be used by i3pystatus. + :param tuple internet_check: Address of server that will be used to check for internet connection by :py:class:`.internet`. """ - def __init__(self, standalone=False, interval=1, input_stream=sys.stdin, click_events=True): - self.modules = util.ModuleList(self, ClassFinder(Module)) + def __init__(self, standalone=False, **kwargs): self.standalone = standalone - self.click_events = click_events - if standalone: + self.click_events = kwargs.get("click_events", True) + interval = kwargs.get("interval", 1) + input_stream = kwargs.get("input_stream", sys.stdin) + if "logfile" in kwargs: + logger = logging.getLogger("i3pystatus") + for handler in logger.handlers: + logger.removeHandler(handler) + handler = logging.FileHandler(kwargs["logfile"], delay=True) + logger.addHandler(handler) + logger.setLevel(logging.CRITICAL) + if "internet_check" in kwargs: + util.internet.address = kwargs["internet_check"] + + self.modules = util.ModuleList(self, ClassFinder(Module)) + if self.standalone: self.io = io.StandaloneIO(self.click_events, self.modules, interval) if self.click_events: self.command_endpoint = CommandEndpoint( diff --git a/i3pystatus/core/util.py b/i3pystatus/core/util.py index 9bc11fd..7ed058c 100644 --- a/i3pystatus/core/util.py +++ b/i3pystatus/core/util.py @@ -335,7 +335,7 @@ def require(predicate): .. seealso:: - :py:func:`internet` + :py:class:`internet` """ @@ -351,18 +351,28 @@ def require(predicate): return decorator -def internet(): +class internet: """ - Checks for a internet connection by connecting to a Google DNS - server. + Checks for internet connection by connecting to a server. + + Used server is determined by the `address` class variable which consists of + server host name and port number. + + :rtype: bool: + + .. seealso:: + + :py:func:`require` - :returns: True if internet connection is available """ - try: - socket.create_connection(("google-public-dns-a.google.com", 53), 1).close() - return True - except OSError: - return False + address = ("google-public-dns-a.google.com", 53) + + def __new__(cls): + try: + socket.create_connection(cls.address, 1).close() + return True + except OSError: + return False def make_graph(values, lower_limit=0.0, upper_limit=100.0, style="blocks"): From 6d211f823c1acd2bbd11d82733868567e74adbba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Mand=C3=A1k?= Date: Thu, 26 Nov 2015 21:14:18 +0100 Subject: [PATCH 2/2] Added options to change logfile and internet check server. --- i3pystatus/core/__init__.py | 35 +++++++++++++++++++++++++---------- i3pystatus/core/util.py | 30 ++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/i3pystatus/core/__init__.py b/i3pystatus/core/__init__.py index 9a580b5..d92d6e9 100644 --- a/i3pystatus/core/__init__.py +++ b/i3pystatus/core/__init__.py @@ -1,10 +1,11 @@ -import sys +import logging import os +import sys from threading import Thread -from i3pystatus.core.exceptions import ConfigError -from i3pystatus.core.imputil import ClassFinder from i3pystatus.core import io, util +from i3pystatus.core.exceptions import ConfigError +from i3pystatus.core.imputil import ClassFinder from i3pystatus.core.modules import Module @@ -39,17 +40,31 @@ class Status: """ The main class used for registering modules and managing I/O - :param standalone: Whether i3pystatus should read i3status-compatible input from `input_stream` - :param interval: Update interval in seconds + :param bool standalone: Whether i3pystatus should read i3status-compatible input from `input_stream`. + :param int interval: Update interval in seconds. :param input_stream: A file-like object that provides the input stream, if `standalone` is False. - :param click_events: Enable click events + :param bool click_events: Enable click events, if `standalone` is True. + :param str logfile: Path to log file that will be used by i3pystatus. + :param tuple internet_check: Address of server that will be used to check for internet connection by :py:class:`.internet`. """ - def __init__(self, standalone=False, interval=1, input_stream=sys.stdin, click_events=True): - self.modules = util.ModuleList(self, ClassFinder(Module)) + def __init__(self, standalone=False, **kwargs): self.standalone = standalone - self.click_events = click_events - if standalone: + self.click_events = kwargs.get("click_events", True) + interval = kwargs.get("interval", 1) + input_stream = kwargs.get("input_stream", sys.stdin) + if "logfile" in kwargs: + logger = logging.getLogger("i3pystatus") + for handler in logger.handlers: + logger.removeHandler(handler) + handler = logging.FileHandler(kwargs["logfile"], delay=True) + logger.addHandler(handler) + logger.setLevel(logging.CRITICAL) + if "internet_check" in kwargs: + util.internet.address = kwargs["internet_check"] + + self.modules = util.ModuleList(self, ClassFinder(Module)) + if self.standalone: self.io = io.StandaloneIO(self.click_events, self.modules, interval) if self.click_events: self.command_endpoint = CommandEndpoint( diff --git a/i3pystatus/core/util.py b/i3pystatus/core/util.py index 9bc11fd..48774c3 100644 --- a/i3pystatus/core/util.py +++ b/i3pystatus/core/util.py @@ -335,7 +335,7 @@ def require(predicate): .. seealso:: - :py:func:`internet` + :py:class:`internet` """ @@ -351,18 +351,28 @@ def require(predicate): return decorator -def internet(): +class internet: """ - Checks for a internet connection by connecting to a Google DNS - server. + Checks for internet connection by connecting to a server. + + Used server is determined by the `address` class variable which consists of + server host name and port number. + + :rtype: bool + + .. seealso:: + + :py:func:`require` - :returns: True if internet connection is available """ - try: - socket.create_connection(("google-public-dns-a.google.com", 53), 1).close() - return True - except OSError: - return False + address = ("google-public-dns-a.google.com", 53) + + def __new__(cls): + try: + socket.create_connection(cls.address, 1).close() + return True + except OSError: + return False def make_graph(values, lower_limit=0.0, upper_limit=100.0, style="blocks"):