Source code for wishbone.module.stdout

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#  Copyright 2018 Jelle Smet <>
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  GNU General Public License for more details.
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.

from gevent import monkey; monkey.patch_all()
from wishbone.module import OutputModule
from os import getpid
from colorama import init, Fore, Back, Style
import sys
import re
from gevent.fileobject import FileObjectThread

class Format():

    def __init__(self, selection, counter, pid):
        self.selection = selection
        if counter:
            self.counter = self.__returnCounter
            self.counter = self.__returnNoCounter
        if pid:
            self.pid_value = getpid()
   = self.__returnPid
   = self.__returnNoPid

    def do(self, data):

    def __returnCounter(self, data):
        self.countervalue += 1
        return "%s - %s" % (self.countervalue, data)

    def __returnNoCounter(self, data):
        return data

    def __returnNoPid(self, data):
        return data

    def __returnPid(self, data):
        return "PID-%s: %s" % (self.pid_value, data)

[docs]class STDOUT(OutputModule): ''' Prints event data to STDOUT. Prints incoming events to STDOUT. When <complete> is True, the complete event including headers is printed to STDOUT. You can optionally define the colors used. Parameters:: - background_color(str)("RESET") | The background color. | Valid values: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET - colorize(bool)(False) | When True all STDOUT output is wrapped in between ANSI color | escape sequences defined by `foreground_color`, `background_color`, | `color_style`. - color_style(str)("NORMAL") | The coloring style to use | Valid values: DIM, NORMAL, BRIGHT - counter(bool)(False) | Puts an incremental number for each event in front | of each event. - foreground_color(str)("WHITE") | The foreground color. | Valid values: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE - native_events(bool)(False) | If True, outgoing events are native events. - parallel_streams(int)(1) | The number of outgoing parallel data streams. - payload(str)(None) | The string to submit. | If defined takes precedence over `selection`. - pid(bool)(False) | Includes the pid of the process producing the output. - prefix(str)("")* | Puts the prefix in front of each printed event. - selection(str)(None) | The event key to submit. | If ``None`` the complete event is selected. Queues:: - inbox | Incoming events. ''' def __init__(self, actor_config, selection=None, payload=None, native_events=False, parallel_streams=1, counter=False, prefix="", pid=False, colorize=False, foreground_color="WHITE", background_color="RESET", color_style="NORMAL"): OutputModule.__init__(self, actor_config) self.__validateInput(foreground_color, background_color, color_style) self.pool.createQueue("inbox") self.registerConsumer(self.consume, "inbox") self.ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]') def preHook(self): self.format = Format( self.kwargs.selection, self.kwargs.counter, ) if self.kwargs.colorize: init(autoreset=True) self.getString = self.__stringColor else: self.getString = self.__stringNoColor self.f = FileObjectThread(sys.stdout) def consume(self, event): data = self.encode( self.getDataToSubmit( event ) ) output = self.getString( getattr(Fore, event.kwargs.foreground_color), getattr(Back, event.kwargs.background_color), getattr(Style, event.kwargs.color_style), event.kwargs.prefix, ) self.f.write(output) # def postHook(self): # self.f.close() def __validateInput(self, f, b, s): if f not in ["BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE"]: raise Exception("Foreground value is not correct.") if b not in ["BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE", "RESET"]: raise Exception("Background value is not correct.") if s not in ["DIM", "NORMAL", "BRIGHT"]: raise Exception("Style value is not correct.") def __stringColor(self, f, b, s, p, d): return "%s%s%s%s%s\n" % ( f, b, s, p, ) def __stringNoColor(self, f, b, s, p, d): d = self.ansi_escape.sub('', str(d)) return "%s%s\n" % ( p, )