timegen.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """
  2. main module to read and get informations about alarms
  3. """
  4. from __future__ import print_function
  5. import sys
  6. from datetime import datetime
  7. import argparse
  8. import json
  9. from .entrypoints_utils import get_one_entrypoint
  10. from logging import getLogger
  11. log = getLogger("timegen")
  12. def get_timegenerator(kind):
  13. """Messes with entrypoints to return an timegenerator function"""
  14. return get_one_entrypoint("larigira.timegenerators", kind)
  15. def get_parser():
  16. parser = argparse.ArgumentParser(
  17. description='Generate "ring times" from a timespec'
  18. )
  19. parser.add_argument(
  20. "timespec",
  21. metavar="TIMESPEC",
  22. type=str,
  23. nargs=1,
  24. help="filename for timespec, formatted in json",
  25. )
  26. parser.add_argument(
  27. "--now",
  28. metavar="NOW",
  29. type=int,
  30. nargs=1,
  31. default=None,
  32. help='Set a different "time", in unix epoch',
  33. )
  34. parser.add_argument(
  35. "--howmany",
  36. metavar="N",
  37. type=int,
  38. nargs=1,
  39. default=[1],
  40. help='Set a different "time", in unix epoch',
  41. )
  42. return parser
  43. def read_spec(fname):
  44. try:
  45. if fname == "-":
  46. return json.load(sys.stdin)
  47. with open(fname) as buf:
  48. return json.load(buf)
  49. except ValueError:
  50. sys.stderr.write("Error: invalid JSON\n")
  51. sys.exit(1)
  52. def check_spec(spec):
  53. if "kind" not in spec:
  54. yield "Missing field 'kind'"
  55. def timegenerate(spec, now=None, howmany=1):
  56. Alarm = get_timegenerator(spec["kind"])
  57. generator = Alarm(spec)
  58. if now is not None:
  59. if type(now) is not datetime:
  60. now = datetime.fromtimestamp(now)
  61. for _ in range(howmany):
  62. now = generator.next_ring(current_time=now)
  63. yield now
  64. def main():
  65. """Main function for the "larigira-timegen" executable"""
  66. args = get_parser().parse_args()
  67. spec = read_spec(args.timespec[0])
  68. errors = tuple(check_spec(spec))
  69. if errors:
  70. log.error("Errors in timespec")
  71. for err in errors:
  72. sys.stderr.write("Error: {}\n".format(err))
  73. sys.exit(1)
  74. now = None if args.now is None else args.now.pop()
  75. howmany = None if args.howmany is None else args.howmany.pop()
  76. for time in timegenerate(spec, now=now, howmany=howmany):
  77. print(time)