__init__.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. """Library setup."""
  2. import logging
  3. from typing import Any
  4. # Current version of the library
  5. __version__ = '4.3.1'
  6. def get_version() -> str:
  7. """
  8. Return a string with the current version of the library.
  9. :rtype: ``string``
  10. :return: Library version (e.g., "0.1.0").
  11. """
  12. return __version__
  13. def init_logging() -> None:
  14. """
  15. Initialize logging for testing.
  16. Temporary workaround for build timeouts by enabling logging to
  17. stdout so that Travis doesn't think the build has hung.
  18. """
  19. set_stream_logger(__name__, level=logging.DEBUG)
  20. TRACE = 5 # Lower than debug which is 10
  21. class CBLogger(logging.Logger):
  22. """
  23. A custom logger, adds logging level below debug.
  24. Add a ``trace`` log level, numeric value 5: ``log.trace("Log message")``
  25. """
  26. def trace(self, msg: object, *args: object, **kwargs: Any) -> None:
  27. """Add ``trace`` log level."""
  28. self.log(TRACE, msg, *args, **kwargs)
  29. # By default, do not force any logging by the library. If you want to see the
  30. # log messages in your scripts, add the following to the top of your script:
  31. # import cloudbridge
  32. # cloudbridge.set_stream_logger(__name__)
  33. # OR
  34. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  35. default_format_string = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
  36. logging.setLoggerClass(CBLogger)
  37. logging.addLevelName(TRACE, "TRACE")
  38. log = logging.getLogger('cloudbridge')
  39. log.addHandler(logging.NullHandler())
  40. # Convenience functions to set logging to a particular file or stream
  41. # To enable either of these by default within CloudBridge, add the following
  42. # at the top of a CloudBridge module:
  43. # import cloudbridge
  44. # cloudbridge.set_stream_logger(__name__)
  45. # OR
  46. # cloudbridge.set_file_logger(__name__, '/tmp/log')
  47. def set_stream_logger(name: str, level: int = TRACE,
  48. format_string: str | None = None) -> None:
  49. """A convenience method to set the global logger to stream."""
  50. global log
  51. if not format_string:
  52. format_string = default_format_string
  53. logger = logging.getLogger(name)
  54. logger.setLevel(level)
  55. fh = logging.StreamHandler()
  56. fh.setLevel(level)
  57. formatter = logging.Formatter(format_string)
  58. fh.setFormatter(formatter)
  59. logger.addHandler(fh)
  60. log = logger
  61. def set_file_logger(name: str, filepath: str, level: int = logging.INFO,
  62. format_string: str | None = None) -> None:
  63. """A convenience method to set the global logger to a file."""
  64. global log
  65. if not format_string:
  66. format_string = default_format_string
  67. logger = logging.getLogger(name)
  68. logger.setLevel(level)
  69. fh = logging.FileHandler(filepath)
  70. fh.setLevel(level)
  71. formatter = logging.Formatter(format_string)
  72. fh.setFormatter(formatter)
  73. logger.addHandler(fh)
  74. log = logger