We were finally successful in moving the input loop
to the lower I/O layer. This means we unified the loop with it's implicit abort condition (end of stream or ^C).
This commit is contained in:
parent
6ff3e8ebf3
commit
e3829b5700
@ -39,40 +39,56 @@ class IOHandler:
|
|||||||
self.inp = inp
|
self.inp = inp
|
||||||
self.out = out
|
self.out = out
|
||||||
|
|
||||||
def write(self, message):
|
def write_line(self, message):
|
||||||
"""Unbuffered printing to stdout."""
|
"""Unbuffered printing to stdout."""
|
||||||
|
|
||||||
self.out.write(message + "\n")
|
self.out.write(message + "\n")
|
||||||
self.out.flush()
|
self.out.flush()
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
"""Interrupted respecting reader for stdin."""
|
"""Iterate over all input lines (Generator)"""
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
yield self.read_line()
|
||||||
|
except EOFError:
|
||||||
|
return
|
||||||
|
|
||||||
|
def read_line(self):
|
||||||
|
"""Interrupted respecting reader for stdin.
|
||||||
|
|
||||||
|
Raises EOFError if the end of stream has been reached"""
|
||||||
|
|
||||||
# try reading a line, removing any extra whitespace
|
|
||||||
try:
|
try:
|
||||||
line = self.inp.readline().decode("utf-8").strip()
|
line = self.inp.readline().decode("utf-8").strip()
|
||||||
# i3status sends EOF, or an empty line
|
|
||||||
if not line:
|
|
||||||
sys.exit(3)
|
|
||||||
return line
|
|
||||||
# exit on ctrl-c
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
sys.exit()
|
raise EOFError()
|
||||||
|
|
||||||
|
# i3status sends EOF, or an empty line
|
||||||
|
if not line:
|
||||||
|
raise EOFError()
|
||||||
|
return line
|
||||||
|
|
||||||
class JSONIO:
|
class JSONIO:
|
||||||
def __init__(self, io):
|
def __init__(self, io):
|
||||||
self.io = io
|
self.io = io
|
||||||
self.io.write(self.io.read())
|
self.io.write_line(self.io.read_line())
|
||||||
self.io.write(self.io.read())
|
self.io.write_line(self.io.read_line())
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
while True:
|
"""Iterate over all JSON input (Generator)"""
|
||||||
with self.read_line() as j:
|
|
||||||
|
for line in self.io.read():
|
||||||
|
with self.parse_line(line) as j:
|
||||||
yield j
|
yield j
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def read_line(self):
|
def parse_line(self, line):
|
||||||
line, prefix = self.io.read(), ""
|
"""Parse a single line of JSON and write modified JSON back.
|
||||||
|
|
||||||
|
Usage is quite simple using the usual with-Syntax."""
|
||||||
|
|
||||||
|
prefix = ""
|
||||||
|
|
||||||
# ignore comma at start of lines
|
# ignore comma at start of lines
|
||||||
if line.startswith(","):
|
if line.startswith(","):
|
||||||
@ -80,7 +96,7 @@ class JSONIO:
|
|||||||
|
|
||||||
j = json.loads(line)
|
j = json.loads(line)
|
||||||
yield j
|
yield j
|
||||||
self.io.write(prefix + json.dumps(j))
|
self.io.write_line(prefix + json.dumps(j))
|
||||||
|
|
||||||
class I3statusHandler:
|
class I3statusHandler:
|
||||||
modules = []
|
modules = []
|
||||||
@ -99,6 +115,6 @@ class I3statusHandler:
|
|||||||
module.registered(self)
|
module.registered(self)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
for j in self.io.read():
|
for j in self.io.read():
|
||||||
for module in self.modules:
|
for module in self.modules:
|
||||||
j.insert(module.position, module.output)
|
j.insert(module.position, module.output)
|
||||||
|
Loading…
Reference in New Issue
Block a user