main.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # -*- coding: utf-8 -*-
  2. """
  3. This is a skeleton file that can serve as a starting point for a Python
  4. console script. To run this script uncomment the following lines in the
  5. [options.entry_points] section in setup.cfg:
  6. console_scripts =
  7. fibonacci = ynrc.skeleton:run
  8. Then run `python setup.py install` which will install the command `fibonacci`
  9. inside your current environment.
  10. Besides console scripts, the header (i.e. until _logger...) of this file can
  11. also be used as template for Python modules.
  12. Note: This skeleton file can be safely removed if not needed!
  13. """
  14. import argparse
  15. import logging
  16. import sys
  17. from ynrc import __version__
  18. __author__ = "Nikola Kotur"
  19. __copyright__ = "Nikola Kotur"
  20. __license__ = "mit"
  21. _logger = logging.getLogger(__name__)
  22. def fib(n):
  23. """Fibonacci example function
  24. Args:
  25. n (int): integer
  26. Returns:
  27. int: n-th Fibonacci number
  28. """
  29. assert n > 0
  30. a, b = 1, 1
  31. for i in range(n - 1):
  32. a, b = b, a + b
  33. return a
  34. def parse_args(args):
  35. """Parse command line parameters
  36. Args:
  37. args ([str]): command line parameters as list of strings
  38. Returns:
  39. :obj:`argparse.Namespace`: command line parameters namespace
  40. """
  41. parser = argparse.ArgumentParser(description="Just a Fibonacci demonstration")
  42. parser.add_argument(
  43. "--version",
  44. action="version",
  45. version="ynrc {ver}".format(ver=__version__),
  46. )
  47. parser.add_argument(dest="n", help="n-th Fibonacci number", type=int, metavar="INT")
  48. parser.add_argument(
  49. "-v",
  50. "--verbose",
  51. dest="loglevel",
  52. help="set loglevel to INFO",
  53. action="store_const",
  54. const=logging.INFO,
  55. )
  56. parser.add_argument(
  57. "-vv",
  58. "--very-verbose",
  59. dest="loglevel",
  60. help="set loglevel to DEBUG",
  61. action="store_const",
  62. const=logging.DEBUG,
  63. )
  64. return parser.parse_args(args)
  65. def setup_logging(loglevel):
  66. """Setup basic logging
  67. Args:
  68. loglevel (int): minimum loglevel for emitting messages
  69. """
  70. logformat = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
  71. logging.basicConfig(
  72. level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S"
  73. )
  74. def main(args):
  75. """Main entry point allowing external calls
  76. Args:
  77. args ([str]): command line parameter list
  78. """
  79. args = parse_args(args)
  80. setup_logging(args.loglevel)
  81. _logger.debug("Starting crazy calculations...")
  82. print("The {}-th Fibonacci number is {}".format(args.n, fib(args.n)))
  83. _logger.info("Script ends here")
  84. def run():
  85. """Entry point for console_scripts"""
  86. main(sys.argv[1:])
  87. if __name__ == "__main__":
  88. run()