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" )
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)
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"])
def help_cmd(command=None): invoke([command, "--help"] if command else ["--help"])
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"])
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")