pomo 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +7 -0
- data/{HISTORY.md → CHANGELOG.md} +25 -0
- data/{LICENSE.txt → LICENSE.md} +0 -0
- data/README.md +57 -30
- data/Rakefile +12 -5
- data/bin/pomo +166 -97
- data/features/configuration.feature +35 -0
- data/features/manage_list.feature +34 -0
- data/features/manage_tasks.feature +73 -0
- data/features/step_definitions/pomo_steps.rb +8 -0
- data/features/support/env.rb +12 -0
- data/lib/pomo.rb +0 -9
- data/lib/pomo/configuration.rb +57 -15
- data/lib/pomo/github_task.rb +51 -13
- data/lib/pomo/list.rb +59 -21
- data/lib/pomo/notifier.rb +5 -0
- data/lib/pomo/notifier/growl_notifier.rb +1 -0
- data/lib/pomo/notifier/libnotify_notifier.rb +1 -0
- data/lib/pomo/notifier/notification_center_notifier.rb +1 -0
- data/lib/pomo/os.rb +2 -0
- data/lib/pomo/task.rb +16 -4
- data/lib/pomo/version.rb +1 -1
- data/pomo.gemspec +7 -3
- data/spec/pomo/configuration_spec.rb +108 -0
- data/spec/pomo/list_spec.rb +63 -0
- data/spec/pomo/task_spec.rb +15 -0
- data/spec/spec_helper.rb +40 -2
- metadata +71 -8
- data/spec/pomo_spec.rb +0 -8
data/.travis.yml
ADDED
data/{HISTORY.md → CHANGELOG.md}
RENAMED
@@ -1,14 +1,36 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
=========
|
3
|
+
|
4
|
+
2.1.0 / 2013-01-17
|
5
|
+
==================
|
6
|
+
|
7
|
+
* Added `pomo initconfig` to set up global preferences. Preferences
|
8
|
+
can be overridden on the command-line (e.g. `pomo start --notifier
|
9
|
+
growl`). Closes #30
|
10
|
+
* Added multiple args to commands (e.g. `pomo rm 1..3 5..8`). Closes [#12]
|
11
|
+
* Added `pomo move` and `pomo copy`. Closes #18
|
12
|
+
* Added RSpec specs and Cucumber features. Closes #9
|
13
|
+
|
14
|
+
View [the full changelog][2.1.0].
|
15
|
+
[2.1.0]: https://github.com/visionmedia/pomo/compare/v2.0.2...v2.1.0
|
16
|
+
|
1
17
|
2.0.2 / 2012-12-18
|
2
18
|
==================
|
3
19
|
|
4
20
|
* Fixed Growl support. Closes #29
|
5
21
|
* Removed unused configuration option `pomo_stat` from `.pomorc`
|
6
22
|
|
23
|
+
View [the full changelog][2.0.2].
|
24
|
+
[2.0.2]: https://github.com/visionmedia/pomo/compare/v2.0.1...v2.0.2
|
25
|
+
|
7
26
|
2.0.1 / 2012-12-16
|
8
27
|
==================
|
9
28
|
|
10
29
|
* Minor fix bug release for tmux status bar coloring.
|
11
30
|
|
31
|
+
View [the full changelog][2.0.1].
|
32
|
+
[2.0.1]: https://github.com/visionmedia/pomo/compare/v2.0.0...v2.0.1
|
33
|
+
|
12
34
|
2.0.0 / 2012-12-16
|
13
35
|
==================
|
14
36
|
|
@@ -20,6 +42,9 @@
|
|
20
42
|
* Added support for importing a single Github issue. Closes #2
|
21
43
|
* Added `pomo ls` as an alias to `pomo list`
|
22
44
|
|
45
|
+
View [the full changelog][2.0.0].
|
46
|
+
[2.0.0]: https://github.com/visionmedia/pomo/compare/1.0.1...v2.0.0
|
47
|
+
|
23
48
|
1.0.1 / 2010-03-10
|
24
49
|
==================
|
25
50
|
|
data/{LICENSE.txt → LICENSE.md}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -15,22 +15,36 @@ status bar.
|
|
15
15
|
## Installation
|
16
16
|
|
17
17
|
$ gem install pomo
|
18
|
-
|
18
|
+
|
19
|
+
## Configuration
|
20
|
+
|
21
|
+
Pomo uses `~/.pomorc` for configuration options.
|
22
|
+
|
23
|
+
To initialize a default configuration file:
|
24
|
+
|
25
|
+
$ pomo initconfig
|
26
|
+
|
27
|
+
See [Configuration Options](#configuration-options) for more details on all the available options.
|
28
|
+
|
19
29
|
## Task Selection API
|
20
30
|
|
21
31
|
Taken from `pomo help`:
|
22
32
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
pomo provides a unified task selection api which can be used
|
34
|
+
with most of the commands. Commands with [task] or [task ...]
|
35
|
+
in their synopsis accept only single or both single and multiple
|
36
|
+
task selection, respectively.
|
37
|
+
|
38
|
+
Single task selection:
|
28
39
|
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
40
|
first : selects the first task : Ex: pomo remove first
|
33
41
|
last : selects the last task : Ex: pomo remove last
|
42
|
+
|
43
|
+
Multiple task selection:
|
44
|
+
[n ]+ : selects several tasks by index : Ex: pomo remove 2 8 1
|
45
|
+
[n..n]+ : selects a range of tasks : Ex: pomo remove 5..9 11..14
|
46
|
+
[n..-n]+ : selects a range of tasks : Ex: pomo remove 2..-1
|
47
|
+
[api ]+ : selects several tasks by api : Ex: pomo remove first last
|
34
48
|
complete : selects complete tasks : Ex: pomo remove complete
|
35
49
|
incomplete : selects incomplete tasks : Ex: pomo remove incomplete
|
36
50
|
all : selects all tasks : Ex: pomo remove all
|
@@ -67,7 +81,7 @@ Taken from `pomo help`:
|
|
67
81
|
|
68
82
|
* Alternatively, you can start the first incomplete task with a progress bar:
|
69
83
|
|
70
|
-
$ pomo start
|
84
|
+
$ pomo start --progress
|
71
85
|
Started Fix IE6 stying issues, you have 25 minutes :)
|
72
86
|
(=........................) 24 minutes remaining
|
73
87
|
|
@@ -141,34 +155,35 @@ Taken from `pomo help`:
|
|
141
155
|
auto-detect `./.pomo` in this directory, and utilize its contents.
|
142
156
|
|
143
157
|
$ pomo init
|
144
|
-
|
145
|
-
## Configuration
|
146
158
|
|
147
|
-
|
159
|
+
## Configuration Options
|
148
160
|
|
149
|
-
|
161
|
+
The default configuration for pomo is as follows:
|
150
162
|
|
151
|
-
*
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
* `:tmux`: Refresh tmux status bar on timer change
|
156
|
-
* Format: Boolean
|
157
|
-
* Default: `false`
|
158
|
-
* Valid values: `true`, `false`
|
163
|
+
* Notification library is set to Notification Center on OSX 10.8; Growl on OSX
|
164
|
+
10.7 or less and Windows; and libnotify on Linux
|
165
|
+
* Progress bar is turned off
|
166
|
+
* tmux integration is turned off
|
159
167
|
|
160
|
-
|
168
|
+
Settings are easily customizable. Taken from `pomo help initconfig`:
|
161
169
|
|
162
|
-
|
163
|
-
:notifier: notification_center
|
164
|
-
:tmux: false
|
170
|
+
Examples:
|
165
171
|
|
166
|
-
|
172
|
+
# Configure with notification center, no progress bar, and tmux integration
|
173
|
+
pomo initconfig --notifier notification_center --no-progress --tmux
|
167
174
|
|
168
|
-
|
169
|
-
|
175
|
+
Options:
|
176
|
+
--notifier <lib> Specify notificaiton library: `notification_center`, `libnotify`, `growl`, `quicksilver`
|
177
|
+
--[no-]progress Run with progress bar
|
178
|
+
--[no-]tmux Refresh tmux status bar on timer change
|
179
|
+
--[no-]force force overwrite of existing config file
|
170
180
|
|
171
|
-
|
181
|
+
### Tmux Status Bar Integration
|
182
|
+
|
183
|
+
Pomo's timer can be displayed in tmux's status bar with the following
|
184
|
+
configuration set:
|
185
|
+
|
186
|
+
pomo initconfig --tmux
|
172
187
|
|
173
188
|
Then add the below to your `~/.tmux.conf`:
|
174
189
|
|
@@ -180,3 +195,15 @@ and blue during a break e.g.
|
|
180
195
|
|
181
196
|
![tmux status bar](http://i.imgur.com/uIzM3.png)
|
182
197
|
|
198
|
+
## Contributing
|
199
|
+
|
200
|
+
We :heart: pull requests and feedback. Feel free to
|
201
|
+
[submit a ticket](https://github.com/visionmedia/pomo/issues) or see
|
202
|
+
[CONTRIBUTING](https://github.com/visionmedia/pomo/blob/master/CONTRIBUTING.md)
|
203
|
+
for details on pull requests.
|
204
|
+
|
205
|
+
## Copyright
|
206
|
+
|
207
|
+
Copyright (c) 2012 TJ Holowaychuk. See
|
208
|
+
[LICENSE](https://github.com/visionmedia/pomo/blob/master/LICENSE.md)
|
209
|
+
for details.
|
data/Rakefile
CHANGED
@@ -1,8 +1,15 @@
|
|
1
|
+
require 'cucumber/rake/task'
|
1
2
|
require 'rspec/core/rake_task'
|
2
3
|
require 'bundler/gem_tasks'
|
4
|
+
require 'yard'
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
Cucumber::Rake::Task.new(:cucumber)
|
9
|
+
|
10
|
+
RSpec::Core::RakeTask.new(:spec)
|
11
|
+
|
12
|
+
YARD::Rake::YardocTask.new(:doc)
|
13
|
+
|
14
|
+
desc 'Run tests, both RSpec and Cucumber'
|
15
|
+
task :test => [:spec, :cucumber]
|
data/bin/pomo
CHANGED
@@ -1,43 +1,62 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
$:.unshift File.dirname(__FILE__) + '/../lib'
|
5
|
-
require 'rubygems'
|
6
4
|
require 'commander/import'
|
7
5
|
require 'pomo'
|
8
6
|
|
9
7
|
program :version, Pomo::VERSION
|
10
8
|
|
11
9
|
program :description, "Pomodoro time management.
|
12
|
-
Most of the subcommands work directly with tasks, and
|
13
|
-
because of this pomo provides a unified task selection api
|
14
|
-
shown below which can be used with most of the commands
|
15
|
-
(those with [task ...] in their synopsis).
|
16
10
|
|
11
|
+
pomo provides a unified task selection api which can be used
|
12
|
+
with most of the commands. Commands with [task] or [task ...]
|
13
|
+
in their synopsis accept only single or both single and multiple
|
14
|
+
task selection, respectively.
|
15
|
+
|
16
|
+
Single task selection:
|
17
17
|
n : selects a single task by index : Ex: pomo remove 1
|
18
|
-
[n ]+ : selects several tasks by index : Ex: pomo remove 2 8 1
|
19
|
-
n..n : selects a range of tasks : Ex: pomo remove 5..9
|
20
|
-
n..-n : selects a range of tasks : Ex: pomo remove 2..-1
|
21
18
|
first : selects the first task : Ex: pomo remove first
|
22
19
|
last : selects the last task : Ex: pomo remove last
|
20
|
+
|
21
|
+
Multiple task selection:
|
22
|
+
[n ]+ : selects several tasks by index : Ex: pomo remove 2 8 1
|
23
|
+
[n..n]+ : selects a range of tasks : Ex: pomo remove 5..9 11..14
|
24
|
+
[n..-n]+ : selects a range of tasks : Ex: pomo remove 2..-1
|
25
|
+
[api ]+ : selects several tasks by api : Ex: pomo remove first last
|
23
26
|
complete : selects complete tasks : Ex: pomo remove complete
|
24
27
|
incomplete : selects incomplete tasks : Ex: pomo remove incomplete
|
25
|
-
all : selects all tasks : Ex: pomo remove all
|
26
|
-
|
28
|
+
all : selects all tasks : Ex: pomo remove all"
|
29
|
+
|
30
|
+
program :help_formatter, :compact
|
27
31
|
|
28
32
|
program :int_message, "\nTerminated pomo" \
|
29
33
|
"\n * previously running tasks not marked as complete" \
|
30
34
|
"\n * manually complete a task with `$ pomo complete <task>`"
|
31
35
|
|
32
|
-
config = Pomo::Configuration.new
|
33
36
|
list = Pomo::List.new
|
34
37
|
|
35
38
|
default_command :list
|
36
39
|
|
40
|
+
command :initconfig do |c|
|
41
|
+
c.syntax = 'pomo initconfig [options]'
|
42
|
+
c.description = 'Initialize default configuration'
|
43
|
+
c.example 'Configure with notification center, no progress bar, and tmux integration', 'pomo initconfig --notifier notification_center --no-progress --tmux'
|
44
|
+
|
45
|
+
c.option '--notifier <lib>', String, 'Specify notificaiton library: `notification_center`, `libnotify`, `growl`, `quicksilver`'
|
46
|
+
c.option '--[no-]progress' , 'Run with progress bar'
|
47
|
+
c.option '--[no-]tmux' , 'Refresh tmux status bar on timer change'
|
48
|
+
c.option '--[no-]force' , 'force overwrite of existing config file'
|
49
|
+
c.action do |args, options|
|
50
|
+
Pomo::Configuration.save(options.__hash__)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
37
54
|
command :init do |c|
|
38
|
-
c.syntax
|
55
|
+
c.syntax = 'pomo init [options]'
|
39
56
|
c.description = 'Initialize pomo in the current directory'
|
57
|
+
|
40
58
|
c.action do |args, options|
|
59
|
+
config = Pomo::Configuration.load
|
41
60
|
Pomo::List.new :init => true
|
42
61
|
say 'Initialized at `./.pomo`'
|
43
62
|
say ' - Any commands run while in this directory will reference this file for tasks'
|
@@ -46,20 +65,23 @@ command :init do |c|
|
|
46
65
|
end
|
47
66
|
|
48
67
|
command :start do |c|
|
49
|
-
c.syntax
|
50
|
-
c.summary
|
68
|
+
c.syntax = 'pomo start [task] [options]'
|
69
|
+
c.summary = 'Start a task'
|
51
70
|
c.description = 'Start a task, given the task [task] or the first task'
|
52
71
|
c.example 'Start the first incomplete task', 'pomo start'
|
53
|
-
c.example 'Start the first task', 'pomo start 0'
|
54
|
-
c.example 'Start the first task', 'pomo start first'
|
55
|
-
c.example 'Start the fifth task', 'pomo start 5'
|
56
|
-
|
72
|
+
c.example 'Start the first task' , 'pomo start 0'
|
73
|
+
c.example 'Start the first task' , 'pomo start first'
|
74
|
+
c.example 'Start the fifth task' , 'pomo start 5'
|
75
|
+
|
76
|
+
c.option '--notifier <lib>', String, 'Specify notificaiton library: `notification_center`, `libnotify`, `growl`, `quicksilver`'
|
77
|
+
c.option '--[no-]progress' , 'Run with progress bar'
|
78
|
+
c.option '--[no-]tmux' , 'Refresh tmux status bar on timer change'
|
57
79
|
c.action do |args, options|
|
58
80
|
abort 'a task is already running' if list.running
|
59
81
|
|
60
|
-
options.
|
82
|
+
config = Pomo::Configuration.load(options.__hash__)
|
61
83
|
args = ['incomplete'] if args.empty?
|
62
|
-
list.find(*args) do |task
|
84
|
+
list.find(*args) do |task|
|
63
85
|
abort 'task already completed' if task.complete?
|
64
86
|
task.start(config, :progress => options.progress, :list => list)
|
65
87
|
break
|
@@ -68,50 +90,39 @@ command :start do |c|
|
|
68
90
|
end
|
69
91
|
|
70
92
|
command :import do |c|
|
71
|
-
c.syntax
|
72
|
-
c.summary
|
93
|
+
c.syntax = 'pomo import <user> <project> [issue_number]'
|
94
|
+
c.summary = 'Import Github issue(s)'
|
73
95
|
c.description = 'Import Github project issues which have not yet been closed'
|
74
96
|
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'
|
97
|
+
c.example 'Import Github issue #3 from "visionmedia/pomo"' , 'pomo import visionmedia pomo 3'
|
98
|
+
|
76
99
|
c.action do |args, options|
|
100
|
+
config = Pomo::Configuration.load
|
77
101
|
user = args.shift or raise('Github <user> is required')
|
78
102
|
project = args.shift or raise('Github <project> is required')
|
79
103
|
number = args.shift
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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,
|
89
|
-
:username => user,
|
90
|
-
:project => project,
|
91
|
-
:description => issue.body,
|
92
|
-
:labels => issue.labels.map(&:name),
|
93
|
-
:number => issue.number
|
94
|
-
)
|
95
|
-
list << task
|
96
|
-
say " - Added #{task}"
|
97
|
-
end
|
98
|
-
list.save
|
99
|
-
rescue Octokit::NotFound => e
|
100
|
-
say '404: This is not the repo you are looking for.'
|
101
|
-
say e.message
|
104
|
+
|
105
|
+
say "Importing issues from https://github.com/#{user}/#{project}"
|
106
|
+
tasks = Pomo::GithubTask.import(user, project, number)
|
107
|
+
tasks.each do |task|
|
108
|
+
list << task
|
109
|
+
say " - Added #{task}"
|
102
110
|
end
|
111
|
+
list.save
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
106
115
|
command :add do |c|
|
107
|
-
c.syntax
|
108
|
-
c.summary
|
116
|
+
c.syntax = 'pomo add <task> [options]'
|
117
|
+
c.summary = 'Add a task'
|
109
118
|
c.description = 'Add a task to the current list of tasks'
|
110
119
|
c.example 'Adds the task "fix IE styling issues"', 'pomo add "fix IE styling issues"'
|
111
|
-
c.example 'Add a task with 60 minute limit', 'pomo add "create executable" --length 60'
|
120
|
+
c.example 'Add a task with 60 minute limit' , 'pomo add "create executable" --length 60'
|
121
|
+
|
112
122
|
c.option '-d', '--description string', 'Add verbose task description'
|
113
123
|
c.option '-l', '--length minutes', Integer, 'Change the default length in minutes'
|
114
124
|
c.action do |args, options|
|
125
|
+
config = Pomo::Configuration.load
|
115
126
|
task = Pomo::Task.new(args.shift, options.__hash__)
|
116
127
|
list << task
|
117
128
|
list.save
|
@@ -120,17 +131,19 @@ command :add do |c|
|
|
120
131
|
end
|
121
132
|
|
122
133
|
command :edit do |c|
|
123
|
-
c.syntax
|
124
|
-
c.summary
|
134
|
+
c.syntax = 'pomo edit [task ...] [options]'
|
135
|
+
c.summary = 'Edit task(s)'
|
125
136
|
c.description = 'Edit the given task(s) or the first task'
|
126
|
-
c.example 'Changes the description for the first task', 'pomo edit first -d "fix IE styling issues"'
|
137
|
+
c.example 'Changes the description for the first task' , 'pomo edit first -d "fix IE styling issues"'
|
127
138
|
c.example 'Changes the description and length for the third task', 'pomo edit 3 -d "fix IE styling issues" -l 60'
|
128
|
-
c.example 'Changes the length of several tasks', 'pomo edit 1..5 -l 10'
|
139
|
+
c.example 'Changes the length of several tasks' , 'pomo edit 1..5 -l 10'
|
140
|
+
|
129
141
|
c.option '-n', '--name string', 'Change the task name'
|
130
142
|
c.option '-d', '--description string', 'Change the task description'
|
131
143
|
c.option '-l', '--length minutes', Integer, 'Change the task length'
|
132
144
|
c.action do |args, options|
|
133
|
-
|
145
|
+
config = Pomo::Configuration.load
|
146
|
+
list.find(*args) do |task|
|
134
147
|
options.__hash__.each do |key, value|
|
135
148
|
task.send :"#{key}=", value
|
136
149
|
end
|
@@ -141,77 +154,127 @@ command :edit do |c|
|
|
141
154
|
end
|
142
155
|
|
143
156
|
command :break do |c|
|
144
|
-
c.syntax
|
145
|
-
c.summary
|
157
|
+
c.syntax = 'pomo break [length] [options]'
|
158
|
+
c.summary = 'Start a break'
|
146
159
|
c.description = 'Take a break, defaults to 5 minutes or [length] or --length'
|
147
160
|
c.example 'Take a five minute break', 'pomo break'
|
148
|
-
c.example 'Take a 30 minute break', 'pomo break 30'
|
149
|
-
c.example 'Take a 30 minute break', 'pomo break --length 30'
|
161
|
+
c.example 'Take a 30 minute break' , 'pomo break 30'
|
162
|
+
c.example 'Take a 30 minute break' , 'pomo break --length 30'
|
163
|
+
|
150
164
|
c.option '-l', '--length minutes', Integer, 'Change the default length in minutes'
|
151
|
-
c.option '
|
165
|
+
c.option '--notifier <lib>', String, 'Specify notificaiton library: `notification_center`, `libnotify`, `growl`, `quicksilver`'
|
166
|
+
c.option '--[no-]progress' , 'Run with progress bar'
|
167
|
+
c.option '--[no-]tmux' , 'Refresh tmux status bar on timer change'
|
152
168
|
c.action do |args, options|
|
153
|
-
options.default :progress => false
|
154
169
|
options.default :length => args.first ? args.first.to_i : 5
|
170
|
+
|
171
|
+
config = Pomo::Configuration.load(options.__hash__)
|
155
172
|
task = Pomo::Break.new('Break time', options.__hash__)
|
156
173
|
task.start(config, :progress => options.progress)
|
157
174
|
end
|
158
175
|
end
|
159
176
|
|
160
177
|
command :remove do |c|
|
161
|
-
c.syntax
|
162
|
-
c.summary
|
178
|
+
c.syntax = 'pomo [remove|rm] [task ...] [options]'
|
179
|
+
c.summary = 'Remove task(s)'
|
163
180
|
c.description = 'Remove task(s) or the first task'
|
164
|
-
c.example 'Remove the first task', 'pomo remove first'
|
165
|
-
c.example 'Remove the
|
166
|
-
c.example 'Remove the fifth task', 'pomo remove 5'
|
181
|
+
c.example 'Remove the first task' , 'pomo remove first'
|
182
|
+
c.example 'Remove the fifth task' , 'pomo rm 5'
|
167
183
|
c.example 'Remove the fifth and second task', 'pomo rm 5 2'
|
168
|
-
c.example 'Remove a range of tasks', 'pomo rm 2..6'
|
169
|
-
c.example 'Remove all but the first task', 'pomo rm 2..-1'
|
170
|
-
c.example 'Remove all tasks', 'pomo rm all'
|
184
|
+
c.example 'Remove a range of tasks' , 'pomo rm 2..6'
|
185
|
+
c.example 'Remove all but the first task' , 'pomo rm 2..-1'
|
186
|
+
c.example 'Remove all tasks' , 'pomo rm all'
|
187
|
+
|
171
188
|
c.action do |args, options|
|
172
|
-
|
189
|
+
config = Pomo::Configuration.load
|
190
|
+
list.find(*args) do |task|
|
173
191
|
list.tasks -= [task]
|
174
192
|
say " - Removed #{task}"
|
175
193
|
end
|
176
|
-
|
194
|
+
list.save
|
177
195
|
end
|
178
196
|
end
|
179
197
|
alias_command :rm, :remove
|
180
198
|
alias_command :clear, :remove, 'all'
|
181
199
|
|
182
|
-
command :
|
183
|
-
c.syntax
|
184
|
-
c.summary
|
185
|
-
c.description = '
|
186
|
-
c.example '
|
187
|
-
c.example '
|
188
|
-
c.example '
|
200
|
+
command :copy do |c|
|
201
|
+
c.syntax = 'pomo [copy|cp] [task...]'
|
202
|
+
c.summary = 'Copy task(s)'
|
203
|
+
c.description = 'Copy task(s) to the end of the current list as an incomplete task'
|
204
|
+
c.example 'Copy first task' , 'pomo copy first'
|
205
|
+
c.example 'Copy the fourth task' , 'pomo cp 4'
|
206
|
+
c.example 'Copy the fifth and second task', 'pomo cp 5 2'
|
207
|
+
c.example 'Copy a range of tasks' , 'pomo cp 2..6'
|
208
|
+
c.example 'Copy all but the first task' , 'pomo cp 2..-1'
|
209
|
+
c.example 'Copy all tasks' , 'pomo cp all'
|
210
|
+
|
211
|
+
c.action do |args, options|
|
212
|
+
config = Pomo::Configuration.load
|
213
|
+
list.find(*args) do |task|
|
214
|
+
dup_task = Marshal::load(Marshal.dump(task))
|
215
|
+
dup_task.complete = false
|
216
|
+
list.tasks << dup_task
|
217
|
+
say " - Copied #{task}"
|
218
|
+
end
|
219
|
+
list.save
|
220
|
+
end
|
221
|
+
end
|
222
|
+
alias_command :cp, :copy
|
223
|
+
|
224
|
+
command :move do |c|
|
225
|
+
c.syntax = 'pomo move [from] [to]'
|
226
|
+
c.summary = 'Move a task'
|
227
|
+
c.description = 'Move a task to a different position in the current list'
|
228
|
+
c.example 'Move task 4 to position 2' , 'pomo move 4 2'
|
229
|
+
c.example 'Move last task to first position', 'pomo mv last first'
|
230
|
+
|
231
|
+
c.action do |args, options|
|
232
|
+
config = Pomo::Configuration.load
|
233
|
+
from = args.shift or raise('<from> is required')
|
234
|
+
to = args.shift or raise('<to> is required')
|
235
|
+
list.find(from) do |task|
|
236
|
+
list.find(to) do |other_task|
|
237
|
+
list.move(from, to)
|
238
|
+
say " - Moved #{task} from position #{from} to #{to}"
|
239
|
+
end
|
240
|
+
end
|
241
|
+
list.save
|
242
|
+
end
|
243
|
+
end
|
244
|
+
alias_command :mv, :move
|
245
|
+
|
246
|
+
# TODO remove view alias in 3.0 release
|
247
|
+
command :show do |c|
|
248
|
+
c.syntax = 'pomo show [task ...] [options]'
|
249
|
+
c.summary = 'Show verbose task information'
|
250
|
+
c.description = 'Show verbose information for the given task(s) or the first task'
|
251
|
+
c.example 'Show the first task', 'pomo show first'
|
252
|
+
c.example 'Show the last task' , 'pomo show last'
|
253
|
+
c.example 'Show the fifth task', 'pomo show 5'
|
254
|
+
|
189
255
|
c.action do |args, options|
|
190
|
-
|
256
|
+
config = Pomo::Configuration.load
|
257
|
+
list.find(*args) do |task|
|
191
258
|
say "\n"
|
192
259
|
format = "%15s : %s\n"
|
193
|
-
|
194
|
-
say format % ['length', "#{task.length} minutes"]
|
195
|
-
say format % ['description', task.description] if task.description and not task.description.empty?
|
196
|
-
if task.github?
|
197
|
-
say format % ['labels', task.labels.join(', ')] if task.labels and not task.labels.empty?
|
198
|
-
say format % ['number', task.number ]
|
199
|
-
say format % ['uri', task.uri ]
|
200
|
-
end
|
260
|
+
task.verbose_output(format)
|
201
261
|
end
|
202
262
|
say "\n"
|
203
263
|
end
|
204
264
|
end
|
265
|
+
alias_command :view, :show
|
205
266
|
|
206
267
|
command :complete do |c|
|
207
|
-
c.syntax
|
208
|
-
c.summary
|
268
|
+
c.syntax = 'pomo complete [task ...] [options]'
|
269
|
+
c.summary = 'Mark task(s) as completed'
|
209
270
|
c.description = 'Mark the given task(s) or the first task to complete'
|
210
271
|
c.example 'Mark first task as complete', 'pomo complete first'
|
211
|
-
c.example 'Mark last task as complete', 'pomo complete last'
|
272
|
+
c.example 'Mark last task as complete' , 'pomo complete last'
|
212
273
|
c.example 'Mark fifth task as complete', 'pomo complete 5'
|
274
|
+
|
213
275
|
c.action do |args, options|
|
214
|
-
|
276
|
+
config = Pomo::Configuration.load
|
277
|
+
list.find(*args) do |task|
|
215
278
|
task.complete = true
|
216
279
|
say " - Completed #{task}"
|
217
280
|
end
|
@@ -220,14 +283,16 @@ command :complete do |c|
|
|
220
283
|
end
|
221
284
|
|
222
285
|
command :incomplete do |c|
|
223
|
-
c.syntax
|
224
|
-
c.summary
|
286
|
+
c.syntax = 'pomo incomplete [task ...] [options]'
|
287
|
+
c.summary = 'Mark task(s) as incompleted'
|
225
288
|
c.description = 'Mark the given task(s) or the first task as not completed'
|
226
289
|
c.example 'Mark first task as not completed', 'pomo incomplete first'
|
227
|
-
c.example 'Mark last task as not completed', 'pomo incomplete last'
|
290
|
+
c.example 'Mark last task as not completed' , 'pomo incomplete last'
|
228
291
|
c.example 'Mark fifth task as not completed', 'pomo incomplete 5'
|
292
|
+
|
229
293
|
c.action do |args, options|
|
230
|
-
|
294
|
+
config = Pomo::Configuration.load
|
295
|
+
list.find(*args) do |task|
|
231
296
|
task.complete = false
|
232
297
|
say " - #{task} marked incomplete"
|
233
298
|
end
|
@@ -236,20 +301,24 @@ command :incomplete do |c|
|
|
236
301
|
end
|
237
302
|
|
238
303
|
command :list do |c|
|
239
|
-
c.syntax
|
304
|
+
c.syntax = 'pomo [list|ls] [options]'
|
240
305
|
c.description = 'List all tasks'
|
241
306
|
c.example 'List all tasks', 'pomo list'
|
307
|
+
|
242
308
|
c.option '-c', '--complete', 'List only completed tasks'
|
243
309
|
c.option '-i', '--incomplete', 'List only incompleted tasks'
|
244
310
|
c.action do |args, options|
|
311
|
+
abort "invalid command. See 'pomo help' for more information" unless args.empty?
|
312
|
+
|
313
|
+
config = Pomo::Configuration.load
|
245
314
|
total = 0
|
246
315
|
list.tasks.each_with_index do |task, i|
|
247
316
|
next if options.complete && !task.complete?
|
248
317
|
next if options.incomplete && task.complete?
|
249
|
-
say ' %s %2d. %-
|
318
|
+
say ' %s %2d. %-50s : %d minutes' % [task.complete? ? '✓' : ' ', i, task.to_s, task.length]
|
250
319
|
total += task.length
|
251
320
|
end
|
252
|
-
say ' ' *
|
321
|
+
say ' ' * 60 + '%d minutes' % total
|
253
322
|
end
|
254
323
|
end
|
255
324
|
alias_command :ls, :list
|