コード例 #1
0
ファイル: timer.py プロジェクト: sjarvie/walrOS
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)
コード例 #2
0
ファイル: timer.py プロジェクト: sjarvie/walrOS
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)
コード例 #3
0
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))
コード例 #4
0
ファイル: timer.py プロジェクト: sjarvie/walrOS
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)
コード例 #5
0
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)
コード例 #6
0
ファイル: timer.py プロジェクト: sjarvie/walrOS
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)
コード例 #7
0
ファイル: timer.py プロジェクト: sjarvie/walrOS
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()
コード例 #8
0
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))
コード例 #9
0
def status_command():
    # TODO(alive): implement
    util.tlog("Wawaaw... Not implemented yet :(")