telesocial 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/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in telesocial.gemspec
4
+ gemspec
data/README.markdown ADDED
@@ -0,0 +1,41 @@
1
+ Telesocial API Ruby gem
2
+ =======================
3
+
4
+ Telesocial's free calling API enables mobile calling in social networks.
5
+ This is a Ruby interface to [Telesocial API](http://sites.telesocial.com/docs/home).
6
+
7
+ Installation
8
+ ------------
9
+
10
+ gem install telesocial
11
+
12
+ Usage - Examples
13
+ ----------------
14
+ ```ruby
15
+ require 'telesocial'
16
+ client = Telesocial::Client.new('your_api_key') # Now, all telesocial methods are available to your client
17
+
18
+ # Method calls on the client returns a simple object that matches
19
+ # Telesocial's API response object.
20
+
21
+ # Register a user with username "eric" and phone number: 4054441212
22
+ response = client.register("eric", "4054441212")
23
+ puts response.status # => 201
24
+ puts response.uri # => "/api/rest/registrant/eric"
25
+
26
+ # Check a user's registration status
27
+ response = begin
28
+ client.get_registration_status('eric')
29
+ rescue Telesocial::NotFound
30
+ # Registration not found;
31
+ else
32
+ # Other errors
33
+ end
34
+
35
+ # Upload a file to be played to a registered user
36
+ media_id = client.create_media.mediaId
37
+ upload_request_grant_id = client.request_upload_grant(media_id)
38
+
39
+ uploaded_file_url = client.upload_file(upload_request_grant_id, "my_file_path.mp3")
40
+
41
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,346 @@
1
+ require 'httparty'
2
+ require 'hashie'
3
+ require 'net/http/post/multipart'
4
+ require 'mime/types'
5
+
6
+ module Telesocial
7
+ class Client
8
+ include HTTParty
9
+ base_uri 'https://api4.bitmouth.com'
10
+ disable_rails_query_string_format
11
+
12
+ class ResponseParser < HTTParty::Parser
13
+ def parse
14
+ begin
15
+ Hashie::Mash.new(Crack::JSON.parse(body).values.first)
16
+ rescue
17
+ body
18
+ end
19
+ end
20
+ end
21
+ parser ResponseParser
22
+
23
+ attr_reader :api_key
24
+
25
+ def initialize(api_key)
26
+ @api_key = api_key
27
+ end
28
+
29
+ def get_registration_status(network_id, query = "exists")
30
+
31
+ response = post("/api/rest/registrant/#{network_id}", :body => {:query => query, :appkey => @api_key})
32
+
33
+ case response.status
34
+ when 200
35
+ response.registered = true
36
+ when 401
37
+ raise Telesocial::Unauthorized.new("The network ID exists but it is not associated with the specified application", response)
38
+ when 404
39
+ raise Telesocial::NotFound.new("The device is not registered.", response)
40
+ else
41
+ raise Telesocial::Error.new(response.message, response)
42
+ end
43
+
44
+ return response
45
+ end
46
+
47
+ def register(network_id, phone, greeting_id = nil)
48
+ response = post("/api/rest/registrant/", :body => {:networkid => network_id, :phone => phone, :appkey => @api_key, :greetingid => greeting_id})
49
+
50
+ case response.status
51
+ when 201
52
+ when 400
53
+ raise Telesocial::BadRequest.new("One or more parameters were invalid or this (phone, networkid) pair is already registered.", response)
54
+ when 502
55
+ raise Telesocial::BadGateway.new("Unable to start the phone authorization process.", response)
56
+ else
57
+ raise Telesocial::Error.new(response.message, response)
58
+ end
59
+
60
+ response
61
+ end
62
+
63
+ def create_media()
64
+ response = post("/api/rest/media/", :body => {:appkey => @api_key})
65
+
66
+ case response.status
67
+ when 201
68
+ when 400
69
+ raise Telesocial::BadRequest.new("Missing parameter(s)", response)
70
+ when 404
71
+ raise Telesocial::NotFound.new("The application key is invalid.", response)
72
+ end
73
+
74
+ response
75
+ end
76
+
77
+ def record(network_id, media_id)
78
+ response = post("/api/rest/media/#{media_id}",:body => {:networkid => network_id, :appkey => @api_key, :action => "record"})
79
+
80
+ case response.status
81
+ when 201
82
+ when 400
83
+ raise Telesocial::BadRequest.new("Missing parameter(s).", response)
84
+ when 404
85
+ raise Telesocial::NotFound.new("The application key is invalid or the application is not associated with the networkid.", response)
86
+ when 502
87
+ raise Telesocial::BadGateway.new("Unable to initiate phone call at this time.", response)
88
+ end
89
+
90
+ response
91
+
92
+ end
93
+
94
+ def blast(network_id, media_id)
95
+ response = post("/api/rest/media/#{media_id}",:body => {:networkid => network_id, :appkey => @api_key, :action => "blast"})
96
+
97
+ case response.status
98
+ when 200,201,202
99
+ when 400
100
+ raise Telesocial::BadRequest.new("Missing parameter(s).", response)
101
+ when 404
102
+ raise Telesocial::NotFound.new("The application key is invalid or the application is not associated with the networkid.", response)
103
+ when 502
104
+ raise Telesocial::BadGateway.new("Unable to initiate phone call at this time.", response)
105
+ end
106
+
107
+ response
108
+ end
109
+
110
+ def request_upload_grant(media_id)
111
+ response = post("/api/rest/media/#{media_id}",:body => {:appkey => @api_key, :action => "upload_grant"})
112
+
113
+ case response.status
114
+ when 201,202
115
+ when 400
116
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
117
+ when 401
118
+ raise Telesocial::Unauthorized.new("The media ID is invalid or is not associated with the application identified by the appkey parameter.", response)
119
+ end
120
+
121
+ response
122
+ end
123
+
124
+ def media_status(media_id)
125
+ response = get("/api/rest/media/status/#{media_id}", :query => {:appkey => @api_key})
126
+
127
+ case response.status
128
+ when 200,201,202
129
+ when 204
130
+ raise Telesocial::NoContent.new("No media content exists for this Media ID.", response)
131
+ when 404
132
+ raise Telesocial::NotFound.new("The application key or networkid are invalid.", response)
133
+ end
134
+
135
+ response
136
+ end
137
+
138
+ def remove_media(media_id)
139
+ response = delete("/api/rest/media/#{media_id}",:body => {:appkey => @api_key, :action => "remove"})
140
+
141
+ case response.status
142
+ when 200
143
+ when 400
144
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
145
+ when 401
146
+ raise Telesocial::Unauthorized.new("The content associated with the media ID cannot be removed.", response)
147
+ when 404
148
+ raise Telesocial::NotFound.new("The media ID is invalid.", response)
149
+ end
150
+
151
+ response
152
+ end
153
+
154
+ def create_conference(network_id, recording_id = nil, greeting_id = nil)
155
+
156
+ options = {}
157
+ options[:recordingid] = recording_id if recording_id
158
+ options[:greetingid] = greeting_id if greeting_id
159
+
160
+ response = post("/api/rest/conference/", :body => {:networkid => args, :appkey => @api_key}.merge(options))
161
+
162
+ case response.status
163
+ when 201
164
+ when 502
165
+ raise Telesocial::BadGateway.new("The request cannot be fulfilled at this time.", response)
166
+ else
167
+ raise Telesocial::Error.new("The request cannot be fulfilled at this time.", response)
168
+ end
169
+
170
+ response
171
+
172
+ end
173
+
174
+ def add_to_conference(conference_id, network_id)
175
+ response = post("/api/rest/conference/#{conference_id}", :body => {:networkid => network_id, :appkey => @api_key, :action => 'add'})
176
+
177
+ case response.status
178
+ when 200
179
+ when 400
180
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
181
+ when 502
182
+ raise Telesocial::BadGateway.new("Unable to initiate phone(s) call at this time.", response)
183
+ end
184
+
185
+ response
186
+
187
+ end
188
+
189
+ def close_conference(conference_id)
190
+ response = post("/api/rest/conference//#{conference_id}", :body => {:appkey => @api_key, :action => 'close'})
191
+
192
+ case response.status
193
+ when 200
194
+ when 400
195
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
196
+ when 404
197
+ raise Telesocial::NotFound.new("The conference ID is invalid.", response)
198
+ when 502
199
+ raise Telesocial::BadGateway.new("Unable to terminate conference calls.", response)
200
+ end
201
+
202
+ response
203
+ end
204
+
205
+ def hangup_call(conference_id, network_id)
206
+ response = post("/api/rest/conference/#{conference_id}/#{network_id}", :body => {:appkey => @api_key, :action => 'hangup'})
207
+
208
+ case response.status
209
+ when 200
210
+ when 400
211
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
212
+ when 401
213
+ raise Telesocial::Unauthorized.new("The specified network ID is not associated with the application identified by the application key.", response)
214
+ when 404
215
+ raise Telesocial::NotFound.new("The conference ID is invalid.", response)
216
+ when 502
217
+ raise Telesocial::BadGateway.new("Unable to terminate call at this time.", response)
218
+ end
219
+
220
+ response
221
+ end
222
+
223
+ def move_call(from_conference_id, to_conference_id, network_id)
224
+ response = post("/api/rest/conference/#{from_conference_id}/#{network_id}", :body => {:appkey => @api_key, :toconferenceid => to_conference_id, :action => 'move'})
225
+
226
+ case response.status
227
+ when 200
228
+ when 400
229
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
230
+ when 401
231
+ raise Telesocial::Unauthorized.new("The specified network ID is not associated with the application identified by the application key.", response)
232
+ when 502
233
+ raise Telesocial::BadGateway.new("Unable to move call.", response)
234
+ end
235
+
236
+ response
237
+ end
238
+
239
+ def mute(conference_id, network_id)
240
+ response = post("/api/rest/conference/#{conference_id}/#{network_id}", :body => {:app_key => @api_key, :action => "mute"})
241
+
242
+ case response.status
243
+ when 200
244
+ when 400
245
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
246
+ when 401
247
+ raise Telesocial::Unauthorized.new("One or more of the specified network IDs is not associated with the application identified by the application key.", response)
248
+ when 502
249
+ raise Telesocial::BadGateway.new("Unable to mute call(s).", response)
250
+ end
251
+
252
+ response
253
+ end
254
+
255
+ def unmute(conference_id, network_id)
256
+ response = self.class.post("/api/rest/conference/#{conference_id}/#{network_id}", :body => {:app_key => @api_key, :action => "unmute"})
257
+
258
+ case response.status
259
+ when 200
260
+ when 400
261
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", response)
262
+ when 401
263
+ raise Telesocial::Unauthorized.new("One or more of the specified network IDs is not associated with the application identified by the application key.", response)
264
+ when 502
265
+ raise Telesocial::BadGateway.new("Unable to unmute call(s).", response)
266
+ end
267
+
268
+ response
269
+ end
270
+
271
+ def get_version
272
+ response = self.class.get("/api/rest/version").parsed_response
273
+ end
274
+
275
+ def upload_file(upload_grant_id, file_path)
276
+ uri = URI.parse(self.class.base_uri)
277
+ req = Net::HTTP::Post::Multipart.new "/forklift/", {"grant" => upload_grant_id, "mediafile" => UploadIO.new(file_path, mime_for(file_path))}
278
+ http = Net::HTTP.new(uri.host, uri.port)
279
+ if (uri.scheme == "https")
280
+ http.use_ssl = true
281
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
282
+ end
283
+ res = http.request(req)
284
+
285
+ case res
286
+ when Net::HTTPSuccess
287
+ when Net::HTTPBadRequest
288
+ raise Telesocial::BadRequest.new("Missing or invalid parameter(s).", res)
289
+ when Net::HTTPNotFound
290
+ raise Telesocial::NotFound.new("The grant code is invalid.", res)
291
+ when Net::HTTPRequestEntityTooLarge
292
+ raise Telesocial::RequestEntityTooLarge.new("The file is larger than the allowed limit.", res)
293
+ when Net::HTTPUnsupportedMediaType
294
+ raise Telesocial::UnsupportedMediaTpe.new("The file is not an MP3 file. Only MP3 files may be uploaded at this time.", res)
295
+ end
296
+
297
+ res.body
298
+
299
+ end
300
+
301
+ # Handling for general errors
302
+ private
303
+ def post(url, options = {})
304
+ response = self.class.post(url, :query => options[:query], :body => options[:body])
305
+ parsed_response = response.parsed_response
306
+
307
+ case response.code
308
+ when 500
309
+ raise Telesocial::Error.new("Internal Server Error", response)
310
+ end
311
+
312
+ parsed_response
313
+ end
314
+
315
+ def get(url, options = {})
316
+ response = self.class.get(url, :query => options[:query])
317
+ parsed_response = response.parsed_response
318
+
319
+ case response.code
320
+ when 500
321
+ raise Telesocial::Error.new("Internal Server Error", response)
322
+ end
323
+
324
+ parsed_response
325
+ end
326
+
327
+ def delete(url, options = {})
328
+ response = self.class.delete(url, :query => options[:query], :body => options[:body])
329
+ parsed_response = response.parsed_response
330
+
331
+ case response.code
332
+ when 500
333
+ raise Telesocial::Error.new("Internal Server Error", response)
334
+ end
335
+
336
+ parsed_response
337
+ end
338
+
339
+ def mime_for(path)
340
+ mime = MIME::Types.type_for path
341
+ mime.empty? ? 'text/plain' : mime[0].content_type
342
+ end
343
+
344
+ end
345
+ end
346
+
@@ -0,0 +1,23 @@
1
+ module Telesocial
2
+ class Error < StandardError
3
+ attr_reader :response
4
+
5
+ def initialize(message, response)
6
+ @response = response
7
+ super(info(message, response))
8
+ end
9
+
10
+ def info(text = '', env = Hashie::Mash.new)
11
+ "#{text} - (server message: #{env.message})"
12
+ end
13
+ end
14
+
15
+ class NotFound < Error; end;
16
+ class Unauthorized < Error; end;
17
+ class BadRequest < Error; end;
18
+ class BadGateway < Error; end;
19
+ class RequestEntityTooLarge < Error; end;
20
+ class UnsupportedMediaTpe < Error; end;
21
+
22
+ end
23
+
@@ -0,0 +1,3 @@
1
+ module Telesocial
2
+ VERSION = "0.0.2"
3
+ end
data/lib/telesocial.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'telesocial/version'
2
+ require 'telesocial/client'
3
+ require 'telesocial/errors'
4
+
5
+ module Telesocial;end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "telesocial/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "telesocial"
7
+ s.version = Telesocial::VERSION
8
+ s.authors = ["Selem Delul"]
9
+ s.email = ["selem@selem.im"]
10
+ s.homepage = ""
11
+ s.summary = %q{Ruby wrapper for Telesocial API}
12
+ s.description = %q{Ruby wrapper for Telesocial API}
13
+
14
+ s.rubyforge_project = "telesocial"
15
+
16
+ s.add_development_dependency "fakeweb"
17
+ s.add_development_dependency "rake"
18
+ s.add_development_dependency "redgreen"
19
+ s.add_development_dependency "rocco"
20
+ s.add_development_dependency "rr"
21
+
22
+ s.add_dependency "httparty"
23
+ s.add_dependency "hashie"
24
+ s.add_dependency "multipart-post"
25
+ s.add_dependency "mime-types"
26
+
27
+ s.files = `git ls-files`.split("\n")
28
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
29
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
30
+ s.require_paths = ["lib"]
31
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/telesocial')
3
+
4
+ class TelesocialClientTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @client = Telesocial::Client.new("f180804f-5eda-4e6b-8f4e-ecea52362396")
8
+ end
9
+
10
+ def test_check_existing_network_id
11
+ resp = @client.get_registration_status("necrodome")
12
+ assert 200 == resp.status
13
+ assert resp.registered?
14
+ end
15
+
16
+ def test_check_non_existing_network_id
17
+ assert_raise(Telesocial::NotFound) { @client.get_registration_status("erica_and_some_other_chars")}
18
+ end
19
+
20
+ # This test needs to improved due to the fact that
21
+ # registration requires phone call.
22
+ # def test_succesful_registration
23
+ # resp = @client.register("xxx", 1234567)
24
+ # assert 201, resp.status
25
+ # end
26
+
27
+ def test_create_media
28
+ resp = @client.create_media()
29
+ assert 201 == resp.status
30
+ assert resp.uri?
31
+ end
32
+
33
+ def test_request_upload_grant
34
+ resp = @client.request_upload_grant("123c5e5b40c54eb198d69d64e37ed182")
35
+ assert 201 == resp.status
36
+ end
37
+
38
+ end
@@ -0,0 +1,83 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/telesocial')
3
+
4
+ class TelesocialClientTest < Test::Unit::TestCase
5
+
6
+ def test_check_existing_network_id
7
+ resp = @client.get_registration_status("eric")
8
+ assert 200 == resp.status
9
+ assert resp.registered?
10
+ end
11
+
12
+ def test_check_non_existing_network_id
13
+ assert_raise(Telesocial::NotFound) { @client.get_registration_status("erica")}
14
+ end
15
+
16
+ def test_succesful_registration
17
+ resp = @client.register("xxx", 1234567)
18
+ assert 201 == resp.status
19
+ end
20
+
21
+ def test_create_media
22
+ resp = @client.create_media()
23
+ assert 201 == resp.status
24
+ assert resp.uri?
25
+ end
26
+
27
+ def test_request_upload_grant
28
+ resp = @client.request_upload_grant("123c5e5b40c54eb198d69d64e37ed182")
29
+ assert 201 == resp.status
30
+ assert resp.grantId == 5062406589092978092
31
+ assert resp.uri == "/api/rest/media/123c5e5b40c54eb198d69d64e37ed182/5062406589092978092"
32
+ end
33
+
34
+ def setup
35
+ @client = Telesocial::Client.new("key")
36
+
37
+ FakeWeb.allow_net_connect = false
38
+ FakeWeb.register_uri(
39
+ :post, "https://api4.bitmouth.com/api/rest/registrant/eric",
40
+ :content_type => "application/json; charset=utf-8",
41
+ :body => <<-JSON
42
+ {"RegistrantResponse":{"message":"","status":200}}
43
+ JSON
44
+ )
45
+
46
+ FakeWeb.register_uri(
47
+ :post, "https://api4.bitmouth.com/api/rest/registrant/erica",
48
+ :content_type => "application/json; charset=utf-8",
49
+ :body => <<-JSON
50
+ {"RegistrantResponse":{"message":"","status":404}}
51
+ JSON
52
+ )
53
+
54
+ FakeWeb.register_uri(
55
+ :post, "https://api4.bitmouth.com/api/rest/registrant/",
56
+ :data => {:name => "sdsd"},
57
+ :content_type => "application/json; charset=utf-8",
58
+ :body => <<-JSON
59
+ {"RegistrationResponse":{"message":"","status":201,"uri":"\/api\/rest\/registrant\/1000022816599"}}
60
+ JSON
61
+ )
62
+
63
+ FakeWeb.register_uri(
64
+ :post, "https://api4.bitmouth.com/api/rest/media/",
65
+ :content_type => "application/json; charset=utf-8",
66
+ :body => <<-JSON
67
+ {"MediaResponse":{"message":"","status":201,"downloadUrl":"","fileSize":0,"mediaId":"6e6a151be31b467f87225b18b0f36f00","uri":"\/api\/rest\/media\/6e6a151be31b467f87225b18b0f36f00"}}
68
+ JSON
69
+ )
70
+
71
+ FakeWeb.register_uri(
72
+ :post, "https://api4.bitmouth.com/api/rest/media/123c5e5b40c54eb198d69d64e37ed182",
73
+ :content_type => "application/json; charset=utf-8",
74
+ :body => <<-JSON
75
+ {"UploadResponse":{"message":"","status":201,"grantId":5062406589092978092,"uri":"\/api\/rest\/media\/123c5e5b40c54eb198d69d64e37ed182\/5062406589092978092"}}
76
+ JSON
77
+ )
78
+
79
+
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,14 @@
1
+ require 'test/unit'
2
+ require 'fakeweb'
3
+ require 'rr'
4
+
5
+ begin
6
+ require 'redgreen'
7
+ rescue LoadError
8
+ end
9
+
10
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
11
+
12
+ class Test::Unit::TestCase
13
+ include RR::Adapters::TestUnit
14
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telesocial
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Selem Delul
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-06 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fakeweb
16
+ requirement: &2151808920 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2151808920
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &2151807760 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2151807760
36
+ - !ruby/object:Gem::Dependency
37
+ name: redgreen
38
+ requirement: &2151806000 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2151806000
47
+ - !ruby/object:Gem::Dependency
48
+ name: rocco
49
+ requirement: &2151804620 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2151804620
58
+ - !ruby/object:Gem::Dependency
59
+ name: rr
60
+ requirement: &2151801600 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2151801600
69
+ - !ruby/object:Gem::Dependency
70
+ name: httparty
71
+ requirement: &2151797000 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *2151797000
80
+ - !ruby/object:Gem::Dependency
81
+ name: hashie
82
+ requirement: &2151843080 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *2151843080
91
+ - !ruby/object:Gem::Dependency
92
+ name: multipart-post
93
+ requirement: &2151846180 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *2151846180
102
+ - !ruby/object:Gem::Dependency
103
+ name: mime-types
104
+ requirement: &2151853180 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *2151853180
113
+ description: Ruby wrapper for Telesocial API
114
+ email:
115
+ - selem@selem.im
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - Gemfile
121
+ - README.markdown
122
+ - Rakefile
123
+ - lib/telesocial.rb
124
+ - lib/telesocial/client.rb
125
+ - lib/telesocial/errors.rb
126
+ - lib/telesocial/version.rb
127
+ - telesocial.gemspec
128
+ - test/telesocial_client_functional_test.rb
129
+ - test/telesocial_client_test.rb
130
+ - test/test_helper.rb
131
+ homepage: ''
132
+ licenses: []
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ segments:
144
+ - 0
145
+ hash: 1926186920278007827
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ segments:
153
+ - 0
154
+ hash: 1926186920278007827
155
+ requirements: []
156
+ rubyforge_project: telesocial
157
+ rubygems_version: 1.8.7
158
+ signing_key:
159
+ specification_version: 3
160
+ summary: Ruby wrapper for Telesocial API
161
+ test_files:
162
+ - test/telesocial_client_functional_test.rb
163
+ - test/telesocial_client_test.rb
164
+ - test/test_helper.rb