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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format d
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in soba-mieruka.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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,5 @@
1
+ module Soba
2
+ class Mieruka
3
+ VERSION = "0.0.2"
4
+ end
5
+ 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: