twitter-stream 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of twitter-stream might be problematic. Click here for more details.

data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -6,19 +6,19 @@ require 'roauth'
6
6
  module Twitter
7
7
  class JSONStream < EventMachine::Connection
8
8
  MAX_LINE_LENGTH = 1024*1024
9
-
9
+
10
10
  # network failure reconnections
11
- NF_RECONNECT_START = 0.25
11
+ NF_RECONNECT_START = 0.25
12
12
  NF_RECONNECT_ADD = 0.25
13
13
  NF_RECONNECT_MAX = 16
14
-
14
+
15
15
  # app failure reconnections
16
16
  AF_RECONNECT_START = 10
17
17
  AF_RECONNECT_MUL = 2
18
-
18
+
19
19
  RECONNECT_MAX = 320
20
20
  RETRIES_MAX = 10
21
-
21
+
22
22
  DEFAULT_OPTIONS = {
23
23
  :method => 'GET',
24
24
  :path => '/',
@@ -42,7 +42,7 @@ module Twitter
42
42
  attr_accessor :af_last_reconnect
43
43
  attr_accessor :reconnect_retries
44
44
  attr_accessor :proxy
45
-
45
+
46
46
  def self.connect options = {}
47
47
  options[:port] = 443 if options[:ssl] && !options.has_key?(:port)
48
48
  options = DEFAULT_OPTIONS.merge(options)
@@ -74,15 +74,15 @@ module Twitter
74
74
  def each_item &block
75
75
  @each_item_callback = block
76
76
  end
77
-
77
+
78
78
  def on_error &block
79
79
  @error_callback = block
80
80
  end
81
-
81
+
82
82
  def on_reconnect &block
83
83
  @reconnect_callback = block
84
84
  end
85
-
85
+
86
86
  def on_max_reconnects &block
87
87
  @max_reconnects_callback = block
88
88
  end
@@ -97,7 +97,7 @@ module Twitter
97
97
  @gracefully_closed = false
98
98
  close_connection
99
99
  end
100
-
100
+
101
101
  def unbind
102
102
  receive_line(@buffer.flush) unless @buffer.empty?
103
103
  schedule_reconnect unless @gracefully_closed
@@ -114,26 +114,26 @@ module Twitter
114
114
  return
115
115
  end
116
116
  end
117
-
117
+
118
118
  def connection_completed
119
119
  send_request
120
120
  end
121
-
121
+
122
122
  def post_init
123
123
  reset_state
124
124
  end
125
-
125
+
126
126
  protected
127
127
  def schedule_reconnect
128
128
  timeout = reconnect_timeout
129
129
  @reconnect_retries += 1
130
130
  if timeout <= RECONNECT_MAX && @reconnect_retries <= RETRIES_MAX
131
- reconnect_after(timeout)
131
+ reconnect_after(timeout)
132
132
  else
133
133
  @max_reconnects_callback.call(timeout, @reconnect_retries) if @max_reconnects_callback
134
134
  end
135
135
  end
136
-
136
+
137
137
  def reconnect_after timeout
138
138
  @reconnect_callback.call(timeout, @reconnect_retries) if @reconnect_callback
139
139
 
@@ -145,13 +145,13 @@ module Twitter
145
145
  end
146
146
  end
147
147
  end
148
-
148
+
149
149
  def reconnect_timeout
150
150
  if @immediate_reconnect
151
151
  @immediate_reconnect = false
152
152
  return 0
153
153
  end
154
-
154
+
155
155
  if (@code == 0) # network failure
156
156
  if @nf_last_reconnect
157
157
  @nf_last_reconnect += NF_RECONNECT_ADD
@@ -168,7 +168,7 @@ module Twitter
168
168
  @af_last_reconnect
169
169
  end
170
170
  end
171
-
171
+
172
172
  def reset_state
173
173
  set_comm_inactivity_timeout @options[:timeout] if @options[:timeout] > 0
174
174
  @code = 0
@@ -180,32 +180,33 @@ module Twitter
180
180
  def send_request
181
181
  data = []
182
182
  request_uri = @options[:path]
183
-
183
+
184
184
  if @proxy
185
185
  # proxies need the request to be for the full url
186
186
  request_uri = "http#{'s' if @options[:ssl]}://#{@options[:host]}:#{@options[:port]}#{request_uri}"
187
187
  end
188
-
188
+
189
189
  content = @options[:content]
190
-
190
+
191
191
  if !@options[:filters].empty?
192
192
  if @options[:method].to_s.upcase == 'GET'
193
- request_uri << "?#{filter_list}"
193
+ request_uri << "?#{query}"
194
194
  else
195
- content = filter_list
195
+ content = query
196
196
  end
197
197
  end
198
-
198
+
199
199
  data << "#{@options[:method]} #{request_uri} HTTP/1.1"
200
200
  data << "Host: #{@options[:host]}"
201
+ data << 'Accept: */*'
201
202
  data << "User-Agent: #{@options[:user_agent]}" if @options[:user_agent]
202
-
203
+
203
204
  if @options[:auth]
204
205
  data << "Authorization: Basic #{[@options[:auth]].pack('m').delete("\r\n")}"
205
206
  elsif @options[:oauth]
206
207
  data << "Authorization: #{oauth_header}"
207
208
  end
208
-
209
+
209
210
  if @proxy && @proxy.user
210
211
  data << "Proxy-Authorization: Basic " + ["#{@proxy.user}:#{@proxy.password}"].pack('m').delete("\r\n")
211
212
  end
@@ -214,7 +215,7 @@ module Twitter
214
215
  data << "Content-length: #{content.length}"
215
216
  end
216
217
  data << "\r\n"
217
-
218
+
218
219
  send_data data.join("\r\n") << content
219
220
  end
220
221
 
@@ -262,12 +263,12 @@ module Twitter
262
263
  close_connection
263
264
  end
264
265
  end
265
-
266
+
266
267
  def reset_timeouts
267
268
  @nf_last_reconnect = @af_last_reconnect = nil
268
269
  @reconnect_retries = 0
269
270
  end
270
-
271
+
271
272
  # :filters => %w(miama lebron jesus)
272
273
  # :oauth => {
273
274
  # :consumer_key => [key],
@@ -277,17 +278,21 @@ module Twitter
277
278
  # }
278
279
  def oauth_header
279
280
  uri = "http://#{@options[:host]}#{@options[:path]}"
280
-
281
- params = {
282
- 'track' => @options[:filters].join(',')
283
- }
284
-
285
281
  ::ROAuth.header(@options[:oauth], uri, params, @options[:method])
286
282
  end
287
-
288
- def filter_list
289
- "track=#{@options[:filters].join(',')}"
283
+
284
+ # Normalized query hash of escaped string keys and escaped string values
285
+ # nil values are skipped
286
+ def params
287
+ { 'track' => escape(@options[:filters].join(",")) }
290
288
  end
291
289
 
292
- end
290
+ def query
291
+ params.map{|pair| pair.join("=")}.sort.join("&")
292
+ end
293
+
294
+ def escape str
295
+ URI.escape(str.to_s, /[^a-zA-Z0-9\-\.\_\~]/)
296
+ end
297
+ end
293
298
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{twitter-stream}
8
- s.version = "0.1.7"
8
+ s.version = "0.1.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Vladimir Kolesnikov"]
12
- s.date = %q{2010-08-02}
12
+ s.date = %q{2010-08-13}
13
13
  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.}
