gulik/doc/man/gulik.1

1184 lines
40 KiB
Groff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.\" Man page generated from reStructuredText.
.
.TH "GULIK" "1" "Feb 01, 2019" "0.0.0.2" "gulik"
.SH NAME
gulik \- gulik Documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.sp
\fBNOTE:\fP
.INDENT 0.0
.INDENT 3.5
This documentation is still a work in progress and as such subject
to sudden changes, cataclysms and various other FNORDs. The software it
describes is still in alpha and may cause undue frustration if not taken
in moderation.
.UNINDENT
.UNINDENT
[image]
.nf
This is ST. GULIK. He is the Messenger of the Goddess.
A different age from ours called him Hermes.
Many people called him by many names.
He is a Roach.
.fi
.sp
.SH QUICKSTART
.SS Install!
.nf
\fB[pkg|apt|dnf|fnord] install gtk3\fP
\fBpip[\-3.6] install \-\-user https://rnd.phryk.net/phryk\-evil\-mad\-sciences\-llc/gulik\fP
.fi
.sp
.SS Run!
.sp
\fBgulik\fP
.SS Done!
.sp
That\(aqs literally everything needed to get \fBgulik\fP to run.
If you want to go deeper, you can…
.SS Configure!
.sp
\fB$EDITOR ~/.config/gulik/config.py\fP
.sp
See also: \fI\%Configuration file\fP\&.
.SH DEFINITIONAL BULLSHIT
.sp
\fBgulik\fP is a highly configurable graphical system monitor.
.sp
\fBgulik\fP is a framework for custom graphical system monitors.
.sp
Both of these statements are true in some sense, false in some sense,
meaningless in some sense, true and false in some sense, true and meaningless
in some sense, false and meaningless in some sense and true and false and
meaningless in some sense.
.sp
This incarnation of our most holy saint \fBgulik\fP is software licensed
under the GPLv3 license, see \fBCOPYING\fP for more details.
.nf
The official git repository for \fBgulik\fP can be found at:
\fI\%https://rnd.phryk.net/phryk\-evil\-mad\-sciences\-llc/gulik/\fP
.fi
.sp
.sp
The PNG \fBgulik\fP logo is based on a nice public domain trace of the sacred
roach crafted by toa267 who is definitely not a cabbage.
.SH COMPATIBILITY AND DEPENDENCIES
.sp
\fBgulik\fP should skitter just fine on FreeBSD and the Linuxoids.
It will probably™ crawl into problems on OSX and other BSDs, but
\fI\%give us a holler\fP
if it doesn\(aqt run on your *nix flavor of choice and you\(aqre willing
to do some testing.
.sp
All bets are off on Windows®™ʷᵗᶠ unless someone else is willing to do a PR,
which we expect will be a long march through the valley of pain that we do not
wish upon anyone.
.sp
\fBgulik\fP runs only on python 3.6 or newer.
All python dependencies are noted in \fBsetup.py\fP, ready for use in pip.
.sp
The only other dependency is gtk3. It does run with X11 and \fIshould\fP run
with wayland, but the latter hasn\(aqt been tested.
.sp
To get partial transparency working (on X11) you need to have a compositing
manager like \fBxcompmgr\fP running.
.SH INSTALLATION
.nf
You can use pip to install \fBgulik\fP and all python dependencies in one go:
\fBpip install \-\-user git+https://rnd.phryk.net/phryk\-evil\-mad\-sciences\-llc/gulik/\fP
.fi
.sp
.sp
If you insist on manual installation, just clone the repository and copy the
\fBgulik\fP subdirectory into your \fBsite\-packages\fP directory and \fBbin/gulik\fP
to a directory in your \fB$PATH\fP\&.
.sp
The master branch of the repository always holds the most current release.
.SH RUNNING
.sp
You run \fBgulik\fP simply by running the \fBgulik\fP executable that comes with
the installation.
.SH CONFIGURATION AND CUSTOMIZATION
.SS Default behavior
.sp
By default, \fBgulik\fP will occupy a 200 pixel wide area over the full height
of the screen, placed at the left border of it and fill it with a few
\fI\%visualizer\fPs to grant you a good overview of what\(aqs happening on
your system.
.sp
It will use a black/white/green color scheme with a hue\-rotation palette
ranging from lime green to magenta\-ish pink and try to use the League of
Movable Type font \fI\%Orbitron\fP
which we very much recommend you install to get the right dystopian vibe.
.SS Configuration file
.sp
You can modify the settings for \fBgulik\fP by creating a configuration file
at \fB~/.config/gulik/config.py\fP\&. This file, as it\(aqs name suggests, is a
python code file. \fBgulik\fP will import and \fBexec()\fP it, loading all
\fBUPPERCASE\fP variables into its configuration.
.SS Lock and reload
.sp
When \fBgulik\fP is running, you can send \fBSIGUSR1\fP to its main process
at any time to tell it to reload the configuration file and apply its
settings. If your configuration file is broken, \fBgulik\fP will keep
running with the previous settings.
.sp
Sending the signal is currently a bit clunky, as you\(aqll have to do
something like: \fBkill \-s SIGUSR1 \(gapgrep \-f \(aqpython3.6.*gulik$\(aq\(ga\fP
since python applications always have the process name of the python
interpreter.
.SS Explaining ALL THE CONFIGURATION OPTIONS (not really, tho)
.INDENT 0.0
.IP \(bu 2
\fBFPS\fP (\fBint\fP or \fBfloat\fP): Frames Per Second; How often to redraw the window (and update system data). Default value: \fB1\fP
.IP \(bu 2
\fBWIDTH\fP (\fBint\fP): The width of the window in pixels. Default value: \fB200\fP
.IP \(bu 2
\fBHEIGHT\fP (\fBint\fP): The height of the window in pixels. Default value: \fBGdk.Screen().get_default().get_height()\fP
.IP \(bu 2
\fBX\fP (\fBint\fP): X coordinate of the windows top left corner. Default value: \fB0\fP
.IP \(bu 2
\fBY\fP (\fBint\fP): Y coordinate of the windows top left corner. Default value: \fB0\fP
.IP \(bu 2
\fBNETDATA_HOSTS\fP (\fBlist\fP): \fI\%netdata\fP hosts to connect to. Hosts as hostnames or \fB(host, port)\fP tuples. Default value: \fB[]\fP
.IP \(bu 2
\fBNETDATA_RETRY\fP (\fBint\fP or \fBfloat\fP): How long a defective \fBNetdataMonitor\fP will wait before retrying to contact the \fBnetdata\fP server, in seconds. Default value: \fB5\fP
.IP \(bu 2
\fBBSD_ACCURATE_MEMORY\fP (\fBbool\fP): Use accurate but expensive memory data collection on BSD. Default value: \fBFalse\fP
.IP \(bu 2
\fBMARGIN\fP (\fBint\fP or \fBfloat\fP): Margin around all \fBVisualizer\fPs. Default value: \fB5\fP
.IP \(bu 2
\fBPADDING\fP (\fBint\fP or \fBfloat\fP): Padding around all \fBVisualizer\fPs. Default value: \fB5\fP
.IP \(bu 2
\fBFONT\fP (\fBstr\fP): Font family to use in captions, legends and the like. Default value: \fB"Orbitron"\fP
.IP \(bu 2
\fBFONT_WEIGHT\fP (\fBstr\fP): Font weight. Default value: \fB"Light"\fP
.IP \(bu 2
\fBFONT_SIZE\fP (\fBint\fP or \fBfloat\fP): Font size in pixels. Default value: \fB10\fP
.IP \(bu 2
\fBCOLOR_WINDOW_BACKGROUND\fP (\fBColor\fP): Background color of the window. Default value: \fBColor(0.05, 0.05, 0.05, 0.8)\fP
.IP \(bu 2
\fBCOLOR_BACKGROUND\fP (\fBColor\fP): Background color for \fBVisualizer\fPs. Default value: \fBColor(1,1,1, 0.1)\fP
.IP \(bu 2
\fBCOLOR_FOREGROUND\fP (\fBColor\fP): Foreground color. This is used as base color for most \fI\%palette\fPs. Default value: \fBColor(0.5, 1, 0, 0.6)\fP
.IP \(bu 2
\fBCOLOR_CAPTION\fP (\fBColor\fP): Text color for captions. Default value: \fBColor(1,1,1, 0.6)\fP
.IP \(bu 2
\fBPALETTE\fP (\fBfunction\fP): The default \fI\%palette\fP generator. Default value: \fBfunctools.partial(\fP \fBpalette_hue()\fP \fB, distance=\-120)\fP
.IP \(bu 2
\fBPATTERN\fP (\fBfunction\fP): The default \fI\%pattern\fP generator. Default value: \fBpatterns.stripe45\fP
.IP \(bu 2
\fBCAPTION_PLACEMENT\fP (\fBstr\fP): \fB"padding"\fP to have captions placed in the paddings of \fBVisualizer\fPs, \fB"inner"\fP to place them within the drawing region of the \fBVisualizer\fP\&. Default value: \fB"inner"\fP
.IP \(bu 2
\fBLEGEND\fP (\fBbool\fP): Whether \fBVisualizer\fPs should attempt automatically creating a legend for themselves in their bottom padding. Default value: \fBTrue\fP
.IP \(bu 2
\fBLEGEND_ORDER\fP (\fBstr\fP): Whether to reverse the legend order. Can be \fB"normal"\fP or \fB"reverse"\fP\&. Default value: \fB"normal"\fP
.IP \(bu 2
\fBLEGEND_SIZE\fP (\fBint\fP or \fBfloat\fP): Pixel height of one legend cell, including its own margin and padding. Legend font size is inferred from this. Default value: \fB20\fP
.IP \(bu 2
\fBLEGEND_PLACEMENT\fP (\fBstr\fP): Where to place legends within the \fBVisualizer\fPs drawing region. Can be \fB"inner"\fP or \fB"padding"\fP\&. Default value: \fB"padding"\fP
.IP \(bu 2
\fBLEGEND_MARGIN\fP (\fBint\fP or \fBfloat\fP): Margin around legends. Default value: \fB2.5\fP
.IP \(bu 2
\fBLEGEND_PADDING\fP: Padding around legends. Default value: \fB0\fP
.IP \(bu 2
\fBOPERATOR\fP: The blending operator used by \fBVisualizer\fPs. Default value: \fBOperator.OVER\fP
.UNINDENT
.SS Explaining ALL THE ᴀʟʟ ᴛʜᴇ ᴄᴏɴꜰɪɢᴜʀᴀᴛɪᴏɴ ᴏᴘᴛɪᴏɴꜱ (ya rly)
.sp
The above list doesn\(aqt really cover all the possible configuration variables
you can set, as \fBgulik\fP features a perversion of cascading styles.
.sp
Every single option except for \fBFPS\fP, \fBX\fP, \fBY\fP, \fBNETDATA_HOSTS\fP,
\fBNETDATA_RETRY\fP and \fBBSD_ACCURATE_MEMORY\fP can be overriden on a per\-class
basis by appending an underscore and the class name in uppercase to the
variable name. To disable legends on all \fBPlot\fPs for example, you
would use \fBLEGEND_PLOT = False\fP\&.
.sp
Additionally, \fBMARGIN\fP and \fBPADDING\fP can be set for each side by
appending an underscore and one of \fBLEFT\fP, \fBRIGHT\fP, \fBTOP\fP or \fBBOTTOM\fP\&.
.sp
If you want to mix both of these things, the resulting string follows the
pattern \fI<name>_<class>_<subname>\fP, for example \fBPADDING_PLOT_RIGHT\fP or
\fBLEGEND_MARGIN_ARC_BOTTOM\fP\&.
.SS Custom setups
.sp
By default, gulik will run \fBGulik.autosetup()\fP to set up a reasonable
collection of \fBVisualizer\fPs that gives you a good overview of your
system but you can add your own \fBsetup\fP function to the configuration
file that will be used in stead of the autosetup.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
import gulik
def setup(app):
box = app.box()
box.place(
\(aqcpu\(aq,
gulik.Plot,
elements=[\(aqcore_0\(aq, \(aqcore_1\(aq],
width=box.width,
height=box.width + 40
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Let\(aqs look at the code, line by line:
.INDENT 0.0
.TP
.B \fBdef setup(app)\fP
The name of the setup function \fImust\fP be \fBsetup\fP, otherwise \fBgulik\fP won\(aqt recognize it.
The passed \fBapp\fP parameter is a \fI\%Gulik\fP object.
.TP
.B \fBbox = app.box()\fP
\fBGulik.box()\fP creates a \fBBox\fP, a little helper to make layouting
easier. You can limit its size via \fBwidth\fP and \fBheight\fP keyword parameters.
If these aren\(aqt supplied, the box will fill the whole window.
.TP
.B \fBbox.place(\fP
\fBBox.place()\fP places a new \fI\%visualizer\fP\&. \fBBox\fP orders
visualizers from left to right and top to bottom.
.TP
.B \fB\(aqcpu\(aq\fP
This is the monitored \fI\%component\fP we want to visualize \fI\%element\fPs
of. It is needed to look up the right \fBMonitor\fP object for
\fBVisualizer\fP instantiation.
.TP
.B \fBgulik.Plot\fP
The \fI\%visualizer\fP class to be instantiated.
A subclass of \fBVisualizer\fP\&.
.UNINDENT
.sp
All keyword arguments below this are just passed on to the visualizer class,
so in this case, \fBPlot\fP\&. Here, these are:
.INDENT 0.0
.TP
.B \fBelements=[\(aqcore_0\(aq, \(aqcore_1\(aq],\fP
Defines the \fI\%element\fPs to be visualized. These two values refer
to the first and second CPU cores.
.TP
.B \fBwidth=box.width,\fP
Defines the width of the \fI\%visualizer\fP\&.
.TP
.B \fBheight=box.width + 40\fP
Defines the height of the \fI\%visualizer\fP\&. Has 40 pixel added to it,
because by default, \fBgulik\fP adds 40 pixel bottom padding to every
visualizer to allow 2 lines of legend.
.UNINDENT
.sp
\fBBox.place()\fP uses the \fBwidth\fP and \fBheight\fP keyword parameters
(if passed) to make its layouting decisions. If they aren\(aqt passed, all
remaining space is used.
.sp
And with that, you hopefully know enough to get started with your custom
setup. You can consult \fBMonitor\fP and its subclasses to find out
\fIwhat\fP you can visualize and \fBVisualizer\fP and its subclasses to
find out \fIhow\fP you can visualize that data.
.sp
If you want to extend the original setup instead of doing a completely
custom one, you can call \fBGulik.autosetup()\fP from your custom \fBsetup\fP
function and limit its area by using \fBwidth\fP and \fBheight\fP as well as
\fBx\fP and \fBy\fP keyword parameters.
.SH PACKAGE REFERENCE
.SS Architecture
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
| |
| gulik process | collector processes
| |
| (main thread) (monitor threads) |
| Gulik\-\-\-\-\-\-\-\-\-\-\- CPUMonitor <\-\-\-\-\-ø\-\-\-\-\-> CPUCollector
| | | \(ga\- MemoryMonitor <\-\-\-\-\-ø\-\-\-\-\-> MemoryCollector
| | |\(ga\-\- NetworkMonitor <\-\-\-\-\-ø\-\-\-\-\-> NetworkCollector
| | \(ga\-\-\- … <\-\-\-\-\-ø\-\-\-\-\-> …
| | | |
| | | |
| \(ga\-\- visualizers | (visualizers |
| | \(ga\- Arc | access |
| |\(ga\-\- Plot <\' monitors) |
| \(ga\-\-\- … |
| |
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In \fBgulik\fP, there is one central \fI\%Gulik\fP object.
It manages \fI\%monitor\fP\-\fI\%collector\fP pairs and \fI\%visualizer\fPs.
.sp
Visualizers use the \fI\%monitors.Monitor.normalize()\fP and \fI\%monitors.Monitor.caption()\fP
functions to utilize the collected data.
.sp
Communication between the \fI\%monitor\fPs within the gulik process and
\fI\%collector\fP processes is done via queues. Every monitor/collector
pair shares two queues. One "update queue" that monitors use to send update
requests to collectors and one "data queue" that collectors use to send the
next datapoint to their respective monitor.
.SS Box model
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ ↑
| | |
| margin | |
| | |
| +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | |
| | | |
| | padding | | h
| | | | e
| | +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ ↑ | | i
| | | | | inner | | g
| | | inner drawing region | | height | | h
| | | | | | | t
| | +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ ↓ | |
| | | | |
| | ←\-\-\-\-\-\-\-\-\-\-\-\- inner width \-\-\-\-\-\-\-\-\-\-→ | | |
| | | | |
| +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | |
| | |
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ ↓
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- width \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
\fBgulik\fPs box model is pretty similar to the one CSS has, with
one important distinction: margins and paddings are included in
\fBwidth\fP and \fBheight\fP in order to make layouting easier.
.SS Concepts
.SS visualizer
.sp
Visualizers are instances of any subclass of \fI\%visualizers.Visualizer\fP\&.
.sp
A visualizer is assigned a \fI\%monitor\fP and a list of \fI\%element\fPs.
.sp
\fI\%Gulik\fP will periodically call all visualizers \fBupdate\fP methods
(see source of \fI\%visualizers.Visualizer.update()\fP).
.sp
What exactly happens in the \fBupdate\fP function of a visualizer differs
between the different classes, but usually it queries the instance\-assigned
monitor for the most recent data about its \fI\%element\fPs by calling
\fBmonitor.Monitor.normalize()\fP and then does some drawing on the passed
\fBcairo.Context\fP to visualize the data in some manner.
.INDENT 0.0
.TP
.B Currently, there are 7 built\-in visualizers:
.INDENT 7.0
.IP \(bu 2
\fI\%visualizers.Text\fP
.IP \(bu 2
\fI\%visualizers.Rect\fP
.IP \(bu 2
\fI\%visualizers.Arc\fP
.IP \(bu 2
\fI\%visualizers.Plot\fP
.IP \(bu 2
\fI\%visualizers.MirrorRect\fP
.IP \(bu 2
\fI\%visualizers.MirrorArc\fP
.IP \(bu 2
\fI\%visualizers.MirrorPlot\fP
.UNINDENT
.UNINDENT
.sp
You are, however, welcome to implement your own visualizers by subclassing
\fI\%visualizers.Visualizer\fP and overriding \fBvisualizers.Visualizer.draw()\fP\&.
.SS monitor
.sp
Monitors are instances of any subclass of \fI\%monitors.Monitor\fP,
which itself is a subclass of \fBmultithreading.Thread\fP\&.
.sp
Every monitor acts as one half of a monitor\-\fI\%collector\fP pair,
each of which collects and transforms data on a specific \fI\%component\fP\&.
.sp
The monitors responsibility in this pair is to take data from the collector
and offer it in a form that is usable by \fI\%visualizer\fPs. This is mainly
done through the functions \fI\%monitors.Monitor.normalize()\fP and \fI\%monitors.Monitor.caption()\fP\&.
.INDENT 0.0
.TP
.B Currently, there are 6 built\-in monitors:
.INDENT 7.0
.IP \(bu 2
\fI\%monitors.CPUMonitor\fP
.IP \(bu 2
\fI\%monitors.MemoryMonitor\fP
.IP \(bu 2
\fI\%monitors.NetworkMonitor\fP
.IP \(bu 2
\fI\%monitors.BatteryMonitor\fP
.IP \(bu 2
\fI\%monitors.DiskMonitor\fP
.IP \(bu 2
\fI\%monitors.NetdataMonitor\fP
.UNINDENT
.UNINDENT
.SS collector
.sp
Collectors are instances of any subclass of \fBcollectors.Collector\fP,
which itself is a subclass of \fBmultiprocessing.Process\fP\&.
.sp
Every collector acts as one half of a \fI\%monitor\fP\-collector pair.
.sp
The collectors responsibility in this pair is to collect system usage
data and send them to its associated \fI\%monitor\fP\&.
.SS component
.sp
A string identifying a data source.
.INDENT 0.0
.TP
.B Valid values are:
.INDENT 7.0
.IP \(bu 2
\fB\(aqcpu\(aq\fP
.IP \(bu 2
\fB\(aqmemory\(aq\fP
.IP \(bu 2
\fB\(aqnetwork\(aq\fP
.IP \(bu 2
\fB\(aqbattery\(aq\fP
.IP \(bu 2
\fB\(aqdisk\(aq\fP
.UNINDENT
.UNINDENT
.sp
Besides that, \fB\(aqnetdata\-<hostname>\(aq\fP is valid, but only if \fB<hostname>\fP
exists in the \fBNETDATA_HOSTS\fP configuration option.
.SS element
.sp
A string identifying a (sub) element of a data source.
Valid values are defined within the respective \fI\%monitor\fPs.
.SS alignment
.INDENT 0.0
.TP
.B A string in the shape of \fB<x\-align>_<y\-align>\fP, where:
.INDENT 7.0
.IP \(bu 2
\fB<x\-align>\fP can be any of \fBleft\fP, \fBcenter\fP, \fBright\fP
.IP \(bu 2
\fB<y\-align>\fP can be any of \fBtop\fP, \fBcenter\fP, \fBbottom\fP
.UNINDENT
.UNINDENT
.sp
alignments are used both for text positioning relative to its respective
allowed borders as well as positioning captions within \fI\%visualizer\fPs.
.SS caption description
.sp
A dictionary describing a caption to be rendered by a \fI\%visualizer\fP\&.
.INDENT 0.0
.TP
.B Required items:
.INDENT 7.0
.IP \(bu 2
\fBtext\fP: The text to be rendered
.UNINDENT
.TP
.B Optional items:
.INDENT 7.0
.IP \(bu 2
\fBposition\fP: Either an \fB(x,y)\fP coordinate tuple or an \fI\%alignment\fP
.IP \(bu 2
\fBalign\fP: An \fI\%alignment\fP
.IP \(bu 2
\fBfont_size\fP: A number (int or float) denoting vertical font size in pixels
.IP \(bu 2
\fBfont_weight\fP: A string. \fBNormal\fP, \fBBold\fP, \fBLight\fP, etc.
.IP \(bu 2
\fBoperator\fP: One of cairos blending operators (See \fBcairo.Operator\fP)
.UNINDENT
.UNINDENT
.SS pattern
.sp
A function taking one \fI\%helpers.Color\fP as parameter returning a cairo surface for
use as fill. See \fI\%patterns.stripe45()\fP for an example.
.SS palette
.sp
A function taking one \fI\%helpers.Color\fP and one \fIint\fP parameter returning a
\fBlist\fP of \fI\%helpers.Color\fP objects with its length being equal to the passed
\fIint\fP parameter.
.sp
\fBNOTE:\fP
.INDENT 0.0
.INDENT 3.5
\fI\%palettes.hue()\fP and \fI\%palettes.value()\fP have extra parameters
you won\(aqt be able to use without wrapping them in \fBfunctools.partial()\fP
first!
.UNINDENT
.UNINDENT
.SS combination
.sp
A string denoting how multiple \fI\%element\fPs are displayed within a \fI\%visualizer\fP\&.
.INDENT 0.0
.TP
.B Valid values are:
.INDENT 7.0
.IP \(bu 2
\fBseparate\fP: separate elements visually
.IP \(bu 2
\fBcumulative\fP: show values cumulatively, assume data is normalized for that (i.e. all values added max out at 1.0)
.IP \(bu 2
\fBcumulative_force\fP: like \fBcumulative\fP, but assumes every single value can go up to 1.0
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.Gulik(configpath)
The main object thingamabob.
.UNINDENT
.SS \fIgulik.collectors\fP
.SS \fIgulik.monitors\fP
.INDENT 0.0
.TP
.B class gulik.monitors.Monitor(app, component)
The base class for all \fI\%monitor\fPs.
.INDENT 7.0
.TP
.B normalize(element)
Return most current datapoint about \fIelement\fP,
normalized to a float between 0 and 1.
.INDENT 7.0
.TP
.B Parameters
\fBelement\fP (\fIstr\fP) \-\- An \fI\%element\fP that is valid in the context of this monitor.
.UNINDENT
.sp
\fBNOTE:\fP
.INDENT 7.0
.INDENT 3.5
This function has to be overriden in custom monitors.
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
Return a given string with placeholders filled in with current values of this monitor.
.INDENT 7.0
.TP
.B Parameters
\fBfmt\fP (\fIstr\fP) \-\- A format string; The \fItext\fP item of a \fI\%caption description\fP\&.
.UNINDENT
.sp
\fBNOTE:\fP
.INDENT 7.0
.INDENT 3.5
This function has to be overridden in custom monitors.
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.CPUMonitor(app, component)
Monitor for CPU usage.
.INDENT 7.0
.TP
.B normalize(element)
.INDENT 7.0
.TP
.B Elements exposed:
.INDENT 7.0
.IP \(bu 2
\fBaggregate\fP: average cpu use, sum of all core loads divided by number of cores
.IP \(bu 2
\fBcore_<n>\fP: load of core \fB<n>\fP, with possible values of \fB<n>\fP being 0 to number of cores \- 1
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
.INDENT 7.0
.TP
.B Exposed keys:
.INDENT 7.0
.IP \(bu 2
\fBaggregate\fP: average cpu use, sum of all core loads divided by number of cores
.IP \(bu 2
\fBcore_<n>\fP: load of core \fB<n>\fP, with possible values of \fB<n>\fP being 0 to number of cores \- 1
.IP \(bu 2
\fBcount\fP: number of cores
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.MemoryMonitor(app, component)
Monitor for memory usage
.INDENT 7.0
.TP
.B normalize(element)
.INDENT 7.0
.TP
.B Elements exposed:
.INDENT 7.0
.IP \(bu 2
\fBpercent\fP: memory use of all processes.
.IP \(bu 2
\fBtop_<n>\fP: memory use of the \fB<n>\fP h\-biggest process. Valid values of \fB<n>\fP are 1\-3.
.IP \(bu 2
\fBother\fP: memory use of all processes except the top 3
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
.INDENT 7.0
.TP
.B Exposed keys:
.INDENT 7.0
.IP \(bu 2
\fBtotal\fP: how much memory this machine has in total,
.IP \(bu 2
\fBpercent\fP: total memory usage in percent.
.IP \(bu 2
\fBavailable\fP: how much memory can be malloc\(aqd without going into swap (roughly).
.IP \(bu 2
\fBtop_<n>\fP: access information about the 3 "biggest" processes. possible subkeys are \fBname\fP, \fBsize\fP and \fBpercent\fP\&.
.IP \(bu 2
\fBother\fP: aggregate information for all processes \fIexcept\fP the top 3. Same subkeys as those, plus \fB\(aqcount\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.NetworkMonitor(app, component)
Monitor for network interfaces.
.INDENT 7.0
.TP
.B count_sec(interface, key)
get a specified count for a given interface
as calculated for the last second.
Example.nf
\fBself.count_sec(\(aqeth0\(aq, \(aqbytes_sent\(aq)\fP
(will return count of bytes sent in the last second)
.fi
.sp
.UNINDENT
.INDENT 7.0
.TP
.B normalize(element)
.INDENT 7.0
.TP
.B Exposed elements:
.INDENT 7.0
.IP \(bu 2
\fB<if>.bytes_sent\fP: upload of network interface \fB<if>\fP\&.
.IP \(bu 2
\fB<if>.bytes_recv\fP: download of network interface \fB<if>\fP\&.
.UNINDENT
.UNINDENT
.sp
\fI<if>\fP can be any local network interface as well as \fI\(aqaggregate\(aq\fP\&.
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
.INDENT 7.0
.TP
.B Exposed keys:
.INDENT 7.0
.IP \(bu 2
\fB<if>.bytes_sent\fP: upload of network interface \fB<if>\fP\&.
.IP \(bu 2
\fB<if>.bytes_recv\fP: download of network interface \fB<if>\fP\&.
.IP \(bu 2
\fB<if>.if_up\fP: Boolean, whether the interface is up.
.IP \(bu 2
\fB<if>.speed\fP: interface speed in Mbit/s
.IP \(bu 2
.INDENT 2.0
.TP
.B \fB<if>.counters\fP: supplies access to interface counters. Possible sub\-elements are:
.INDENT 7.0
.IP \(bu 2
\fBbytes_sent\fP
.IP \(bu 2
\fBbytes_recv\fP
.IP \(bu 2
\fBpackets_sent\fP
.IP \(bu 2
\fBpackets_recv\fP
.IP \(bu 2
\fBerrin\fP
.IP \(bu 2
\fBerrout\fP
.IP \(bu 2
\fBdropin\fP
.IP \(bu 2
\fBdropout\fP
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.sp
\fI<if>\fP can be any local network interface as well as \fB\(aqaggregate\(aq\fP\&.
.sp
Additionally, the \fB\(aqaggregate\(aq\fP interface exposes the total
count of network interfaces as \fBif_count\fP\&.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.BatteryMonitor(app, component)
Monitor laptop batteries.
.INDENT 7.0
.TP
.B normalize(element)
This function exposes no explicit elements, but always just returns
the current fill of the battery.
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
.INDENT 7.0
.TP
.B Exposed keys:
.INDENT 7.0
.IP \(bu 2
\fBpower_plugged\fP: Boolean, whether the AC cable is connected.
.IP \(bu 2
\fBpercent\fP: current fill of the battery in percent.
.IP \(bu 2
\fBsecsleft\fP: seconds left till battery is completely drained.
.IP \(bu 2
\fBstate\fP: Current state of the battery, one of \fB\(aqfull\(aq\fP, \fB\(aqcharging\(aq\fP or \fB\(aqdraining\(aq\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.DiskMonitor(*args, **kwargs)
Monitors disk I/O and partitions.
.INDENT 7.0
.TP
.B normalize(element)
.INDENT 7.0
.TP
.B Elements exposed:
.INDENT 7.0
.IP \(bu 2
.INDENT 2.0
.TP
.B \fBio\fP
.INDENT 7.0
.IP \(bu 2
Valid subelements are disk device file names as found in
\fB/dev\fP\&. Examples: \fBada0\fP, \fBsda\fP\&.
.INDENT 2.0
.TP
.B Valid subsubelements are as follows:
.INDENT 7.0
.IP \(bu 2
\fBread_bytes\fP
.IP \(bu 2
\fBwrite_bytes\fP
.IP \(bu 2
\fBread_time\fP
.IP \(bu 2
\fBwrite_time\fP
.IP \(bu 2
\fBbusy_time\fP
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.IP \(bu 2
.INDENT 2.0
.TP
.B \fBpartitions\fP
.INDENT 7.0
.IP \(bu 2
Valid subelements are partition device file names as
found in \fB/dev\fP, with dots (\fB\&.\fP) being replaced
with dashes (\fB\-\fP). Examples: \fBroot\-eli\fP, \fBsda1\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
Exposed keys are the same as for \fI\%DiskMonitor.normalize()\fP\&.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.monitors.NetdataMonitor(app, component, host, port)
Monitor that interfaces with (remote) netdata instances.
.INDENT 7.0
.TP
.B normalize(element)
Exposed elements correspond to \fIchart names\fP and their datapoint
\fIdimension\fPs. For a list of valid chart and dimensions names, consult
\fB/api/v1/charts\fP of the netdata instance in question.
Examples.INDENT 7.0
.IP \(bu 2
\fBsystem.cpu.nice\fP
.IP \(bu 2
\fBdisk.ada0.writes\fP
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B caption(fmt)
Exposed keys are the same as for \fI\%NetdataMonitor.normalize()\fP\&.
.UNINDENT
.UNINDENT
.SS \fIgulik.visualizers\fP
.INDENT 0.0
.TP
.B class gulik.visualizers.Visualizer(app, monitor, x=0, y=0, width=None, height=None, margin=None, margin_left=None, margin_right=None, margin_top=None, margin_bottom=None, padding=None, padding_left=None, padding_right=None, padding_top=None, padding_bottom=None, elements=None, captions=None, caption_placement=None, legend=None, legend_order=None, legend_format=None, legend_size=None, legend_placement=None, legend_margin=None, legend_margin_left=None, legend_margin_right=None, legend_margin_top=None, legend_margin_bottom=None, legend_padding=None, legend_padding_left=None, legend_padding_right=None, legend_padding_top=None, legend_padding_bottom=None, foreground=None, background=None, pattern=None, palette=None, combination=None, operator=None)
The base class for all visualizers. Not called widget to avoid naming
confusion with gtk widgets (which aren\(aqt even used in gulik).
.sp
Usually you won\(aqt instantiate this by yourself but use \fBgulik.Box.place()\fP\&.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBapp\fP (\fI\%gulik.Gulik\fP) \-\- The app managing visualizers and monitors
.IP \(bu 2
\fBmonitor\fP (\fI\%monitor\fP) \-\- The monitor managing data collection for this visualizer
.IP \(bu 2
\fBx\fP (\fIint\fP) \-\- leftmost coordinate on the x\-axis
.IP \(bu 2
\fBy\fP (\fIint\fP) \-\- topmost coordinate on the y\-axis
.IP \(bu 2
\fBwidth\fP (\fIint\fP) \-\- overall width (including \fBmargin\fP and \fBpadding\fP)
.IP \(bu 2
\fBheight\fP (\fIint\fP) \-\- overall height (including \fBmargin\fP and \fBpadding\fP)
.IP \(bu 2
\fBmargin\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied around all sides
.IP \(bu 2
\fBmargin_left\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the left side
.IP \(bu 2
\fBmargin_right\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the right side
.IP \(bu 2
\fBmargin_top\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the top side
.IP \(bu 2
\fBmargin_bottom\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the bottom side
.IP \(bu 2
\fBpadding\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied around all sides
.IP \(bu 2
\fBpadding_left\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the left side
.IP \(bu 2
\fBpadding_right\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the right side
.IP \(bu 2
\fBpadding_top\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the top side
.IP \(bu 2
\fBpadding_bottom\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the bottom side
.IP \(bu 2
\fBelements\fP (\fIlist of str\fP) \-\- A list of \fI\%element\fPs to visualize
.IP \(bu 2
\fBcaptions\fP (\fIlist of dict\fP\fI, \fP\fIoptional\fP) \-\- A list of \fI\%caption descriptions\fP
.IP \(bu 2
\fBlegend\fP (\fIbool\fP) \-\- Whether to try to automatically create a legend of elements
.IP \(bu 2
\fBlegend_order\fP (\fI\(aqnormal\(aq\fP\fI or \fP\fI\(aqreverse\(aq\fP\fI, \fP\fIoptional\fP) \-\- Whether to reverse the legend order
.IP \(bu 2
\fBlegend_format\fP (\fIstr\fP) \-\- A format string, can contain \fB{element}\fP to refer to the element legend items refer to.
.IP \(bu 2
\fBlegend_size\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- height of a single legend item
.IP \(bu 2
\fBlegend_placement\fP (\fI\(aqpadding\(aq\fP\fI or \fP\fI\(aqinner\(aq\fP) \-\- Where to place the legend
.IP \(bu 2
\fBlegend_margin\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied around all sides of the legend
.IP \(bu 2
\fBlegend_margin_left\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the left side of the legend
.IP \(bu 2
\fBlegend_margin_right\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the right side of the legend
.IP \(bu 2
\fBlegend_margin_top\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the top side of the legend
.IP \(bu 2
\fBlegend_margin_bottom\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- margin applied to the bottom side of the legend
.IP \(bu 2
\fBlegend_padding\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied around all sides of the legend
.IP \(bu 2
\fBlegend_padding_left\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the left side of the legend
.IP \(bu 2
\fBlegend_padding_right\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the right side of the legend
.IP \(bu 2
\fBlegend_padding_top\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the top side of the legend
.IP \(bu 2
\fBlegend_padding_bottom\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- padding applied to the bottom side of the legend
.IP \(bu 2
\fBforeground\fP (\fBgulik,helpers.Color\fP, optional) \-\- The foreground color, base\-color for generated palettes
.IP \(bu 2
\fBbackground\fP (\fI\%gulik.helpers.Color\fP, optional) \-\- The background color
.IP \(bu 2
\fBpattern\fP (\fIfunction\fP\fI, \fP\fIoptional\fP) \-\- An executable \fI\%pattern\fP
.IP \(bu 2
\fBpalette\fP (\fIfunction\fP\fI, \fP\fIoptional\fP) \-\- An executable \fI\%palette\fP
.IP \(bu 2
\fBcombination\fP (\fIstr\fP\fI, \fP\fIoptional\fP) \-\- The \fI\%combination\fP mode used when displaying multiple \fI\%element\fPs
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B get_style(name, subname=None)
load the most specific style setting available given a name and optional subname.
usage examples: self.get_style(\(aqmargin\(aq, \(aqleft\(aq),
.UNINDENT
.INDENT 7.0
.TP
.B legend_info()
defines colors for legend elements
.UNINDENT
.INDENT 7.0
.TP
.B update(context)
.INDENT 7.0
.TP
.B Parameters
\fBcontext\fP (\fBcairo.Context\fP) \-\- cairo context of the window
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.Text(app, monitor, text, speed=25, align=None, **kwargs)
Scrollable text using monitors\(aq \fBcaption\fP function to give textual
representations of values, prettified where necessary.
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.Rect(app, monitor, x=0, y=0, width=None, height=None, margin=None, margin_left=None, margin_right=None, margin_top=None, margin_bottom=None, padding=None, padding_left=None, padding_right=None, padding_top=None, padding_bottom=None, elements=None, captions=None, caption_placement=None, legend=None, legend_order=None, legend_format=None, legend_size=None, legend_placement=None, legend_margin=None, legend_margin_left=None, legend_margin_right=None, legend_margin_top=None, legend_margin_bottom=None, legend_padding=None, legend_padding_left=None, legend_padding_right=None, legend_padding_top=None, legend_padding_bottom=None, foreground=None, background=None, pattern=None, palette=None, combination=None, operator=None)
[image]
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.MirrorRect(app, monitor, **kwargs)
Mirrored variant of \fI\%Rect\fP\&.
.INDENT 7.0
.TP
.B legend_info()
defines colors for legend elements
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.Arc(app, monitor, stroke_width=5, **kwargs)
[image]
.INDENT 7.0
.TP
.B Parameters
\fBstroke_width\fP (\fIint\fP) \-\- width of the arc in pixels.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.MirrorArc(app, monitor, **kwargs)
Mirrored variant of \fI\%Arc\fP\&.
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.Plot(app, monitor, num_points=None, autoscale=None, markers=None, line=None, grid=None, **kwargs)
[image]
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBnum_points\fP (\fIint\fP\fI, \fP\fIoptional\fP) \-\- The number of datapoints to show.
.IP \(bu 2
\fBautoscale\fP (\fIbool\fP\fI, \fP\fIoptional\fP) \-\- Whether to automatically "zoom" into the data.
.IP \(bu 2
\fBmarkers\fP (\fIbool\fP\fI, \fP\fIoptional\fP) \-\- Whether tho render markers at data point coordinates.
.IP \(bu 2
\fBline\fP (\fIbool\fP\fI, \fP\fIoptional\fP) \-\- Whether to draw a line.
.IP \(bu 2
\fBgrid\fP (\fIbool\fP\fI, \fP\fIoptional\fP) \-\- Whether to draw a grid. The grid automatically adapts if \fBautoscale\fP is \fBTrue\fP\&.
.IP \(bu 2
\fB**kwargs\fP \-\- passed up to \fI\%Visualizer\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.visualizers.MirrorPlot(app, monitor, scale_lock=True, **kwargs)
Mirrored variant of \fI\%Plot\fP\&.
.UNINDENT
.SS \fIgulik.palettes\fP
.INDENT 0.0
.TP
.B gulik.palettes.hue(base, count, distance=180)
Creates a hue\-rotation palette.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBbase\fP (\fBColor\fP) \-\- Color on which the palette will be based (i.e. the starting point of the hue\-rotation).
.IP \(bu 2
\fBcount\fP (\fIint\fP) \-\- number of colors the palette should hold.
.IP \(bu 2
\fBdistance\fP (\fIint\fP\fI or \fP\fIfloat\fP) \-\- angular distance on a 360° hue circle thingamabob.
.UNINDENT
.TP
.B Returns
A list of length \fBcount\fP of \fBColor\fP objects.
.TP
.B Return type
list
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B gulik.palettes.value(base, count, min=None, max=None)
Creates a value\-stepped palette
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBbase\fP (\fBColor\fP) \-\- Color on which the palette will be based (i.e. source of hue and saturation)
.IP \(bu 2
\fBcount\fP (\fIint\fP) \-\- number of colors the palette should hold
.IP \(bu 2
\fBmin\fP (\fIfloat >= 0 and <= 1\fP) \-\- minimum value (the v in hsv)
.IP \(bu 2
\fBmax\fP (\fIfloat >= 0 and <= 1\fP) \-\- maximum value
.UNINDENT
.TP
.B Returns
A list of length \fBcount\fP of \fBColor\fP objects.
.TP
.B Return type
list
.UNINDENT
.UNINDENT
.SS \fIgulik.patterns\fP
.INDENT 0.0
.TP
.B gulik.patterns.stripe45(color)
A tilable pattern with 45° stripes.
.UNINDENT
.SS \fIgulik.helpers\fP
.INDENT 0.0
.TP
.B gulik.helpers.pretty_si(number)
Return a SI\-postfixed string representation of a number (int or float).
.UNINDENT
.INDENT 0.0
.TP
.B gulik.helpers.pretty_bytes(bytecount)
Return a human\-readable representation given a size in bytes.
.UNINDENT
.INDENT 0.0
.TP
.B gulik.helpers.pretty_bits(bytecount)
Return a human\-readable representation in bits given a size in bytes.
.UNINDENT
.INDENT 0.0
.TP
.B gulik.helpers.ignore_none(*args)
Return the first passed value that isn\(aqt \fBNone\fP\&.
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.helpers.Color(red=None, green=None, blue=None, alpha=None, hue=None, saturation=None, value=None)
Magic color class implementing and supplying on\-the\-fly manipulation of
RGB and HSV (and alpha) attributes.
.INDENT 7.0
.TP
.B tuple_rgb()
return color (without alpha) as tuple, channels being float 0.0\-1.0
.UNINDENT
.INDENT 7.0
.TP
.B tuple_rgba()
return color (\fIwith\fP alpha) as tuple, channels being float 0.0\-1.0
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.helpers.DotDict
A dictionary with its data being readable through faked attributes.
Used to avoid [[[][][][][]] in caption formatting.
.UNINDENT
.INDENT 0.0
.TP
.B class gulik.helpers.Box(app, x, y, width, height)
Can wrap multiple \fI\%visualizer\fPs, used for layouting.
Orders added visualizers from left to right and top to bottom.
.sp
This is basically a smart helper for \fBGulik.add_visualizer()\fP\&.
.INDENT 7.0
.TP
.B place(component, cls, **kwargs)
place a new \fI\%visualizer\fP\&.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcomponent\fP (\fIstr\fP) \-\- The \fI\%component\fP string identifying the data source.
.IP \(bu 2
\fBcls\fP (\fBtype\fP, child of \fBvisualizers.Visualizer\fP) \-\- The visualizer class to instantiate.
.IP \(bu 2
\fB**kwargs\fP \-\- passed on to \fBcls\fP\(aq constructor. width and height defined in here are honored.
.UNINDENT
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.IP \(bu 2
genindex
.IP \(bu 2
search
.UNINDENT
.SH AUTHOR
phryk
.SH COPYRIGHT
YOLD 3184-3185, phryk
.\" Generated by docutils manpage writer.
.