neighborparrot 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,12 +3,15 @@ source "http://rubygems.org"
3
3
  gem 'eventmachine'
4
4
  gem 'em-http-request'
5
5
  gem 'em-eventsource'
6
+ gem 'bson_ext'
7
+ gem 'ruby-hmac'
8
+ gem 'signature'
6
9
 
7
10
  group :development do
8
- gem "rspec", "~> 2.3.0"
9
- gem "bundler", "~> 1.0.0"
11
+ gem "rspec"
12
+ gem "bundler"
10
13
  gem "jeweler", "~> 1.6.4"
11
- gem "rcov", ">= 0"
14
+ gem "simplecov"
12
15
  end
13
16
 
14
17
 
data/Gemfile.lock CHANGED
@@ -2,15 +2,20 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  addressable (2.2.6)
5
+ bson (1.5.2)
6
+ bson_ext (1.5.2)
7
+ bson (= 1.5.2)
8
+ cookiejar (0.3.0)
5
9
  diff-lcs (1.1.3)
6
10
  em-eventsource (0.1.5)
7
11
  em-http-request (~> 1.0.0)
8
12
  eventmachine (~> 1.0.0.beta3)
9
- em-http-request (1.0.0)
13
+ em-http-request (1.0.1)
10
14
  addressable (>= 2.2.3)
15
+ cookiejar
11
16
  em-socksify
12
- eventmachine (>= 1.0.0.beta.3)
13
- http_parser.rb (>= 0.5.2)
17
+ eventmachine (>= 1.0.0.beta.4)
18
+ http_parser.rb (>= 0.5.3)
14
19
  em-socksify (0.1.0)
15
20
  eventmachine
16
21
  eventmachine (1.0.0.beta.4)
@@ -23,26 +28,36 @@ GEM
23
28
  bundler (~> 1.0)
24
29
  git (>= 1.2.5)
25
30
  rake
31
+ multi_json (1.0.4)
26
32
  rake (0.9.2.2)
27
- rcov (0.9.11)
28
- rspec (2.3.0)
29
- rspec-core (~> 2.3.0)
30
- rspec-expectations (~> 2.3.0)
31
- rspec-mocks (~> 2.3.0)
32
- rspec-core (2.3.1)
33
- rspec-expectations (2.3.0)
33
+ rspec (2.8.0)
34
+ rspec-core (~> 2.8.0)
35
+ rspec-expectations (~> 2.8.0)
36
+ rspec-mocks (~> 2.8.0)
37
+ rspec-core (2.8.0)
38
+ rspec-expectations (2.8.0)
34
39
  diff-lcs (~> 1.1.2)
35
- rspec-mocks (2.3.0)
40
+ rspec-mocks (2.8.0)
41
+ ruby-hmac (0.4.0)
42
+ signature (0.1.2)
43
+ ruby-hmac
44
+ simplecov (0.5.4)
45
+ multi_json (~> 1.0.3)
46
+ simplecov-html (~> 0.5.3)
47
+ simplecov-html (0.5.3)
36
48
 
37
49
  PLATFORMS
38
50
  ruby
39
51
 
40
52
  DEPENDENCIES
41
- bundler (~> 1.0.0)
53
+ bson_ext
54
+ bundler
42
55
  em-eventsource
43
56
  em-http-request
44
57
  eventmachine
45
58
  faker
46
59
  jeweler (~> 1.6.4)
47
- rcov
48
- rspec (~> 2.3.0)
60
+ rspec
61
+ ruby-hmac
62
+ signature
63
+ simplecov
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.4
@@ -3,6 +3,7 @@ require 'uri'
3
3
  require 'neighborparrot/config'
4
4
  require 'neighborparrot/callbacks'
5
5
  require 'neighborparrot/reactor'
6
+ require 'neighborparrot/auth'
6
7
  require 'neighborparrot/send'
7
8
  require 'neighborparrot/open'
8
9
  require 'neighborparrot/helpers/url_helpers'
