## hatch_ci.__main__

src/hatch_ci/__main__.py
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    from __future__ import annotations

    import argparse
    import functools
    import logging
    import sys
    from typing import Any

    from . import tools

    log = logging.getLogger(__name__)

    def parse_args(args: str | None = None, testmode: bool = False) -> dict[str, Any]:
        """parses args from the command line

        Args:
            args: command line arguments or None to pull from sys.argv
            testmode: internal flag, if set will not SystemExit but will
                      raises tools.AbortExecution
        """

        class F(
            argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter
        ):
            pass

        parser = argparse.ArgumentParser(formatter_class=F, description=__doc__)

        parser.add_argument("-n", "--dry-run", dest="dryrun", action="store_true")
        parser.add_argument("-v", "--verbose", action="store_true")

        options = parser.parse_args(args)

        def error(message, explain="", hint="", parser=None, testmode=False):
            out = []
            if parser:
                out.extend(tools.indent(parser.format_usage()).split("\n"))
            if message:
                out.extend(tools.indent(message).split("\n"))
            if explain:
                out.append("reason:")
                out.extend(tools.indent(explain).split("\n"))
            if hint:
                out.append("hint:")
                out.extend(tools.indent(hint).split("\n"))

            if testmode:
                raise tools.AbortExecution(message, explain, hint)
            else:
                print()  # noqa: T201
                print("\n".join(out), file=sys.stderr)  # noqa: T201
                raise SystemExit(2)

        options.error = functools.partial(error, parser=parser, testmode=testmode)

        logging.basicConfig(
            format="%(levelname)s:%(name)s:(dry-run) %(message)s"
            if options.dryrun
            else "%(levelname)s:%(name)s:%(message)s",
            level=logging.DEBUG if options.verbose else logging.INFO,
        )

        for d in [
            "verbose",
        ]:
            delattr(options, d)
        return options.__dict__

    def run():
        pass

    def main():
        run(**parse_args())

    if __name__ == "__main__":
        main()