General Viewer (GViewer)
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