From af5315c5b991228499ec2149030ce1262cffc6ae Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 2 May 2025 10:47:44 +0100 Subject: [PATCH] Add todo.txt pom and its dependencies --- .config/yadm/bootstrap.d/11-ruby | 7 ++ .todo.actions.d/pom/README.md | 36 ++++++ .todo.actions.d/pom/lib/countdown.rb | 39 +++++++ .todo.actions.d/pom/lib/file_logger.rb | 29 +++++ .todo.actions.d/pom/lib/pomo_logger.rb | 19 ++++ .todo.actions.d/pom/lib/task.rb | 63 +++++++++++ .../pom/lib/terminal_notifier_logger.rb | 9 ++ .todo.actions.d/pom/pom | 94 +++++++++++++++ .todo.actions.d/pom/screenshot.png | Bin 0 -> 48522 bytes .todo.actions.d/pom/spec/task_spec.rb | 107 ++++++++++++++++++ 10 files changed, 403 insertions(+) create mode 100755 .config/yadm/bootstrap.d/11-ruby create mode 100644 .todo.actions.d/pom/README.md create mode 100644 .todo.actions.d/pom/lib/countdown.rb create mode 100644 .todo.actions.d/pom/lib/file_logger.rb create mode 100644 .todo.actions.d/pom/lib/pomo_logger.rb create mode 100644 .todo.actions.d/pom/lib/task.rb create mode 100644 .todo.actions.d/pom/lib/terminal_notifier_logger.rb create mode 100755 .todo.actions.d/pom/pom create mode 100644 .todo.actions.d/pom/screenshot.png create mode 100644 .todo.actions.d/pom/spec/task_spec.rb diff --git a/.config/yadm/bootstrap.d/11-ruby b/.config/yadm/bootstrap.d/11-ruby new file mode 100755 index 0000000..9400891 --- /dev/null +++ b/.config/yadm/bootstrap.d/11-ruby @@ -0,0 +1,7 @@ +#!/bin/bash +if command -v ruby >/dev/null 2>&1; then + exit 0 +else + sudo pacman -S ruby + gem install rainbow terminal-notifier +fi diff --git a/.todo.actions.d/pom/README.md b/.todo.actions.d/pom/README.md new file mode 100644 index 0000000..330a648 --- /dev/null +++ b/.todo.actions.d/pom/README.md @@ -0,0 +1,36 @@ +## Pomodori-todo.txt + +A pomodoro counter implementation for [Todo.txt](http://todotxt.com/). + +## What it features + +* easily plan, run timers, and show current tasks status via the command line +* allows tmux integration to display the remaining pomodoro timer in your tmux statusbar +* logs the pomodori start time and end time to a log file for an easy history +* uses the terminal-notifier gem to notify you when your pomodoro starts and ends + +## Installation + +* Make sure you have ruby installed +* run `gem install rainbow terminal-notifier` +* Download this repo somewhere on your filesystem +* symlink the `pom` executable into your TODO_ACTIONS_DIR + +## Usage: + + todo.sh pom action [task_number] [args] + Actions: + ls + lists tasks with pomodori count and estimates + log + displays a log of your pomodori + start ITEM# + start a pomodoro timer for item ITEM# + add ITEM# + add one pomodoro to task on line ITEM# without running a timer + plan ITEM# PLANNED_POMODORI + estimate ITEM# will take PLANNED_POMODORI to complete + +## Example: + + diff --git a/.todo.actions.d/pom/lib/countdown.rb b/.todo.actions.d/pom/lib/countdown.rb new file mode 100644 index 0000000..570f3dc --- /dev/null +++ b/.todo.actions.d/pom/lib/countdown.rb @@ -0,0 +1,39 @@ +class Countdown + + def run seconds, options={} + seconds.downto(0) do |current_seconds| + sleep 1 + write_tmux(current_seconds) if (options[:services] || []).include?(:tmux) + set_window_title(current_seconds) if (options[:services] || []).include?(:iterm2) + STDOUT.write "[RUNNING] #{to_minutes(current_seconds)}\r" + end + end + + private + + def write_tmux(current_seconds) + `echo #{to_minutes(current_seconds, :tmux)} > ~/.pomo.txt.tmux` + end + + def set_window_title(current_seconds) + title = to_minutes(current_seconds, :tmux) + `echo -ne "\e]1;#{title}\a"` + end + + def to_minutes seconds, format=:standard + minutes = seconds / 60 + mins = sprintf("%02d", minutes) + secs = sprintf("%02d", seconds % 60) + if format == :standard + "#{mins}:#{secs} [#{dots_for(minutes)}]" + else + "#{mins}:#{secs}" + end + end + + + def dots_for mins + "#{'.' * (25 - mins)}#{' ' * mins}" + end + +end diff --git a/.todo.actions.d/pom/lib/file_logger.rb b/.todo.actions.d/pom/lib/file_logger.rb new file mode 100644 index 0000000..09f9d0b --- /dev/null +++ b/.todo.actions.d/pom/lib/file_logger.rb @@ -0,0 +1,29 @@ +require 'fileutils' + +class FileLogger + + attr_accessor :pomodoro_log_file + + def initialize log_file_path + @pomodoro_log_file = log_file_path + FileUtils.touch pomodoro_log_file + end + + def notify_start task + add_separator_if_new_day + File.open(pomodoro_log_file, "a") { |file| file.puts "#{Time.now.strftime('%Y/%m/%d %H:%M')} Pomodoro nr. #{sprintf("% 2d", task.pomodori + 1)} started: #{task.text}" } + end + + def notify_completed task + File.open(pomodoro_log_file, "a") { |file| file.puts "#{Time.now.strftime('%Y/%m/%d %H:%M')} Pomodoro nr. #{sprintf("% 2d", task.pomodori + 1)} completed: #{task.text}" } + end + + private + + def add_separator_if_new_day + return if File.zero?(pomodoro_log_file) + last_day = File.open(pomodoro_log_file, "r") { |file| file.readlines.last.split(" ")[0]} + today = Time.now.strftime('%Y/%m/%d') + File.open(pomodoro_log_file, "a") { |file| file.puts "\n-----------\n\n" } if last_day != today + end +end diff --git a/.todo.actions.d/pom/lib/pomo_logger.rb b/.todo.actions.d/pom/lib/pomo_logger.rb new file mode 100644 index 0000000..ef869f1 --- /dev/null +++ b/.todo.actions.d/pom/lib/pomo_logger.rb @@ -0,0 +1,19 @@ +class PomoLogger + + attr_accessor :options + + def initialize opts + @options = opts + end + + def log_pomodoro_started task + TerminalNotifierLogger.new.notify_start(task) + FileLogger.new(options[:pomodoro_log_file]).notify_start(task) + end + + def log_pomodoro_completed task + TerminalNotifierLogger.new.notify_completed(task) + FileLogger.new(options[:pomodoro_log_file]).notify_completed(task) + end + +end diff --git a/.todo.actions.d/pom/lib/task.rb b/.todo.actions.d/pom/lib/task.rb new file mode 100644 index 0000000..e356af5 --- /dev/null +++ b/.todo.actions.d/pom/lib/task.rb @@ -0,0 +1,63 @@ +require 'rainbow' + +class Task + + attr_accessor :text + attr_accessor :index + attr_accessor :pomodori + attr_accessor :planned + + POMO_REGEXP = / \(#pomo: (\d+)\/(\d+)\)$/ + PRIORITY_REGEXP = /^\([A-Z]+\) / + STATUS_COLORS = { + new: :white, + planned: :green, + in_progress: :yellow, + completed: :blue, + underestimated: :red + } + + def initialize index, text + @index = index.to_i + if text =~ POMO_REGEXP + @pomodori, @planned = text.match(POMO_REGEXP)[1].to_i, text.match(POMO_REGEXP)[2].to_i + else + @pomodori, @planned = 0, 0 + end + @text = text.gsub(POMO_REGEXP, '').gsub(PRIORITY_REGEXP, '') + end + + def to_s + "#{text} (#pomo: #{pomodori}/#{planned})" + end + + def add_pomo + @pomodori += 1 + end + + def plan planned + @planned = planned.to_i + end + + def puts_highlighted + return if blank?(text) + print "#{index} #{text} " + color = STATUS_COLORS[self.status] + puts Rainbow("(#pomo: #{pomodori}/#{planned})").send(color) + end + + def status + return :new if pomodori == 0 && planned == 0 + return :planned if pomodori == 0 && planned != 0 + return :completed if pomodori == planned + return :in_progress if pomodori != 0 && planned != 0 && pomodori < planned + return :underestimated if pomodori != 0 && pomodori > planned + end + + private + + def blank?(string) + string == nil || string == "" + end + +end diff --git a/.todo.actions.d/pom/lib/terminal_notifier_logger.rb b/.todo.actions.d/pom/lib/terminal_notifier_logger.rb new file mode 100644 index 0000000..7a28022 --- /dev/null +++ b/.todo.actions.d/pom/lib/terminal_notifier_logger.rb @@ -0,0 +1,9 @@ +class TerminalNotifierLogger + def notify_start task + TerminalNotifier.notify('Pomodoro started', title: 'Pomotxt', sound: 'Glass') + end + + def notify_completed task + TerminalNotifier.notify('Pomodoro completed!', title: 'Pomotxt', sound: 'Glass') + end +end diff --git a/.todo.actions.d/pom/pom b/.todo.actions.d/pom/pom new file mode 100755 index 0000000..cfd939d --- /dev/null +++ b/.todo.actions.d/pom/pom @@ -0,0 +1,94 @@ +#!/usr/bin/env ruby + +require 'date' +require 'rainbow' +require 'terminal-notifier' +require_relative 'lib/task' +require_relative 'lib/countdown' +require_relative 'lib/pomo_logger' +require_relative 'lib/terminal_notifier_logger' +require_relative 'lib/file_logger' + +POMODORO_SECONDS = 25 * 60 +# TODO: either move this to a env variable or a yml configuration file +POMODORO_LOG_FILE = "#{ENV['HOME']}/Documents/pomodoro_log.txt" + +def logger + PomoLogger.new( + :pomodoro_log_file => POMODORO_LOG_FILE + ) +end + +def read_todos + todos = File.read(ENV['TODO_FILE']) + todos.split(/\r?\n/) +end + +def increase_pomos todos, index + todo_to_update = todos[index] + task = Task.new(index + 1, todo_to_update) + task.add_pomo + task.puts_highlighted + `todo.sh replace #{index + 1} "#{task.to_s}"` +end + +def plan_task todos, index, planned + todo_to_update = todos[index] + task = Task.new(index + 1, todo_to_update) + task.plan(planned) + task.puts_highlighted + `todo.sh replace #{index + 1} "#{task.to_s}"` +end + +def puts_and_exit string + puts string + exit +end + + +case ARGV[1] +when 'ls' + todos = read_todos + todos.each_with_index do |todo, index| + Task.new(index + 1, todo).puts_highlighted + end +when 'log' + puts `cat #{POMODORO_LOG_FILE}` +when 'add' + puts_and_exit "You must insert the task number" unless index = ARGV[2] + puts_and_exit "Task number must be... a number" unless index =~ /\d+/ + index = index.to_i - 1 + todos = read_todos + increase_pomos todos, index +when 'plan' + puts_and_exit "You must insert the task number" unless index = ARGV[2] + puts_and_exit "Task number must be... a number" unless index =~ /\d+/ + puts_and_exit "You must insert the task pomodori estimate" unless planned = ARGV[3] + puts_and_exit "The task pomodori estimate must be a number" unless planned =~ /\d+/ + index = index.to_i - 1 + todos = read_todos + plan_task todos, index, planned +when 'start' + puts_and_exit "You must insert the task number" unless index = ARGV[2] + puts_and_exit "Task number must be... a number" unless index =~ /\d+/ + index = index.to_i - 1 + todos = read_todos + task_being_worked = Task.new(index + 1, todos[index]) + logger.log_pomodoro_started(task_being_worked) + Countdown.new.run(POMODORO_SECONDS, services: [ :tmux, :iterm2 ]) + logger.log_pomodoro_completed(task_being_worked) + increase_pomos todos, index +when 'help' + puts "Usage: todo.sh pomo action [task_number] [args]\n" + puts "Actions:" + puts " ls" + puts " lists tasks with pomodori count and estimates" + puts " log" + puts " displays a log of your pomodori" + puts " start ITEM#" + puts " start a pomodoro timer for item ITEM#" + puts " add ITEM#" + puts " add one pomodoro to task on line ITEM# without running a timer" + puts " plan ITEM# PLANNED_POMODORI" + puts " estimate ITEM# will take PLANNED_POMODORI to complete" +end diff --git a/.todo.actions.d/pom/screenshot.png b/.todo.actions.d/pom/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc3063b797d3f71297355f49106878f027db10e GIT binary patch literal 48522 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 literal 0 HcmV?d00001 diff --git a/.todo.actions.d/pom/spec/task_spec.rb b/.todo.actions.d/pom/spec/task_spec.rb new file mode 100644 index 0000000..3efbb07 --- /dev/null +++ b/.todo.actions.d/pom/spec/task_spec.rb @@ -0,0 +1,107 @@ +require_relative '../lib/task' + +describe Task do + + context "Task#new" do + context "When task already includes pomodori" do + subject { Task.new(1, "Write Task spec (#pomo: 3/5)")} + specify { expect(subject.pomodori).to eq(3) } + specify { expect(subject.planned).to eq(5) } + specify { expect(subject.text).to eq("Write Task spec") } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 3/5)") } + end + + context "When task does not include pomodori" do + subject { Task.new(1, "Write Task spec")} + specify { expect(subject.pomodori).to eq(0) } + specify { expect(subject.planned).to eq(0) } + specify { expect(subject.text).to eq("Write Task spec") } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 0/0)") } + end + end + + context "Task#add_pomo" do + context "Prioritized task" do + subject { Task.new(1, "(A) Write Task spec (#pomo: 3/5)")} + specify { expect(subject.pomodori).to eq(3) } + + context "Adding pomo to a tagged task" do + before { subject.add_pomo } + specify { expect(subject.pomodori).to eq(4) } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 4/5)") } + specify { subject.add_pomo; expect(subject.to_s).to eq("Write Task spec (#pomo: 5/5)") } + end + end + + context "Already tagged task" do + subject { Task.new(1, "Write Task spec (#pomo: 3/5)")} + specify { expect(subject.pomodori).to eq(3) } + + context "Adding pomo to a tagged task" do + before { subject.add_pomo } + specify { expect(subject.pomodori).to eq(4) } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 4/5)") } + end + end + + context "Normal task" do + subject { Task.new(1, "Write Task spec")} + specify { expect(subject.pomodori).to eq(0) } + + context "Adding pomo to a normal task" do + before { subject.add_pomo } + specify { expect(subject.pomodori).to eq(1) } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 1/0)") } + end + end + end + + context "Task#plan" do + context "When task already includes pomodori" do + subject { Task.new(1, "Write Task spec (#pomo: 3/5)")} + before { subject.plan(10) } + specify { expect(subject.pomodori).to eq(3) } + specify { expect(subject.planned).to eq(10) } + specify { expect(subject.text).to eq("Write Task spec") } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 3/10)") } + end + + context "When task does not include pomodori" do + subject { Task.new(1, "Write Task spec")} + before { subject.plan(10) } + specify { expect(subject.pomodori).to eq(0) } + specify { expect(subject.planned).to eq(10) } + specify { expect(subject.text).to eq("Write Task spec") } + specify { expect(subject.to_s).to eq("Write Task spec (#pomo: 0/10)") } + end + end + + context "Task#status" do + subject { Task.new(1, "Write Task spec")} + + context "new task" do + specify { expect(subject.status).to eq :new } + end + + context "planned task" do + before { subject.plan(10) } + specify { expect(subject.status).to eq :planned } + end + + context "in progress task" do + before { subject.plan(10); subject.add_pomo } + specify { expect(subject.status).to eq :in_progress } + end + + context "completed task" do + before { subject.plan(1); subject.add_pomo } + specify { expect(subject.status).to eq :completed } + end + + context "underestimated task" do + before { subject.plan(1); 2.times { subject.add_pomo } } + specify { expect(subject.status).to eq :underestimated } + end + end +end +