@@ -0,0 +1,21 @@
1
+ require 'hmac-sha2'
2
+ require 'signature'
3
+
4
+ module Neighborparrot
5
+ def self.sign_connect_request(query, params={})
6
+ endpoint = query[:service] == 'es' ? '/open' : '/ws'
7
+ sign_request('GET', endpoint, query, params)
8
+ end
9
+
10
+ def self.sign_send_request(body, params={})
11
+ sign_request('POST', '/send',body, params)
12
+ end
13
+
14
+ def self.sign_request(method, path, request, params={})
15
+ params = Neighborparrot.configuration.merge params
16
+ token = Signature::Token.new(params[:api_id], params[:api_key])
17
+ sign_request = Signature::Request.new(method, path, request)
18
+ auth_hash = sign_request.sign(token)
19
+ request.merge(auth_hash)
20
+ end
21
+ end
@@ -38,14 +38,15 @@ module Neighborparrot
38
38
  end
39
39
 
40
40
 
41
- # Chen mandatory parameters
41
+ # Check mandatory parameters
42
42
  # @param [Hash] parameters
43
43
  # @param [Symbol] action [:send/:open]
44
44
  def check_params(p, action=:send)
45
- trigger_on_error "Channel can't be nil" if p[:channel].nil? || p[:channel].length == 0
46
- trigger_on_error "ERROR# Neighborparrot: api_id can't be nil" if p[:api_id].nil? || p[:api_id].length == 0
47
- if action == :send
48
- trigger_on_error "ERROR# Neighborparrot: api_key can't be nil" if p[:api_key].nil? || p[:api_key].length == 0
45
+ trigger_error "Channel can't be nil" if p[:channel].nil? || p[:channel].length == 0
46
+ trigger_error "ERROR# Neighborparrot: api_id can't be nil" if p[:api_id].nil? || p[:api_id].length == 0
47
+ trigger_error "ERROR# Neighborparrot: api_key can't be nil" if p[:api_key].nil? || p[:api_key].length == 0
48
+ if action == :open
49
+ trigger_error "ERROR# Neighborparrot: socket_id can't be nil" if p[:socket_id].nil? || p[:socket_id].length == 0
49
50
  end
50
51
  true
51
52
  end
@@ -19,15 +19,16 @@ module Neighborparrot
19
19
  return unless check_params params, :post
20
20
  return if dummy_connections?
21
21
  uri = URI.parse(params[:server])
22
- channel = params[:channel]
23
22
  url = "#{params[:server]}/open"
24
-
25
- @source = EM::EventSource.new(url, :channel => channel )
23
+ request = {:channel => params[:channel], :socket_id => params[:socket_id]}
24
+ signed_request = Neighborparrot.sign_connect_request(request, params)
25
+ @source = EM::EventSource.new(url, signed_request)
26
26
  @source.inactivity_timeout = 120
27
27
  @source.message do |message|
28
28
  EM.next_tick { trigger_message message }
29
29
  end
30
30
  @source.error do |error|
31
+ puts "Error #{error}"
31
32
  EM.next_tick { trigger_error error }
32
33
  end
33
34
 
@@ -68,15 +68,13 @@ module Neighborparrot
68
68
 
69
69
  # Send a message to a channel
70
70
  # If empty data, refuse to send nothing
71
- # @param [Hash] params
72
- # * :api_id => Your api ID in neighborparrot.com
73
- # * :api_key => Your api key
74
- # * :server => Server to connect (Only for development)
71
+ # @request [Hash] params
75
72
  # * :channel => The channel name
76
73
  # * :data => Your payload
74
+ # @params optional parameters
77
75
  # @return [Boolean] true if sended
78
- def send(params)
79
- EM.schedule { @out_queue.push params }
76
+ def send(request, params={})
77
+ EM.schedule { @out_queue.push({ :request => request, :params => params }) }
80
78
  end
81
79
 
82
80
 
@@ -92,7 +90,12 @@ module Neighborparrot
92
90
  return init_queue unless @out_queue
93
91
  end
94
92
  @em_thread = Thread.new {
95
- EM.run { init_queue }
93
+ EM.run do
94
+ EM.error_handler{ |e|
95
+ puts "Error raised during event loop: #{e.message} , #{e}"
96
+ }
97
+ init_queue
98
+ end
96
99
  }
97
100
  end
98
101
 
@@ -7,9 +7,9 @@ module Neighborparrot
7
7
  # If you start a module reactor in some point in your program
8
8
  # the request is scheduled in this reactor and return
9
9
  # the control to your program. Module callbacks are used in this case.
