rtmilk 0.0.2 → 0.3.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/CHANGELOG.txt +24 -1
- data/History.txt +0 -0
- data/Manifest.txt +17 -3
- data/README.txt +2 -3
- data/Rakefile +1 -0
- data/example/get.rb +43 -0
- data/lib/rtmilk.rb +2 -179
- data/lib/rtmilk/api.rb +76 -341
- data/lib/rtmilk/api/auth.rb +62 -0
- data/lib/rtmilk/api/lists.rb +177 -0
- data/lib/rtmilk/api/notes.rb +141 -0
- data/lib/rtmilk/api/tasks.rb +196 -0
- data/lib/rtmilk/api/timelines.rb +34 -0
- data/lib/rtmilk/error.rb +8 -0
- data/lib/rtmilk/version.rb +2 -2
- data/test/Rakefile +7 -0
- data/test/auth_api_test.rb +82 -0
- data/test/error_test.rb +21 -0
- data/test/lists_api_test.rb +82 -0
- data/test/make_config.rb +75 -0
- data/test/notes_api_test.rb +125 -0
- data/test/rtm_api_test.rb +47 -128
- data/test/tasks_api_test.rb +88 -0
- data/test/timelines_api_test.rb +44 -0
- metadata +25 -5
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# rtm.timelines : Timelines API
|
3
|
+
#
|
4
|
+
module RTM
|
5
|
+
module Timelines
|
6
|
+
|
7
|
+
class Create < RTM::API
|
8
|
+
def parse_result(result)
|
9
|
+
super
|
10
|
+
result['timeline'].first
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(token)
|
14
|
+
super 'rtm.timelines.create', token
|
15
|
+
end
|
16
|
+
end # Create
|
17
|
+
|
18
|
+
end # Timelines
|
19
|
+
|
20
|
+
class Timeline
|
21
|
+
def initialize(token)
|
22
|
+
@timeline = RTM::Timelines::Create.new(token).invoke
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
@timeline
|
27
|
+
end
|
28
|
+
|
29
|
+
def length
|
30
|
+
@timeline.length
|
31
|
+
end
|
32
|
+
end # Timeline
|
33
|
+
end # RTM
|
34
|
+
# vim:fdm=indent
|
data/lib/rtmilk/error.rb
ADDED
data/lib/rtmilk/version.rb
CHANGED
data/test/Rakefile
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# tests for RTM::Auth API.
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
+
|
7
|
+
class RTMAuthAPITest < Test::Unit::TestCase
|
8
|
+
CONFIG = File.dirname(__FILE__) + '/../config.dat' # config data file
|
9
|
+
|
10
|
+
def setup
|
11
|
+
conf = begin
|
12
|
+
Marshal.load(open(CONFIG))
|
13
|
+
rescue
|
14
|
+
puts 'please run make_config.rb first.'
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
RTM::API.init(conf[:key], conf[:sec], conf)
|
19
|
+
@perms = 'delete'
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
end
|
24
|
+
|
25
|
+
# -----------------------------------------------------------------
|
26
|
+
# helper
|
27
|
+
#
|
28
|
+
def prompt_for_auth(url)
|
29
|
+
puts 'authorize this url : ' + url
|
30
|
+
puts 'then, push enter here.'
|
31
|
+
gets
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_frob
|
35
|
+
frob = RTM::Auth::GetFrob.new.invoke
|
36
|
+
assert_equal(40, frob.length)
|
37
|
+
return frob
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_token(frob)
|
41
|
+
res = RTM::Auth::GetToken.new(frob).invoke
|
42
|
+
assert_equal(40, res[:token].length)
|
43
|
+
assert_equal(@perms, res[:perms])
|
44
|
+
return res[:token]
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_token_interactive
|
48
|
+
frob = get_frob
|
49
|
+
url = RTM::API.get_auth_url(@perms, frob)
|
50
|
+
prompt_for_auth(url)
|
51
|
+
|
52
|
+
get_token(frob)
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# -----------------------------------------------------------------
|
57
|
+
# tests
|
58
|
+
#
|
59
|
+
def test_getFrob
|
60
|
+
get_frob
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_invalidToken
|
64
|
+
assert_raise(RTM::Error) {
|
65
|
+
RTM::Auth::GetToken.new('detarame').invoke
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
# this test requires user authentication manually, so disabed normally.
|
70
|
+
def not_test_getToken
|
71
|
+
get_token_interactive
|
72
|
+
end
|
73
|
+
|
74
|
+
# this test requires user authentication manually, so disabed normally.
|
75
|
+
def not_test_checkToken
|
76
|
+
token = get_token_interactive
|
77
|
+
|
78
|
+
auth = RTM::Auth::CheckToken.new(token).invoke
|
79
|
+
assert_equal(@perms, auth[:perms])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
# vim:fdm=indent
|
data/test/error_test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# tests for RTM::Auth API.
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
+
|
7
|
+
class RTMErrorTest < Test::Unit::TestCase
|
8
|
+
CONFIG = File.dirname(__FILE__) + '/../config.dat' # config data file
|
9
|
+
|
10
|
+
def setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_raise
|
17
|
+
assert_raise(RTM::Error) { raise RTM::Error, "login failed" }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
# vim:fdm=indent
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# tests for RTM::Lists API.
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
+
|
7
|
+
class RTMListsAPITest < Test::Unit::TestCase
|
8
|
+
CONFIG = File.dirname(__FILE__) + '/../config.dat' # config data file
|
9
|
+
|
10
|
+
def setup
|
11
|
+
conf = begin
|
12
|
+
Marshal.load(open(CONFIG))
|
13
|
+
rescue
|
14
|
+
puts 'please run make_config.rb first.'
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
RTM::API.init(conf[:key], conf[:sec], conf)
|
19
|
+
@perms = 'read'
|
20
|
+
@token = conf[:token]
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
end
|
25
|
+
|
26
|
+
# -----------------------------------------------------------------
|
27
|
+
# helper
|
28
|
+
#
|
29
|
+
|
30
|
+
# -----------------------------------------------------------------
|
31
|
+
# tests
|
32
|
+
#
|
33
|
+
def test_getList
|
34
|
+
lists = RTM::Lists::GetList.new(@token).invoke
|
35
|
+
assert_instance_of(Array, lists)
|
36
|
+
lists.each do |list|
|
37
|
+
assert_instance_of(Hash, list)
|
38
|
+
assert_equal(true, list.has_key?('name'))
|
39
|
+
assert_equal(true, list.has_key?('id'))
|
40
|
+
assert_equal(true, list.has_key?('deleted'))
|
41
|
+
assert_equal(true, list.has_key?('smart'))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def not_test_add
|
46
|
+
name = 'testAddList'
|
47
|
+
added = RTM::Lists::Add.new(@token, name).invoke
|
48
|
+
assert_equal(added['name'], name)
|
49
|
+
|
50
|
+
# TODO: do filter test
|
51
|
+
end # add
|
52
|
+
|
53
|
+
def not_test_delete
|
54
|
+
name = 'testAddList'
|
55
|
+
added = RTM::Lists::Add.new(@token, name).invoke
|
56
|
+
assert_equal(added['name'], name)
|
57
|
+
|
58
|
+
deleted = RTM::Lists::Delete.new(@token, added['id']).invoke
|
59
|
+
assert_equal(added['name'], deleted['name'])
|
60
|
+
assert_equal(added['id'], deleted['id'])
|
61
|
+
assert_equal('1', deleted['deleted'])
|
62
|
+
end # delete
|
63
|
+
|
64
|
+
def test_setName
|
65
|
+
# add
|
66
|
+
name = 'testSetName'
|
67
|
+
new_name = 'testSetNameNew'
|
68
|
+
added = RTM::Lists::Add.new(@token, name).invoke
|
69
|
+
assert_equal(added['name'], name)
|
70
|
+
|
71
|
+
# setName
|
72
|
+
named = RTM::Lists::SetName.new(@token, added['id'], new_name).invoke
|
73
|
+
assert_equal(new_name, named['name'])
|
74
|
+
|
75
|
+
# delete
|
76
|
+
deleted = RTM::Lists::Delete.new(@token, added['id']).invoke
|
77
|
+
assert_equal(named['name'], deleted['name'])
|
78
|
+
assert_equal(named['id'], deleted['id'])
|
79
|
+
assert_equal('1', deleted['deleted'])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
# vim:fdm=indent
|
data/test/make_config.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#
|
2
|
+
# make config.dat to store API_KEY, SHARED_SECRET, TOKENs.
|
3
|
+
#
|
4
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
5
|
+
|
6
|
+
CONFIG = File.dirname(__FILE__) + '/../config.dat' # config data file
|
7
|
+
|
8
|
+
# if file exists, exit
|
9
|
+
if FileTest.readable?(CONFIG)
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
|
13
|
+
done = false
|
14
|
+
|
15
|
+
def getToken(perms, frob)
|
16
|
+
url = RTM::API.get_auth_url(perms, frob)
|
17
|
+
puts "follow this link to acqure token (#{perms}) : " + url
|
18
|
+
puts ', then press enter here.'
|
19
|
+
gets
|
20
|
+
|
21
|
+
res = RTM::Auth::GetToken.new(frob).invoke
|
22
|
+
return res[:token]
|
23
|
+
end
|
24
|
+
|
25
|
+
fh = open(CONFIG, 'w')
|
26
|
+
begin
|
27
|
+
hash = {}
|
28
|
+
puts 'Enter your API key.'
|
29
|
+
hash[:key] = gets.chomp
|
30
|
+
|
31
|
+
puts 'Enter your shared secret.'
|
32
|
+
hash[:sec] = gets.chomp
|
33
|
+
|
34
|
+
RTM::API.init(hash[:key], hash[:sec])
|
35
|
+
|
36
|
+
# get a frob
|
37
|
+
frob = RTM::Auth::GetFrob.new.invoke
|
38
|
+
puts 'acquired frob : ' + frob
|
39
|
+
|
40
|
+
#
|
41
|
+
# choose permission
|
42
|
+
#
|
43
|
+
puts 'choose permission: [R]ead, [W]rite, or [D]elete .'
|
44
|
+
selected = gets.chomp
|
45
|
+
|
46
|
+
perms = {
|
47
|
+
'r' => 'read',
|
48
|
+
'R' => 'read',
|
49
|
+
'w' => 'write',
|
50
|
+
'W' => 'write',
|
51
|
+
'd' => 'delete',
|
52
|
+
'D' => 'delete' }
|
53
|
+
|
54
|
+
#
|
55
|
+
# get tokens
|
56
|
+
#
|
57
|
+
token = getToken(perms[selected], frob)
|
58
|
+
hash[:token] = token
|
59
|
+
|
60
|
+
puts 'acquired token is ' + token
|
61
|
+
|
62
|
+
#
|
63
|
+
# save
|
64
|
+
#
|
65
|
+
Marshal.dump(hash, fh)
|
66
|
+
puts 'all done !!!'
|
67
|
+
puts "your informations stored to #{CONFIG}."
|
68
|
+
done = true
|
69
|
+
ensure
|
70
|
+
fh.close
|
71
|
+
|
72
|
+
unless done
|
73
|
+
File.unlink(CONFIG)
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#
|
2
|
+
# tests for RTM::Tasks::Notes API.
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
+
|
7
|
+
class RTMTasksNotesAPITest < Test::Unit::TestCase
|
8
|
+
CONFIG = File.dirname(__FILE__) + '/../config.dat' # config data file
|
9
|
+
|
10
|
+
def setup
|
11
|
+
conf = begin
|
12
|
+
Marshal.load(open(CONFIG))
|
13
|
+
rescue
|
14
|
+
puts 'please run make_config.rb first.'
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
RTM::API.init(conf[:key], conf[:sec], conf)
|
19
|
+
@perms = 'read'
|
20
|
+
@token = conf[:token]
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
end
|
25
|
+
|
26
|
+
# -----------------------------------------------------------------
|
27
|
+
# helper
|
28
|
+
#
|
29
|
+
|
30
|
+
# -----------------------------------------------------------------
|
31
|
+
# tests
|
32
|
+
#
|
33
|
+
def not_test_add
|
34
|
+
timeline, err = RTM::Timelines::Create.new(@token).invoke
|
35
|
+
assert_equal('ok', err)
|
36
|
+
assert_equal(7, timeline.length)
|
37
|
+
|
38
|
+
lists, err = RTM::Lists::GetList.new(@token).invoke
|
39
|
+
assert_equal('ok', err)
|
40
|
+
assert_instance_of(Array, lists)
|
41
|
+
list = lists.first['id']
|
42
|
+
|
43
|
+
list_a, err, transaction_add = RTM::Tasks::Add.new(
|
44
|
+
@token, timeline, list, 'testTaskAdd').invoke
|
45
|
+
assert_equal('ok', err)
|
46
|
+
|
47
|
+
taskseries = list_a['taskseries'].first['id']
|
48
|
+
task = list_a['taskseries'].first['task'].first['id']
|
49
|
+
|
50
|
+
puts 'creating Note with ' +
|
51
|
+
'timeline=' + timeline +
|
52
|
+
', list=' + list +
|
53
|
+
', taskseries=' + taskseries +
|
54
|
+
', task=' + task
|
55
|
+
note, err, transaction = RTM::Tasks::Notes::Add.new(
|
56
|
+
@token, timeline, list, taskseries, task, 'testNote', 'testNote body.').invoke
|
57
|
+
assert_equal('ok', err)
|
58
|
+
assert_instance_of(Hash, note)
|
59
|
+
assert_not_equal('', note['id'])
|
60
|
+
end
|
61
|
+
|
62
|
+
def not_test_add_delete
|
63
|
+
timeline, err = RTM::Timelines::Create.new(@token).invoke
|
64
|
+
assert_equal('ok', err)
|
65
|
+
assert_equal(7, timeline.length)
|
66
|
+
|
67
|
+
lists, err = RTM::Lists::GetList.new(@token).invoke
|
68
|
+
assert_equal('ok', err)
|
69
|
+
assert_instance_of(Array, lists)
|
70
|
+
list = lists.first['id']
|
71
|
+
|
72
|
+
list_a, err, transaction_add = RTM::Tasks::Add.new(
|
73
|
+
@token, timeline, list, 'testTaskAdd').invoke
|
74
|
+
assert_equal('ok', err)
|
75
|
+
|
76
|
+
taskseries = list_a['taskseries'].first['id']
|
77
|
+
task = list_a['taskseries'].first['task'].first['id']
|
78
|
+
|
79
|
+
note, err, transaction = RTM::Tasks::Notes::Add.new(
|
80
|
+
@token, timeline, list, taskseries, task, 'testNote', 'testNote body.').invoke
|
81
|
+
assert_equal('ok', err)
|
82
|
+
assert_instance_of(Array, lists)
|
83
|
+
|
84
|
+
raise Error if note['id'] == ''
|
85
|
+
|
86
|
+
err = RTM::Tasks::Notes::Delete.new(@token, timeline, note['id']).invoke
|
87
|
+
assert_equal('ok', err.first)
|
88
|
+
|
89
|
+
list_d, err, transaction = RTM::Tasks::Delete.new(
|
90
|
+
@token, timeline, lists.first['id'], taskseries, task).invoke
|
91
|
+
assert_equal('ok', err)
|
92
|
+
assert_equal(list_a['id'], list_d['id'])
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_edit
|
96
|
+
timeline = RTM::Timelines::Create.new(@token).invoke
|
97
|
+
assert_equal(7, timeline.length)
|
98
|
+
|
99
|
+
lists = RTM::Lists::GetList.new(@token).invoke
|
100
|
+
assert_instance_of(Array, lists)
|
101
|
+
list = lists.first['id']
|
102
|
+
|
103
|
+
list_a, transaction_add = RTM::Tasks::Add.new(
|
104
|
+
@token, timeline, list, 'testTaskAdd').invoke
|
105
|
+
|
106
|
+
taskseries = list_a['taskseries'].first['id']
|
107
|
+
task = list_a['taskseries'].first['task'].first['id']
|
108
|
+
|
109
|
+
note, transaction = RTM::Tasks::Notes::Add.new(
|
110
|
+
@token, timeline, list, taskseries, task, 'testNote', 'testNote body.').invoke
|
111
|
+
|
112
|
+
raise Error if note['id'] == ''
|
113
|
+
|
114
|
+
editted, transaction = RTM::Tasks::Notes::Edit.new(
|
115
|
+
@token, timeline, note['id'], 'testNote editted', 'testNote body edditted.').invoke
|
116
|
+
assert_equal(note['id'], editted['id'])
|
117
|
+
|
118
|
+
RTM::Tasks::Notes::Delete.new(@token, timeline, note['id']).invoke
|
119
|
+
|
120
|
+
list_d, transaction = RTM::Tasks::Delete.new(
|
121
|
+
@token, timeline, lists.first['id'], taskseries, task).invoke
|
122
|
+
assert_equal(list_a['id'], list_d['id'])
|
123
|
+
end
|
124
|
+
end
|
125
|
+
# vim:fdm=indent
|