soba-mieruka 0.0.2
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 +4 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/soba/mieruka.rb +330 -0
- data/lib/soba/mieruka/group.rb +40 -0
- data/lib/soba/mieruka/response.rb +36 -0
- data/lib/soba/mieruka/room.rb +64 -0
- data/lib/soba/mieruka/session.rb +61 -0
- data/lib/soba/mieruka/user.rb +51 -0
- data/lib/soba/mieruka/version.rb +5 -0
- data/soba-mieruka.gemspec +23 -0
- data/spec/mieruka_spec.rb +128 -0
- metadata +61 -0
data/.gitignore
ADDED
data/.rspec
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--color --format d
|
data/Gemfile
ADDED
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/soba/mieruka.rb
ADDED
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
# code: utf-8
|
|
2
|
+
|
|
3
|
+
require 'digest/md5'
|
|
4
|
+
require 'cgi'
|
|
5
|
+
require 'net/http'
|
|
6
|
+
require 'pathname'
|
|
7
|
+
mieruka_dir = Pathname(File.dirname(__FILE__)) + 'mieruka'
|
|
8
|
+
require mieruka_dir + 'user'
|
|
9
|
+
require mieruka_dir + 'session'
|
|
10
|
+
require mieruka_dir + 'room'
|
|
11
|
+
require mieruka_dir + 'group'
|
|
12
|
+
require mieruka_dir + 'version'
|
|
13
|
+
|
|
14
|
+
module Soba
|
|
15
|
+
|
|
16
|
+
class ApiResponse
|
|
17
|
+
|
|
18
|
+
attr_reader :doc, :error_code, :error_message
|
|
19
|
+
|
|
20
|
+
def initialize(res)
|
|
21
|
+
@ok = false
|
|
22
|
+
if res.message == 'OK'
|
|
23
|
+
@doc = REXML::Document.new(res.body)
|
|
24
|
+
if @doc.root.attributes['result'] == 'OK'
|
|
25
|
+
@ok = true
|
|
26
|
+
else
|
|
27
|
+
errorElm = @doc.root.elements['error']
|
|
28
|
+
@error_code = errorElm.attributes['code'].to_i
|
|
29
|
+
@error_message = CGI.unescapeHTML(errorElm.attributes['message'])
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def ok?
|
|
35
|
+
return @ok
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class ApiError < StandardError
|
|
41
|
+
def initialize(response)
|
|
42
|
+
@error_code = response.error_code
|
|
43
|
+
@error_message = response.error_message
|
|
44
|
+
end
|
|
45
|
+
attr_reader :error_code, :error_message
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class Mieruka
|
|
50
|
+
|
|
51
|
+
DEFAULT_CONFIG = {
|
|
52
|
+
:api_key => '',
|
|
53
|
+
:private_key => '',
|
|
54
|
+
:host => 'web-api.soba-project.com',
|
|
55
|
+
:port => 80,
|
|
56
|
+
:base_path => '/webapi',
|
|
57
|
+
:version => 1.4
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
def initialize(params)
|
|
61
|
+
@params = DEFAULT_CONFIG.merge(params)
|
|
62
|
+
@params[:base_path] += '/' + @params[:version].to_s unless @params[:version].nil?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
attr_reader :token
|
|
66
|
+
|
|
67
|
+
# Returns the URL of the application's authentication page.
|
|
68
|
+
def authentication_url(back_url)
|
|
69
|
+
timestamp = Time.now.to_i.to_s
|
|
70
|
+
sig_base = @params[:private_key] + @params[:api_key] + back_url + timestamp
|
|
71
|
+
sig = Digest::MD5.new(sig_base)
|
|
72
|
+
enc_url = CGI.escape(back_url)
|
|
73
|
+
"#{$HTTPS_API_ROOT}/auth?api_key=#{@params[:api_key]}&back_url=#{enc_url}&time=#{timestamp}&sig=#{sig}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def login(params)
|
|
77
|
+
required_params params, :user_name, :password
|
|
78
|
+
http = ::Net::HTTP.start(@params[:host], @params[:port])
|
|
79
|
+
path = @params[:base_path] + '/login'
|
|
80
|
+
val = "api_key=#{@params[:api_key]}&user_name=#{CGI.escape(params[:user_name])}&password=#{params[:password]}"
|
|
81
|
+
response = http.post(path, val)
|
|
82
|
+
make_response(response) do |doc, res|
|
|
83
|
+
@token = CGI.unescapeHTML(doc.root.elements["token"].get_text.to_s)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def logout
|
|
88
|
+
# Returns a Command object
|
|
89
|
+
response = request_with_auth(:GET, '/logout')
|
|
90
|
+
make_response(response) do |doc, res|
|
|
91
|
+
url = CGI.unescapeHTML(doc.root.elements["url"].get_text.to_s)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def create_session(params)
|
|
96
|
+
required_params params, :session_name, :session_description
|
|
97
|
+
response = request_with_auth(:POST, '/create_session', params)
|
|
98
|
+
make_response(response) do |doc, res|
|
|
99
|
+
Struct.new(:url, :soba_session_id).new(
|
|
100
|
+
CGI.unescapeHTML(doc.root.elements["url"].get_text.to_s),
|
|
101
|
+
CGI.unescapeHTML(doc.root.elements["soba-session-id"].get_text.to_s)
|
|
102
|
+
)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def join_session(params)
|
|
107
|
+
required_params params, :session_id
|
|
108
|
+
sid = CGI.escape(params['session_id'])
|
|
109
|
+
response = request_with_auth(:GET, "/join_session?session_id=#{sid}")
|
|
110
|
+
puts response.body
|
|
111
|
+
make_response(response) do |doc, res|
|
|
112
|
+
Struct.new(:url).new(CGI.unescapeHTML(doc.root.elements["url"].get_text.to_s))
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def sessions
|
|
117
|
+
# Returns an Array of Session object
|
|
118
|
+
response = request_with_auth(:GET, "/session_list")
|
|
119
|
+
make_response(response) do |doc, res|
|
|
120
|
+
doc.elements.collect('session-list-response/session-list/session') do |elm|
|
|
121
|
+
Session.create_from_session_element(elm)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def users
|
|
127
|
+
# Returns an Array of User object
|
|
128
|
+
response = request_with_auth(:GET, "/user_list")
|
|
129
|
+
#puts response.body
|
|
130
|
+
make_response(response) do |doc, res|
|
|
131
|
+
doc.elements.collect('user-list-response/user') do |elm|
|
|
132
|
+
User.create_from_element(elm)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def change_password(new_password)
|
|
138
|
+
response = request_with_auth(:POST, '/change_password', :newPassword => new_password)
|
|
139
|
+
make_response(response)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def get_command(session_url)
|
|
143
|
+
# Returns a Command object which contains a URL to create or join the session
|
|
144
|
+
take_action(GetCommand)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def rooms(params={})
|
|
148
|
+
response = request_with_auth(:GET, '/rooms', params)
|
|
149
|
+
make_response(response) do |doc, res|
|
|
150
|
+
doc.elements.collect('*/room') do |elm|
|
|
151
|
+
Room.create_from_room_element(elm)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def create_room(params)
|
|
157
|
+
required_params params, :name, :description
|
|
158
|
+
response = request_with_auth(:POST, '/create_room', params)
|
|
159
|
+
make_response(response) do |doc, res|
|
|
160
|
+
Room.create_from_room_element(doc.root.elements['room'])
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def delete_room(rid)
|
|
165
|
+
response = request_with_auth(:GET, "/delete_room?rid=%s" % rid.to_s)
|
|
166
|
+
make_response(response)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def groups(params={})
|
|
170
|
+
response = request_with_auth(:GET, '/groups', params)
|
|
171
|
+
make_response(response) do |doc, res|
|
|
172
|
+
doc.elements.map('*/group') do |elm|
|
|
173
|
+
res.groups << Group.create_from_element(elm)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def update_user_info(params)
|
|
179
|
+
#take_action(UpdateUserInfo, params)
|
|
180
|
+
res = request_with_auth(:GET, '/update_user_info', params)
|
|
181
|
+
return ApiResponse.new(res)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def command_file(params)
|
|
185
|
+
required_params params, :rid
|
|
186
|
+
auth = CGI.escape(Mieruka.auth_header(@token, @params[:private_key]))
|
|
187
|
+
return "http://#{@params[:host]}#{@params[:base_path]}/command.mkd?rid=#{params[:rid]}&auth=#{auth}"
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def create_group(params)
|
|
191
|
+
required_params params, :groupName, :groupDescription, :groupAdminName, :groupAdminPassword, :mailAddress
|
|
192
|
+
res = request_with_auth(:POST, '/create_group', params)
|
|
193
|
+
return ApiResponse.new(res)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def create_group_member(params)
|
|
197
|
+
required_params params, :newUserName, :newUserPassword, :nickname, :groupName, :groupAdminName, :groupAdminPassword
|
|
198
|
+
res = request_with_auth(:POST, '/create_group_member', params)
|
|
199
|
+
return ApiResponse.new(res)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def delete_group_member(params)
|
|
203
|
+
required_params params, :userName, :groupName, :groupAdminName, :groupAdminPassword
|
|
204
|
+
res = request_with_auth(:POST, '/delete_group_member', params)
|
|
205
|
+
ApiResponse.new(res)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def set_pap_layout(layout)
|
|
209
|
+
response = request_with_auth(:POST, '/set_pap_layout', :layout => layout)
|
|
210
|
+
puts response.code
|
|
211
|
+
make_response(response)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def get_license_usage
|
|
215
|
+
response = request_with_auth(:GET, '/get_license_usage')
|
|
216
|
+
make_response(response) do |doc, res|
|
|
217
|
+
class << res
|
|
218
|
+
attr_accessor :group, :max, :used
|
|
219
|
+
end
|
|
220
|
+
res.group = CGI.unescape(doc.root.elements['group'].get_text.to_s)
|
|
221
|
+
res.max = doc.root.elements['max'].get_text.to_s.to_i
|
|
222
|
+
res.used = doc.root.elements['used'].get_text.to_s.to_i
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def set_number_of_licenses(val)
|
|
227
|
+
response = request_with_auth(:GET, "/set_number_of_licenses?value=#{val}")
|
|
228
|
+
make_response(response)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Private Methods
|
|
233
|
+
#
|
|
234
|
+
|
|
235
|
+
private
|
|
236
|
+
|
|
237
|
+
def make_response(http_response, &block)
|
|
238
|
+
if http_response.message == 'OK'
|
|
239
|
+
res = ApiResponse.new(http_response)
|
|
240
|
+
if res.ok?
|
|
241
|
+
if block
|
|
242
|
+
block.call(res.doc, res)
|
|
243
|
+
end
|
|
244
|
+
else
|
|
245
|
+
raise ApiError.new(res)
|
|
246
|
+
end
|
|
247
|
+
else
|
|
248
|
+
raise http_response.message
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def request_with_auth(method, path, params={})
|
|
253
|
+
http = Net::HTTP.start(@params[:host], @params[:port])
|
|
254
|
+
req = nil
|
|
255
|
+
real_path = @params[:base_path] + path
|
|
256
|
+
#params[:auth] = Mieruka.auth_header(@token, @params[:private_key])
|
|
257
|
+
case method
|
|
258
|
+
when :GET
|
|
259
|
+
req = Mieruka::make_get_request(real_path, params)
|
|
260
|
+
when :POST
|
|
261
|
+
req = Mieruka::make_post_request(real_path, params)
|
|
262
|
+
else
|
|
263
|
+
raise 'Invalid method: ' + method
|
|
264
|
+
end
|
|
265
|
+
req['Authorization'] = Mieruka.auth_header(@token, @params[:private_key])
|
|
266
|
+
http.request(req)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
#
|
|
270
|
+
# Helper Methods
|
|
271
|
+
#
|
|
272
|
+
|
|
273
|
+
def self.make_get_request(path, params={})
|
|
274
|
+
query_params = Mieruka.make_params_string(params)
|
|
275
|
+
path += '?' + query_params if query_params.length > 0
|
|
276
|
+
return Net::HTTP::Get.new(path)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def self.make_post_request(path, params)
|
|
280
|
+
req = Net::HTTP::Post.new(path)
|
|
281
|
+
req.body = Mieruka.make_params_string(params)
|
|
282
|
+
req.content_type = 'application/x-www-form-urlencoded'
|
|
283
|
+
return req
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def self.make_params_string(params)
|
|
287
|
+
qparam = params.map do |k,v|
|
|
288
|
+
if v.class == Array
|
|
289
|
+
v.map{|e| Mieruka.make_param_string(k, e)}.join('&')
|
|
290
|
+
else
|
|
291
|
+
Mieruka.make_param_string(k, v)
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
return qparam.join('&')
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def self.make_param_string(name, value)
|
|
298
|
+
CGI.escape(name.to_s) + '=' + CGI.escape(value.to_s)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
#
|
|
302
|
+
# Authentication Utils
|
|
303
|
+
#
|
|
304
|
+
|
|
305
|
+
def self.auth_header(token, private_key)
|
|
306
|
+
timestamp = Time.now.to_i.to_s
|
|
307
|
+
nonce = generate_nonce()
|
|
308
|
+
sig = Digest::MD5.hexdigest(private_key + timestamp + nonce)
|
|
309
|
+
"SobaAuth token=\"#{token}\" timestamp=\"#{timestamp}\" nonce=\"#{nonce}\" sig=\"#{sig}\" sigalg=\"SOBA-1\""
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def self.generate_nonce
|
|
313
|
+
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
|
314
|
+
ret = []
|
|
315
|
+
16.times { ret << charset[rand(charset.length)].chr }
|
|
316
|
+
ret.join
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def required_params(params, *keys)
|
|
320
|
+
missings = []
|
|
321
|
+
keys.each do |key|
|
|
322
|
+
missings << key unless params.has_key?(key)
|
|
323
|
+
end
|
|
324
|
+
raise "Missing parameters: " + missings.join(',') if missings.size > 0
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'rexml/document'
|
|
2
|
+
require 'cgi'
|
|
3
|
+
|
|
4
|
+
module Soba
|
|
5
|
+
class Mieruka
|
|
6
|
+
|
|
7
|
+
class Group
|
|
8
|
+
def initialize(params)
|
|
9
|
+
@name = params['name']
|
|
10
|
+
@description = params['description']
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :name, :description
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
"{name:%s, desc:%s}" % [@name, @description]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.create_from_element(elm)
|
|
20
|
+
return Group.new(parse_group_elm(elm))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
ATTRS = ['name', 'description']
|
|
26
|
+
|
|
27
|
+
def self.parse_group_elm(elm)
|
|
28
|
+
params = {}
|
|
29
|
+
ATTRS.each do |a|
|
|
30
|
+
begin
|
|
31
|
+
params[a] = CGI.unescapeHTML(elm.elements[a].get_text.to_s)
|
|
32
|
+
rescue
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
params
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
class Soba::Mieruka
|
|
2
|
+
|
|
3
|
+
class Response
|
|
4
|
+
OK = 'OK'
|
|
5
|
+
NG = 'NG'
|
|
6
|
+
|
|
7
|
+
def self.parse(res_body)
|
|
8
|
+
doc = REXML::Document.new(res_body)
|
|
9
|
+
if doc.root.attributes['result'] == 'OK'
|
|
10
|
+
return Response.new(OK, doc)
|
|
11
|
+
else
|
|
12
|
+
errorElm = doc.root.elements['error']
|
|
13
|
+
res = Response.new(NG, nil)
|
|
14
|
+
res.error_code = errorElm.attributes['code']
|
|
15
|
+
res.error_message = CGI.unescapeHTML(errorElm.attributes['message'])
|
|
16
|
+
return res
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
attr_accessor :error_code, :error_message
|
|
21
|
+
|
|
22
|
+
def initialize(result, value, message=nil)
|
|
23
|
+
@result = result
|
|
24
|
+
@value = value
|
|
25
|
+
@message = message
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def success?
|
|
29
|
+
@result != NG
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
attr_reader :value, :message
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'rexml/document'
|
|
2
|
+
require 'cgi'
|
|
3
|
+
|
|
4
|
+
module Soba
|
|
5
|
+
class Mieruka
|
|
6
|
+
|
|
7
|
+
class Room
|
|
8
|
+
def initialize(params)
|
|
9
|
+
@id = params['id']
|
|
10
|
+
@name = params['name']
|
|
11
|
+
@description = params['description']
|
|
12
|
+
@owner = params['owner']
|
|
13
|
+
@created_time = Time.at(params['created-time'].to_i / 1000)
|
|
14
|
+
#@deleted_time = params['deleted-time']
|
|
15
|
+
@group = params['group']
|
|
16
|
+
@url = params['url']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :id, :name, :description, :owner, :created_time, :group, :url
|
|
20
|
+
|
|
21
|
+
def to_s
|
|
22
|
+
"{id:%d, name:%s, desc:%s, owner:%s, created-time:%s, url:%s}" % [@id, @name, @description, @owner, @created_time, @url]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.create(http_res)
|
|
26
|
+
#Room.elm_to_room(elm_room)
|
|
27
|
+
self.create_from_xml(http_res.body)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.create_from_xml(xml)
|
|
31
|
+
doc = REXML::Document.new(xml)
|
|
32
|
+
ret = []
|
|
33
|
+
doc.elements.each('*/room') do |e|
|
|
34
|
+
ret << Room.elm_to_room(e)
|
|
35
|
+
end
|
|
36
|
+
ret
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.create_from_room_element(elm)
|
|
40
|
+
return Room.new(parse_room_elm(elm))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def self.elm_to_room(elm)
|
|
46
|
+
Room.new(parse_room_elm(elm))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
ATTRS = ['id', 'name', 'description', 'owner', 'created-time', 'group', 'url']
|
|
50
|
+
|
|
51
|
+
def self.parse_room_elm(elm)
|
|
52
|
+
params = {}
|
|
53
|
+
ATTRS.each do |a|
|
|
54
|
+
begin
|
|
55
|
+
params[a] = CGI.unescapeHTML(elm.elements[a].get_text.to_s)
|
|
56
|
+
rescue
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
params
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'rexml/document'
|
|
2
|
+
require 'cgi'
|
|
3
|
+
|
|
4
|
+
module Soba
|
|
5
|
+
class Mieruka
|
|
6
|
+
|
|
7
|
+
class Session
|
|
8
|
+
def initialize(params)
|
|
9
|
+
@id = params['id']
|
|
10
|
+
@title = params['title']
|
|
11
|
+
@description = params['description']
|
|
12
|
+
@creator_id = params['creator-id']
|
|
13
|
+
@created_time = params['created-time']
|
|
14
|
+
@deleted_time = params['deleted-time']
|
|
15
|
+
@soba_session_id = params['soba-session-id']
|
|
16
|
+
@scope = params['scope']
|
|
17
|
+
@participants = params['participants']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
attr_reader :id, :title, :description, :creator_id, :created_time, :deleted_time, :soba_session_id, :scope
|
|
21
|
+
|
|
22
|
+
def self.create(http_res)
|
|
23
|
+
doc = REXML::Document.new(http_res.body)
|
|
24
|
+
ret = []
|
|
25
|
+
doc.elements.each('session-list-response/session-list/session') do |elm|
|
|
26
|
+
ret << Session.elm_to_session(elm)
|
|
27
|
+
end
|
|
28
|
+
ret
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.create_from_session_element(elm)
|
|
32
|
+
return Session.new(parse_session_elm(elm))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def self.elm_to_session(elm)
|
|
39
|
+
Session.new(parse_session_elm(elm))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
ATTRS = ['id', 'title', 'description', 'creator-id', 'created-time', 'deleted-time', 'soba-session-id', 'scope']
|
|
43
|
+
|
|
44
|
+
def self.parse_session_elm(elm)
|
|
45
|
+
params = {}
|
|
46
|
+
ATTRS.each do |a|
|
|
47
|
+
begin
|
|
48
|
+
params[a] = CGI.unescapeHTML(elm.elements[a].get_text.to_s )
|
|
49
|
+
rescue
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
params['participants'] = []
|
|
53
|
+
elm.elements.each('participants/participant') do |partElm|
|
|
54
|
+
params['participants'] << partElm.get_text.to_s
|
|
55
|
+
end
|
|
56
|
+
params
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'rexml/document'
|
|
2
|
+
|
|
3
|
+
module Soba
|
|
4
|
+
class Mieruka
|
|
5
|
+
|
|
6
|
+
class User
|
|
7
|
+
def initialize(params)
|
|
8
|
+
@name = params['name']
|
|
9
|
+
@id = params['id']
|
|
10
|
+
@mail = params['mail']
|
|
11
|
+
@groups = params['groups']
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_accessor :id, :name, :mail, :groups
|
|
15
|
+
|
|
16
|
+
def self.create(http_res)
|
|
17
|
+
doc = REXML::Document.new(http_res.body)
|
|
18
|
+
ret = []
|
|
19
|
+
doc.elements.each('user-list-response/user') do |elm|
|
|
20
|
+
ret << User.create_from_element(elm)
|
|
21
|
+
end
|
|
22
|
+
ret
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.create_from_element(elm)
|
|
26
|
+
return User.new(parse_user_elm(elm))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_s
|
|
30
|
+
"{name=#{@name}, mail=#{@mail}, id=#{@id}, groups=#{@groups.join(',')}}"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
ATTRS = ['id', 'name', 'mail', 'groups']
|
|
36
|
+
|
|
37
|
+
def self.parse_user_elm(elm)
|
|
38
|
+
params = {}
|
|
39
|
+
ATTRS.each do |a|
|
|
40
|
+
if a == 'groups'
|
|
41
|
+
params['groups'] = elm.get_elements('groups/group').map{|e| e.get_text.to_s}
|
|
42
|
+
else
|
|
43
|
+
params[a] = elm.elements[a].get_text.to_s
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
params
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "soba/mieruka/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "soba-mieruka"
|
|
7
|
+
s.version = Soba::Mieruka::VERSION
|
|
8
|
+
s.authors = ["Takuji Shimokawa"]
|
|
9
|
+
s.email = ["takuji.shimokawa@gmail.com"]
|
|
10
|
+
s.homepage = "http://web-api.soba-project.com"
|
|
11
|
+
s.summary = %q{SOBA mieruka Web API's client library}
|
|
12
|
+
s.description = %q{This library is for developing web sites which publish command files to create new sessions or to join them for SOBA mieruka Client application.}
|
|
13
|
+
s.rubyforge_project = "soba-mieruka"
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n").delete_if{|e| e =~ /^spec\//}
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
# specify any dependencies here; for example:
|
|
21
|
+
# s.add_development_dependency "rspec"
|
|
22
|
+
# s.add_runtime_dependency "rest-client"
|
|
23
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require_relative '../lib/soba/mieruka'
|
|
2
|
+
|
|
3
|
+
CONFIG = {
|
|
4
|
+
:api_key => 'your api key',
|
|
5
|
+
:private_key => 'your private key',
|
|
6
|
+
#:version => '1.4'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
ACCOUNT = {
|
|
10
|
+
:user_name => 'you soba mieruka account',
|
|
11
|
+
:password => 'your password'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def gen_str(len)
|
|
15
|
+
a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
|
|
16
|
+
Array.new(len){a[rand(a.size)]}.join
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe Soba::Mieruka do
|
|
20
|
+
before do
|
|
21
|
+
@m = Soba::Mieruka.new(CONFIG)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def valid_account
|
|
25
|
+
ACCOUNT
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'can log in with valid attributes.' do
|
|
29
|
+
expect {
|
|
30
|
+
@m.login(valid_account)
|
|
31
|
+
@m.logout
|
|
32
|
+
}.should_not raise_error
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'is logged in' do
|
|
36
|
+
before do
|
|
37
|
+
expect {
|
|
38
|
+
@m.login(valid_account)
|
|
39
|
+
}.should_not raise_error
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'make a new session' do
|
|
43
|
+
expect {
|
|
44
|
+
session = @m.create_session(:session_name => 'test', :session_description => 'this is a test')
|
|
45
|
+
session.should respond_to(:url)
|
|
46
|
+
session.should respond_to(:soba_session_id)
|
|
47
|
+
}.should_not raise_error
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'get the session list' do
|
|
51
|
+
expect {
|
|
52
|
+
sessions = @m.sessions
|
|
53
|
+
sessions.should be_a(Array)
|
|
54
|
+
sessions.each do |session|
|
|
55
|
+
session.should be_a(Soba::Mieruka::Session)
|
|
56
|
+
session.should respond_to(:id)
|
|
57
|
+
session.should respond_to(:title)
|
|
58
|
+
session.should respond_to(:description)
|
|
59
|
+
session.should respond_to(:creator_id)
|
|
60
|
+
session.should respond_to(:created_time)
|
|
61
|
+
session.should respond_to(:deleted_time)
|
|
62
|
+
session.should respond_to(:soba_session_id)
|
|
63
|
+
session.should respond_to(:scope)
|
|
64
|
+
session.should respond_to(:participants)
|
|
65
|
+
end
|
|
66
|
+
}.should_not raise_error
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'can get users list' do
|
|
70
|
+
expect {
|
|
71
|
+
users = @m.users
|
|
72
|
+
users.should be_a(Array)
|
|
73
|
+
users.each do |user|
|
|
74
|
+
user.should be_a(Soba::Mieruka::User)
|
|
75
|
+
end
|
|
76
|
+
}.should_not raise_error
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context 'and some sessions exist' do
|
|
80
|
+
before do
|
|
81
|
+
@sessions = @m.sessions
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'can join the session' do
|
|
85
|
+
pending('No sessions exist!') if @sessions.empty?
|
|
86
|
+
@session = @sessions[0]
|
|
87
|
+
res = @m.join_session(:session_id => @session.id)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'can get rooms' do
|
|
92
|
+
rooms = @m.rooms
|
|
93
|
+
rooms.should be_a(Array)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'can create and delete a room' do
|
|
97
|
+
rooms = @m.rooms
|
|
98
|
+
rooms.class.should == Array
|
|
99
|
+
n = rooms.size
|
|
100
|
+
|
|
101
|
+
name = 'room_' + gen_str(10)
|
|
102
|
+
room = @m.create_room(:name => name, :description => 'test room')
|
|
103
|
+
room.name.should == name
|
|
104
|
+
room.description.should == 'test room'
|
|
105
|
+
rooms = @m.rooms
|
|
106
|
+
rooms.size.should == (n + 1)
|
|
107
|
+
|
|
108
|
+
expect {
|
|
109
|
+
@m.delete_room(room.id)
|
|
110
|
+
}.should_not raise_error
|
|
111
|
+
@m.rooms.size.should == n
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'can change its own password' do
|
|
115
|
+
old_password = valid_account[:password]
|
|
116
|
+
new_password = gen_str(16)
|
|
117
|
+
expect {
|
|
118
|
+
@m.change_password(new_password)
|
|
119
|
+
@m.login(valid_account.merge(:password => new_password))
|
|
120
|
+
@m.change_password(old_password)
|
|
121
|
+
}.should_not raise_error
|
|
122
|
+
expect {
|
|
123
|
+
@m.login(valid_account.merge(:password => new_password))
|
|
124
|
+
}.should raise_error
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: soba-mieruka
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.2
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Takuji Shimokawa
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2011-12-15 00:00:00.000000000Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: This library is for developing web sites which publish command files
|
|
15
|
+
to create new sessions or to join them for SOBA mieruka Client application.
|
|
16
|
+
email:
|
|
17
|
+
- takuji.shimokawa@gmail.com
|
|
18
|
+
executables: []
|
|
19
|
+
extensions: []
|
|
20
|
+
extra_rdoc_files: []
|
|
21
|
+
files:
|
|
22
|
+
- .gitignore
|
|
23
|
+
- .rspec
|
|
24
|
+
- Gemfile
|
|
25
|
+
- Rakefile
|
|
26
|
+
- lib/soba/mieruka.rb
|
|
27
|
+
- lib/soba/mieruka/group.rb
|
|
28
|
+
- lib/soba/mieruka/response.rb
|
|
29
|
+
- lib/soba/mieruka/room.rb
|
|
30
|
+
- lib/soba/mieruka/session.rb
|
|
31
|
+
- lib/soba/mieruka/user.rb
|
|
32
|
+
- lib/soba/mieruka/version.rb
|
|
33
|
+
- soba-mieruka.gemspec
|
|
34
|
+
- spec/mieruka_spec.rb
|
|
35
|
+
homepage: http://web-api.soba-project.com
|
|
36
|
+
licenses: []
|
|
37
|
+
post_install_message:
|
|
38
|
+
rdoc_options: []
|
|
39
|
+
require_paths:
|
|
40
|
+
- lib
|
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
42
|
+
none: false
|
|
43
|
+
requirements:
|
|
44
|
+
- - ! '>='
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
|
+
none: false
|
|
49
|
+
requirements:
|
|
50
|
+
- - ! '>='
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '0'
|
|
53
|
+
requirements: []
|
|
54
|
+
rubyforge_project: soba-mieruka
|
|
55
|
+
rubygems_version: 1.8.10
|
|
56
|
+
signing_key:
|
|
57
|
+
specification_version: 3
|
|
58
|
+
summary: SOBA mieruka Web API's client library
|
|
59
|
+
test_files:
|
|
60
|
+
- spec/mieruka_spec.rb
|
|
61
|
+
has_rdoc:
|