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.ApplicationMixinproviding methods for launching the application code and error management;vutils.cli.io.StreamsProxyMixinproviding methods for I/O streams manipulation;vutils.cli.logging.LoggerMixinproviding 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 fromrunand the value it returns is used as an application exit code.argvis an array containing command line arguments.run(self, argv)runsmainand handles errors occurred insidemain. Returns the exit code returned bymainor byApplicationMixin.exitor byon_errorhandler.start(cls, modname="__main__")runs the application. In greater detail, it calls therunmethod withsys.argvonly ifmodnameis 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 exceptionexcthat should be caught when it is raised insidemain. If an exception raised insidemainis not registered, the exception is not caught and it is propagated outside ofmain.ApplicationErrorfromvutils.cli.errorsis registered by default.error(self, msg, ecode=1)logsmsgand callsApplicationMixin.exitwithecode. To make logging work,ApplicationMixinmust 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_exithook to be called, ifexithas been invoked withinmain. Ifexitis called outside themain's stack frame, the behavior is undefined.on_exit(self, ecode)is a hook which is called whenexithas been invoked withinmain.ecodeis 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 properlyApplicationMixinmust be used together withLoggerMixinandStreamsProxyMixinmixins.on_error(self, exc)is an exception handler to where a user can put his/her code to handle the caught exceptionexc. Everything registered bycatchthat comes frommainis caught and passed asexcto this handler. The value returned by this handler is used as the application's exit code. The default implementation logs theexcand returnsEXIT_FAILURE, thus the application must implement logging, at least by inheriting fromLoggerMixinandStreamsProxyMixinmixins.
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.Nonemeans the original setting is left untouched. The default output and error output stream issys.stdoutandsys.stderr, respectively.wout(self, text)writestextto the output stream.werr(self, text)writestextto 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.logpathsets the path of the log file,formattersets the new formatter object (seeLogFormatter),vlevelsets the verbosity level, anddlevelsets the debug level. The initial values of these properties given during the time ofLoggerMixininitialization areNoneforlogpath,LogFormatterinstance 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).nameis the name of the type of log messages. The value should be one of the following constants provided byLogFormatter:INFO,WARNING,ERROR, andDEBUG.coloris the color function, seevutils.cli.io. This method modifies directly the formatter object set byset_logger_props.wlog(self, msg)writesmsgto 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): ifvlevelis less or equal to the verbosity level, issuemsgas an info message.lwarn(self, msg)issuesmsgas a warning message.lerror(self, msg)issuesmsgas an error message.ldebug(self, msg, dlevel=1): ifdlevelis less or equal to the debug level, issuemsgas 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:
INFOfor info messages;WARNINGfor warning messages;ERRORfor error messages;DEBUGfor 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.nameis the name of the message type andcoloris the message color. By default,LogFormatterprintsINFOmessages in blue,WARNINGmessages in yellow,ERRORmessages in red, andDEBUGmessages in brown.colorize(self, name, msg, nocolor=False)colorizesmsgusing the color associated withnameby previous call ofset_style. IfnocolorisTrueornamehas no color associated with it,msgis not colorized.format(self, name, msg)formatsmsgby interpolatingFORMATwith uppercasednameaslabelandmsgasmessage. 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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
|