Make DebugStream also execute commands, not just dump them

This commit is contained in:
Kovid Goyal
2016-10-21 00:55:15 +05:30
parent 5bd728fe2f
commit 404e074d64

View File

@@ -22,11 +22,11 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from functools import wraps
import itertools import itertools
import os import os
import re import re
import sys import sys
import warnings
from collections import defaultdict from collections import defaultdict
from . import control as ctrl, escape as esc from . import control as ctrl, escape as esc
@@ -157,11 +157,6 @@ class Stream(object):
if not hasattr(screen, event): if not hasattr(screen, event):
error_message = "{0} is missing {1}".format(screen, event) error_message = "{0} is missing {1}".format(screen, event)
raise TypeError(error_message) raise TypeError(error_message)
if self.listener is not None:
warnings.warn("As of version 0.6.0 the listener queue is "
"restricted to a single element. Existing "
"listener {0} will be replaced."
.format(self.listener), DeprecationWarning)
self.listener = screen self.listener = screen
self._parser = self._parser_fsm() self._parser = self._parser_fsm()
@@ -362,9 +357,8 @@ class DebugStream(Stream):
default, which means -- debug all events). default, which means -- debug all events).
""" """
def __init__(self, *args, **kwargs): def __init__(self, screen, to=sys.stdout, only=()):
to = kwargs.pop('to', sys.stdout) stream = super(DebugStream, self)
only = kwargs.pop('only', ())
def safe_str(chunk): def safe_str(chunk):
if isinstance(chunk, bytes): if isinstance(chunk, bytes):
@@ -374,22 +368,20 @@ class DebugStream(Stream):
return chunk return chunk
def noop(*args, **kwargs): class Bugger:
pass
class Bugger(object):
def __getattr__(self, event): def __getattr__(self, event):
if only and event not in only:
return noop
@wraps(getattr(screen, event))
def inner(*args, **kwargs): def inner(*args, **kwargs):
to.write(event.upper() + " ") if not only or event in only:
to.write("; ".join(map(safe_str, args))) to.write(event.upper() + " ")
to.write(" ") to.write("; ".join(map(safe_str, args)))
to.write(", ".join("{0}: {1}".format(k, safe_str(v)) to.write(" ")
for k, v in kwargs.items())) to.write(", ".join("{0}: {1}".format(k, safe_str(v))
to.write(os.linesep) for k, v in kwargs.items()))
return inner to.write(os.linesep)
getattr(screen, event)(*args, **kwargs)
super(DebugStream, self).__init__(Bugger(), *args, **kwargs) return inner
stream.__init__(Bugger())