Skip to main content

Automatically generate a simple CLI.

Project description

FunCLI

Supported Python versions Build status Coverage Downloads License

Automatically generate a simple CLI.

Installation

pip install funcli

Basic Usage

def main(*args: int):
	"""
		Adds numbers together.
		
		:param args: some numbers
	"""
	print("Sum:", sum(args))

if __name__ == '__main__':
	import funcli
	funcli.main()

# $ python sum.py 1 2 3
# Sum: 6

--help is autogenerated by the backend (argparse):

$ python sum.py -h
usage: sum.py [-h] [args [args ...]]

Adds numbers together.

positional arguments:
	args        some numbers

optional arguments:
	-h, --help  show this help message and exit

Advanced Usage

def foo(): pass
def bleep(): pass
async def bloop_it(a, second_arg: int = 0, *c: str, d: list[float] | None = None):
	print("Args:", a, second_arg, c, d)

if __name__ == '__main__':
	import funcli
	funcli.main({ 'foo': foo, 'bar': { bleep, bloop_it } })

# $ python advanced.py bar bloop-it arg0 c0 c1 --second-arg=987 --d 42 -0.3
# Args: arg0 987 ('c0', 'c1'), [42, -0.3]

Note that underscores in variable and function names are automatically converted to dashes in the command-line argument (second_arg -> --second-arg). You can disable this by passing dash = False to funcli.main or funcli.run.

Reference

funcli.main(spec = None, dash = True)

Sugar. spec defaults to the main function from the caller's scope. Calls funcli.run on spec, and calls sys.exit with the return value. If dash == True, underscores in Python parameters will be changed to dashes in the corresponding command-line arguments.

funcli.run(spec, args = None, converters = None, dash = True)
  • spec is either a callable, a sequence of callables, or a dict mapping strings to nested specs
  • args default to sys.argv[1:]
  • converters is a mapping from types (or whatever you want to use as annotations) to a function that parses a command-line argument
  • if dash == True, underscores in Python parameters or function names will be changed to dashes in the corresponding command-line arguments

Given functions foo, bar, baz, here are some sample invocations:

funcli.run(foo, ['arg0']) # Calls foo('arg0')
funcli.run({ foo, bar }, ['bar', 'arg0']) # Calls bar('arg0')
funcli.run({ 'beep': foo, 'bloop': [bar, baz] }, ['beep', 'arg0']) # Calls foo('arg0')
funcli.run({ 'beep': foo, 'bloop': [bar, baz] }, ['bloop', 'bar', 'arg0']) # Calls bar('arg0')

bool arguments

Non-optional bool values should be passed as True and False on the command line. Optional bool values, on the other hand, must be omitted.

def f(warnings: bool = False): ...
funcli.run(f, ['--warnings']) # f(warnings = True)

Note: currently, if the default value is True, there is no way to pass False.

Converters

Built-in converters handle int, float, bool, and pathlib.Path. Unannotated args are kept as a str. Basic sequence types (list[T], set[T], tuple[T, ...], Iterable[T], Sequence[T]) are supported, but only as optional arguments, e.g.:

def f(mylist: List[int] = []): ...
funcli.run(f, ['--mylist', '1', '2']) # f([1, 2])

Optionals (T | None) are supported, but there's currently no way to explicitly pass None values.

Notes

Because of argparse limitations:

  • **kwargs aren't supported; if your function has them, they'll always be empty
  • optional arguments cannot be positional; f(a = 'default') has to be invoked as python foo.py --a=nondefault

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

funcli-0.8.0-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

Details for the file funcli-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: funcli-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 6.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for funcli-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4fa7d5902977058c0251ae083dc068009655fb4ffe5aa385be940366fea40f21
MD5 761e3889a6dec824a356c5d8788aaf32
BLAKE2b-256 1b0c7b0be7121e87b6fba8bf6fbffa27585c469fd1e95255a51b8b556c92189a

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