toodledo 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +1 -0
- data/lib/toodledo.rb +17 -6
- data/lib/toodledo/command_line/client.rb +48 -6
- data/lib/toodledo/command_line/task_formatter.rb +47 -1
- data/lib/toodledo/repeat.rb +6 -6
- data/lib/toodledo/session.rb +39 -1
- data/lib/toodledo/status.rb +44 -0
- data/lib/toodledo/task.rb +29 -2
- data/test/client_test.rb +30 -2
- metadata +4 -3
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/lib/toodledo.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
module Toodledo
|
6
6
|
|
7
7
|
# Required for gem
|
8
|
-
VERSION = '1.
|
8
|
+
VERSION = '1.3.0'
|
9
9
|
|
10
10
|
# Returns the configuration object.
|
11
11
|
def self.get_config()
|
@@ -24,11 +24,21 @@ module Toodledo
|
|
24
24
|
#
|
25
25
|
# The following will do most everything you want, assuming you've set
|
26
26
|
# the config correctly:
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
27
|
+
#
|
28
|
+
# require 'rubygems'
|
29
|
+
# require 'toodledo'
|
30
|
+
# require 'yaml'
|
31
|
+
# config = {
|
32
|
+
# "connection" => {
|
33
|
+
# "url" => "http://www.toodledo.com/api.php",
|
34
|
+
# "user_id" => "<your user id>",
|
35
|
+
# "password" => "<your password>"
|
36
|
+
# }
|
37
|
+
# }
|
38
|
+
# Toodledo.set_config(config)
|
39
|
+
# Toodledo.begin do |session|
|
40
|
+
# session.add_task('foo')
|
41
|
+
# end
|
32
42
|
#
|
33
43
|
def self.begin(logger = nil)
|
34
44
|
config = Toodledo.get_config()
|
@@ -56,6 +66,7 @@ end
|
|
56
66
|
require 'toodledo/server_error'
|
57
67
|
require 'toodledo/item_not_found_error'
|
58
68
|
require 'toodledo/invalid_configuration_error'
|
69
|
+
require 'toodledo/status'
|
59
70
|
require 'toodledo/task'
|
60
71
|
require 'toodledo/context'
|
61
72
|
require 'toodledo/goal'
|
@@ -18,6 +18,7 @@ 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_tasks_by_context_command'
|
21
22
|
require 'toodledo/command_line/list_folders_command'
|
22
23
|
require 'toodledo/command_line/list_contexts_command'
|
23
24
|
require 'toodledo/command_line/list_goals_command'
|
@@ -76,10 +77,16 @@ module Toodledo
|
|
76
77
|
}
|
77
78
|
end
|
78
79
|
|
80
|
+
#
|
81
|
+
# Returns debugging status.
|
82
|
+
#
|
79
83
|
def debug?
|
80
84
|
return @debug
|
81
85
|
end
|
82
86
|
|
87
|
+
#
|
88
|
+
# Sets the debugging on or off.
|
89
|
+
#
|
83
90
|
def debug=(is_debug)
|
84
91
|
@debug = is_debug
|
85
92
|
if (@debug == true)
|
@@ -89,6 +96,9 @@ module Toodledo
|
|
89
96
|
end
|
90
97
|
end
|
91
98
|
|
99
|
+
#
|
100
|
+
# Returns the logger.
|
101
|
+
#
|
92
102
|
def logger
|
93
103
|
return @logger
|
94
104
|
end
|
@@ -293,6 +303,20 @@ module Toodledo
|
|
293
303
|
end
|
294
304
|
end
|
295
305
|
|
306
|
+
#
|
307
|
+
# Prints all active tasks nested by context.
|
308
|
+
#
|
309
|
+
def list_tasks_by_context(session, line)
|
310
|
+
folder = parse_folder(line)
|
311
|
+
|
312
|
+
session.get_contexts().each do |context|
|
313
|
+
criteria = { :folder => folder, :context => context, :notcomp => true }
|
314
|
+
tasks = session.get_tasks(criteria)
|
315
|
+
print "#{context.name}" if (! tasks.empty?)
|
316
|
+
tasks.each { |task| print " " + @formatters[:task].format(task) }
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
296
320
|
#
|
297
321
|
# Lists the goals. Takes an optional argument of
|
298
322
|
# 'short', 'medium' or 'life'.
|
@@ -359,10 +383,8 @@ module Toodledo
|
|
359
383
|
# The order of symbols does not matter, but the title must be the last thing
|
360
384
|
# on the line.
|
361
385
|
#
|
362
|
-
# add @[Deep Space] *Action ^[For Great Justice] Take off every Zig
|
386
|
+
# add @[Deep Space] !top *Action ^[For Great Justice] Take off every Zig
|
363
387
|
#
|
364
|
-
# There is no priority handling in this method. It may be added if there is
|
365
|
-
# demand for it.
|
366
388
|
def add_task(session, line)
|
367
389
|
context = parse_context(line)
|
368
390
|
folder = parse_folder(line)
|
@@ -397,6 +419,9 @@ module Toodledo
|
|
397
419
|
print "Task #{task_id} added."
|
398
420
|
end
|
399
421
|
|
422
|
+
#
|
423
|
+
# Adds context.
|
424
|
+
#
|
400
425
|
def add_context(session, input)
|
401
426
|
|
402
427
|
title = input.strip
|
@@ -406,6 +431,9 @@ module Toodledo
|
|
406
431
|
print "Context #{context_id} added."
|
407
432
|
end
|
408
433
|
|
434
|
+
#
|
435
|
+
# Adds goal.
|
436
|
+
#
|
409
437
|
def add_goal(session, input)
|
410
438
|
input.strip!
|
411
439
|
|
@@ -455,7 +483,7 @@ module Toodledo
|
|
455
483
|
# Edits a single task. This method allows you to change the symbols on a
|
456
484
|
# task. Note that you must specify the ID here.
|
457
485
|
#
|
458
|
-
# edit *Action 12345
|
486
|
+
# edit *Action !top 12345
|
459
487
|
def edit_task(session, input)
|
460
488
|
logger.debug("edit_task: #{input.inspect}")
|
461
489
|
|
@@ -522,7 +550,8 @@ module Toodledo
|
|
522
550
|
#
|
523
551
|
# delete 123
|
524
552
|
#
|
525
|
-
def delete_task(session, line)
|
553
|
+
def delete_task(session, line)
|
554
|
+
logger.debug("delete_task: #{line.inspect}")
|
526
555
|
task_id = line
|
527
556
|
|
528
557
|
if (task_id == nil)
|
@@ -538,7 +567,12 @@ module Toodledo
|
|
538
567
|
end
|
539
568
|
end
|
540
569
|
|
570
|
+
#
|
571
|
+
# Deletes context.
|
572
|
+
#
|
541
573
|
def delete_context(session, line)
|
574
|
+
logger.debug("delete_context #{line.inspect}")
|
575
|
+
|
542
576
|
id = line
|
543
577
|
|
544
578
|
id.strip!
|
@@ -550,6 +584,9 @@ module Toodledo
|
|
550
584
|
end
|
551
585
|
end
|
552
586
|
|
587
|
+
#
|
588
|
+
# Deletes goal.
|
589
|
+
#
|
553
590
|
def delete_goal(session, line)
|
554
591
|
id = line
|
555
592
|
|
@@ -562,6 +599,9 @@ module Toodledo
|
|
562
599
|
end
|
563
600
|
end
|
564
601
|
|
602
|
+
#
|
603
|
+
# Deletes folder
|
604
|
+
#
|
565
605
|
def delete_folder(session, line)
|
566
606
|
id = line
|
567
607
|
|
@@ -573,8 +613,10 @@ module Toodledo
|
|
573
613
|
print "Folder #{id} could not be deleted!"
|
574
614
|
end
|
575
615
|
end
|
576
|
-
|
616
|
+
|
617
|
+
#
|
577
618
|
# Prints out a single line.
|
619
|
+
#
|
578
620
|
def print(line = nil)
|
579
621
|
if (line == nil)
|
580
622
|
puts
|
@@ -29,6 +29,19 @@ module Toodledo
|
|
29
29
|
fmt = '%m/%d/%Y %I:%M %p'
|
30
30
|
msg += " \#[#{task.duedatemodifier}#{task.duedate.strftime(fmt)}]"
|
31
31
|
end
|
32
|
+
|
33
|
+
if (task.startdate != nil)
|
34
|
+
fmt = '%m/%d/%Y'
|
35
|
+
msg += " startdate[#{task.startdate.strftime(fmt)}]"
|
36
|
+
end
|
37
|
+
|
38
|
+
if (task.status != Status::NONE)
|
39
|
+
msg += " status[#{readable_status(task.status)}]"
|
40
|
+
end
|
41
|
+
|
42
|
+
if (task.star)
|
43
|
+
msg += " starred"
|
44
|
+
end
|
32
45
|
|
33
46
|
if (task.tag != nil)
|
34
47
|
msg += " tag[#{task.tag}]"
|
@@ -46,7 +59,7 @@ module Toodledo
|
|
46
59
|
msg += " timer[#{task.timer}]"
|
47
60
|
end
|
48
61
|
|
49
|
-
if (task.num_children != nil)
|
62
|
+
if (task.num_children != nil && task.num_children > 0)
|
50
63
|
msg += " children[#{task.num_children}]"
|
51
64
|
end
|
52
65
|
|
@@ -76,6 +89,9 @@ module Toodledo
|
|
76
89
|
end
|
77
90
|
end
|
78
91
|
|
92
|
+
#
|
93
|
+
# Returns a string matching the numeric repeat code.
|
94
|
+
#
|
79
95
|
def readable_repeat(repeat)
|
80
96
|
case repeat
|
81
97
|
when Repeat::NONE
|
@@ -100,6 +116,36 @@ module Toodledo
|
|
100
116
|
''
|
101
117
|
end
|
102
118
|
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Return a readable status given the numeric code.
|
122
|
+
#
|
123
|
+
def readable_status(status)
|
124
|
+
case status
|
125
|
+
when Status::NONE
|
126
|
+
'none'
|
127
|
+
when Status::NEXT_ACTION
|
128
|
+
'Next Action'
|
129
|
+
when Status::ACTIVE
|
130
|
+
'Active'
|
131
|
+
when Status::PLANNING
|
132
|
+
'Planning'
|
133
|
+
when Status::DELEGATED
|
134
|
+
'Delegated'
|
135
|
+
when Status::WAITING
|
136
|
+
'Waiting'
|
137
|
+
when Status::HOLD
|
138
|
+
'Hold'
|
139
|
+
when Status::POSTPONED
|
140
|
+
'Postponed'
|
141
|
+
when Status::SOMEDAY
|
142
|
+
'Someday'
|
143
|
+
when Status::CANCELLED
|
144
|
+
'Cancelled'
|
145
|
+
when Status::REFERENCE
|
146
|
+
'Reference'
|
147
|
+
end
|
148
|
+
end
|
103
149
|
end
|
104
150
|
end
|
105
151
|
end
|
data/lib/toodledo/repeat.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
|
5
|
-
|
1
|
+
#
|
2
|
+
# The value values for repeats
|
3
|
+
#
|
6
4
|
module Toodledo
|
7
5
|
class Repeat
|
8
6
|
|
@@ -15,6 +13,7 @@ module Toodledo
|
|
15
13
|
BIMONTHLY = 6
|
16
14
|
SEMIANNUALLY = 7
|
17
15
|
QUARTERLY = 8
|
16
|
+
WITH_PARENT = 9
|
18
17
|
|
19
18
|
REPEAT_ARRAY = [
|
20
19
|
NONE,
|
@@ -25,7 +24,8 @@ module Toodledo
|
|
25
24
|
BIWEEKLY,
|
26
25
|
BIMONTHLY,
|
27
26
|
SEMIANNUALLY,
|
28
|
-
QUARTERLY
|
27
|
+
QUARTERLY,
|
28
|
+
WITH_PARENT
|
29
29
|
]
|
30
30
|
|
31
31
|
def self.each
|
data/lib/toodledo/session.rb
CHANGED
@@ -350,6 +350,9 @@ module Toodledo
|
|
350
350
|
# * compbefore
|
351
351
|
# * compafter
|
352
352
|
# * notcomp
|
353
|
+
# * star
|
354
|
+
# * status
|
355
|
+
# * startdate
|
353
356
|
#
|
354
357
|
# Returns an array of tasks. This information is never cached.
|
355
358
|
def get_tasks(params={})
|
@@ -420,7 +423,19 @@ module Toodledo
|
|
420
423
|
# * compafter : A date formated as YYYY-MM-DD. Used to find tasks with a
|
421
424
|
# completed date after this date.
|
422
425
|
handle_date(myhash, params, :compafter)
|
423
|
-
|
426
|
+
|
427
|
+
# startbefore:
|
428
|
+
handle_date(myhash, params, :startbefore)
|
429
|
+
|
430
|
+
# startafter:
|
431
|
+
handle_date(myhash, params, :startafter)
|
432
|
+
|
433
|
+
# star
|
434
|
+
handle_boolean(myhash, params, :star)
|
435
|
+
|
436
|
+
# status
|
437
|
+
handle_status(myhash, params)
|
438
|
+
|
424
439
|
# * notcomp : Set to 1 to omit completed tasks. Omit variable, or set to 0
|
425
440
|
# to retrieve both completed and uncompleted tasks.
|
426
441
|
handle_boolean(myhash, params, :notcomp)
|
@@ -482,6 +497,9 @@ module Toodledo
|
|
482
497
|
|
483
498
|
# Goal handling
|
484
499
|
handle_goal(myhash, params)
|
500
|
+
|
501
|
+
# Add the start date if it's been added.
|
502
|
+
handle_date(myhash, params, :startdate)
|
485
503
|
|
486
504
|
# duedate handling. Take either a string or a Time object.'YYYY-MM-DD'
|
487
505
|
handle_date(myhash, params, :duedate)
|
@@ -497,7 +515,14 @@ module Toodledo
|
|
497
515
|
|
498
516
|
# priority use the map to change from the symbol to the raw numeric value.
|
499
517
|
handle_priority(myhash, params)
|
518
|
+
|
519
|
+
# Handle the star.
|
520
|
+
handle_boolean(myhash, params, :star)
|
500
521
|
|
522
|
+
# Handle the status date.
|
523
|
+
handle_status(myhash, params)
|
524
|
+
|
525
|
+
# Handle the note.
|
501
526
|
handle_string(myhash, params, :note)
|
502
527
|
|
503
528
|
result = call('addTask', myhash, @key)
|
@@ -1121,6 +1146,19 @@ module Toodledo
|
|
1121
1146
|
|
1122
1147
|
myhash.merge!({ :repeat => repeat })
|
1123
1148
|
end
|
1149
|
+
|
1150
|
+
# Handles the status parameter
|
1151
|
+
def handle_status(myhash, params)
|
1152
|
+
status = params[:status]
|
1153
|
+
|
1154
|
+
return if (status == nil)
|
1155
|
+
|
1156
|
+
if (! Status.valid?(status))
|
1157
|
+
raise "Invalid status value: #{status}"
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
myhash.merge!({ :status => status })
|
1161
|
+
end
|
1124
1162
|
|
1125
1163
|
# Handles the priority. This must be one of several values.
|
1126
1164
|
def handle_priority(myhash, params)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# The possible values for the status field of a task.
|
3
|
+
#
|
4
|
+
class Status
|
5
|
+
|
6
|
+
NONE = 0
|
7
|
+
NEXT_ACTION = 1
|
8
|
+
ACTIVE = 2
|
9
|
+
PLANNING = 3
|
10
|
+
DELEGATED = 4
|
11
|
+
WAITING = 5
|
12
|
+
HOLD = 6
|
13
|
+
POSTPONED = 7
|
14
|
+
SOMEDAY = 8
|
15
|
+
CANCELLED = 9
|
16
|
+
REFERENCE = 10
|
17
|
+
|
18
|
+
STATUS_ARRAY = [
|
19
|
+
NONE,
|
20
|
+
NEXT_ACTION,
|
21
|
+
ACTIVE,
|
22
|
+
PLANNING,
|
23
|
+
DELEGATED,
|
24
|
+
WAITING,
|
25
|
+
HOLD,
|
26
|
+
POSTPONED,
|
27
|
+
SOMEDAY,
|
28
|
+
CANCELLED,
|
29
|
+
REFERENCE
|
30
|
+
]
|
31
|
+
|
32
|
+
def self.each
|
33
|
+
STATUS_ARRAY.each{|value| yield(value)}
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.valid?(input)
|
37
|
+
for status in STATUS_ARRAY
|
38
|
+
if (status == input)
|
39
|
+
return true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return false
|
43
|
+
end
|
44
|
+
end
|
data/lib/toodledo/task.rb
CHANGED
@@ -26,7 +26,14 @@ module Toodledo
|
|
26
26
|
attr_reader :parent_id, :parent, :title, :tag
|
27
27
|
attr_reader :added, :modified, :completed
|
28
28
|
attr_reader :duedate, :duedatemodifier
|
29
|
-
attr_reader :repeat, :priority
|
29
|
+
attr_reader :repeat, :priority
|
30
|
+
attr_reader :length, :timer
|
31
|
+
attr_reader :note
|
32
|
+
|
33
|
+
# as of 3.90
|
34
|
+
attr_reader :status
|
35
|
+
attr_reader :startdate
|
36
|
+
attr_reader :star
|
30
37
|
|
31
38
|
def server_id
|
32
39
|
return @id
|
@@ -79,6 +86,10 @@ module Toodledo
|
|
79
86
|
@length = params[:length]
|
80
87
|
@timer = params[:timer]
|
81
88
|
@note = params[:note]
|
89
|
+
|
90
|
+
@startdate = params[:startdate]
|
91
|
+
@status = params[:status]
|
92
|
+
@star = params[:star]
|
82
93
|
end
|
83
94
|
|
84
95
|
def completed?
|
@@ -130,8 +141,11 @@ module Toodledo
|
|
130
141
|
# <repeat>1</repeat>
|
131
142
|
# <priority>2</priority>
|
132
143
|
# <length>20</length>
|
133
|
-
# <timer>0</timer>
|
144
|
+
# <timer onfor=''>0</timer>
|
134
145
|
# <note></note>
|
146
|
+
# <startdate></startdate>
|
147
|
+
# <status>0</status>
|
148
|
+
# <star></star>
|
135
149
|
# </task> #++
|
136
150
|
|
137
151
|
id = el.elements['id'].text
|
@@ -220,6 +234,16 @@ module Toodledo
|
|
220
234
|
note = el.elements['note'].text
|
221
235
|
note = nil if (note == '0')
|
222
236
|
|
237
|
+
startdate = el.elements['startdate'].text
|
238
|
+
if (startdate != nil)
|
239
|
+
startdate = Date.strptime(startdate, Session::DATE_FORMAT)
|
240
|
+
end
|
241
|
+
|
242
|
+
status = el.elements['status'].text
|
243
|
+
status = Status::NONE if (status == '0')
|
244
|
+
|
245
|
+
star = (el.elements['star'].text.to_i == 1)
|
246
|
+
|
223
247
|
params = {
|
224
248
|
:parent_id => parent_id,
|
225
249
|
:parent => parent,
|
@@ -239,6 +263,9 @@ module Toodledo
|
|
239
263
|
:length => length,
|
240
264
|
:timer => timer,
|
241
265
|
:note => note,
|
266
|
+
:startdate => startdate,
|
267
|
+
:status => status,
|
268
|
+
:star => star
|
242
269
|
}
|
243
270
|
return Task.new(id, params)
|
244
271
|
end
|
data/test/client_test.rb
CHANGED
@@ -118,6 +118,7 @@ module Toodledo
|
|
118
118
|
:folder => Folder::NO_FOLDER,
|
119
119
|
:context => Context::NO_CONTEXT,
|
120
120
|
:goal => Goal::NO_GOAL,
|
121
|
+
:status => Status::NONE,
|
121
122
|
:repeat => Repeat::NONE
|
122
123
|
}
|
123
124
|
task = Task.new(1234, params)
|
@@ -139,16 +140,43 @@ module Toodledo
|
|
139
140
|
:context => Context.new(345, 'test context'),
|
140
141
|
:goal => Goal.new(342341, 0, 0, 'test goal'),
|
141
142
|
:repeat => Repeat::BIWEEKLY,
|
142
|
-
:
|
143
|
+
:status => Status::NEXT_ACTION,
|
144
|
+
:tag => 'some tag',
|
145
|
+
:star => true
|
143
146
|
}
|
144
147
|
task = Task.new(1234, params)
|
145
148
|
tasks = [ task ]
|
146
149
|
@session.should_receive(:get_tasks).and_return(tasks)
|
147
|
-
@client.should_receive(:print).with('<1234> -- !low *[test folder] @[test context] ^[test goal] repeat[biweekly] tag[some tag] foo')
|
150
|
+
@client.should_receive(:print).with('<1234> -- !low *[test folder] @[test context] ^[test goal] repeat[biweekly] status[Next Action] starred tag[some tag] foo')
|
148
151
|
|
149
152
|
input = ''
|
150
153
|
@client.list_tasks(@session, input)
|
151
154
|
end
|
155
|
+
|
156
|
+
def test_list_tasks_by_context()
|
157
|
+
context = Context.new(345, 'test context')
|
158
|
+
folder = Folder.new(1234, 0, 0, 'test folder')
|
159
|
+
|
160
|
+
params = {
|
161
|
+
:priority => Priority::LOW,
|
162
|
+
:title => 'foo',
|
163
|
+
:folder => folder,
|
164
|
+
:goal => Goal::NO_GOAL,
|
165
|
+
:repeat => Repeat::NONE,
|
166
|
+
:status => Status::NONE,
|
167
|
+
:context => context
|
168
|
+
}
|
169
|
+
task = Task.new(1234, params)
|
170
|
+
tasks = [ task ]
|
171
|
+
contexts = [ context ]
|
172
|
+
@session.should_receive(:get_contexts).and_return(contexts)
|
173
|
+
@session.should_receive(:get_tasks).and_return(tasks)
|
174
|
+
@client.should_receive(:print).with('test context')
|
175
|
+
@client.should_receive(:print).with(' <1234> -- !low *[test folder] @[test context] foo')
|
176
|
+
|
177
|
+
input = ''
|
178
|
+
@client.list_tasks_by_context(@session, input)
|
179
|
+
end
|
152
180
|
|
153
181
|
def test_list_contexts()
|
154
182
|
context = Context.new(1234, 'Context')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toodledo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Will Sargent
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-05-31 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- lib/toodledo/repeat.rb
|
85
85
|
- lib/toodledo/server_error.rb
|
86
86
|
- lib/toodledo/session.rb
|
87
|
+
- lib/toodledo/status.rb
|
87
88
|
- lib/toodledo/task.rb
|
88
89
|
- test/client_test.rb
|
89
90
|
- test/parser_helper_test.rb
|
@@ -112,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
113
|
requirements: []
|
113
114
|
|
114
115
|
rubyforge_project: toodledo
|
115
|
-
rubygems_version: 1.
|
116
|
+
rubygems_version: 1.1.1
|
116
117
|
signing_key:
|
117
118
|
specification_version: 2
|
118
119
|
summary: A command line client and API to Toodledo
|