toodledo 1.3.8 → 1.4.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/History.txt +4 -0
- data/README.md +7 -0
- data/Rakefile +2 -0
- data/lib/toodledo/command_line/client.rb +78 -4
- data/lib/toodledo/command_line/parser_helper.rb +27 -2
- data/lib/toodledo/version.rb +2 -2
- data/test/parser_helper_test.rb +77 -1
- data/toodledo.gemspec +1 -1
- metadata +73 -76
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -59,6 +59,13 @@ for the client is as follows:
|
|
59
59
|
#DueDate
|
60
60
|
%Tags
|
61
61
|
|
62
|
+
Additionally, a * _not_ followed immediately by a folder name
|
63
|
+
indicates that the task should be starred.
|
64
|
+
|
65
|
+
For adding tasks, you may specify Priority as either a word:
|
66
|
+
top,high,medium,low,negative or as a number: -1,0,1,2,3
|
67
|
+
|
68
|
+
|
62
69
|
You can encase the symbol with square brackets if there is a space involved:
|
63
70
|
|
64
71
|
*[Blue Sky]
|
data/Rakefile
CHANGED
@@ -26,6 +26,8 @@ You can also use the client in your shell scripts, or use the API directly
|
|
26
26
|
as part of a web application. Custom private RSS feed? Want to have the Mac
|
27
27
|
read out your top priority? Input tasks through Quicksilver? Print out
|
28
28
|
tasks with a BetaBrite? It can all happen.
|
29
|
+
|
30
|
+
Check it out: http://aosekai.net/2011/09/quickly-add-new-task-to-toodledo-with-alfred/
|
29
31
|
EOF
|
30
32
|
gem.homepage = "http://github.com/wsargent/toodledo"
|
31
33
|
gem.authors = ["Will Sargent"]
|
@@ -18,6 +18,9 @@ require 'toodledo/command_line/add_command'
|
|
18
18
|
# READ
|
19
19
|
require 'toodledo/command_line/hotlist_command'
|
20
20
|
require 'toodledo/command_line/list_tasks_command'
|
21
|
+
require 'toodledo/command_line/list_today_command'
|
22
|
+
require 'toodledo/command_line/list_tomorrow_command'
|
23
|
+
require 'toodledo/command_line/list_overdue_command'
|
21
24
|
require 'toodledo/command_line/list_tasks_by_context_command'
|
22
25
|
require 'toodledo/command_line/list_folders_command'
|
23
26
|
require 'toodledo/command_line/list_contexts_command'
|
@@ -333,7 +336,55 @@ module Toodledo
|
|
333
336
|
print @formatters[:task].format(task)
|
334
337
|
end
|
335
338
|
end
|
336
|
-
|
339
|
+
|
340
|
+
#
|
341
|
+
# Print all tasks with the due date in the given time range
|
342
|
+
#
|
343
|
+
def list_tasks_by_beforeafter(session, before, after)
|
344
|
+
params = { :notcomp => true }
|
345
|
+
if (before)
|
346
|
+
params.merge!({ :before => before.strftime("%Y-%m-%d") })
|
347
|
+
end
|
348
|
+
|
349
|
+
if (after)
|
350
|
+
params.merge!({ :after => after.strftime("%Y-%m-%d") })
|
351
|
+
end
|
352
|
+
|
353
|
+
tasks = session.get_tasks(params)
|
354
|
+
for task in tasks
|
355
|
+
print @formatters[:task].format(task)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
#
|
360
|
+
# Print tasks for today
|
361
|
+
#
|
362
|
+
def list_today_tasks(session, line)
|
363
|
+
tomorrow = Date.today + 1
|
364
|
+
yesterday = Date.today - 1
|
365
|
+
# show us everything before tomorrow, but after yesterday.
|
366
|
+
list_tasks_by_beforeafter(session, tomorrow, yesterday)
|
367
|
+
end
|
368
|
+
|
369
|
+
#
|
370
|
+
# Print tasks for tomorrow
|
371
|
+
#
|
372
|
+
def list_tomorrow_tasks(session, line)
|
373
|
+
today = Date.today
|
374
|
+
twodaysfromnow = today + 2
|
375
|
+
# show us tasks before two days from now, but after today.
|
376
|
+
list_tasks_by_beforeafter(session, twodaysfromnow, today)
|
377
|
+
end
|
378
|
+
|
379
|
+
#
|
380
|
+
# Print overdue tasks
|
381
|
+
#
|
382
|
+
def list_overdue_tasks(session, line)
|
383
|
+
today = Date.today
|
384
|
+
# show us everything before today.
|
385
|
+
list_tasks_by_beforeafter(session, today, nil)
|
386
|
+
end
|
387
|
+
|
337
388
|
#
|
338
389
|
# Prints all active tasks nested by context.
|
339
390
|
#
|
@@ -385,7 +436,6 @@ module Toodledo
|
|
385
436
|
# Lists the contexts.
|
386
437
|
#
|
387
438
|
def list_contexts(session, input)
|
388
|
-
params = { }
|
389
439
|
|
390
440
|
contexts = session.get_contexts()
|
391
441
|
|
@@ -398,7 +448,6 @@ module Toodledo
|
|
398
448
|
# Lists the folders.
|
399
449
|
#
|
400
450
|
def list_folders(session, input)
|
401
|
-
params = { }
|
402
451
|
|
403
452
|
folders = session.get_folders()
|
404
453
|
|
@@ -419,13 +468,14 @@ module Toodledo
|
|
419
468
|
def add_task(session, line)
|
420
469
|
# TODO Yet again, essentially the same code as list and hotlist; Refactor
|
421
470
|
context = parse_context(line)
|
471
|
+
star = parse_star(line) # ctanis
|
422
472
|
folder = parse_folder(line)
|
423
473
|
goal = parse_goal(line)
|
424
474
|
priority = parse_priority(line)
|
425
475
|
date = parse_date(line)
|
426
476
|
tag = parse_tag(line)
|
427
477
|
title = parse_remainder(line)
|
428
|
-
|
478
|
+
|
429
479
|
params = {}
|
430
480
|
if (priority != nil)
|
431
481
|
params.merge!({ :priority => priority })
|
@@ -450,6 +500,10 @@ module Toodledo
|
|
450
500
|
if (tag != nil)
|
451
501
|
params.merge!({ :tag => tag })
|
452
502
|
end
|
503
|
+
|
504
|
+
if (star) # boolean
|
505
|
+
params.merge!({ :star => true })
|
506
|
+
end
|
453
507
|
|
454
508
|
# If we got nothing but 'add' then ask for it explicitly.
|
455
509
|
if (title == nil)
|
@@ -687,6 +741,9 @@ module Toodledo
|
|
687
741
|
print "goals Shows all goals"
|
688
742
|
print "contexts Shows all contexts"
|
689
743
|
print "tasks Shows tasks ('tasks *Action @Home')"
|
744
|
+
print "today Shows tasks for today"
|
745
|
+
print "tomorrow Shows tasks for tomorrow"
|
746
|
+
print "overdue Shows overdue tasks"
|
690
747
|
print
|
691
748
|
print "add Adds task ('add *Action @Home Eat breakfast')"
|
692
749
|
print " folder Adds a folder ('add folder MyFolder')"
|
@@ -764,6 +821,18 @@ module Toodledo
|
|
764
821
|
line = clean(/^(tasks)/, input)
|
765
822
|
list_tasks(session, line)
|
766
823
|
|
824
|
+
when /^today/
|
825
|
+
line = clean(/^(today)/, input)
|
826
|
+
list_today_tasks(session, line)
|
827
|
+
|
828
|
+
when /^tomorrow/
|
829
|
+
line = clean(/^(tomorrow)/, input)
|
830
|
+
list_tomorrow_tasks(session, line)
|
831
|
+
|
832
|
+
when /^overdue/
|
833
|
+
line = clean(/^(overdue)/, input)
|
834
|
+
list_overdue_tasks(session, line)
|
835
|
+
|
767
836
|
when /^folders/
|
768
837
|
line = clean(/^folders/, input)
|
769
838
|
list_folders(session,line)
|
@@ -830,6 +899,11 @@ module Toodledo
|
|
830
899
|
cmd.add_command(AddTaskCommand.new(self))
|
831
900
|
|
832
901
|
cmd.add_command(ListTasksCommand.new(self))
|
902
|
+
|
903
|
+
cmd.add_command(ListTodayCommand.new(self))
|
904
|
+
cmd.add_command(ListTomorrowCommand.new(self))
|
905
|
+
cmd.add_command(ListOverdueCommand.new(self))
|
906
|
+
|
833
907
|
cmd.add_command(ListFoldersCommand.new(self))
|
834
908
|
cmd.add_command(ListGoalsCommand.new(self))
|
835
909
|
cmd.add_command(ListContextsCommand.new(self))
|
@@ -16,18 +16,21 @@ module Toodledo
|
|
16
16
|
|
17
17
|
CONTEXT_REGEXP = /\@((\w+)|\[(.*?)\])/
|
18
18
|
|
19
|
-
PRIORITY_REGEXP = /!(top|high|medium|low|negative)/
|
19
|
+
PRIORITY_REGEXP = /!(top|high|medium|low|negative|-1|0|1|2|3)/
|
20
20
|
|
21
21
|
DATE_REGEXP = /\#(([^\[]\S*)|\[(.*?)\])/
|
22
22
|
|
23
23
|
TAGS_REGEXP = /\%((\w+)|\[(.*?)\])/
|
24
24
|
|
25
|
+
STAR_REGEXP = /\*\s+|\*$/
|
26
|
+
|
25
27
|
# Note that level must exist at the beginning of the line
|
26
28
|
LEVEL_REGEXP = /^(life|medium|short)/
|
27
29
|
|
28
30
|
# Don't include level regexp
|
29
31
|
REGEXP_LIST = [
|
30
32
|
FOLDER_REGEXP,
|
33
|
+
STAR_REGEXP,
|
31
34
|
GOAL_REGEXP,
|
32
35
|
CONTEXT_REGEXP,
|
33
36
|
PRIORITY_REGEXP,
|
@@ -92,6 +95,17 @@ module Toodledo
|
|
92
95
|
return Toodledo::Priority::LOW
|
93
96
|
when 'negative'
|
94
97
|
return Toodledo::Priority::NEGATIVE
|
98
|
+
when '-1'
|
99
|
+
return Toodledo::Priority::NEGATIVE
|
100
|
+
when '0'
|
101
|
+
return Toodledo::Priority::LOW
|
102
|
+
when '1'
|
103
|
+
return Toodledo::Priority::MEDIUM
|
104
|
+
when '2'
|
105
|
+
return Toodledo::Priority::HIGH
|
106
|
+
when '3'
|
107
|
+
return Toodledo::Priority::TOP
|
108
|
+
|
95
109
|
else
|
96
110
|
return nil
|
97
111
|
end
|
@@ -116,7 +130,17 @@ module Toodledo
|
|
116
130
|
end
|
117
131
|
end
|
118
132
|
|
119
|
-
|
133
|
+
def parse_star(input)
|
134
|
+
match_data = STAR_REGEXP.match(input)
|
135
|
+
if (match_data == nil)
|
136
|
+
return false
|
137
|
+
else
|
138
|
+
return true
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
# Returns the bit after we've looked for *Folder, @Context & ^Goal & star
|
120
144
|
def parse_remainder(line)
|
121
145
|
input = line
|
122
146
|
|
@@ -129,6 +153,7 @@ module Toodledo
|
|
129
153
|
|
130
154
|
return input
|
131
155
|
end
|
156
|
+
|
132
157
|
|
133
158
|
# Strips a string of [ and ] characters
|
134
159
|
def strip_brackets(inword)
|
data/lib/toodledo/version.rb
CHANGED
data/test/parser_helper_test.rb
CHANGED
@@ -158,4 +158,80 @@ class ParserHelperTest < Test::Unit::TestCase
|
|
158
158
|
assert_equal(Goal::SHORT_LEVEL, level, 'level not found')
|
159
159
|
end
|
160
160
|
|
161
|
-
|
161
|
+
def test_find_star()
|
162
|
+
input = '* this is a starred task'
|
163
|
+
star = parse_star(input)
|
164
|
+
folder = parse_folder(input)
|
165
|
+
assert_equal(star, true)
|
166
|
+
assert_equal(folder, nil)
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_find_star2()
|
170
|
+
input = 'this is also a starred task *'
|
171
|
+
star = parse_star(input)
|
172
|
+
folder = parse_folder(input)
|
173
|
+
assert_equal(star, true)
|
174
|
+
assert_equal(folder, nil)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_find_star3()
|
178
|
+
input = 'this is not a starred task *foo'
|
179
|
+
star = parse_star(input)
|
180
|
+
folder = parse_folder(input)
|
181
|
+
assert_equal(star, false)
|
182
|
+
assert_equal(folder, "foo")
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_find_star4()
|
186
|
+
input = '* but this is not a starred task *foo'
|
187
|
+
star = parse_star(input)
|
188
|
+
folder = parse_folder(input)
|
189
|
+
assert_equal(star, true)
|
190
|
+
assert_equal(folder, "foo")
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_find_priority_with_numbers1
|
194
|
+
input = "!3 I AM VERY IMPORTANT!"
|
195
|
+
|
196
|
+
priority = parse_priority(input)
|
197
|
+
|
198
|
+
assert(priority == Priority::TOP, "Value not found")
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_find_priority_with_numbers2
|
202
|
+
input = "I AM QUITE IMPORTANT! !2"
|
203
|
+
|
204
|
+
priority = parse_priority(input)
|
205
|
+
|
206
|
+
assert(priority == Priority::HIGH, "Value not found")
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_find_priority_with_numbers3
|
210
|
+
input = "!1 I AM KINDA IMPORTANT!"
|
211
|
+
|
212
|
+
priority = parse_priority(input)
|
213
|
+
|
214
|
+
assert(priority == Priority::MEDIUM, "Value not found")
|
215
|
+
end
|
216
|
+
|
217
|
+
|
218
|
+
def test_find_priority_with_numbers4
|
219
|
+
input = "!0 I AM NOT VERY IMPORTANT!"
|
220
|
+
|
221
|
+
priority = parse_priority(input)
|
222
|
+
|
223
|
+
assert(priority == Priority::LOW, "Value not found")
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
def test_find_priority_with_numbers5
|
228
|
+
input = "!-1 I AM MAXIMALLY UNIMPORTANT!"
|
229
|
+
|
230
|
+
priority = parse_priority(input)
|
231
|
+
|
232
|
+
assert(priority == Priority::NEGATIVE, "Value not found")
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
end
|
data/toodledo.gemspec
CHANGED
metadata
CHANGED
@@ -1,85 +1,92 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: toodledo
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
- 8
|
10
|
-
version: 1.3.8
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Will Sargent
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-06-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: cmdparse
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: highline
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
25
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: highline
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: flexmock
|
50
39
|
prerelease: false
|
51
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
41
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: flexmock
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
60
54
|
type: :development
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ! 'This is a Ruby API and client for http://toodledo.com, a task management
|
63
|
+
|
64
|
+
website. It implements all of the calls from Toodledo''s developer API, and
|
65
|
+
|
65
66
|
provides a nice wrapper around the functionality.
|
66
|
-
|
67
|
+
|
68
|
+
|
67
69
|
The client allows you to work with Toodledo from the command line. It will
|
70
|
+
|
68
71
|
work in either interactive or command line mode.
|
69
|
-
|
72
|
+
|
73
|
+
|
70
74
|
You can also use the client in your shell scripts, or use the API directly
|
75
|
+
|
71
76
|
as part of a web application. Custom private RSS feed? Want to have the Mac
|
77
|
+
|
72
78
|
read out your top priority? Input tasks through Quicksilver? Print out
|
79
|
+
|
73
80
|
tasks with a BetaBrite? It can all happen.
|
74
81
|
|
82
|
+
'
|
75
83
|
email: will.sargent@gmail.com
|
76
|
-
executables:
|
84
|
+
executables:
|
77
85
|
- toodledo
|
78
86
|
extensions: []
|
79
|
-
|
80
|
-
extra_rdoc_files:
|
87
|
+
extra_rdoc_files:
|
81
88
|
- README.md
|
82
|
-
files:
|
89
|
+
files:
|
83
90
|
- History.txt
|
84
91
|
- README.md
|
85
92
|
- Rakefile
|
@@ -124,36 +131,26 @@ files:
|
|
124
131
|
- toodledo.gemspec
|
125
132
|
homepage: http://github.com/wsargent/toodledo
|
126
133
|
licenses: []
|
127
|
-
|
128
134
|
post_install_message:
|
129
135
|
rdoc_options: []
|
130
|
-
|
131
|
-
require_paths:
|
136
|
+
require_paths:
|
132
137
|
- lib
|
133
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
139
|
none: false
|
135
|
-
requirements:
|
136
|
-
- -
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
|
139
|
-
|
140
|
-
- 0
|
141
|
-
version: "0"
|
142
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
145
|
none: false
|
144
|
-
requirements:
|
145
|
-
- -
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
|
148
|
-
segments:
|
149
|
-
- 0
|
150
|
-
version: "0"
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
151
150
|
requirements: []
|
152
|
-
|
153
151
|
rubyforge_project:
|
154
|
-
rubygems_version: 1.8.
|
152
|
+
rubygems_version: 1.8.23
|
155
153
|
signing_key:
|
156
154
|
specification_version: 3
|
157
155
|
summary: A command line client and API to Toodledo
|
158
156
|
test_files: []
|
159
|
-
|