Skip to content

Python Cli

command line interface

Click

import click


@click.command()
@click.option('-m', '--module', type=click.Choice(['log', 'content', 'dimension']), required=True)
def dots(n):
    click.echo('.' * n)


if __name__ == '__main__':
    dots()

argparse

def main():
    parser = argparse.ArgumentParser(description="Generate your vaccination QR code.")
    parser.add_argument("-n", "--name", type=str, help="Your name", required=True)
    parser.add_argument("-b", "--birth", type=str, help="Your birthday in YYYY-MM-DD format", required=True)
    parser.add_argument("-m", "--manufacturer", type=str, nargs="+", help="The vaccine manufacturer", required=True, choices=[
            "pfizer","moderna","astrazeneca","janssen","sinovac"])
    parser.add_argument("-d", "--date", type=str, nargs="+", help="The date of vaccination", required=True)
    args = parser.parse_args()

    if len(args.manufacturer) != len(args.date):
        logging.error(
            "The number of vaccine manufacturer doesn't match with the number of vaccine dates."
        )
        exit(1)

    qr_code = QRCode(name=args.name, birth=args.birth, vaccine=[Vaccination(args.manufacturer[i], args.date[i]) for i in range(len(args.date))])
    generate_qr_code(qr_code)

if __name__ == "__main__":
    try:
        main()
    except ValidationException as e:
        logging.error(e)
    except Exception as e:
        logging.exception(e)

Typer

import typer
from enum import Enum
from typing import List, Optional

class ApprovedVaccine(str, Enum):
    pfizer = "pfizer"
    moderna = "moderna"
    astrazeneca = "astrazeneca"
    janssen = "janssen"
    sinovac = "sinovac"

def main(
    name: str = typer.Option(..., help="Your Name"),
    birth: str = typer.Option(..., help="Your birthday in YYYY-MM-DD format", callback=validate_date),
    manufacturer: Optional[List[ApprovedVaccine]] = typer.Option(..., help="The vaccine manufacturer", case_sensitive=False),
    date: Optional[List[str]] = typer.Option(..., help="The date of vaccination", callback=validate_date)
):
    """Generate your vaccination QR code."""
    # same logic as Click example
    print(name, birth, manufacturer, date)

if __name__ == "__main__":
    typer.run(main)

Docopt

"""Generate your vaccination QR code.
Usage:
    cli.py (-n NAME) (-b BIRTH) (-m MANUFACTURER) [-m MANUFACTURER] (-d DATE) [-d DATE]
    cli.py -h|--help
    cli.py -v|--version
-n --name Your name
-b --birth Your birthday in YYYY-MM-DD format
-m --manufacturer The vaccine manufacturer
-d --date The date of vaccination
-h --help  Show this screen.
-v --version  Show version.
"""

from docopt import docopt

if __name__ == "__main__":
    arguments = docopt(__doc__)
    name = arguments["--name"]
    birth = arguments["--birth"]
    manufacturer = arguments["--manufacturer"]
    date = arguments["--date"]

    print(arguments)

Fire

import fire

def main(name, birth, manufacturer, date):
    """
    Generate your vaccination QR code.
    --name Your name.
    --birth Your birthday in YYYY-MM-DD format
    --manufacturer The vaccine manufacturer
    --date The date of vaccination
    """
    # custom validation like Argparser example
    pass

if __name__ == "__main__":
    fire.Fire(main)