Skip to main content

An object-oriented framework for command-line apps.

Project description

https://img.shields.io/pypi/v/byoc.svg https://img.shields.io/pypi/pyversions/byoc.svg https://img.shields.io/readthedocs/byoc.svg https://img.shields.io/github/workflow/status/kalekundert/byoc/Test%20and%20release/master https://img.shields.io/coveralls/kalekundert/byoc.svg

BYOC is a python library for integrating configuration values from any number/kind of sources, e.g. files, command-line arguments, environment variables, remote JSON APIs, etc. The primary goal of BYOC is to give you complete control over your configuration. This means:

  • Complete control over how files, options, etc. are named and organized.

  • Complete control over how values from different config sources are parsed and merged.

  • Support for any kind of file format, argument parsing library, etc.

  • No opinions about anything enforced by BYOC.

To use BYOC, you would create a class with special attributes (called parameters) that know where to look for configuration values. When these parameters are accessed, the desired values are looked up, possibly merged, possibly cached, and returned. Here’s a brief example:

import byoc
from byoc import Key, DocoptConfig, AppDirsConfig

class Greet(byoc.App):
    """
    Say a greeting.

    Usage:
        greet <name> [-g <greeting>]
    """

    # Define which config sources are available to this class.
    __config__ = [
            DocoptConfig,
            AppDirsConfig.setup(name='conf.yml'),
    ]

    # Define how to search for each config value.
    name = byoc.param(
            Key(DocoptConfig, '<name>'),
    )
    greeting = byoc.param(
            Key(DocoptConfig, '-g'),
            Key(AppDirsConfig, 'greeting'),
            default='Hello',
    )

    def main(self):
        self.load(DocoptConfig)
        print(f"{self.greeting}, {self.name}!")

if __name__ == '__main__':
    Greet.entry_point()

We can configure this script from the command line:

$ ./greet 'Sir Bedevere'
Hello, Sir Bedevere!
$ ./greet 'Sir Lancelot' -g Goodbye
Goodbye, Sir Lancelot!

…or from its config files:

$ mkdir -p ~/.config/greet
$ echo "greeting: Run away" > ~/.config/greet/conf.yml
$ greet 'Sir Robin'
Run away, Sir Robin!

This example only scratches the surface, but hopefully you can already get a sense for how powerful and flexible these parameters are. For more information, refer to the following examples (in lieu of complete documentation).

Examples

For some examples of byoc being used in real scripts, check out the Stepwise — Molecular Biology repository. Almost every script in this repository uses byoc. Below are some particular scripts that might be useful:

Simple scripts:

Long but straight-forward scripts:

Complex scripts:

  • serial_dilution.py

    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 byoc 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.

  • digest.py

    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.

  • ivtt.py

    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.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

byoc-0.31.0.tar.gz (68.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

byoc-0.31.0-py2.py3-none-any.whl (26.5 kB view details)

Uploaded Python 2Python 3

File details

Details for the file byoc-0.31.0.tar.gz.

File metadata

  • Download URL: byoc-0.31.0.tar.gz
  • Upload date:
  • Size: 68.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/35.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for byoc-0.31.0.tar.gz
Algorithm Hash digest
SHA256 affcd8a5038897afcafbeb9bc81c5fec57202760d25ccc7b6e75bf3632c99277
MD5 bd71c377bb8adf9e4c05005d80aa27e6
BLAKE2b-256 9623bc8dcd8797f86ba6b748da0e262cc3a320026200a3797990e46500f360e0

See more details on using hashes here.

File details

Details for the file byoc-0.31.0-py2.py3-none-any.whl.

File metadata

  • Download URL: byoc-0.31.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 26.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/35.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for byoc-0.31.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c42cf9c87f1d7eef90ea9650887b795202ca6059ac39d663b5dd27cb385e9501
MD5 18ba75e01f72c488ef1ab336bd1cbec4
BLAKE2b-256 e164500d822bdb4ae4b60e6b5ecae18b1ad3964c3a91735c8effe5207233115c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page