10
- def self.send(params={})
10
+ def self.send(request, params={})
11
11
  if self.reactor_running?
12
- return @@class_reactor.send params
12
+ return @@class_reactor.send request, params
13
13
  end
14
14
  response = nil
15
15
  error = false
@@ -23,21 +23,27 @@ module Neighborparrot
23
23
  response = resp
24
24
  parrot.stop
25
25
  end
26
- parrot.send params
26
+ # Skip reactor queues
27
+ parrot.send_to_broker request, params
27
28
  end
28
29
  fail error if error
29
30
  return response
30
31
  end
31
32
 
32
- private
33
33
  # Send the message to the broker
34
- def send_to_broker(params={})
35
- params = Neighborparrot.configuration.merge params
36
- return unless check_params params
37
- return if params[:data].nil? || params[:data].length == 0
34
+ # This is the final step of a send request in the reactor process
35
+ def send_to_broker(options)
36
+ params = Neighborparrot.configuration.merge options[:params]
37
+ request = options[:request]
38
+ # TODO: Refactor
39
+ # return unless check_params request
40
+ return if request[:data].nil? || request[:data].length == 0
38
41
  return if params[:dummy_connections]
42
+
43
+ signed_request = Neighborparrot.sign_send_request request, params
44
+
39
45
  url = "#{params[:server]}/send"
40
- http = EventMachine::HttpRequest.new(url).post :body => params
46
+ http = EventMachine::HttpRequest.new(url).post :body => signed_request
41
47
  http.errback{ |msg| trigger_error msg }
42
48
  http.callback do
43
49
  if http.response_header.status == 200
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "neighborparrot"
8
- s.version = "0.3.3"
8
+ s.version = "0.3.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Eloy Gomez"]
12
- s.date = "2012-01-11"
12
+ s.date = "2012-02-01"
13
13
  s.description = "Send messages to the neighborparrot event source service"
14
14
  s.email = "eloy@indeos.es"
