General Viewer


License
MIT
Install
pip install gviewer==2.0.0

Documentation

General Viewer (GViewer)

Build Status Coverage Status

Simple, Light Weight, Powerful
GViewer is a terminal UI library that depends on urwid simplified writing a tui based reporting system.
You could write a powerful terminal UI that display and operate with data as you want with just less and less code.

Installation

pip install gviewer

Run Example

There are some example in examples that provide some use cases.
You could see and run the examples.

python examples/panama.py

Usage

Data Store

StaticDataStore

Used for static data list, like log file Initiate with a list of eny type of content The content will transfer to the your defined displayer later for display

from gviewer import StaticDataStore
data_store = StaticDataStore(data)

AsyncDataStore

Used for asynchronous data list, like subscribe an zeromq publisher

def register_func(on_message):
    some_listener.on_message(on_message)

data_store = AsyncDataStore(register_func)

Displayer

Defined how you display your data from Data Store to summary/details

from gviewer import BaseDisplayer, View, Group, PropsGroup, Text, Prop

class MyDisplayer(BaseDisplayer):
    def to_summary(self, message):
        """
        return a str or text markup
        reference: http://urwid.org/manual/displayattributes.html#text-markup
        """
        return message["summary"]

    def get_views(self):
        """return an array of tuple that contains view title and a function that transform message to detail"""
        return [
            ("view1", self.view1),
            ("view2", self.view2),
        ]

    def view1(self, message):
        """return groups"""
        return View(
            [Group("title", [Text(m) for m in message["view1"]])]
        )

    def view2(self, message):
        """return groups"""
        return View(
            [PropsGroup("title", [Prop(p[0], p[1]) for p in message["view2"]])]
        )

GViewer

Main class to start the tui The constructor accept any of urwid.MainLoop arguments to intiate with custom config

from gviewer import GViewer, DisplayerContext
context = DisplayerContext(data_store, displayer)
viewer = GViewer(context)
viewer.start()

Advanced Usage

Summary Actions

Bind function to specific key to apply customize action, ex: export

from gviewer import GViewer, DisplayerContext

def custom_export(controller, message, widget, *args, **kwargs):
    with open("export", "w") as f:
        f.write(str(message))
    controller.notify("file is export")

context = DisplayerContext(data_store, displayer, actions=Actions([("a", "Custom export", custom_export)]))
viewer = GViewer(context)

View Actions

Bind function to specific key to apply customize action, ex: export

from gviewer import View, BaseDisplayer
class MyDisplayer(BaseDisplayer):
    def get_views(self):
        return [("view", self.view)]

    def view(self, message):
        return View([], actions=Actions([("a", "Custom export", self.custom_export)]))

    def custom_export(controller, message, *args, **kwargs):
        with open("export", "w") as f:
            f.write(str(message))
        controller.notify("file is export")

Built-in actions

Summary

  • /: search
  • g: top
  • G: bottom
  • x: clear current item
  • X: clear all items
  • q: quit
  • ?: help

Detail

  • /: search
  • tab: next view
  • shift+tab: prev view
  • n: search next result
  • N: search previous result
  • e: export current content to file
  • q: quit
  • ?: help

Contribution

Please feel free to create issue or create PR