def clear_command(label): if timer_db.timer_exists(label): with timer_db.TimerFileProxy(label) as timer: if timer.is_running: util.tlog("The timer with label `%s` is currently running" % timer.label) return timer.clear() else: util.tlog("No paused timer with label '%s' exists" % label)
def timer_notify(): util.tlog("Notified") time_str = datetime.datetime.strftime(datetime.datetime.now(), "%H:%M") subprocess.call([ "osascript -e \'display notification " + "\"%s: notify\" with title \"walrOS timer\"\'" % time_str ], shell=True) for ix in range(0, 3): subprocess.call(["afplay", "/System/Library/Sounds/Blow.aiff"]) time.sleep(2)
def done_command(label): # TODO(alive): Rewrite with the paradigm used in timer_db.py. # Move this logic into Entry. if not os.path.isfile(_resource_path(label)): util.tlog("No diary entry with label `%s` exists" % label) return with util.OpenAndLock(_resource_path(label), 'r') as f: entry = json.load(f) now = time.time() span = now - entry['epoch'] effective = entry['effective'] # Handle orderings: # 1. __enter__, new, done, __exit__. # 2. new, done, __enter__, __exit__. # 3. __enter__, __exit__, new, done. # # If we are in any of the above orderings AND effective is 0.0, then we # simply set `effective` to `span`. In these cases, there is no interaction # between diary and timer. # # If, however, the first condition is True, but the second is false, then # we must be in case #1 above. The only way for `effective` to be non-zero # here is for the user to have called timer.inc(). This is only possible # if a timer is running, and therefore, cases #2 and #3 are ruled out. The # else block handles this case. if (util.isclose(entry['epoch'], entry['interval_start_time']) and util.isclose(effective, 0.0)): effective = span else: # Handle orderings: # 1. __enter__, new, done, __exit__ (with call to timer.inc()). # 5. new, __enter__, done, __exit__. # Capture the amount of time elapsed after __enter__. timer = timer_db.running_timer() if timer: with timer: if timer.label == label: effective += time.time() - entry['interval_start_time'] if util.isclose(span - effective, 0.0, abs_tol=_TIME_EPSILON): overhead = 0.0 else: overhead = (span - effective) / span click.echo(" Start time: %s" % _format_timestamp(entry['epoch'])) click.echo(" End time: %s" % _format_timestamp(now)) click.echo(" Span (m): %.2f" % (span / 60.0)) click.echo(" Effective (m): %.2f" % (effective / 60.0)) click.echo(" Overhead (%%): %.1f%%" % (overhead * 100.0)) os.remove(_resource_path(label))
def inc_command(delta): timer = timer_db.running_timer() if not timer: util.tlog("No timer is currently running") return with timer: remaining = timer.remaining timer.inc(delta) click.echo(" previous: %f" % remaining) click.echo(" current: %f" % timer.remaining) if diary.increment_effective(timer.label, -1 * delta): click.echo(" (diary updated)") set_signal(DISPLAY_UPDATE_SIGNAL)
def new_command(label): if os.path.isfile(_resource_path(label)): util.tlog("A diary entry with label `%s` already exists" % label) return now = time.time() entry = { 'label': label, 'epoch': now, 'interval_start_time': now, 'effective': 0.0, } with util.OpenAndLock(_resource_path(label), 'w') as f: f.write(util.json_dumps(entry)) util.tlog("diary entry with label `%s` created" % label)
def init_command(): tracker_data = init_tracker_data() spreadsheet = data_util.Spreadsheet(walros_base.SPREADSHEET_ID) worksheet = spreadsheet.GetWorksheet(tracker_data.worksheet_id) init_requests = walros_base.build_init_requests(tracker_data, spreadsheet, worksheet) if len(init_requests) == 0: util.tlog("%s sheet is already initialized for today" % tracker_data.worksheet_name) return # Update sheet wide statistics. init_requests += build_update_statistics_requests(worksheet, tracker_data) # Send requests. response = spreadsheet.BatchUpdate(init_requests)
def start_command(label, seconds, minutes, hours, whitenoise, track, force): tracker_data = init_tracker_data() if not set_signal(TIMER_RUNNING_SIGNAL): util.tlog("A timer is already running") return clear_signals(exclude=[TIMER_RUNNING_SIGNAL]) if not seconds and not minutes and not hours: seconds = FOCUS_UNIT_DURATION if force and timer_db.timer_exists(label): with timer_db.TimerFileProxy(label) as timer: timer.clear() if timer_db.timer_exists(label): with timer_db.TimerFileProxy(label) as timer: timer.resume() util.tlog("Resuming at %d seconds" % timer.remaining) else: with timer_db.TimerFileProxy(label) as timer: timer.start(seconds, minutes, hours) util.tlog("Starting at %d seconds" % timer.remaining) try: with diary.Entry(label): # Tracks effective time spent and overhead. while True: # Timer loop. # end time could have been changed; read again from file with timer_db.TimerFileProxy(label) as timer: if timer.is_complete: util.tlog("Timer `%s` completed" % timer.label) break if unset_signal(DISPLAY_UPDATE_SIGNAL): util.tlog("Currently at %d seconds" % timer.remaining) time.sleep(1) finally: with timer_db.TimerFileProxy(label) as timer: if timer.is_complete: timer.clear() else: remaining = timer.pause() util.tlog("Pausing timer at %d seconds" % remaining, prefix='\n') unset_signal(TIMER_RUNNING_SIGNAL) try: # Notify and record. if track: spreadsheet = data_util.Spreadsheet(walros_base.SPREADSHEET_ID) worksheet = spreadsheet.GetWorksheet(tracker_data.worksheet_id) latest_date = spreadsheet.GetCellValue( worksheet_name=tracker_data.worksheet_name, row=tracker_data.row_margin + 1, col=1) latest_date = latest_date.split()[0] date_today = datetime.datetime.now().strftime("%Y-%m-%d") if latest_date != date_today: util.tlog( "Warning: the latest row in spreadsheet does not correspond " "to today's date") label_count = timer_increment_label_count(spreadsheet, worksheet, tracker_data, label) util.tlog("%s count: %d" % (label, label_count)) except Exception as ex: util.tlog("Error updating spreadsheet count") raise ex finally: timer_notify()
def remove_command(label): if not os.path.isfile(_resource_path(label)): util.tlog("No diary entry with label `%s` exists" % label) return os.remove(_resource_path(label))
def status_command(): # TODO(alive): implement util.tlog("Wawaaw... Not implemented yet :(")