"""A small CLI that prints a configurable greeting.""" from __future__ import annotations import argparse import doctest from collections.abc import Sequence def build_greeting(name: str, excited: bool = False) -> str: """Build a greeting. >>> build_greeting("Ada") 'Hello, Ada.' >>> build_greeting("Grace", excited=True) 'Hello, Grace!' """ punctuation = "!" if excited else "." return f"Hello, {name}{punctuation}" def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: """Parse command-line arguments.""" parser = argparse.ArgumentParser(description="Print a friendly greeting.") parser.add_argument("name", help="name of the person to greet") parser.add_argument( "-n", "--count", type=int, default=1, help="number of greetings to print (default: 1)", ) parser.add_argument( "--excited", action="store_true", help="end the greeting with an exclamation mark", ) parser.add_argument( "--test", action="store_true", help="run the embedded tests before printing", ) args = parser.parse_args(argv) if args.count < 1: parser.error("--count must be at least 1") return args def main(argv: Sequence[str] | None = None) -> int: """Run the command-line program.""" args = parse_args(argv) if args.test: failures, _ = doctest.testmod() if failures: return 1 greeting = build_greeting(args.name, args.excited) for _ in range(args.count): print(greeting) return 0 if __name__ == "__main__": raise SystemExit(main())