pomo 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/DEVELOPMENT +15 -0
- data/Gemfile +4 -0
- data/{History.md → HISTORY.md} +11 -1
- data/LICENSE.txt +22 -0
- data/README.md +186 -0
- data/Rakefile +6 -15
- data/bin/pomo +43 -26
- data/lib/pomo.rb +11 -25
- data/lib/pomo/break.rb +17 -0
- data/lib/pomo/configuration.rb +74 -0
- data/lib/pomo/github_task.rb +19 -19
- data/lib/pomo/list.rb +30 -18
- data/lib/pomo/notifier.rb +26 -0
- data/lib/pomo/notifier/growl.rb +17 -0
- data/lib/pomo/notifier/libnotify.rb +14 -0
- data/lib/pomo/notifier/notification_center.rb +13 -0
- data/lib/pomo/notifier/quicksilver.rb +12 -0
- data/lib/pomo/task.rb +127 -32
- data/lib/pomo/version.rb +2 -2
- data/pomo.gemspec +24 -32
- metadata +123 -82
- data/Manifest +0 -17
- data/Readme.md +0 -137
- data/spec/spec.opts +0 -2
- data/tasks/docs.rake +0 -13
- data/tasks/gemspec.rake +0 -3
- data/tasks/spec.rake +0 -25
data/.gitignore
ADDED
data/DEVELOPMENT
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
To run the development rake tasks, you need bundler installed.
|
2
|
+
|
3
|
+
Before you push any changes, run the RSpec suite:
|
4
|
+
|
5
|
+
$ rake spec
|
6
|
+
|
7
|
+
To build a new version of the gem:
|
8
|
+
|
9
|
+
$ rake build
|
10
|
+
|
11
|
+
To push the new version to Rubygems:
|
12
|
+
|
13
|
+
$ rake release
|
14
|
+
|
15
|
+
(http://rubygems.org/gems/pomo)
|
data/Gemfile
ADDED
data/{History.md → HISTORY.md}
RENAMED
@@ -1,3 +1,13 @@
|
|
1
|
+
2.0.0 / 2012-12-16
|
2
|
+
==================
|
3
|
+
|
4
|
+
* Added detach mode, on by default. To get the 1.x progress bar run `pomo start -p`. Closes #1
|
5
|
+
* Added notification support for Mac OS X User Notifications, Quicksilver and libnotify.
|
6
|
+
Growl continues to be supported. Closes #23
|
7
|
+
* Added optional tmux status bar support to display Pomo timer.
|
8
|
+
* Fixed import of Github issues list. Closes #11
|
9
|
+
* Added support for importing a single Github issue. Closes #2
|
10
|
+
* Added `pomo ls` as an alias to `pomo list`
|
1
11
|
|
2
12
|
1.0.1 / 2010-03-10
|
3
13
|
==================
|
@@ -72,4 +82,4 @@
|
|
72
82
|
0.0.1 / 2009-10-15
|
73
83
|
==================
|
74
84
|
|
75
|
-
* Initial release
|
85
|
+
* Initial release
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
# Pomo
|
2
|
+
|
3
|
+
Command-line application for the [Pomodoro](http://www.pomodorotechnique.com/)
|
4
|
+
time management technique, with notification and tmux status bar support.
|
5
|
+
|
6
|
+
## Description
|
7
|
+
|
8
|
+
With Pomo you can add, remove, list, view, and start timing tasks all via the
|
9
|
+
command-line with a simple, slick interface. You are reminded of the remaining
|
10
|
+
time on a task via Notification Center, Growl, libnotify, or Quicksilver.
|
11
|
+
These notifications appear half-way, at the 5 minute point, and when the task
|
12
|
+
duration has expired. Also, the Pomo timer can be displayed in your tmux
|
13
|
+
status bar.
|
14
|
+
|
15
|
+
## Installation
|
16
|
+
|
17
|
+
$ gem install pomo
|
18
|
+
|
19
|
+
## Task Selection API
|
20
|
+
|
21
|
+
Taken from `pomo help`:
|
22
|
+
|
23
|
+
Most of the subcommands work directly with tasks,
|
24
|
+
and because of this pomo provides a unified task selection api
|
25
|
+
shown below which can be used with most of the commands
|
26
|
+
(those with [task ...] in their synopsis).
|
27
|
+
|
28
|
+
n : selects a single task by index : Ex: pomo remove 1
|
29
|
+
[n ]+ : selects several tasks by index : Ex: pomo remove 2 8 1
|
30
|
+
n..n : selects a range of tasks : Ex: pomo remove 5..9
|
31
|
+
n..-n : selects a range of tasks : Ex: pomo remove 2..-1
|
32
|
+
first : selects the first task : Ex: pomo remove first
|
33
|
+
last : selects the last task : Ex: pomo remove last
|
34
|
+
complete : selects complete tasks : Ex: pomo remove complete
|
35
|
+
incomplete : selects incomplete tasks : Ex: pomo remove incomplete
|
36
|
+
all : selects all tasks : Ex: pomo remove all
|
37
|
+
|
38
|
+
## Examples
|
39
|
+
|
40
|
+
* View global or command specific help:
|
41
|
+
|
42
|
+
$ pomo help
|
43
|
+
$ pomo help add
|
44
|
+
$ pomo help remove
|
45
|
+
|
46
|
+
* Get started by adding a task:
|
47
|
+
|
48
|
+
$ pomo add "Fix IE stying issues"
|
49
|
+
|
50
|
+
And another:
|
51
|
+
|
52
|
+
$ pomo add "Destroy IE" --description "because IE is terrible"
|
53
|
+
|
54
|
+
* List your tasks (or use `pomo` which defaults to `pomo list`):
|
55
|
+
|
56
|
+
$ pomo list
|
57
|
+
0. Fix IE stying issues : 25 minutes
|
58
|
+
1. Destroy IE : 25 minutes
|
59
|
+
|
60
|
+
* Start the first incomplete task:
|
61
|
+
|
62
|
+
$ pomo start
|
63
|
+
Started Fix IE stying issues, you have 25 minutes :)
|
64
|
+
|
65
|
+
* Alternatively, you can start the first incomplete task with a progress bar:
|
66
|
+
|
67
|
+
$ pomo start -p
|
68
|
+
Started Fix IE stying issues, you have 25 minutes :)
|
69
|
+
(=........................) 24 minutes remaining
|
70
|
+
|
71
|
+
* Once you have completed the task, list again (alternatively `pomo ls`):
|
72
|
+
|
73
|
+
$ pomo ls
|
74
|
+
✓ 0. Fix IE stying issues : 25 minutes
|
75
|
+
1. Destroy IE : 25 minutes
|
76
|
+
|
77
|
+
* Or take a break:
|
78
|
+
|
79
|
+
$ pomo break
|
80
|
+
$ pomo break 10
|
81
|
+
$ pomo break --length 10
|
82
|
+
|
83
|
+
* List only remaining tasks:
|
84
|
+
|
85
|
+
$ pomo ls --incomplete
|
86
|
+
1. Destroy IE : 25 minutes
|
87
|
+
|
88
|
+
* List only completed tasks:
|
89
|
+
|
90
|
+
$ pomo ls --complete
|
91
|
+
✓ 0. Fix IE stying issues : 25 minutes
|
92
|
+
|
93
|
+
* At any time mid-task you may terminate pomo via CTRL + C, at which
|
94
|
+
time you may manually complete the task:
|
95
|
+
|
96
|
+
$ pomo complete first
|
97
|
+
$ pomo complete last
|
98
|
+
$ pomo complete 1
|
99
|
+
$ pomo complete all
|
100
|
+
$ pomo complete incomplete
|
101
|
+
$ pomo complete 5..7
|
102
|
+
|
103
|
+
* The next time you run `pomo start` the first incomplete task
|
104
|
+
will start:
|
105
|
+
|
106
|
+
$ pomo start
|
107
|
+
|
108
|
+
Or choose a specific task:
|
109
|
+
|
110
|
+
$ pomo start first
|
111
|
+
$ pomo start last
|
112
|
+
$ pomo start 5
|
113
|
+
|
114
|
+
* You may also remove tasks:
|
115
|
+
|
116
|
+
$ pomo remove first
|
117
|
+
$ pomo remove last
|
118
|
+
$ pomo remove 2
|
119
|
+
$ pomo remove 1
|
120
|
+
$ pomo remove 6
|
121
|
+
$ pomo rm first
|
122
|
+
$ pomo rm 2..5
|
123
|
+
$ pomo rm 1..-1
|
124
|
+
|
125
|
+
* View task details:
|
126
|
+
|
127
|
+
$ pomo view first
|
128
|
+
$ pomo view last
|
129
|
+
$ pomo view 5
|
130
|
+
$ pomo view 1 2 3
|
131
|
+
|
132
|
+
* Remove all tasks:
|
133
|
+
|
134
|
+
$ pomo remove all
|
135
|
+
$ pomo rm all
|
136
|
+
|
137
|
+
* Or if you prefer, create a directory specific task list. Pomo will
|
138
|
+
auto-detect `./.pomo` in this directory, and utilize its contents.
|
139
|
+
|
140
|
+
$ pomo init
|
141
|
+
|
142
|
+
## Configuration
|
143
|
+
|
144
|
+
Pomo uses `~/.pomorc` for configuration options.
|
145
|
+
|
146
|
+
Configuration options:
|
147
|
+
|
148
|
+
* `:notifier`: Notification library
|
149
|
+
* Format: String
|
150
|
+
* Default: depends on OS
|
151
|
+
* Valid values: `notification_center`, `libnotify`, `growl`, `quicksilver`
|
152
|
+
* `:tmux`: Refresh tmux status bar on timer change
|
153
|
+
* Format: Boolean
|
154
|
+
* Default: `false`
|
155
|
+
* Valid values: `true`, `false`
|
156
|
+
|
157
|
+
For example on Mac OS X Mountain Lion, `~/.pomorc` defaults to:
|
158
|
+
|
159
|
+
---
|
160
|
+
:notifier: notification_center
|
161
|
+
:tmux: false
|
162
|
+
|
163
|
+
## tmux Status Bar Integration
|
164
|
+
|
165
|
+
The Pomo timer can be displayed in tmux's status bar with the following
|
166
|
+
configurations set:
|
167
|
+
|
168
|
+
:tmux: true
|
169
|
+
|
170
|
+
Then add the below to your `~/.tmux.conf`:
|
171
|
+
|
172
|
+
set-option -g status-right '#(cat ~/.pomo_stat)'
|
173
|
+
|
174
|
+
The timer will display with the default color when not active,
|
175
|
+
green during a Pomodoro, red during the last 5 minutes of a Pomodoro,
|
176
|
+
and blue during a break e.g.
|
177
|
+
|
178
|
+

