File size: 1,595 Bytes
e197abb | 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 | import argparse
import logging
import sys
from pathlib import Path
LOG_FORMAT = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
def setup_logging(level: str, log_file: str | None = None) -> None:
handlers: list[logging.Handler] = [logging.StreamHandler(sys.stdout)]
if log_file:
handlers.append(logging.FileHandler(log_file))
logging.basicConfig(
level=getattr(logging, level.upper(), logging.INFO),
format=LOG_FORMAT,
handlers=handlers,
)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description="Application entry point",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument("--debug", action="store_true")
parser.add_argument("--log-file", default=None)
parser.add_argument("--config", default="config.json")
parser.add_argument("--dry-run", action="store_true")
return parser
def main() -> int:
parser = build_parser()
args = parser.parse_args()
setup_logging("DEBUG" if args.debug else "INFO", args.log_file)
logger = logging.getLogger(__name__)
if not Path(args.config).exists():
logger.warning("Config not found at %s, using defaults", args.config)
from app import App
try:
app = App(debug=args.debug, dry_run=args.dry_run)
app.run()
except KeyboardInterrupt:
logger.info("Interrupted")
return 130
except Exception as exc:
logger.exception("Fatal: %s", exc)
return 1
return 0
if __name__ == "__main__":
sys.exit(main())
|