AppCLI is a Library for making command line apps. You can also think of it as a library for initializing objects with values from disparate sources, e.g. config files, environment variables, command-line options, etc. It’s philosophy is that (i) it should be easy to incorporate options from the command line and config files, and (ii) the object should remain usable as a normal object in python.
Usage
The following snippets introduce the basic concepts behind appcli:
import appcli
from appcli import DocoptConfig, AppDirsConfig, Key
# Inheriting from App will give us the ability to instantiate MyApp objects
# without calling the constructor, i.e. exclusively using information from
# the command-line and the config files. We'll take advantage of this in
# the '__main__' block at the end of the script:
class MyApp(appcli.App):
"""
Do a thing.
Usage:
myapp <x> [-y]
"""
# The `__config__` class variable defines locations to search for
# parameter values. In this case, we specify that `docopt` should be
# used to parse command line arguments, and that `appdirs` should be
# used to find configuration files. Note however that appcli is not
# tied to any particular command-line argument parser or file format.
# A wide variety of `Config` classes come with `appcli`, and it's also
# easy to write your own.
__config__ = [
DocoptConfig(),
AppDirsConfig(),
]
# The `appcli.param()` calls define attributes that will take their
# value from the configuration source specified above. For example,
# the `x` parameter will look for an argument named `<x>` specified on
# the command line. The `y` parameter is similar, but will also (i)
# look for a value in the configuration files if none if specified on
# the command line, (ii) convert the value to an integer, and (iii) use
# a default of 0 if no other value is found.
x = appcli.param(
Key(DocoptConfig, '<x>'),
)
y = appcli.param(
Key(DocoptConfig, '-y'),
Key(AppDirsConfig, 'y'),
cast=int,
default=0,
)
# Define a constructor because we want this object to be fully usable
# from python. Because <x> is a required argument on the command line,
# it makes sense for it to be a required argument to the constructor as
# well.
def __init__(self, x):
self.x = x
# Define one or more methods that actually do whatever this application
# is supposed to do. These methods can be named anything; think of
# MyApp as a totally normal class by this point. Note that `x` and `y`
# can be used exactly like regular attributes.
def main(self):
return self.x * self.y
# Invoke the application from the command line. Note that we can't call
# the constructor because it requires an `x` argument, and we don't have
# that information yet (because it will come from the command line).
# Instead we use the `from_params()` method provided by `appcli.App`. This
# constructs an instance of MyApp without calling the construtor, instead
# depending fully on the command-line and the configuration files to
# provide values for every parameter. The call to `appcli.load()` triggers
# the command line to be parsed, such that the `app` instance is fully
# initialized when the `main()` method is called.
if __name__ == '__main__':
app = Main.from_params()
appcli.load(app)
app.main()
Note that we could seamlessly use this object in another python script:
from myapp import MyApp
# Because we don't call `appcli.load()` in this script, the command line
# would not be parsed. The configuration files would still be read,
# however. In the snippet below, for example, the value of `app.y` could
# come from the configuration file. See `Config.autoload` for more
# information on controlling which configs are used in which contexts.
app = MyApp('abc')
app.main()
Examples
For some examples of appcli being used in real scripts, check out the Stepwise — Molecular Biology repository. Almost every script in this repository uses appcli. Below are some particular scripts that might be useful:
Simple scripts:
Long but straight-forward scripts:
Complex scripts:
-
This script features parameters that depend on other parameters. Specifically, the user must provide values for any three of volume, conc_high, conc_low, and factor. Whichever one isn’t specified is inferred from the ones that are. This is implemented by making the appcli parameters (which in this case read only from the command-line and not from any config files) private, then adding public properties that are calculated from the private ones.
-
This script is actually pretty simple, but it makes used of __bareinit__() to download some data from the internet. As alluded to above, __init__() is not called when App instances are initialized from the command-line, because __init__() might require arbitrary arguments and is therefore considered to be part of the python API. Instead, App instances are initialized by calling __bareinit__() with no arguments.
-
This script defines a custom Config class to read from a sequence database. (This example might go out of date, though; I have plans to move that custom Config into a different package.)
Release files for appcli 0.19.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| appcli-0.19.1.tar.gz | 35.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| appcli-0.19.1-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 55.1 kB
Release files / appcli-0.19.1.tar.gz
| Download URL | appcli-0.19.1.tar.gz |
|---|---|
| Size | 35.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec9dc5d3434c244e6014f8be08996936eb62962ccbad336d508d29551fa58220
|
|
BLAKE2b-256 checksum How to use checksums |
65fd20668a00737a9368d204c6730273a87a7f4c0810429266d54bd8de09d52e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.7.10
|
Release files / appcli-0.19.1-py2.py3-none-any.whl
| Download URL | appcli-0.19.1-py2.py3-none-any.whl |
|---|---|
| Size | 19.5 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
82f77b1ebb840aa7d94f29a20657cc89bc52089038246ee0a515455bd2cab0b2
|
|
BLAKE2b-256 checksum How to use checksums |
18257e327326a88a95da2e5448136f1bfac66ba68f56aa191d28df962677b34c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.7.10
|