2019-06-25 13:49:33 +02:00
|
|
|
"""
|
2014-11-03 02:15:22 +01:00
|
|
|
main module to read and get informations about alarms
|
2019-06-25 13:49:33 +02:00
|
|
|
"""
|
2014-11-03 02:15:22 +01:00
|
|
|
import sys
|
2016-08-29 20:04:35 +02:00
|
|
|
from datetime import datetime
|
2014-11-03 02:15:22 +01:00
|
|
|
import argparse
|
|
|
|
import json
|
2016-08-29 20:04:35 +02:00
|
|
|
from .entrypoints_utils import get_one_entrypoint
|
2015-02-01 19:57:50 +01:00
|
|
|
from logging import getLogger
|
2019-06-25 13:49:33 +02:00
|
|
|
|
|
|
|
log = getLogger("timegen")
|
2014-11-03 02:15:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
def get_timegenerator(kind):
|
2019-06-25 13:49:33 +02:00
|
|
|
"""Messes with entrypoints to return an timegenerator function"""
|
|
|
|
return get_one_entrypoint("larigira.timegenerators", kind)
|
2014-11-03 02:15:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
def get_parser():
|
|
|
|
parser = argparse.ArgumentParser(
|
2019-06-25 13:49:33 +02:00
|
|
|
description='Generate "ring times" from a timespec'
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"timespec",
|
|
|
|
metavar="TIMESPEC",
|
|
|
|
type=str,
|
|
|
|
nargs=1,
|
|
|
|
help="filename for timespec, formatted in json",
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"--now",
|
|
|
|
metavar="NOW",
|
|
|
|
type=int,
|
|
|
|
nargs=1,
|
|
|
|
default=None,
|
|
|
|
help='Set a different "time", in unix epoch',
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"--howmany",
|
|
|
|
metavar="N",
|
|
|
|
type=int,
|
|
|
|
nargs=1,
|
|
|
|
default=[1],
|
|
|
|
help='Set a different "time", in unix epoch',
|
|
|
|
)
|
2014-11-03 02:15:22 +01:00
|
|
|
return parser
|
|
|
|
|
|
|
|
|
|
|
|
def read_spec(fname):
|
2016-07-19 17:11:36 +02:00
|
|
|
try:
|
2019-06-25 13:49:33 +02:00
|
|
|
if fname == "-":
|
2016-07-19 17:11:36 +02:00
|
|
|
return json.load(sys.stdin)
|
|
|
|
with open(fname) as buf:
|
|
|
|
return json.load(buf)
|
|
|
|
except ValueError:
|
|
|
|
sys.stderr.write("Error: invalid JSON\n")
|
|
|
|
sys.exit(1)
|
2014-11-03 02:15:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
def check_spec(spec):
|
2019-06-25 13:49:33 +02:00
|
|
|
if "kind" not in spec:
|
2014-11-03 02:15:22 +01:00
|
|
|
yield "Missing field 'kind'"
|
|
|
|
|
|
|
|
|
|
|
|
def timegenerate(spec, now=None, howmany=1):
|
2019-06-25 13:49:33 +02:00
|
|
|
Alarm = get_timegenerator(spec["kind"])
|
2014-11-03 02:15:22 +01:00
|
|
|
generator = Alarm(spec)
|
|
|
|
if now is not None:
|
|
|
|
if type(now) is not datetime:
|
|
|
|
now = datetime.fromtimestamp(now)
|
2016-08-29 20:04:35 +02:00
|
|
|
for _ in range(howmany):
|
2014-11-03 02:15:22 +01:00
|
|
|
now = generator.next_ring(current_time=now)
|
|
|
|
yield now
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
2019-06-25 13:49:33 +02:00
|
|
|
"""Main function for the "larigira-timegen" executable"""
|
2014-11-03 02:15:22 +01:00
|
|
|
args = get_parser().parse_args()
|
|
|
|
spec = read_spec(args.timespec[0])
|
|
|
|
errors = tuple(check_spec(spec))
|
|
|
|
if errors:
|
2015-02-01 19:57:50 +01:00
|
|
|
log.error("Errors in timespec")
|
2014-11-03 02:15:22 +01:00
|
|
|
for err in errors:
|
2019-06-25 13:49:33 +02:00
|
|
|
sys.stderr.write("Error: {}\n".format(err))
|
2014-11-03 02:15:22 +01:00
|
|
|
sys.exit(1)
|
|
|
|
now = None if args.now is None else args.now.pop()
|
|
|
|
howmany = None if args.howmany is None else args.howmany.pop()
|
|
|
|
for time in timegenerate(spec, now=now, howmany=howmany):
|
|
|
|
print(time)
|