Auxiliary library for writing CLI applications
Project description
vutils-cli: Auxiliary Library for Writing CLI Applications
This package provides a set of tools for writing applications with command line interface.
Installation
To install vutils-cli
, type
$ pip install vutils-cli
How to Use
vutils-cli provides three mixins:
vutils.cli.application.ApplicationMixin
providing methods for launching the application code and error management;vutils.cli.io.StreamsProxyMixin
providing methods for I/O streams manipulation;vutils.cli.logging.LoggerMixin
providing methods for logging support.
Combined together, these three mixins form a base for creating command line interface applications. User can make a subclass from each of mixins to reach desired behavior. A simple application can be made in a way like this:
from vutils.cli.application import ApplicationMixin
from vutils.cli.io import StreamsProxyMixin
from vutils.cli.logging import LoggerMixin
class CommandBase(ApplicationMixin, StreamsProxyMixin, LoggerMixin):
def __init__(self):
ApplicationMixin.__init__(self)
StreamsProxyMixin.__init__(self)
LoggerMixin.__init__(self)
class Application(CommandBase):
def __init__(self):
CommandBase.__init__(self)
def main(self, argv):
s = " ".join(argv)
self.wout(f"{s}\n")
return type(self).EXIT_SUCCESS
Application.start(__name__)
When the application starts, it prints its command line arguments to the
standard output. Methods provided by ApplicationMixin
related to running the
application are:
main(self, argv)
provides the application entry point. The application logic should be placed into this method. This method is called fromrun
and the value it returns is used as an application exit code.argv
is an array containing command line arguments.run(self, argv)
runsmain
and handles errors occurred insidemain
. Returns the exit code returned bymain
or byApplicationMixin.exit
or byon_error
handler.start(cls, modname="__main__")
runs the application. In greater detail, it calls therun
method withsys.argv
only ifmodname
is equal to"__main__"
.
In the example above, CommandBase
has been introduced to indicate that it is
possible to use these three mixins also for implementing subcommands. This is
due no one of these three mixins has a global dependencies.
Error Management
ApplicationMixin
provides a set of methods for doing error management:
catch(self, exc)
register an exceptionexc
that should be caught when it is raised insidemain
. If an exception raised insidemain
is not registered, the exception is not caught and it is propagated outside ofmain
.ApplicationError
fromvutils.cli.errors
is registered by default.error(self, msg, ecode=1)
logsmsg
and callsApplicationMixin.exit
withecode
. To make logging work,ApplicationMixin
must be used together withLoggerMixin
(fromvutils.cli.logging
) andStreamsProxyMixin
(fromvutils.cli.io
) mixins.exit(self, ecode)
exits the application with the exit codeecode
. Unlikesys.exit
, it causeson_exit
hook to be called, ifexit
has been invoked withinmain
. Ifexit
is called outside themain
's stack frame, the behavior is undefined.on_exit(self, ecode)
is a hook which is called whenexit
has been invoked withinmain
.ecode
is the exit code given toexit
. This method is dedicated to be overridden by a user. The default implementation logs the exit event, so to make it work properlyApplicationMixin
must be used together withLoggerMixin
andStreamsProxyMixin
mixins.on_error(self, exc)
is an exception handler to where a user can put his/her code to handle the caught exceptionexc
. Everything registered bycatch
that comes frommain
is caught and passed asexc
to this handler. The value returned by this handler is used as the application's exit code. The default implementation logs theexc
and returnsEXIT_FAILURE
, thus the application must implement logging, at least by inheriting fromLoggerMixin
andStreamsProxyMixin
mixins.
ApplicationMixin
also provides two constants EXIT_SUCCESS
and
EXIT_FAILURE
which equals to 0 and 1, respectively.
User can make his/her custom errors by deriving from ApplicationError
from
vutils.cli.errors
. By implementing detail
method, user can provide more
detail about his/her error.
Input and Output Streams
Adding StreamsProxyMixin
from vutils.cli.io
to the list of base classes of
an application allow to use a set of methods for manipulating streams:
set_streams(self, ostream=None, estream=None)
set the output and error output streams.None
means the original setting is left untouched. The default output and error output stream issys.stdout
andsys.stderr
, respectively.wout(self, text)
writestext
to the output stream.werr(self, text)
writestext
to the error output stream.
vutils.cli.io
provides also functions for colorizing the text, namely
nocolor
, red
, green
, blue
, yellow
, and brown
.
Logging
As noted many times above, to support logging, use both LoggerMixin
and
StreamsProxyMixin
mixins together with ApplicationMixin
:
import pathlib
from vutils.cli.application import ApplicationMixin
from vutils.cli.io import StreamsProxyMixin
from vutils.cli.logging import LoggerMixin
class MyApp(ApplicationMixin, StreamsProxyMixin, LoggerMixin):
def __init__(self):
ApplicationMixin.__init__(self)
StreamsProxyMixin.__init__(self)
LoggerMixin.__init__(self)
def main(self, argv):
self.set_logger_props(logpath=pathlib.Path("/var/tmp/MyApp.log"))
self.linfo("Hello from MyApp!\n")
return ApplicationMixin.EXIT_SUCCESS
LoggerMixin
extends MyApp
about these methods:
set_logger_props(self, logpath=None, formatter=None, vlevel=None, dlevel=None)
allows to modify the logging facility properties.logpath
sets the path of the log file,formatter
sets the new formatter object (seeLogFormatter
),vlevel
sets the verbosity level, anddlevel
sets the debug level. The initial values of these properties given during the time ofLoggerMixin
initialization areNone
forlogpath
,LogFormatter
instance forformatter
, 1 forvlevel
, and 0 fordlevel
. A property is set only if a new value of the property is notNone
.set_log_style(self, name, color)
sets the style of log messages (currently only color).name
is the name of the type of log messages. The value should be one of the following constants provided byLogFormatter
:INFO
,WARNING
,ERROR
, andDEBUG
.color
is the color function, seevutils.cli.io
. This method modifies directly the formatter object set byset_logger_props
.wlog(self, msg)
writesmsg
to the log file if it is set.- Following methods write a message to the both error output stream and log
file:
linfo(self, msg, vlevel=1)
: ifvlevel
is less or equal to the verbosity level, issuemsg
as an info message.lwarn(self, msg)
issuesmsg
as a warning message.lerror(self, msg)
issuesmsg
as an error message.ldebug(self, msg, dlevel=1)
: ifdlevel
is less or equal to the debug level, issuemsg
as a debug message.
vutils.cli.logging
provides also facility for formatting log messages,
LogFormatter
. LogFormatter
provides four constants to identify four
different types of log messages:
INFO
for info messages;WARNING
for warning messages;ERROR
for error messages;DEBUG
for debug messages.
LogFormatter.FORMAT
contains a format string used to format every message.
The format string is interpolated using str.format
method and it recognizes
label
for the message label and message
for the message itself. Methods
provided by LogFormatter
are:
set_style(self, name, color)
sets the style (currently only color) of log messages.name
is the name of the message type andcolor
is the message color. By default,LogFormatter
printsINFO
messages in blue,WARNING
messages in yellow,ERROR
messages in red, andDEBUG
messages in brown.colorize(self, name, msg, nocolor=False)
colorizesmsg
using the color associated withname
by previous call ofset_style
. Ifnocolor
isTrue
orname
has no color associated with it,msg
is not colorized.format(self, name, msg)
formatsmsg
by interpolatingFORMAT
with uppercasedname
aslabel
andmsg
asmessage
. By overriding this method user can customize how log messages are formatted.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file vutils-cli-0.1.2.tar.gz
.
File metadata
- Download URL: vutils-cli-0.1.2.tar.gz
- Upload date:
- Size: 19.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 22b646c7476a5c0d6d6f290ac3aee33d0a9f4ae618b7136405ae84242f73580e |
|
MD5 | 640bcfd713ffe9d178292322630f270f |
|
BLAKE2b-256 | 7036ac697c9608682a8a2a6f93966b6ab921e44c98dba9f6bcc5c79da653f93c |
File details
Details for the file vutils_cli-0.1.2-py2.py3-none-any.whl
.
File metadata
- Download URL: vutils_cli-0.1.2-py2.py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77b0ee18692356ef3eef56929c68e7c71ee7e0ab2c02c2517cbcaaffe85da012 |
|
MD5 | 8c49c9906dfc19a2d598f1e39f7e35eb |
|
BLAKE2b-256 | 95ad70ba98826ee6d9b9b00755ff8751d8875178f7bfb0c21a1896282868c869 |