app.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import logging
  2. import argparse
  3. import sys
  4. import colorlog
  5. class App:
  6. def __init__(self, no_exit=False):
  7. # Argument Parser
  8. self.no_exit = no_exit
  9. self.parser = argparse.ArgumentParser()
  10. self.parser.add_argument("-d", "--debug", action="store_true", help="Debug")
  11. # Logging
  12. self.logger = colorlog.getLogger()
  13. # Application specific initialization
  14. self.init()
  15. def __call__(self, args=None, skip_logger_init=False):
  16. self.args, self.other_args = self.parser.parse_known_args(args=args)
  17. # configure log output
  18. # if skip_logger_init:
  19. self.log_level = logging.DEBUG if self.args.debug else logging.INFO
  20. self.logger.setLevel(self.log_level)
  21. if not self.logger.hasHandlers():
  22. self.handler = colorlog.StreamHandler(sys.stdout)
  23. self.handler.setLevel(self.log_level)
  24. self.formatter = colorlog.ColoredFormatter(
  25. "%(log_color)s%(asctime)s [%(levelname)s] %(message)s",
  26. log_colors={
  27. "DEBUG": "cyan",
  28. # "INFO": "white",
  29. "WARNING": "yellow",
  30. "ERROR": "red",
  31. "CRITICAL": "red,bg_white",
  32. },
  33. )
  34. self.handler.setFormatter(self.formatter)
  35. self.logger.addHandler(self.handler)
  36. # execute requested function
  37. self.before()
  38. return_code = self.call()
  39. self.after()
  40. if isinstance(return_code, int):
  41. return self._exit(return_code)
  42. else:
  43. self.logger.error("Missing return code")
  44. return self._exit(255)
  45. def _exit(self, code):
  46. if self.no_exit:
  47. return code
  48. exit(code)
  49. def call(self):
  50. if "func" not in self.args:
  51. self.parser.error("Choose something to do")
  52. return self.args.func()
  53. def init(self):
  54. raise Exception("init() is not implemented")
  55. def before(self):
  56. pass
  57. def after(self):
  58. pass