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!

Planned features include:

  • Counted arguments like -vvv

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='verbose', short='v', default=False, help='Show verbose output'),
    ]
)

@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.5.1.tar.gz (8.3 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.5.1-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for foxcli-0.5.1.tar.gz
Algorithm Hash digest
SHA256 74aff432e641805d0bfe0eceb144e80c2411b7cf2a5f49c15264bb83b22c2318
MD5 a8f9bc729a0a3c26f71912a63dd533d8
BLAKE2b-256 9a384c02490643baa6b45a76a79b3b28b895d449532af0091948179fd7a0873c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: foxcli-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 10.5 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.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 68157a34d2c3f4640d6e32540bf56fffe44cb7b51ad4b9efb1b77dbc9321bbcb
MD5 09c11a3d907ff226d174b4ac24f11f63
BLAKE2b-256 577bb3f1caf3abce0fa5afa410af565d62d911a259b1f0a0f26c84e0fb7dee5c

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