twitter-stream 0.1.14 → 0.1.15
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.
Potentially problematic release.
This version of twitter-stream might be problematic. Click here for more details.
- data/LICENSE +20 -0
- data/README.markdown +6 -6
- data/lib/twitter/json_stream.rb +7 -5
- data/spec/spec_helper.rb +1 -2
- data/spec/twitter/json_stream_spec.rb +32 -20
- data/twitter-stream.gemspec +3 -3
- metadata +52 -88
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Vladimir Kolesnikov, twitter-stream
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# twitter-stream
|
2
2
|
|
3
|
-
Simple Ruby client library for [twitter streaming API](http://apiwiki.twitter.com/Streaming-API-Documentation).
|
4
|
-
Uses [EventMachine](http://rubyeventmachine.com/) for connection handling. Adheres to twitter's [reconnection guidline](
|
3
|
+
Simple Ruby client library for [twitter streaming API](http://apiwiki.twitter.com/Streaming-API-Documentation).
|
4
|
+
Uses [EventMachine](http://rubyeventmachine.com/) for connection handling. Adheres to twitter's [reconnection guidline](https://dev.twitter.com/docs/streaming-api/concepts#connecting).
|
5
5
|
|
6
6
|
JSON format only.
|
7
7
|
|
@@ -13,7 +13,7 @@ JSON format only.
|
|
13
13
|
|
14
14
|
require 'rubygems'
|
15
15
|
require 'twitter/json_stream'
|
16
|
-
|
16
|
+
|
17
17
|
EventMachine::run {
|
18
18
|
stream = Twitter::JSONStream.connect(
|
19
19
|
:path => '/1/statuses/filter.json?track=football',
|
@@ -25,15 +25,15 @@ JSON format only.
|
|
25
25
|
end
|
26
26
|
|
27
27
|
stream.on_error do |message|
|
28
|
-
# No need to worry here. It might be an issue with Twitter.
|
28
|
+
# No need to worry here. It might be an issue with Twitter.
|
29
29
|
# Log message for future reference. JSONStream will try to reconnect after a timeout.
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
stream.on_max_reconnects do |timeout, retries|
|
33
33
|
# Something is wrong on your side. Send yourself an email.
|
34
34
|
end
|
35
35
|
}
|
36
|
-
|
36
|
+
|
37
37
|
|
38
38
|
## Examples
|
39
39
|
|
data/lib/twitter/json_stream.rb
CHANGED
@@ -27,8 +27,8 @@ module Twitter
|
|
27
27
|
:content => '',
|
28
28
|
:path => '/1/statuses/filter.json',
|
29
29
|
:host => 'stream.twitter.com',
|
30
|
-
:port =>
|
31
|
-
:ssl =>
|
30
|
+
:port => 443,
|
31
|
+
:ssl => true,
|
32
32
|
:user_agent => 'TwitterStream',
|
33
33
|
:timeout => 0,
|
34
34
|
:proxy => ENV['HTTP_PROXY'],
|
@@ -60,7 +60,6 @@ module Twitter
|
|
60
60
|
end
|
61
61
|
|
62
62
|
connection = EventMachine.connect host, port, self, options
|
63
|
-
connection.start_tls if options[:ssl]
|
64
63
|
connection
|
65
64
|
end
|
66
65
|
|
@@ -122,6 +121,7 @@ module Twitter
|
|
122
121
|
end
|
123
122
|
|
124
123
|
def connection_completed
|
124
|
+
start_tls if @options[:ssl]
|
125
125
|
send_request
|
126
126
|
end
|
127
127
|
|
@@ -248,7 +248,7 @@ module Twitter
|
|
248
248
|
if @proxy && @proxy.user
|
249
249
|
data << "Proxy-Authorization: Basic " + ["#{@proxy.user}:#{@proxy.password}"].pack('m').delete("\r\n")
|
250
250
|
end
|
251
|
-
if @options[:method]
|
251
|
+
if ['POST', 'PUT'].include?(@options[:method])
|
252
252
|
data << "Content-type: #{@options[:content_type]}"
|
253
253
|
data << "Content-length: #{content.length}"
|
254
254
|
end
|
@@ -311,7 +311,9 @@ module Twitter
|
|
311
311
|
:token_secret => @options[:oauth][:access_secret]
|
312
312
|
}
|
313
313
|
|
314
|
-
|
314
|
+
data = ['POST', 'PUT'].include?(@options[:method]) ? params : {}
|
315
|
+
|
316
|
+
SimpleOAuth::Header.new(@options[:method], uri, data, oauth)
|
315
317
|
end
|
316
318
|
|
317
319
|
# Scheme (https if ssl, http otherwise) and host part of URL
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
$:.unshift File.expand_path("../../lib", __FILE__)
|
3
2
|
|
4
3
|
gem 'rspec', '>= 2.5.0'
|
5
4
|
require 'rspec'
|
@@ -51,4 +50,4 @@ end
|
|
51
50
|
def http_chunk(data)
|
52
51
|
# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1
|
53
52
|
"#{data.length.to_s(16)}\r\n#{data}\r\n"
|
54
|
-
end
|
53
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
1
|
+
require 'spec_helper.rb'
|
3
2
|
require 'twitter/json_stream'
|
4
3
|
|
5
4
|
include Twitter
|
@@ -24,7 +23,7 @@ describe JSONStream do
|
|
24
23
|
|
25
24
|
context "authentication" do
|
26
25
|
it "should connect with basic auth credentials" do
|
27
|
-
connect_stream :auth => "username:password"
|
26
|
+
connect_stream :auth => "username:password", :ssl => false
|
28
27
|
$recieved_data.should include('Authorization: Basic')
|
29
28
|
end
|
30
29
|
|
@@ -35,7 +34,7 @@ describe JSONStream do
|
|
35
34
|
:access_key => 'ohai',
|
36
35
|
:access_secret => 'ohno'
|
37
36
|
}
|
38
|
-
connect_stream :oauth => oauth
|
37
|
+
connect_stream :oauth => oauth, :ssl => false
|
39
38
|
$recieved_data.should include('Authorization: OAuth')
|
40
39
|
end
|
41
40
|
end
|
@@ -51,7 +50,7 @@ describe JSONStream do
|
|
51
50
|
it "should define default properties" do
|
52
51
|
EM.should_receive(:connect).with do |host, port, handler, opts|
|
53
52
|
host.should == 'stream.twitter.com'
|
54
|
-
port.should ==
|
53
|
+
port.should == 443
|
55
54
|
opts[:path].should == '/1/statuses/filter.json'
|
56
55
|
opts[:method].should == 'GET'
|
57
56
|
end
|
@@ -63,12 +62,19 @@ describe JSONStream do
|
|
63
62
|
host.should == 'my-proxy'
|
64
63
|
port.should == 8080
|
65
64
|
opts[:host].should == 'stream.twitter.com'
|
66
|
-
opts[:port].should ==
|
65
|
+
opts[:port].should == 443
|
67
66
|
opts[:proxy].should == 'http://my-proxy:8080'
|
68
67
|
end
|
69
68
|
stream = JSONStream.connect(:proxy => "http://my-proxy:8080") {}
|
70
69
|
end
|
71
70
|
|
71
|
+
it "should not trigger SSL until connection is established" do
|
72
|
+
connection = stub('connection')
|
73
|
+
EM.should_receive(:connect).and_return(connection)
|
74
|
+
stream = JSONStream.connect(:ssl => true)
|
75
|
+
stream.should == connection
|
76
|
+
end
|
77
|
+
|
72
78
|
end
|
73
79
|
|
74
80
|
context "on valid stream" do
|
@@ -76,46 +82,46 @@ describe JSONStream do
|
|
76
82
|
before :each do
|
77
83
|
$body = File.readlines(fixture_path("twitter/tweets.txt"))
|
78
84
|
$body.each {|tweet| tweet.strip!; tweet << "\r" }
|
79
|
-
$data_to_send = http_response(200,"OK",{}
|
85
|
+
$data_to_send = http_response(200, "OK", {}, $body)
|
80
86
|
$recieved_data = ''
|
81
87
|
$close_connection = false
|
82
88
|
end
|
83
89
|
|
84
90
|
it "should add no params" do
|
85
|
-
connect_stream
|
91
|
+
connect_stream :ssl => false
|
86
92
|
$recieved_data.should include('/1/statuses/filter.json HTTP')
|
87
93
|
end
|
88
94
|
|
89
95
|
it "should add custom params" do
|
90
|
-
connect_stream :params => {:name => 'test'}
|
96
|
+
connect_stream :params => {:name => 'test'}, :ssl => false
|
91
97
|
$recieved_data.should include('?name=test')
|
92
98
|
end
|
93
99
|
|
94
100
|
it "should parse headers" do
|
95
|
-
connect_stream
|
101
|
+
connect_stream :ssl => false
|
96
102
|
stream.code.should == 200
|
97
103
|
stream.headers.keys.map{|k| k.downcase}.should include('content-type')
|
98
104
|
end
|
99
105
|
|
100
106
|
it "should parse headers even after connection close" do
|
101
|
-
connect_stream
|
107
|
+
connect_stream :ssl => false
|
102
108
|
stream.code.should == 200
|
103
109
|
stream.headers.keys.map{|k| k.downcase}.should include('content-type')
|
104
110
|
end
|
105
111
|
|
106
112
|
it "should extract records" do
|
107
|
-
connect_stream :user_agent => 'TEST_USER_AGENT'
|
113
|
+
connect_stream :user_agent => 'TEST_USER_AGENT', :ssl => false
|
108
114
|
$recieved_data.upcase.should include('USER-AGENT: TEST_USER_AGENT')
|
109
115
|
end
|
110
116
|
|
111
117
|
it 'should allow custom headers' do
|
112
|
-
connect_stream :headers => { 'From' => 'twitter-stream' }
|
118
|
+
connect_stream :headers => { 'From' => 'twitter-stream' }, :ssl => false
|
113
119
|
$recieved_data.upcase.should include('FROM: TWITTER-STREAM')
|
114
120
|
end
|
115
121
|
|
116
122
|
it "should deliver each item" do
|
117
123
|
items = []
|
118
|
-
connect_stream do
|
124
|
+
connect_stream :ssl => false do
|
119
125
|
stream.each_item do |item|
|
120
126
|
items << item
|
121
127
|
end
|
@@ -198,6 +204,12 @@ describe JSONStream do
|
|
198
204
|
end
|
199
205
|
end
|
200
206
|
|
207
|
+
it "should reconnect with SSL if enabled" do
|
208
|
+
connect_stream :ssl => true do
|
209
|
+
stream.should_receive(:start_tls).twice
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
201
213
|
it_should_behave_like "network failure"
|
202
214
|
end
|
203
215
|
|
@@ -225,26 +237,26 @@ describe JSONStream do
|
|
225
237
|
end
|
226
238
|
|
227
239
|
it "should reconnect on application failure 10 at base" do
|
228
|
-
connect_stream do
|
240
|
+
connect_stream :ssl => false do
|
229
241
|
stream.should_receive(:reconnect_after).with(10)
|
230
242
|
end
|
231
243
|
end
|
232
244
|
|
233
245
|
it "should not reconnect on application failure 10 at base when not configured to auto reconnect" do
|
234
|
-
connect_stream
|
246
|
+
connect_stream :ssl => false, :auto_reconnect => false do
|
235
247
|
stream.should_receive(:reconnect_after).never
|
236
248
|
end
|
237
249
|
end
|
238
250
|
|
239
251
|
it "should reconnect with exponential timeout" do
|
240
|
-
connect_stream do
|
252
|
+
connect_stream :ssl => false do
|
241
253
|
stream.af_last_reconnect = 160
|
242
254
|
stream.should_receive(:reconnect_after).with(320)
|
243
255
|
end
|
244
256
|
end
|
245
257
|
|
246
258
|
it "should not try to reconnect after limit is reached" do
|
247
|
-
connect_stream do
|
259
|
+
connect_stream :ssl => false do
|
248
260
|
stream.af_last_reconnect = 320
|
249
261
|
stream.should_not_receive(:reconnect_after)
|
250
262
|
end
|
@@ -262,7 +274,7 @@ describe JSONStream do
|
|
262
274
|
body_chunks = ["{\"screen"+"_name\"",":\"user1\"}\r\r\r{","\"id\":9876}\r\r"]
|
263
275
|
$data_to_send = http_response(200,"OK",{},body_chunks)
|
264
276
|
items = []
|
265
|
-
connect_stream do
|
277
|
+
connect_stream :ssl => false do
|
266
278
|
stream.each_item do |item|
|
267
279
|
items << item
|
268
280
|
end
|
@@ -276,7 +288,7 @@ describe JSONStream do
|
|
276
288
|
body_chunks = ["{\"id\"",":1234}\r{","\"id\":9876}"]
|
277
289
|
$data_to_send = http_response(200,"OK",{},body_chunks)
|
278
290
|
items = []
|
279
|
-
connect_stream do
|
291
|
+
connect_stream :ssl => false do
|
280
292
|
stream.each_item do |item|
|
281
293
|
items << item
|
282
294
|
end
|
data/twitter-stream.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{twitter-stream}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.15"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Vladimir Kolesnikov"]
|
9
|
-
s.date = %q{
|
9
|
+
s.date = %q{2012-04-10}
|
10
10
|
s.description = %q{Simple Ruby client library for twitter streaming API. Uses EventMachine for connection handling. Adheres to twitter's reconnection guidline. JSON format only.}
|
11
11
|
s.summary = %q{Twitter realtime API client}
|
12
12
|
s.homepage = %q{http://github.com/voloko/twitter-stream}
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
|
18
18
|
|
19
19
|
s.rdoc_options = ["--charset=UTF-8"]
|
20
|
-
s.extra_rdoc_files = ["README.markdown"]
|
20
|
+
s.extra_rdoc_files = ["README.markdown", "LICENSE"]
|
21
21
|
|
22
22
|
s.add_runtime_dependency('eventmachine', ">= 0.12.8")
|
23
23
|
s.add_runtime_dependency('simple_oauth', '~> 0.1.4')
|
metadata
CHANGED
@@ -1,96 +1,70 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter-stream
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 14
|
10
|
-
version: 0.1.14
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.15
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Vladimir Kolesnikov
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-04-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: eventmachine
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70312242841020 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 63
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 12
|
33
|
-
- 8
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
34
21
|
version: 0.12.8
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: simple_oauth
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: *70312242841020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: simple_oauth
|
27
|
+
requirement: &70312242839900 !ruby/object:Gem::Requirement
|
41
28
|
none: false
|
42
|
-
requirements:
|
29
|
+
requirements:
|
43
30
|
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
hash: 19
|
46
|
-
segments:
|
47
|
-
- 0
|
48
|
-
- 1
|
49
|
-
- 4
|
31
|
+
- !ruby/object:Gem::Version
|
50
32
|
version: 0.1.4
|
51
33
|
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: http_parser.rb
|
55
34
|
prerelease: false
|
56
|
-
|
35
|
+
version_requirements: *70312242839900
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: http_parser.rb
|
38
|
+
requirement: &70312242838600 !ruby/object:Gem::Requirement
|
57
39
|
none: false
|
58
|
-
requirements:
|
40
|
+
requirements:
|
59
41
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 9
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 5
|
65
|
-
- 1
|
42
|
+
- !ruby/object:Gem::Version
|
66
43
|
version: 0.5.1
|
67
44
|
type: :runtime
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
45
|
prerelease: false
|
72
|
-
|
46
|
+
version_requirements: *70312242838600
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: &70312242837520 !ruby/object:Gem::Requirement
|
73
50
|
none: false
|
74
|
-
requirements:
|
51
|
+
requirements:
|
75
52
|
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
hash: 27
|
78
|
-
segments:
|
79
|
-
- 2
|
80
|
-
- 5
|
81
|
-
- 0
|
53
|
+
- !ruby/object:Gem::Version
|
82
54
|
version: 2.5.0
|
83
55
|
type: :development
|
84
|
-
|
85
|
-
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70312242837520
|
58
|
+
description: Simple Ruby client library for twitter streaming API. Uses EventMachine
|
59
|
+
for connection handling. Adheres to twitter's reconnection guidline. JSON format
|
60
|
+
only.
|
86
61
|
email: voloko@gmail.com
|
87
62
|
executables: []
|
88
|
-
|
89
63
|
extensions: []
|
90
|
-
|
91
|
-
extra_rdoc_files:
|
64
|
+
extra_rdoc_files:
|
92
65
|
- README.markdown
|
93
|
-
|
66
|
+
- LICENSE
|
67
|
+
files:
|
94
68
|
- .gemtest
|
95
69
|
- .gitignore
|
96
70
|
- .rspec
|
@@ -104,42 +78,32 @@ files:
|
|
104
78
|
- spec/spec_helper.rb
|
105
79
|
- spec/twitter/json_stream_spec.rb
|
106
80
|
- twitter-stream.gemspec
|
107
|
-
|
81
|
+
- LICENSE
|
108
82
|
homepage: http://github.com/voloko/twitter-stream
|
109
83
|
licenses: []
|
110
|
-
|
111
84
|
post_install_message:
|
112
|
-
rdoc_options:
|
85
|
+
rdoc_options:
|
113
86
|
- --charset=UTF-8
|
114
|
-
require_paths:
|
87
|
+
require_paths:
|
115
88
|
- lib
|
116
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
90
|
none: false
|
118
|
-
requirements:
|
119
|
-
- -
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
|
122
|
-
|
123
|
-
- 0
|
124
|
-
version: "0"
|
125
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
96
|
none: false
|
127
|
-
requirements:
|
128
|
-
- -
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
hash: 23
|
131
|
-
segments:
|
132
|
-
- 1
|
133
|
-
- 3
|
134
|
-
- 6
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
135
100
|
version: 1.3.6
|
136
101
|
requirements: []
|
137
|
-
|
138
102
|
rubyforge_project:
|
139
|
-
rubygems_version: 1.
|
103
|
+
rubygems_version: 1.8.15
|
140
104
|
signing_key:
|
141
105
|
specification_version: 3
|
142
106
|
summary: Twitter realtime API client
|
143
|
-
test_files:
|
107
|
+
test_files:
|
144
108
|
- spec/spec_helper.rb
|
145
109
|
- spec/twitter/json_stream_spec.rb
|