Exemplo n.º 1
0
def test_invoke():

    sm_invoke_endpoint_expected_params = {
        "EndpointName": "test",
        "Body": "test",
        "ContentType": "text/csv",
    }

    event_body = {"payload": "test", "ContentType": "text/csv"}

    with patch('boto3.client') as mock_client:
        invoke(event_body, "test", sm_client=mock_client)
        mock_client.invoke_endpoint.assert_called_with(
            EndpointName="test",
            Body="test",
            ContentType="text/csv"
        )
Exemplo n.º 2
0
def daemon():
    G.lock_fh = open(cfg.lock_file, "w")
    try:
        fcntl.lockf(G.lock_fh, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except IOError as e:
        if e.errno not in (errno.EACCES, errno.EAGAIN):
            raise
        raise Error("daemon already running")

    logger.info("daemon started (pid %s)", os.getpid())
    atexit.register(exit_handler)

    cfg.pid_file.write_text("%s\n" % os.getpid())
    while True:
        start_time = time.time()
        invoke(["update"])
        delay = 60 - (time.time() - start_time)
        if delay > 0:
            logger.debug("sleeping for %ss", delay)
            time.sleep(delay)
Exemplo n.º 3
0
def edit(date, adjust, reason):
    # parse args
    try:
        dt = ui.parse_date(date, context="day")
        adjust_mins = ui.parse_adjustment(adjust)
        reason = (" ".join(reason)).strip()
    except ValueError as e:
        raise Error(e)

    # validate reason
    if not reason:
        raise Error("'reason' must be provided")

    # validate adjustment
    if abs(adjust_mins) > 60 * 24:
        raise Error("adjustment is too large")

    minutes = 0
    for dtr in database.active_ranges(dt, dt.ceil("day")):
        minutes += dtr.minutes

    edits = database.edits(dt)
    for e in edits:
        minutes += e.minutes

    if minutes + adjust_mins > 60 * 24:
        raise Error("total adjustments for %s would exceed 24 hours" %
                    dt.format("Do MMM"))
    if minutes + adjust_mins < 0:
        raise Error("total adjustments for %s would be negative" %
                    dt.format("Do MMM"))

    # insert into db and show summary
    database.log_edit(dt, adjust_mins, reason)

    invoke(["day"])
Exemplo n.º 4
0
def help_cmd(command=None):
    invoke([command, "--help"] if command else ["--help"])
Exemplo n.º 5
0
def week(date, status):
    start_dt = ui.parse_date(date, context="week")

    # start_dt needs to be a monday
    if start_dt.weekday() != 0:
        start_dt = start_dt.shift(days=-7).shift(weekday=0)

    end_dt = start_dt.shift(days=7).shift(minutes=-1)

    # count days worked
    days = {}
    dt = start_dt.clone()
    while dt < end_dt:
        days[dt.format("YYYYMMDD")] = dict(dt=dt.clone(), minutes=0, edited=False)
        dt = dt.shift(days=1)

    # tally minutes
    total_minutes = 0
    for dtr in database.active_ranges(start_dt, end_dt):
        days[dtr.start_dt.format("YYYYMMDD")]["minutes"] += dtr.minutes
        total_minutes += dtr.minutes

    # process edits
    for ymd in sorted(days.keys()):
        for edit in database.edits(days[ymd]["dt"]):
            days[ymd]["minutes"] += edit.minutes
            days[ymd]["edited"] = True
            total_minutes += edit.minutes

    # header
    print(
        "%s %s %s %s - %s"
        % (
            coloured("yellow", ui.format_minutes(total_minutes)),
            coloured("yellow", "%-9s" % "WEEK"),
            ui.format_minutes_relative(cfg.work_week * 60, total_minutes),
            coloured("yellow", start_dt.format("Do MMM")),
            coloured("yellow", end_dt.format("Do MMM")),
        )
    )

    hours_per_day = (cfg.work_week * 60) / 5
    today = arrow.now(tz=cfg.time_zone).ceil("day")
    today_ymd = today.format("YYYYMMDD")
    is_away = state.is_away()
    for ymd in sorted(days.keys()):
        dt = days[ymd]["dt"]
        minutes = days[ymd]["minutes"]
        edited = days[ymd]["edited"]
        current = not is_away and ymd == today_ymd

        # don't report on the weekend unless there were hours logged
        if dt.weekday() > 4 and minutes == 0:
            continue

        # only report future dates if there's edits
        if dt > today and not edited:
            continue

        print(
            "%s %s %s%s%s"
            % (
                ui.format_minutes(minutes),
                "%-9s" % dt.format("dddd"),
                ui.format_minutes_relative(hours_per_day, minutes),
                " %s" % ui.CHAR_EDITED if edited else "",
                " %s" % ui.CHAR_CURRENT if current else "",
            )
        )

    if status:
        invoke(["status", "--no-daemon"])
Exemplo n.º 6
0
def test_invoke(event):
    with patch("boto3.client") as mock_client:
        invoke(json.loads(event["body"]), "test", sm_client=mock_client)
        mock_client.invoke_endpoint.assert_called_with(EndpointName="test",
                                                       Body="test",
                                                       ContentType="text/csv")