From d41c142d4a68c293d4aeed119edc59cade2db9d2 Mon Sep 17 00:00:00 2001 From: Tobi-wan Kenobi Date: Sat, 10 Dec 2016 19:20:19 +0100 Subject: [PATCH] [modules/memory] Re-enable memory usage module Add module that shows RAM consumption and opens the gnome-system-monitor on click. see #23 --- bumblebee/modules/memory.py | 44 +++++++++++++++++++++++++++++++++ tests/modules/test_memory.py | 47 ++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 bumblebee/modules/memory.py create mode 100644 tests/modules/test_memory.py diff --git a/bumblebee/modules/memory.py b/bumblebee/modules/memory.py new file mode 100644 index 0000000..90515df --- /dev/null +++ b/bumblebee/modules/memory.py @@ -0,0 +1,44 @@ +# pylint: disable=C0111,R0903 + +"""Displays available RAM, total amount of RAM and percentage available. + +Parameters: + * cpu.warning : Warning threshold in % of memory used (defaults to 80%) + * cpu.critical: Critical threshold in % of memory used (defaults to 90%) +""" + +import psutil + +import bumblebee.util +import bumblebee.input +import bumblebee.output +import bumblebee.engine + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + super(Module, self).__init__(engine, config, + bumblebee.output.Widget(full_text=self.memory_usage) + ) + self._mem = psutil.virtual_memory() + engine.input.register_callback(self, button=bumblebee.input.LEFT_MOUSE, + cmd="gnome-system-monitor") + + def memory_usage(self): + used = self._mem.total - self._mem.available + return "{}/{} ({:05.02f}%)".format( + bumblebee.util.bytefmt(used), + bumblebee.util.bytefmt(self._mem.total), + self._mem.percent + ) + + def update(self, widgets): + self._mem = psutil.virtual_memory() + + def state(self, widget): + if self._mem.percent > float(self.parameter("critical", 90)): + return "critical" + if self._mem.percent > float(self.parameter("warning", 80)): + return "warning" + return None + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 diff --git a/tests/modules/test_memory.py b/tests/modules/test_memory.py new file mode 100644 index 0000000..4533357 --- /dev/null +++ b/tests/modules/test_memory.py @@ -0,0 +1,47 @@ +# pylint: disable=C0103,C0111 + +import json +import unittest +import mock + +import bumblebee.input +from bumblebee.input import I3BarInput +from bumblebee.modules.memory import Module +from tests.util import MockEngine, MockConfig, assertPopen, assertMouseEvent, assertStateContains + +class VirtualMemory(object): + def __init__(self, percent): + self.percent = percent + +class TestMemoryModule(unittest.TestCase): + def setUp(self): + self.engine = MockEngine() + self.engine.input = I3BarInput() + self.engine.input.need_event = True + self.config = MockConfig() + self.module = Module(engine=self.engine, config={ "config": self.config }) + + @mock.patch("select.select") + @mock.patch("subprocess.Popen") + @mock.patch("sys.stdin") + def test_leftclick(self, mock_input, mock_output, mock_select): + assertMouseEvent(mock_input, mock_output, mock_select, self.engine, + self.module, bumblebee.input.LEFT_MOUSE, + "gnome-system-monitor" + ) + + @mock.patch("psutil.virtual_memory") + def test_warning(self, mock_vmem): + self.config.set("memory.critical", "80") + self.config.set("memory.warning", "70") + mock_vmem.return_value = VirtualMemory(75) + assertStateContains(self, self.module, "warning") + + @mock.patch("psutil.virtual_memory") + def test_critical(self, mock_vmem): + self.config.set("memory.critical", "80") + self.config.set("memory.warning", "70") + mock_vmem.return_value = VirtualMemory(85) + assertStateContains(self, self.module, "critical") + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4