|
179
|
+
|
180
|
+
## Contributing
|
181
|
+
|
182
|
+
1. Fork it
|
183
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
184
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
185
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
186
|
+
5. Create new Pull Request
|
data/Rakefile
CHANGED
@@ -1,17 +1,8 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require 'bundler/gem_tasks'
|
1
3
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require 'echoe'
|
7
|
-
|
8
|
-
Echoe.new "pomo", Pomo::VERSION do |p|
|
9
|
-
p.author = "TJ Holowaychuk"
|
10
|
-
p.email = "tj@vision-media.ca"
|
11
|
-
p.summary = "Pomodoro time management for the command-line"
|
12
|
-
p.url = "http://github.com/visionmedia/pomo"
|
13
|
-
p.runtime_dependencies << 'commander >=4.0.2'
|
14
|
-
p.runtime_dependencies << 'growl >=1.0.3'
|
4
|
+
desc 'Run specs'
|
5
|
+
RSpec::Core::RakeTask.new do |t|
|
6
|
+
t.verbose = false
|
7
|
+
t.rspec_opts = '--color'
|
15
8
|
end
|
16
|
-
|
17
|
-
Dir['tasks/**/*.rake'].sort.each { |f| load f }
|
data/bin/pomo
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
$:.unshift File.dirname(__FILE__) + '/../lib'
|
4
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
5
5
|
require 'rubygems'
|
6
6
|
require 'commander/import'
|
7
7
|
require 'pomo'
|
8
8
|
|
9
9
|
program :version, Pomo::VERSION
|
10
|
+
|
10
11
|
program :description, "Pomodoro time management.
|
11
|
-
Most of the subcommands work directly with tasks, and
|
12
|
+
Most of the subcommands work directly with tasks, and
|
12
13
|
because of this pomo provides a unified task selection api
|
13
|
-
shown below which can be used with most of the commands
|
14
|
-
(those with [task ...] in their synopsis).
|
15
|
-
|
14
|
+
shown below which can be used with most of the commands
|
15
|
+
(those with [task ...] in their synopsis).
|
16
|
+
|
16
17
|
n : selects a single task by index : Ex: pomo remove 1
|
17
18
|
[n ]+ : selects several tasks by index : Ex: pomo remove 2 8 1
|
18
19
|
n..n : selects a range of tasks : Ex: pomo remove 5..9
|
@@ -28,7 +29,8 @@ program :int_message, "\nTerminated pomo" \
|
|
28
29
|
"\n * previously running tasks not marked as complete" \
|
29
30
|
"\n * manually complete a task with `$ pomo complete <task>`"
|
30
31
|
|
31
|
-
|
32
|
+
config = Pomo::Configuration.new
|
33
|
+
list = Pomo::List.new
|
32
34
|
|
33
35
|
default_command :list
|
34
36
|
|
@@ -36,11 +38,11 @@ command :init do |c|
|
|
36
38
|
c.syntax = 'pomo init [options]'
|
37
39
|
c.description = 'Initialize pomo in the current directory'
|
38
40
|
c.action do |args, options|
|
39
|
-
Pomo::List.new
|
40
|
-
say
|
41
|
-
say
|
42
|
-
say
|
43
|
-
end
|
41
|
+
Pomo::List.new :init => true
|
42
|
+
say 'Initialized at `./.pomo`'
|
43
|
+
say ' - Any commands run while in this directory will reference this file for tasks'
|
44
|
+
say ' - To remove simply execute `rm .pomo`'
|
45
|
+
end
|
44
46
|
end
|
45
47
|
|
46
48
|
command :start do |c|
|
@@ -51,44 +53,56 @@ command :start do |c|
|
|
51
53
|
c.example 'Start the first task', 'pomo start 0'
|
52
54
|
c.example 'Start the first task', 'pomo start first'
|
53
55
|
c.example 'Start the fifth task', 'pomo start 5'
|
56
|
+
c.option '-p', '--progress', 'Run with progress bar in foreground'
|
54
57
|
c.action do |args, options|
|
58
|
+
abort 'a task is already running' if list.running
|
59
|
+
|
60
|
+
options.default :progress => false
|
55
61
|
args = ['incomplete'] if args.empty?
|
56
62
|
list.find(*args) do |task, i|
|
57
63
|
abort 'task already completed' if task.complete?
|
58
|
-
|
59
|
-
task.start
|
60
|
-
list.save
|
64
|
+
task.start(config, :progress => options.progress, :list => list)
|
61
65
|
break
|
62
66
|
end
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
66
70
|
command :import do |c|
|
67
|
-
c.syntax = 'pomo import <user> <project> [
|
71
|
+
c.syntax = 'pomo import <user> <project> [issue_number]'
|
68
72
|
c.summary = 'Import Github project issues'
|
69
73
|
c.description = 'Import Github project issues which have not yet been closed'
|
74
|
+
c.example 'Import all open Github issues from "visionmedia/pomo"', 'pomo import visionmedia pomo'
|
75
|
+
c.example 'Import Github issue #3 from "visionmedia/pomo"', 'pomo import visionmedia pomo 3'
|
70
76
|
c.action do |args, options|
|
71
|
-
gem 'octopi', '>=0.2.1'
|
72
|
-
require 'octopi'
|
73
77
|
user = args.shift or raise('Github <user> is required')
|
74
78
|
project = args.shift or raise('Github <project> is required')
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
+
number = args.shift
|
80
|
+
begin
|
81
|
+
if number
|
82
|
+
issues = [Octokit.issue({:username => user, :repo => project}, number)]
|
83
|
+
else
|
84
|
+
issues = Octokit.list_issues({:username => user, :repo => project}, :state => 'open', :sort => 'created')
|
85
|
+
end
|
86
|
+
issues.each_with_index do |issue, index|
|
87
|
+
say "Importing issues from https://github.com/#{user}/#{project}" if index == 0
|
88
|
+
task = Pomo::GithubTask.new(issue.title,
|
79
89
|
:username => user,
|
80
90
|
:project => project,
|
81
91
|
:description => issue.body,
|
82
|
-
:labels => issue.labels,
|
92
|
+
:labels => issue.labels.map(&:name),
|
83
93
|
:number => issue.number
|
94
|
+
)
|
84
95
|
list << task
|
85
96
|
say " - Added #{task}"
|
86
97
|
end
|
87
98
|
list.save
|
99
|
+
rescue Octokit::NotFound => e
|
100
|
+
say '404: This is not the repo you are looking for.'
|
101
|
+
say e.message
|
88
102
|
end
|
89
103
|
end
|
90
104
|
end
|
91
|
-
|
105
|
+
|
92
106
|
command :add do |c|
|
93
107
|
c.syntax = 'pomo add <task> [options]'
|
94
108
|
c.summary = 'Add a task'
|
@@ -134,10 +148,12 @@ command :break do |c|
|
|
134
148
|
c.example 'Take a 30 minute break', 'pomo break 30'
|
135
149
|
c.example 'Take a 30 minute break', 'pomo break --length 30'
|
136
150
|
c.option '-l', '--length minutes', Integer, 'Change the default length in minutes'
|
151
|
+
c.option '-p', '--progress', 'Run with progress bar in foreground'
|
137
152
|
c.action do |args, options|
|
153
|
+
options.default :progress => false
|
138
154
|
options.default :length => args.first ? args.first.to_i : 5
|
139
|
-
task = Pomo::
|
140
|
-
task.start
|
155
|
+
task = Pomo::Break.new('Break time', options.__hash__)
|
156
|
+
task.start(config, :progress => options.progress)
|
141
157
|
end
|
142
158
|
end
|
143
159
|
|
@@ -220,7 +236,7 @@ command :incomplete do |c|
|
|
220
236
|
end
|
221
237
|
|
222
238
|
command :list do |c|
|
223
|
-
c.syntax = 'pomo list [options]'
|
239
|
+
c.syntax = 'pomo [list|ls] [options]'
|
224
240
|
c.description = 'List all tasks'
|
225
241
|
c.example 'List all tasks', 'pomo list'
|
226
242
|
c.option '-c', '--complete', 'List only completed tasks'
|
@@ -236,4 +252,5 @@ command :list do |c|
|
|
236
252
|
say ' ' * 55 + '%d minutes' % total
|
237
253
|
end
|
238
254
|
end
|
255
|
+
alias_command :ls, :list
|
239
256
|
|
data/lib/pomo.rb
CHANGED
@@ -1,29 +1,15 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2009 TJ Holowaychuk <tj@vision-media.ca>
|
3
|
-
#
|
4
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
-
# a copy of this software and associated documentation files (the
|
6
|
-
# "Software"), to deal in the Software without restriction, including
|
7
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
-
# the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be
|
13
|
-
# included in all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
-
#++
|
23
|
-
|
24
1
|
require 'yaml'
|
25
|
-
require '
|
2
|
+
require 'octokit'
|
3
|
+
require 'terminal-notifier' if /darwin/ =~ RUBY_PLATFORM
|
4
|
+
require 'growl' if /darwin/ =~ RUBY_PLATFORM
|
5
|
+
require 'libnotify' if /linux/ =~ RUBY_PLATFORM
|
6
|
+
require 'pomo/configuration'
|
7
|
+
require 'pomo/notifier'
|
8
|
+
require 'pomo/notifier/notification_center'
|
9
|
+
require 'pomo/notifier/growl'
|
10
|
+
require 'pomo/notifier/libnotify'
|
26
11
|
require 'pomo/list'
|
27
12
|
require 'pomo/task'
|
28
13
|
require 'pomo/github_task'
|
29
|
-
require 'pomo/
|
14
|
+
require 'pomo/break'
|
15
|
+
require 'pomo/version'
|