Skip to main content

A lightweight and minimal CLI framework

Project description

[!IMPORTANT] While foxcli is pre-1.0.0, breaking changes may be made without bumping the major version!

foxcli is a minimal-by-design CLI framework for Python.

There are many great CLI frameworks out there, but some features I like in one aren't present in another. Likewise, one framework I like may have features that I don't like or has a bunch of extra features that I don't need.

foxcli being minimal-by-design means that it does not include any built-in commands, no TUI helpers, no command usage generation. You will have to handle all of this yourself.

This framework features:

  • Class-based commands + being able to subclass its Command class
  • Multi-level commands (like user create)
  • Global options that can appear anywhere in command invocation
  • Hooks to customize error handling
  • Pre-run and post-run hooks for commands

foxcli is still very much in early development but certainly usable, in fact I am using it in a testdrive with my project WinUtils!

Current limitations:

  • Only the pre-run and post-run command hooks furthest down the chain will be called

Installation

pip install foxcli

Sample

from sys import exit
from foxcli.cli import CLI
from foxcli.command import Command
from foxcli.argument import Argument
from foxcli.option import Opt, Option

class App(CLI):
    pass

app = App(
    name='myapp',
    version='1.0.0',
    description='My app',
    global_options=[
        # global options, accessible in commands via `self.ctx.global_options`
        Option(name='debug', short='d', default=False, help='Enable debug mode'),
        # count number of occurrences of an option: `-vvv`, `-v -v -v`, and `-v --verbose` all equal `3`
        Option(name='verbose', short='v', default=0, count=True, help='Output verbosity')
    ]
)

@app.command()
class Version(Command):
    name = 'version'
    description = 'Show version'

    def __init__(self):
        self._version = '0.0.0'

    def pre_run(self, args):
        # runs before `run`
        self._version = self.ctx.cli.version

    def post_run(self, args):
        # runs after `run`
        pass

    def run(self, args) -> int:
        print(self._version)  # '1.0.0'
        return 0

# subclassing `Command` to add options
class UserableCommand(Command):
    arguments = [
        Argument('username'),  # supports `nargs` which takes int, '*', '+', and '?'. defaults to 1, which implicitly makes it required
    ]

@app.command()
class User(Command):
    name = 'user'
    aliases = ['u']
    description = 'User management commands'

# multi-level command
@app.command(parent='user')
class UserCreate(UserableCommand):
    name = 'create'
    description = 'Creates a new user'
    aliases = ['c', 'add']
    arguments = [
        # positional arguments
        Argument('avatar', default='https://website.com/image.png'),  # supports default values
    ]
    options = [
        Opt('rank', short='r', required=True)  # shortcut for `Option`, `Arg` also exists
    ]

    # `myapp user add Caim -r "Super Admin" -v`
    def run(self, args) -> int:
        # self.ctx.global_options.get('verbose', bool) -> True
        print(self.ctx.global_options.to_dict())  # {'verbose': True}

        # args.get('username', str) -> 'Caim'
        # args.get('avatar', str) -> 'https://website.com/image.png'
        # args.get('rank', str) -> 'Super Admin'
        print(args.to_dict())  # {'username': 'Caim', 'avatar': 'https://website.com/image.png', 'rank': 'Super Admin'}
        return 0

exit(app.run())

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

foxcli-0.6.0.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

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

foxcli-0.6.0-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file foxcli-0.6.0.tar.gz.

File metadata

  • Download URL: foxcli-0.6.0.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for foxcli-0.6.0.tar.gz
Algorithm Hash digest
SHA256 c74718d784d0f0e04ea384b5d2e4328937e2b8a26e43c507d2fd45831ff83db3
MD5 2dcdbf27fc4e1ae180352f90074c934e
BLAKE2b-256 75457fefc64e3e35d2a80f3ab1e59784f3c95895b37c2e2ddb97544b8ed5d563

See more details on using hashes here.

File details

Details for the file foxcli-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: foxcli-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for foxcli-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cff64ae389180be2a7af22c4d6170be295acd5fbe2e9755b0eec70f4ccf93d1b
MD5 e379250296027a9d25c0be05caa5c018
BLAKE2b-256 4934e82b795e523ad7e243e373de12d56908508750cb10a20e07c33c32847650

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