em-twitter 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,11 +1,7 @@
1
1
  language: ruby
2
- matrix:
3
- allow_failures:
4
- - rvm: ruby-head
5
2
  rvm:
6
3
  - rbx-18mode
7
4
  - rbx-19mode
8
5
  - 1.8.7
9
6
  - 1.9.2
10
7
  - 1.9.3
11
- - ree
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,3 @@
1
+ ## Contributing
2
+
3
+ Pull requests welcome: fork, make a topic branch, commit (squash when possible) *with tests* and I'll happily consider.
data/README.md CHANGED
@@ -1,8 +1,13 @@
1
- # EM-Twitter [![Build Status](https://secure.travis-ci.org/spagalloco/em-twitter.png?branch=master)][travis] [![Dependency Status](https://gemnasium.com/spagalloco/em-twitter.png?travis)][gemnasium]
1
+ # EM-Twitter
2
+ [![Build Status](https://secure.travis-ci.org/spagalloco/em-twitter.png?branch=master)][travis]
3
+ [![Dependency Status](https://gemnasium.com/spagalloco/em-twitter.png?travis)][gemnasium]
4
+ [![Code Climate](https://codeclimate.com/badge.png)][codeclimate]
5
+
2
6
  EM-Twitter is an EventMachine-based ruby client for the [Twitter Streaming API](https://dev.twitter.com/docs/streaming-api).
3
7
 
4
8
  [travis]: http://travis-ci.org/spagalloco/em-twitter
5
9
  [gemnasium]: https://gemnasium.com/spagalloco/em-twitter
10
+ [codeclimate]: https://codeclimate.com/github/spagalloco/em-twitter
6
11
 
7
12
  ## Usage
8
13
 
@@ -99,6 +104,16 @@ client.on_max_reconnects do |timeout, count|
99
104
  end
100
105
  ```
101
106
 
107
+ ## Stream Processing
108
+
109
+ We recommend using [TweetStream](https://github.com/intridea/tweetstream) for a higher abstraction level interface.
110
+
111
+ ## REST
112
+
113
+ To access the Twitter REST API, we recommend the [Twitter][] gem.
114
+
115
+ [twitter]: https://github.com/sferik/twitter
116
+
102
117
  ## Todo
103
118
 
104
119
  * Gzip encoding support (see [issue #1](https://github.com/spagalloco/em-twitter/issues/1) for more information)
@@ -110,10 +125,6 @@ EM-Twitter is heavily inspired by Vladimir Kolesnikov's [twitter-stream](https:/
110
125
 
111
126
  Testing with EM can be a challenge, but was made incredibly easy through the use of Hayes Davis' awesome [mockingbird](https://github.com/hayesdavis/mockingbird) gem.
112
127
 
113
- ## Contributing
114
-
115
- Pull requests welcome: fork, make a topic branch, commit (squash when possible) *with tests* and I'll happily consider.
116
-
117
128
  ## Copyright
118
129
 
119
130
  Copyright (c) 2012 Steve Agalloco. See [LICENSE](https://github.com/spagalloco/em-twitter/blob/master/LICENSE.md) for details.
data/em-twitter.gemspec CHANGED
@@ -11,16 +11,16 @@ Gem::Specification.new do |gem|
11
11
  gem.description = %q{Twitter Streaming API client for EventMachine}
12
12
  gem.summary = %q{Twitter Streaming API client for EventMachine}
13
13
 
14
- gem.add_dependency "eventmachine", ">= 1.0.0.beta.4"
15
- gem.add_dependency "http_parser.rb", "~> 0.5"
16
- gem.add_dependency "simple_oauth", "~> 0.1"
14
+ gem.add_dependency 'eventmachine', '~> 1.0'
15
+ gem.add_dependency 'http_parser.rb', '~> 0.5'
16
+ gem.add_dependency 'simple_oauth', '~> 0.1'
17
17
 
18
18
  gem.add_development_dependency 'rake'
19
19
  gem.add_development_dependency 'rdiscount'
20
- gem.add_development_dependency 'rspec'
20
+ gem.add_development_dependency 'rspec', '>= 2.11'
21
21
  gem.add_development_dependency 'simplecov'
22
22
  gem.add_development_dependency 'yard'
23
- gem.add_development_dependency 'mockingbird', '>= 0.1.1'
23
+ gem.add_development_dependency 'mockingbird', '>= 0.2'
24
24
  gem.add_development_dependency 'guard-rspec'
25
25
 
26
26
  gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
data/lib/em-twitter.rb CHANGED
@@ -22,6 +22,10 @@ module EventMachine
22
22
  :auto_reconnect => true
23
23
  }
24
24
 
25
+ DEFAULT_REQUEST_PARAMETERS = {
26
+ :stall_warnings => 'true'
27
+ }
28
+
25
29
  class ReconnectLimitError < StandardError; end
26
30
  class ConfigurationError < StandardError; end
27
31
 
@@ -17,7 +17,8 @@ module EventMachine
17
17
  :reconnect_callback,
18
18
  :max_reconnects_callback,
19
19
  :close_callback,
20
- :no_data_callback
20
+ :no_data_callback,
21
+ :service_unavailable_callback
21
22
  ].freeze unless defined?(CALLBACKS)
22
23
 
23
24
  attr_accessor :connection, :options, :host, :port
@@ -32,6 +33,7 @@ module EventMachine
32
33
 
33
34
  def initialize(options = {})
34
35
  @options = DEFAULT_CONNECTION_OPTIONS.merge(options)
36
+ @options[:params].merge!(EM::Twitter::DEFAULT_REQUEST_PARAMETERS)
35
37
 
36
38
  validate_client
37
39
 
@@ -87,6 +89,10 @@ module EventMachine
87
89
  end
88
90
  alias :on_rate_limited :on_enhance_your_calm
89
91
 
92
+ def on_service_unavailable(&block)
93
+ @service_unavailable_callback = block
94
+ end
95
+
90
96
  def on_reconnect(&block)
91
97
  @reconnect_callback = block
92
98
  end
@@ -123,4 +129,4 @@ module EventMachine
123
129
 
124
130
  end
125
131
  end
126
- end
132
+ end
@@ -35,6 +35,9 @@ module EventMachine
35
35
  @certificate_store = OpenSSL::X509::Store.new
36
36
  @certificate_store.add_file(@options[:ssl][:cert_chain_file])
37
37
  end
38
+
39
+ @network_reconnector = EM::Twitter::Reconnectors::NetworkFailure.new
40
+ @application_reconnector = EM::Twitter::Reconnectors::ApplicationFailure.new
38
41
  end
39
42
 
40
43
  # Called after the connection to the server is completed. Initiates a
@@ -49,8 +52,8 @@ module EventMachine
49
52
  end
50
53
 
51
54
  def post_init
52
- @headers = {}
53
- @reconnector = EM::Twitter::Reconnectors::NetworkFailure.new
55
+ @headers = {}
56
+ @reconnector = @network_reconnector
54
57
 
55
58
  @stall_timer = EM::PeriodicTimer.new(STALL_TIMER) do
56
59
  if gracefully_closed?
@@ -73,20 +76,21 @@ module EventMachine
73
76
 
74
77
  # Close the connection gracefully, without reconnecting
75
78
  def stop
76
- @gracefully_closed = true
79
+ @auto_reconnect = false
80
+ @gracefully_closed = true
77
81
  close_connection
78
82
  end
79
83
 
80
84
  # Immediately reconnects the connection
81
85
  def immediate_reconnect
82
- @immediate_reconnect = true
83
- @gracefully_closed = false
86
+ @immediate_reconnect = true
87
+ @gracefully_closed = false
84
88
  close_connection
85
89
  end
86
90
 
87
91
  # Called when a connection is disconnected
88
92
  def unbind
89
- schedule_reconnect if @options[:auto_reconnect] && !gracefully_closed?
93
+ schedule_reconnect if auto_reconnect_on_close?
90
94
  invoke_callback(@client.close_callback)
91
95
  end
92
96
 
@@ -110,6 +114,16 @@ module EventMachine
110
114
  @immediate_reconnect
111
115
  end
112
116
 
117
+ # Determines if the connection should reconnect if the connection closes
118
+ def auto_reconnect_on_close?
119
+ auto_reconnect? && !gracefully_closed?
120
+ end
121
+
122
+ # Returns the current state of the auto_reconnect flag.
123
+ def auto_reconnect?
124
+ @auto_reconnect
125
+ end
126
+
113
127
  def stalled?
114
128
  @last_response ||= Response.new
115
129
  @last_response.older_than?(STALL_TIMEOUT)
@@ -146,12 +160,16 @@ module EventMachine
146
160
  # BaseDecoder.new
147
161
  # end
148
162
 
149
- # since we got a response use the application failure reconnector
150
- # to handle redirects
151
- @reconnector = EM::Twitter::Reconnectors::ApplicationFailure.new
152
-
153
163
  # everything below here is error handling so return if we got a 200
154
- return if @response_code == 200
164
+ if @response_code.to_i == 200
165
+ @network_reconnector.reset
166
+ @application_reconnector.reset
167
+ return
168
+ end
169
+
170
+ # since we got a response use the application failure reconnector
171
+ # to handle reconnects
172
+ @reconnector = @application_reconnector
155
173
 
156
174
  case @response_code
157
175
  when 401 then invoke_callback(@client.unauthorized_callback)
@@ -161,6 +179,7 @@ module EventMachine
161
179
  when 413 then invoke_callback(@client.too_long_callback)
162
180
  when 416 then invoke_callback(@client.range_unacceptable_callback)
163
181
  when 420 then invoke_callback(@client.enhance_your_calm_callback)
182
+ when 503 then invoke_callback(@client.service_unavailable_callback)
164
183
  else
165
184
  msg = "Unhandled status code: #{@response_code}."
166
185
  invoke_callback(@client.error_callback, msg)
@@ -262,6 +281,9 @@ module EventMachine
262
281
  @reconnector.reconnect_timeout,
263
282
  @reconnector.reconnect_count)
264
283
 
284
+ # don't assume a successful reconnect so use the network reconnector
285
+ @reconnector = @network_reconnector
286
+
265
287
  if reconnect_timeout.zero?
266
288
  reconnect(@host, @port)
267
289
  else
@@ -284,8 +306,9 @@ module EventMachine
284
306
 
285
307
  @gracefully_closed = false
286
308
  @immediate_reconnect = false
309
+ @auto_reconnect = @options[:auto_reconnect]
287
310
  end
288
311
 
289
312
  end
290
313
  end
291
- end
314
+ end
@@ -1,5 +1,5 @@
1
1
  module EventMachine
2
2
  module Twitter
3
- VERSION = "0.1.4" unless defined?(EventMachine::Twitter::VERSION)
3
+ VERSION = "0.2.0" unless defined?(EventMachine::Twitter::VERSION)
4
4
  end
5
5
  end
@@ -9,6 +9,11 @@ describe EM::Twitter::Client do
9
9
  EM::Twitter::Client.new(opts)
10
10
  }.should raise_error(EM::Twitter::ConfigurationError)
11
11
  end
12
+
13
+ it 'merges default request parameters' do
14
+ client = EM::Twitter::Client.new(default_options)
15
+ client.options[:params].should include(:stall_warnings => 'true')
16
+ end
12
17
  end
13
18
 
14
19
  describe '.connect' do
@@ -18,17 +23,15 @@ describe EM::Twitter::Client do
18
23
  EM.stub(:connect).and_return(conn)
19
24
  end
20
25
 
21
- context 'without a proxy' do
22
- it 'connects to the configured host/port' do
23
- EventMachine.should_receive(:connect).with(
24
- test_options[:host],
25
- test_options[:port],
26
- EventMachine::Twitter::Connection,
27
- kind_of(EM::Twitter::Client),
28
- test_options[:host],
29
- test_options[:port])
30
- EM::Twitter::Client.connect(default_options)
31
- end
26
+ it 'connects to the configured host/port' do
27
+ EventMachine.should_receive(:connect).with(
28
+ test_options[:host],
29
+ test_options[:port],
30
+ EventMachine::Twitter::Connection,
31
+ kind_of(EM::Twitter::Client),
32
+ test_options[:host],
33
+ test_options[:port])
34
+ EM::Twitter::Client.connect(default_options)
32
35
  end
33
36
 
34
37
  context 'when using a proxy' do
@@ -44,7 +47,7 @@ describe EM::Twitter::Client do
44
47
  end
45
48
  end
46
49
 
47
- it "should not trigger SSL until connection is established" do
50
+ it "doesn't trigger SSL until connection is established" do
48
51
  connection = stub('EventMachine::Connection')
49
52
  EM.should_receive(:connect).and_return(connection)
50
53
  EM.should_not_receive(:start_tls)
@@ -61,4 +64,4 @@ describe EM::Twitter::Client do
61
64
  end
62
65
  end
63
66
 
64
- end
67
+ end
@@ -9,4 +9,5 @@ describe 'EM::Twitter::Connection error handling' do
9
9
  error_callback_invoked('on_range_unacceptable', 416, 'Range Unacceptable')
10
10
  error_callback_invoked('on_enhance_your_calm', 420, 'Enhance Your Calm')
11
11
  error_callback_invoked('on_error', 500, 'Internal Server Error', 'An error occurred.')
12
- end
12
+ error_callback_invoked('on_service_unavailable', 503, 'Service Unavailable')
13
+ end
@@ -4,6 +4,97 @@ include EM::Twitter
4
4
 
5
5
  describe 'EM::Twitter::Connection reconnections' do
6
6
 
7
+ describe 'reconnector setting' do
8
+ context 'on connect' do
9
+ before do
10
+ Mockingbird.setup(test_options) do
11
+ status 200, 'Success'
12
+ end
13
+ end
14
+
15
+ after { Mockingbird.teardown }
16
+
17
+ it 'uses the network failure reconnector' do
18
+ EM.run_block do
19
+ client = Client.connect(default_options)
20
+ client.connection.reconnector.should be_kind_of(Reconnectors::NetworkFailure)
21
+ end
22
+ end
23
+ end
24
+
25
+ context 'after successful connect' do
26
+ before do
27
+ Mockingbird.setup(test_options) do
28
+ status 200, 'Success'
29
+ end
30
+ end
31
+
32
+ after { Mockingbird.teardown }
33
+
34
+ it 'resets the network failure reconnector' do
35
+ Reconnectors::NetworkFailure.any_instance.should_receive(:reset)
36
+ EM.run do
37
+ EM::Timer.new(1) { EM.stop }
38
+ client = Client.connect(default_options)
39
+ end
40
+ end
41
+
42
+ it 'resets the application failure reconnector' do
43
+ Reconnectors::ApplicationFailure.any_instance.should_receive(:reset)
44
+ EM.run do
45
+ EM::Timer.new(1) { EM.stop }
46
+ client = Client.connect(default_options)
47
+ # EM::Timer.new(1) { EM.stop }
48
+ end
49
+ end
50
+ end
51
+
52
+ context 'on 4xx responses' do
53
+ before do
54
+ Mockingbird.setup(test_options) do
55
+ status 401, 'Unauthorized'
56
+ end
57
+ end
58
+
59
+ after { Mockingbird.teardown }
60
+
61
+ it 'uses the application failure reconnector' do
62
+ EM.run do
63
+ client = Client.connect(default_options)
64
+ EM::Timer.new(1) do
65
+ client.connection.reconnector.should be_kind_of(Reconnectors::ApplicationFailure)
66
+ EM.stop
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'on reconnects' do
73
+ before do
74
+ Mockingbird.setup(test_options) do
75
+ on_connection(1) do
76
+ status 401, 'Unauthorized'
77
+ disconnect!
78
+ end
79
+
80
+ wait(5)
81
+ end
82
+ end
83
+
84
+ after { Mockingbird.teardown }
85
+
86
+ it 'set the reconnector to the network failure reconnector' do
87
+ EM.run do
88
+ client = Client.connect(default_options)
89
+ EM::Timer.new(1) do
90
+ client.connection.reconnector.should be_kind_of(Reconnectors::NetworkFailure)
91
+ EM.stop
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
7
98
  describe '#reconnect' do
8
99
  before do
9
100
  Mockingbird.setup(test_options) do
@@ -136,4 +227,4 @@ describe 'EM::Twitter::Connection reconnections' do
136
227
  end
137
228
  end
138
229
  end
139
- end
230
+ end
@@ -25,13 +25,15 @@ describe EM::Twitter::Connection do
25
25
  describe '#each with partial responses' do
26
26
  before do
27
27
  Mockingbird.setup(test_options) do
28
+ status '200', 'Success'
29
+
28
30
  on_connection('*') do
29
- status '200', 'Success'
30
31
  100.times do
31
- send '{"foo":"ba'
32
- send 'r"}'
32
+ send %({"foo":"ba)
33
+ send %(r"}\r\n)
33
34
  end
34
35
  end
36
+
35
37
  end
36
38
  end
37
39
 
@@ -43,24 +45,28 @@ describe EM::Twitter::Connection do
43
45
  EM.run do
44
46
  client = EM::Twitter::Client.connect(default_options)
45
47
  client.each do |message|
46
- count = count + 1
47
- EM.stop if count >= 99
48
+ count += 1
49
+ if count >= 100
50
+ client.stop
51
+ EM.stop
52
+ end
48
53
  end
49
54
 
50
- EM::Timer.new(60) { EM.stop }
55
+ EM::Timer.new(10) { EM.stop }
51
56
  end
52
57
 
53
- count.should == 100
58
+ count.should >= 100
54
59
  end
55
60
  end
56
61
 
57
62
  describe '#each with full responses' do
58
63
  before do
59
64
  Mockingbird.setup(test_options) do
65
+ status '200', 'Success'
66
+
60
67
  on_connection('*') do
61
- status '200', 'Success'
62
68
  100.times do
63
- send '{"foo":"bar"}'
69
+ send %({"foo":"bar"}\r\n)
64
70
  end
65
71
  end
66
72
 
@@ -70,27 +76,28 @@ describe EM::Twitter::Connection do
70
76
  after { Mockingbird.teardown }
71
77
 
72
78
  it 'emits each complete response chunk' do
73
- count = 0
74
79
  responses = []
75
80
 
76
81
  EM.run do
77
82
  client = EM::Twitter::Client.connect(default_options)
78
83
  client.each do |message|
79
- count = count + 1
80
84
  responses << message
81
- EM.stop if count >= 99
85
+ EM.stop if responses.size >= 100
82
86
  end
83
87
 
84
- EM::Timer.new(60) { EM.stop }
88
+ EM::Timer.new(10) { EM.stop }
85
89
  end
86
90
 
87
- count.should == 100
91
+ responses.size.should >= 100
88
92
  responses.last.should eq('{"foo":"bar"}')
89
93
  end
90
94
  end
91
95
 
92
96
  describe 'stall handling' do
93
97
  before do
98
+ stub_const("EM::Twitter::Connection::STALL_TIMEOUT", 5)
99
+ stub_const("EM::Twitter::Connection::STALL_TIMER", 1)
100
+
94
101
  Mockingbird.setup(test_options) do
95
102
  wait(10)
96
103
  end
@@ -112,7 +119,7 @@ describe EM::Twitter::Connection do
112
119
  called.should be_true
113
120
  end
114
121
 
115
- it 'it closes the connection when stalled to prompt a reconnect' do
122
+ it 'closes the connection when stalled to prompt a reconnect' do
116
123
  called = false
117
124
  EM.run do
118
125
  client = EM::Twitter::Client.connect(default_options)
@@ -128,7 +135,7 @@ describe EM::Twitter::Connection do
128
135
  end
129
136
 
130
137
  it 'invokes a no-data callback when stalled without a response' do
131
- called = false
138
+ stalled = false
132
139
  EM.run do
133
140
  client = EM::Twitter::Client.connect(default_options)
134
141
  # this is kind of sneaky, using a stub on gracefully_closed?
@@ -140,12 +147,12 @@ describe EM::Twitter::Connection do
140
147
  false
141
148
  end
142
149
  client.on_no_data_received do
143
- called = true
150
+ stalled = client.connection.stalled?
144
151
  EM.stop
145
152
  end
146
153
  end
147
154
 
148
- called.should be_true
155
+ stalled.should be_true
149
156
  end
150
157
  end
151
158
  end
@@ -179,6 +186,14 @@ describe EM::Twitter::Connection do
179
186
  client.should be_gracefully_closed
180
187
  end
181
188
  end
189
+
190
+ it "doesn't auto-reconnect" do
191
+ EM.run_block do
192
+ client = EM::Twitter::Client.connect(default_options)
193
+ client.stop
194
+ client.connection.auto_reconnect?.should be_false
195
+ end
196
+ end
182
197
  end
183
198
 
184
199
  describe '#update' do
@@ -219,4 +234,36 @@ describe EM::Twitter::Connection do
219
234
  end
220
235
  end
221
236
 
222
- end
237
+ describe '#auto_reconnect?' do
238
+ before do
239
+ Mockingbird.setup(test_options) do
240
+ 100.times do
241
+ send '{"foo":"bar"}'
242
+ end
243
+ end
244
+ end
245
+
246
+ after { Mockingbird.teardown }
247
+
248
+ it 'indicates the auto_reconnect setting' do
249
+ EM.run do
250
+ client = EM::Twitter::Client.connect(default_options)
251
+ EM::Timer.new(1) do
252
+ client.auto_reconnect?.should be_true
253
+ EM.stop
254
+ end
255
+ end
256
+ end
257
+
258
+ it 'indicates the auto_reconnect setting when false' do
259
+ EM.run do
260
+ client = EM::Twitter::Client.connect(default_options.merge(:auto_reconnect => false))
261
+ EM::Timer.new(1) do
262
+ client.auto_reconnect?.should be_false
263
+ EM.stop
264
+ end
265
+ end
266
+ end
267
+ end
268
+
269
+ end
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,7 @@ require 'rspec'
12
12
  require 'mockingbird'
13
13
 
14
14
  def test_options
15
- { :host => '127.0.0.1', :port => 9551, :quiet => false }
15
+ { :host => '127.0.0.1', :port => 9551, :quiet => true }
16
16
  end
17
17
 
18
18
  def default_options
@@ -77,4 +77,4 @@ def error_callback_invoked(callback, code, desc, msg = nil)
77
77
  called.should be_true
78
78
  end
79
79
  end
80
- end
80
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-twitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-26 00:00:00.000000000Z
12
+ date: 2012-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &70171881287000 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.0.beta.4
21
+ version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70171881287000
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: http_parser.rb
27
- requirement: &70171881286320 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0.5'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70171881286320
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.5'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: simple_oauth
38
- requirement: &70171881285660 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0.1'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70171881285660
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rake
49
- requirement: &70171881285040 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70171881285040
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: rdiscount
60
- requirement: &70171881284540 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,21 +85,31 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70171881284540
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rspec
71
- requirement: &70171881284120 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
75
100
  - !ruby/object:Gem::Version
76
- version: '0'
101
+ version: '2.11'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70171881284120
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '2.11'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: simplecov
82
- requirement: &70171881283520 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70171881283520
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: yard
93
- requirement: &70171881282900 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,21 +133,31 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70171881282900
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: mockingbird
104
- requirement: &70171881282120 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
108
148
  - !ruby/object:Gem::Version
109
- version: 0.1.1
149
+ version: '0.2'
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70171881282120
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0.2'
113
158
  - !ruby/object:Gem::Dependency
114
159
  name: guard-rspec
115
- requirement: &70171881281540 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
116
161
  none: false
117
162
  requirements:
118
163
  - - ! '>='
@@ -120,7 +165,12 @@ dependencies:
120
165
  version: '0'
121
166
  type: :development
122
167
  prerelease: false
123
- version_requirements: *70171881281540
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
124
174
  description: Twitter Streaming API client for EventMachine
125
175
  email: steve.agalloco@gmail.com
126
176
  executables: []
@@ -132,6 +182,7 @@ files:
132
182
  - .rspec
133
183
  - .travis.yml
134
184
  - .yardopts
185
+ - CONTRIBUTING.md
135
186
  - Gemfile
136
187
  - Guardfile
137
188
  - LICENSE.md
@@ -184,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
235
  version: '0'
185
236
  requirements: []
186
237
  rubyforge_project:
187
- rubygems_version: 1.8.10
238
+ rubygems_version: 1.8.23
188
239
  signing_key:
189
240
  specification_version: 3
190
241
  summary: Twitter Streaming API client for EventMachine