[core/output] Add initial version of i3bar output

Add output handler for i3bar protocol and add some tests for it. Right
now, it only support start and end.

see #23
This commit is contained in:
Tobi-wan Kenobi 2016-12-04 12:26:20 +01:00
parent a2c6214baa
commit 6f52825ef0
5 changed files with 59 additions and 6 deletions

View file

@ -19,7 +19,8 @@ class Engine(object):
This class connects input/output, instantiates all This class connects input/output, instantiates all
required modules and drives the "event loop" required modules and drives the "event loop"
""" """
def __init__(self, config): def __init__(self, config, output=None):
self._output = output
self._running = True self._running = True
self._modules = [] self._modules = []
self.load_modules(config.modules()) self.load_modules(config.modules())
@ -45,7 +46,10 @@ class Engine(object):
def run(self): def run(self):
"""Start the event loop""" """Start the event loop"""
self._output.start()
while self.running(): while self.running():
pass pass
self._output.stop()
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

21
bumblebee/output.py Normal file
View file

@ -0,0 +1,21 @@
# pylint: disable=R0201
"""Output classes"""
import sys
import json
class I3BarOutput(object):
"""Manage output according to the i3bar protocol"""
def __init__(self):
pass
def start(self):
"""Print start preamble for i3bar protocol"""
sys.stdout.write(json.dumps({"version": 1, "click_events": True}) + "[\n")
def stop(self):
"""Finish i3bar protocol"""
sys.stdout.write("]\n")
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
find . -name "*.py"|xargs pylint find . -name "*.py"|xargs pylint --disable=R0903

View file

@ -10,8 +10,8 @@ class TestEngine(unittest.TestCase):
self.testModule = "test" self.testModule = "test"
self.testModuleSpec = "bumblebee.modules.{}".format(self.testModule) self.testModuleSpec = "bumblebee.modules.{}".format(self.testModule)
self.testModules = [ self.testModules = [
{ "module": "test", "name": "a" }, {"module": "test", "name": "a"},
{ "module": "test", "name": "b" }, {"module": "test", "name": "b"},
] ]
def test_stop(self): def test_stop(self):
@ -27,8 +27,8 @@ class TestEngine(unittest.TestCase):
modules = self.engine.load_modules(self.testModules) modules = self.engine.load_modules(self.testModules)
self.assertEquals(len(modules), len(self.testModules)) self.assertEquals(len(modules), len(self.testModules))
self.assertEquals( self.assertEquals(
[ module.__module__ for module in modules ], [module.__module__ for module in modules],
[ self.testModuleSpec for module in modules ] [self.testModuleSpec for module in modules]
) )
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

28
tests/test_i3baroutput.py Normal file
View file

@ -0,0 +1,28 @@
# pylint: disable=C0103,C0111
import json
import unittest
import mock
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from bumblebee.output import I3BarOutput
class TestI3BarOutput(unittest.TestCase):
def setUp(self):
self.output = I3BarOutput()
self.expectedStart = json.dumps({"version": 1, "click_events": True}) + "[\n"
self.expectedStop = "]\n"
@mock.patch("sys.stdout", new_callable=StringIO)
def test_start(self, stdout):
self.output.start()
self.assertEquals(self.expectedStart, stdout.getvalue())
@mock.patch("sys.stdout", new_callable=StringIO)
def test_stop(self, stdout):
self.output.stop()
self.assertEquals(self.expectedStop, stdout.getvalue())
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4