~reviewer/hello-hut

ref: 05b11e83d429b8dc796116a590ac2d3865b314d0 hello-hut/src/hello_hut/cli.py -rw-r--r-- 2.2 KiB
05b11e83 — Ines Moreau Add bash and zsh completions 2 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""Command-line interface for hello-hut."""

import argparse
import json
import os
import sys

from . import __version__
from .config import load_config
from .greetings import DEFAULT_NAME, greet, time_of_day_greeting


def build_parser():
    parser = argparse.ArgumentParser(
        prog="hello-hut",
        description="A friendly greeting tool for your terminal.",
    )
    parser.add_argument("name", nargs="?", help="who to greet")
    parser.add_argument("--shout", action="store_true",
                        help="print the greeting in capitals")
    parser.add_argument("--time-of-day", action="store_true",
                        help="say good morning, afternoon or evening")
    parser.add_argument("--count", type=int, default=1, metavar="N",
                        help="repeat the greeting N times (default: 1)")
    parser.add_argument("--color", choices=("auto", "always", "never"),
                        default="auto", help="colorize the output")
    parser.add_argument("--format", choices=("text", "json"), default="text",
                        help="output format (default: text)")
    parser.add_argument("--version", action="version",
                        version=f"%(prog)s {__version__}")
    return parser


def use_color(mode, stream=sys.stdout):
    """Decide whether to colorize, honouring NO_COLOR (https://no-color.org)."""
    if mode == "always":
        return True
    if mode == "never" or os.environ.get("NO_COLOR"):
        return False
    return stream.isatty()


def main(argv=None):
    args = build_parser().parse_args(argv)
    config = load_config()
    name = args.name or config.get("name", DEFAULT_NAME)
    shout = args.shout or bool(config.get("shout", False))
    if args.count < 1:
        print("hello-hut: --count must be at least 1", file=sys.stderr)
        return 2

    salutation = time_of_day_greeting() if args.time_of_day else None
    message = greet(name, shout=shout, salutation=salutation)
    for _ in range(args.count):
        if args.format == "json":
            print(json.dumps({"greeting": message, "name": name}))
        elif use_color(args.color):
            print(f"\033[1;32m{message}\033[0m")
        else:
            print(message)
    return 0