15
15
  s.extra_rdoc_files = [
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "Rakefile",
27
27
  "VERSION",
28
28
  "lib/neighborparrot.rb",
29
+ "lib/neighborparrot/auth.rb",
29
30
  "lib/neighborparrot/callbacks.rb",
30
31
  "lib/neighborparrot/config.rb",
31
32
  "lib/neighborparrot/helpers/url_helpers.rb",
@@ -42,7 +43,7 @@ Gem::Specification.new do |s|
42
43
  s.homepage = "http://neighborparrot.com"
43
44
  s.licenses = ["MIT"]
44
45
  s.require_paths = ["lib"]
45
- s.rubygems_version = "1.8.10"
46
+ s.rubygems_version = "1.8.11"
46
47
  s.summary = "Ruby client for the Neighborparrot"
47
48
 
48
49
  if s.respond_to? :specification_version then
@@ -52,27 +53,36 @@ Gem::Specification.new do |s|
52
53
  s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
53
54
  s.add_runtime_dependency(%q<em-http-request>, [">= 0"])
54
55
  s.add_runtime_dependency(%q<em-eventsource>, [">= 0"])
55
- s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
56
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_runtime_dependency(%q<bson_ext>, [">= 0"])
57
+ s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
58
+ s.add_runtime_dependency(%q<signature>, [">= 0"])
59
+ s.add_development_dependency(%q<rspec>, [">= 0"])
60
+ s.add_development_dependency(%q<bundler>, [">= 0"])
57
61
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
58
- s.add_development_dependency(%q<rcov>, [">= 0"])
62
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
59
63
  else
60
64
  s.add_dependency(%q<eventmachine>, [">= 0"])
61
65
  s.add_dependency(%q<em-http-request>, [">= 0"])
62
66
  s.add_dependency(%q<em-eventsource>, [">= 0"])
63
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
64
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_dependency(%q<bson_ext>, [">= 0"])
68
+ s.add_dependency(%q<ruby-hmac>, [">= 0"])
69
+ s.add_dependency(%q<signature>, [">= 0"])
70
+ s.add_dependency(%q<rspec>, [">= 0"])
71
+ s.add_dependency(%q<bundler>, [">= 0"])
65
72
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
66
- s.add_dependency(%q<rcov>, [">= 0"])
73
+ s.add_dependency(%q<simplecov>, [">= 0"])
67
74
  end
68
75
  else
69
76
  s.add_dependency(%q<eventmachine>, [">= 0"])
70
77
  s.add_dependency(%q<em-http-request>, [">= 0"])
71
78
  s.add_dependency(%q<em-eventsource>, [">= 0"])
72
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
73
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
79
+ s.add_dependency(%q<bson_ext>, [">= 0"])
80
+ s.add_dependency(%q<ruby-hmac>, [">= 0"])
81
+ s.add_dependency(%q<signature>, [">= 0"])
82
+ s.add_dependency(%q<rspec>, [">= 0"])
83
+ s.add_dependency(%q<bundler>, [">= 0"])
74
84
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
75
- s.add_dependency(%q<rcov>, [">= 0"])
85
+ s.add_dependency(%q<simplecov>, [">= 0"])
76
86
  end
77
87
  end
78
88
 
@@ -2,10 +2,11 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe "Neighborparrot::ESParrot" do
4
4
  before :all do
5
- api_id = 'test-id'
6
- api_key = 'api_key'
7
- Neighborparrot.configure({ :api_id => api_id, :api_key => :api_key })
8
- @channel = 'test'
5
+ api_id = '7b6632eb-1345-4431-81d6-27744845a7c2'
6
+ api_key = '39aa7d81-8f6a-4885-a254-335dcf7dc8f7'
7
+ @socket_id = '1234'
8
+ Neighborparrot.configure(:api_id => api_id, :api_key => api_key)
9
+ @channel = 'spec-test'
9
10
  end
10
11
 
11
12
  before :each do
@@ -23,7 +24,7 @@ describe "Neighborparrot::ESParrot" do
23
24
  @parrot.on_connect do
24
25
  connected = true
25
26
  end
26
- @parrot.open(:channel => @channel)
27
+ @parrot.open(:channel => @channel, :socket_id => @socket_id)
27
28
  sleep 1
28
29
  connected.should be_true
29
30
  end
@@ -33,23 +34,23 @@ describe "Neighborparrot::ESParrot" do
33
34
  @parrot.on_message do |msg|
34
35
  received = msg
35
36
  end
36
- @parrot.open(:channel => @channel)
37
+ @parrot.open(:channel => @channel, :socket_id => @socket_id)
37
38
 
38
39
  text = Faker::Lorem.paragraph(30)
39
- @parrot.send(:channel => 'test', :data => text)
40
+ @parrot.send(:channel => @channel, :data => text)
40
41
  sleep 1
41
42
  received.should eq text
42
43
  end
43
44
 
44
45
  it "should return false if already a connection active" do
45
- @parrot.open(:channel => @channel)
46
+ @parrot.open(:channel => @channel, :socket_id => @socket_id)
46
47
  @parrot.open(:channel => 'other test').should be_false
47
48
  end
48
49
  end
49
50
 
50
51
  describe "Neighborparrot::ESParrot#close" do
51
52
  it "should close a connection" do
52
- @parrot.open(:channel => @channel)
53
+ @parrot.open(:channel => @channel, :socket_id => @socket_id)
53
54
  @parrot.stop
54
55
  @parrot.connected?.should be_false
55
56
  end
@@ -62,7 +63,7 @@ describe "Neighborparrot::ESParrot" do
62
63
  end
63
64
 
64
65
  it "should be true when connected" do
65
- @parrot.open(:channel => @channel)
66
+ @parrot.open(:channel => @channel, :socket_id => @socket_id)
66
67
  sleep 2
67
68
  @parrot.connected?.should be_true
68
69
  @parrot.close
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,8 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
4
  require 'faker'
5
+ require 'hmac-sha2'
6
+ require 'signature'
5
7
 
6
8
  require File.expand_path(File.dirname(__FILE__) + '/../lib/neighborparrot')
7
9
 
@@ -10,7 +12,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../lib/neighborparrot')
10
12
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
13
 
12
14
  # Setup server on localhost
13
- # Neighborparrot.configure :server => 'http://127.0.0.1:9000'
15
+ Neighborparrot.configure :server => 'http://127.0.0.1:9000'
14
16
 
15
17
  RSpec.configure do |config|
16
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neighborparrot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-11 00:00:00.000000000Z
12
+ date: 2012-02-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &28945400 !ruby/object:Gem::Requirement
16
+ requirement: &80693500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *28945400
24
+ version_requirements: *80693500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: em-http-request
27
- requirement: &28944760 !ruby/object:Gem::Requirement
27
+ requirement: &80689840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *28944760
35
+ version_requirements: *80689840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-eventsource
38
- requirement: &28943860 !ruby/object:Gem::Requirement
38
+ requirement: &80712050 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,32 +43,65 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *28943860
46
+ version_requirements: *80712050
47
+ - !ruby/object:Gem::Dependency
48
+ name: bson_ext
49
+ requirement: &80708470 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *80708470
58
+ - !ruby/object:Gem::Dependency
59
+ name: ruby-hmac
60
+ requirement: &80810390 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *80810390
69
+ - !ruby/object:Gem::Dependency
70
+ name: signature
71
+ requirement: &80807390 !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: *80807390
47
80
  - !ruby/object:Gem::Dependency
48
81
  name: rspec
49
- requirement: &28942880 !ruby/object:Gem::Requirement
82
+ requirement: &80941980 !ruby/object:Gem::Requirement
50
83
  none: false
51
84
  requirements:
52
- - - ~>
85
+ - - ! '>='
53
86
  - !ruby/object:Gem::Version
54
- version: 2.3.0
87
+ version: '0'
55
88
  type: :development
56
89
  prerelease: false
57
- version_requirements: *28942880
90
+ version_requirements: *80941980
58
91
  - !ruby/object:Gem::Dependency
59
92
  name: bundler
60
- requirement: &28942180 !ruby/object:Gem::Requirement
93
+ requirement: &80940920 !ruby/object:Gem::Requirement
61
94
  none: false
62
95
  requirements:
63
- - - ~>
96
+ - - ! '>='
64
97
  - !ruby/object:Gem::Version
65
- version: 1.0.0
98
+ version: '0'
66
99
  type: :development
67
100
  prerelease: false
68
- version_requirements: *28942180
101
+ version_requirements: *80940920
69
102
  - !ruby/object:Gem::Dependency
70
103
  name: jeweler
71
- requirement: &28940820 !ruby/object:Gem::Requirement
104
+ requirement: &80940000 !ruby/object:Gem::Requirement
72
105
  none: false
73
106
  requirements:
74
107
  - - ~>
@@ -76,10 +109,10 @@ dependencies:
76
109
  version: 1.6.4
77
110
  type: :development
78
111
  prerelease: false
79
- version_requirements: *28940820
112
+ version_requirements: *80940000
80
113
  - !ruby/object:Gem::Dependency
81
- name: rcov
82
- requirement: &28940060 !ruby/object:Gem::Requirement
114
+ name: simplecov
115
+ requirement: &80938470 !ruby/object:Gem::Requirement
83
116
  none: false
84
117
  requirements:
85
118
  - - ! '>='
@@ -87,7 +120,7 @@ dependencies:
87
120
  version: '0'
88
121
  type: :development
89
122
  prerelease: false
90
- version_requirements: *28940060
123
+ version_requirements: *80938470
91
124
  description: Send messages to the neighborparrot event source service
92
125
  email: eloy@indeos.es
93
126
  executables: []
@@ -105,6 +138,7 @@ files:
105
138
  - Rakefile
106
139
  - VERSION
107
140
  - lib/neighborparrot.rb
141
+ - lib/neighborparrot/auth.rb
108
142
  - lib/neighborparrot/callbacks.rb
109
143
  - lib/neighborparrot/config.rb
110
144
  - lib/neighborparrot/helpers/url_helpers.rb
@@ -132,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
166
  version: '0'
133
167
  segments:
134
168
  - 0
135
- hash: 96556740036397666
169
+ hash: -150390895
136
170
  required_rubygems_version: !ruby/object:Gem::Requirement
137
171
  none: false
138
172
  requirements:
@@ -141,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
175
  version: '0'
142
176
  requirements: []
143
177
  rubyforge_project:
144
- rubygems_version: 1.8.10
178
+ rubygems_version: 1.8.11
145
179
  signing_key:
146
180
  specification_version: 3
147
181
  summary: Ruby client for the Neighborparrot