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.
Metadata
Release files for vutils-cli 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| vutils-cli-0.1.2.tar.gz | 19.5 kB | Without provenance | Details for vutils-cli-0.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| vutils_cli-0.1.2-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details for vutils_cli-0.1.2-py2.py3-none-any.whl |
Total release size: 32.2 kB
Release files / vutils-cli-0.1.2.tar.gz
| Download URL | vutils-cli-0.1.2.tar.gz |
|---|---|
| Size | 19.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
22b646c7476a5c0d6d6f290ac3aee33d0a9f4ae618b7136405ae84242f73580e
|
|
BLAKE2b-256 checksum How to use checksums |
7036ac697c9608682a8a2a6f93966b6ab921e44c98dba9f6bcc5c79da653f93c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.15
|
Release files / vutils_cli-0.1.2-py2.py3-none-any.whl
| Download URL | vutils_cli-0.1.2-py2.py3-none-any.whl |
|---|---|
| Size | 12.7 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
77b0ee18692356ef3eef56929c68e7c71ee7e0ab2c02c2517cbcaaffe85da012
|
|
BLAKE2b-256 checksum How to use checksums |
95ad70ba98826ee6d9b9b00755ff8751d8875178f7bfb0c21a1896282868c869
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.15
|
Security for vutils-cli 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.