14
14
  s.email = %q{voloko@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.homepage = %q{http://github.com/voloko/twitter-stream}
31
31
  s.rdoc_options = ["--charset=UTF-8"]
32
32
  s.require_paths = ["lib"]
33
- s.rubygems_version = %q{1.3.6}
33
+ s.rubygems_version = %q{1.3.7}
34
34
  s.summary = %q{Twitter realtime API client}
35
35
  s.test_files = [
36
36
  "spec/spec_helper.rb",
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
42
42
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
43
  s.specification_version = 3
44
44
 
45
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
45
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
46
  s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.8"])
47
47
  s.add_runtime_dependency(%q<roauth>, [">= 0.0.2"])
48
48
  s.add_development_dependency(%q<rspec>, [">= 1.2.8"])
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter-stream
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 11
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- - 7
9
- version: 0.1.7
9
+ - 8
10
+ version: 0.1.8
10
11
  platform: ruby
11
12
  authors:
12
13
  - Vladimir Kolesnikov
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-08-02 00:00:00 +04:00
18
+ date: 2010-08-13 00:00:00 +04:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: eventmachine
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 63
27
30
  segments:
28
31
  - 0
29
32
  - 12
@@ -35,9 +38,11 @@ dependencies:
35
38
  name: roauth
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ">="
40
44
  - !ruby/object:Gem::Version
45
+ hash: 27
41
46
  segments:
42
47
  - 0
43
48
  - 0
@@ -49,9 +54,11 @@ dependencies:
49
54
  name: rspec
50
55
  prerelease: false
51
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
52
58
  requirements:
53
59
  - - ">="
54
60
  - !ruby/object:Gem::Version
61
+ hash: 15
55
62
  segments:
56
63
  - 1
57
64
  - 2
@@ -88,23 +95,27 @@ rdoc_options:
88
95
  require_paths:
89
96
  - lib
90
97
  required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
91
99
  requirements:
92
100
  - - ">="
93
101
  - !ruby/object:Gem::Version
102
+ hash: 3
94
103
  segments:
95
104
  - 0
96
105
  version: "0"
97
106
  required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
98
108
  requirements:
99
109
  - - ">="
100
110
  - !ruby/object:Gem::Version
111
+ hash: 3
101
112
  segments:
102
113
  - 0
103
114
  version: "0"
104
115
  requirements: []
105
116
 
106
117
  rubyforge_project:
107
- rubygems_version: 1.3.6
118
+ rubygems_version: 1.3.7
108
119
  signing_key:
109
120
  specification_version: 3
110
121
  summary: Twitter realtime API client