nervion 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +46 -0
  6. data/LICENSE +22 -0
  7. data/README.md +197 -0
  8. data/Rakefile +22 -0
  9. data/features/step_definitions/streaming_steps.rb +55 -0
  10. data/features/streaming.feature +16 -0
  11. data/features/support/env.rb +9 -0
  12. data/features/support/streaming_api_double.rb +45 -0
  13. data/fixtures/responses.rb +53 -0
  14. data/fixtures/stream.txt +100 -0
  15. data/lib/nervion.rb +4 -0
  16. data/lib/nervion/callback_table.rb +30 -0
  17. data/lib/nervion/client.rb +23 -0
  18. data/lib/nervion/configuration.rb +50 -0
  19. data/lib/nervion/facade.rb +54 -0
  20. data/lib/nervion/http_parser.rb +62 -0
  21. data/lib/nervion/oauth_header.rb +88 -0
  22. data/lib/nervion/oauth_signature.rb +54 -0
  23. data/lib/nervion/percent_encoder.rb +11 -0
  24. data/lib/nervion/reconnection_scheduler.rb +96 -0
  25. data/lib/nervion/request.rb +99 -0
  26. data/lib/nervion/stream.rb +64 -0
  27. data/lib/nervion/stream_handler.rb +42 -0
  28. data/lib/nervion/version.rb +3 -0
  29. data/nervion.gemspec +24 -0
  30. data/spec/nervion/callback_table_spec.rb +18 -0
  31. data/spec/nervion/client_spec.rb +51 -0
  32. data/spec/nervion/configuration_spec.rb +58 -0
  33. data/spec/nervion/facade_spec.rb +90 -0
  34. data/spec/nervion/http_parser_spec.rb +26 -0
  35. data/spec/nervion/oauth_header_spec.rb +115 -0
  36. data/spec/nervion/oauth_signature_spec.rb +66 -0
  37. data/spec/nervion/percent_encoder_spec.rb +20 -0
  38. data/spec/nervion/reconnection_scheduler_spec.rb +84 -0
  39. data/spec/nervion/request_spec.rb +90 -0
  40. data/spec/nervion/stream_handler_spec.rb +67 -0
  41. data/spec/nervion/stream_spec.rb +97 -0
  42. data/spec/spec_helper.rb +4 -0
  43. metadata +200 -0
@@ -0,0 +1,67 @@
1
+ require 'nervion/stream_handler'
2
+
3
+ describe Nervion::StreamHandler do
4
+ subject { described_class.new callbacks }
5
+ let(:http_parser) { mock(:http_parser).as_null_object }
6
+ let(:json_parser) { mock(:json_parser).as_null_object }
7
+
8
+ let(:callbacks) do
9
+ {
10
+ status: status_callback,
11
+ http_error: http_error_callback,
12
+ network_error: network_error_callback
13
+ }
14
+ end
15
+
16
+ let(:status_callback) { mock :status_callback }
17
+ let(:http_error_callback) { mock(:http_error_callback).as_null_object }
18
+ let(:network_error_callback) { mock(:network_error_callback).as_null_object }
19
+
20
+ before do
21
+ Yajl::Parser.stub(:new).with(symbolize_keys: true).and_return(json_parser)
22
+ Nervion::HttpParser.stub(:new).with(json_parser).and_return(http_parser)
23
+ end
24
+
25
+ it 'sets up the status received callback' do
26
+ json_parser.should_receive(:on_parse_complete=).with(status_callback)
27
+ described_class.new callbacks
28
+ end
29
+
30
+ it 'appends the received data to the http parser' do
31
+ data = stub
32
+ http_parser.should_receive(:<<).with(data)
33
+ subject << data
34
+ end
35
+
36
+ it 'can be told to close the stream' do
37
+ subject.stream_close_requested?.should be_false
38
+ subject.close_stream
39
+ subject.stream_close_requested?.should be_true
40
+ end
41
+
42
+ context 'handling HTTP errors' do
43
+ let(:http_error) { stub(:http_error, status: 401, body: 'Unauthorized') }
44
+
45
+ it 'resets the HTTP parser' do
46
+ http_parser.should_receive(:reset!)
47
+ subject.handle_http_error http_error
48
+ end
49
+
50
+ it 'calls the HTTP error callback' do
51
+ http_error_callback.should_receive(:call).with(401, 'Unauthorized')
52
+ subject.handle_http_error http_error
53
+ end
54
+ end
55
+
56
+ context 'handling network errors' do
57
+ it 'resets the HTTP parser' do
58
+ http_parser.should_receive(:reset!)
59
+ subject.handle_network_error
60
+ end
61
+
62
+ it 'calls the network error callback' do
63
+ network_error_callback.should_receive(:call)
64
+ subject.handle_network_error
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,97 @@
1
+ require 'nervion/stream'
2
+
3
+ describe Nervion::Stream do
4
+ subject { described_class.new :signature, request, handler }
5
+ let(:request) { stub(:request, host: 'host', port: 443) }
6
+ let(:handler) { mock :handler }
7
+ let(:scheduler) { mock :reconnection_scheduler }
8
+ let(:http_error) { Nervion::HttpError.new(401, 'Unauthorized') }
9
+
10
+ before { Nervion::ReconnectionScheduler.stub(:new).and_return(scheduler) }
11
+
12
+ it 'starts TLS encription' do
13
+ subject.stub(:send_data)
14
+ subject.should_receive(:start_tls)
15
+ subject.connection_completed
16
+ end
17
+
18
+ it 'sends the request' do
19
+ subject.stub(:start_tls)
20
+ subject.should_receive(:send_data).with(request)
21
+ subject.connection_completed
22
+ end
23
+
24
+ it 'handles received data' do
25
+ data = stub
26
+ handler.should_receive(:<<).with(data)
27
+ subject.receive_data(data)
28
+ end
29
+
30
+ it 'registers HTTP errors' do
31
+ handler.stub(:<<).and_raise http_error
32
+ subject.receive_data('some random data')
33
+ subject.http_error.should be http_error
34
+ end
35
+
36
+ it 'clears HTTP errors before retries' do
37
+ subject.stub(:reconnect)
38
+ handler.stub(:<<).and_raise http_error
39
+ subject.receive_data('some random data')
40
+ subject.retry
41
+ subject.http_error.should be_nil
42
+ end
43
+
44
+ it 'knows how to retry' do
45
+ subject.should_receive(:reconnect).with('host', 443)
46
+ subject.retry
47
+ end
48
+
49
+ context 'on unbound connections' do
50
+ context 'due to HTTP errors' do
51
+ before do
52
+ handler.stub(:stream_close_requested?).and_return(false)
53
+ subject.stub(:http_error).and_return(http_error)
54
+ end
55
+
56
+ it 'notifies the error' do
57
+ handler.should_receive(:handle_http_error).with(http_error)
58
+ scheduler.stub(:reconnect_after_http_error_in)
59
+ subject.unbind
60
+ end
61
+
62
+ it 'schedules a retry' do
63
+ handler.stub(:handle_http_error)
64
+ scheduler.should_receive(:reconnect_after_http_error_in).with(subject)
65
+ subject.unbind
66
+ end
67
+ end
68
+
69
+ context 'due to network errors' do
70
+ before { handler.stub(:stream_close_requested?).and_return(false) }
71
+
72
+ it 'notifies the error' do
73
+ handler.should_receive(:handle_network_error)
74
+ scheduler.stub(:reconnect_after_network_error_in)
75
+ subject.unbind
76
+ end
77
+
78
+ it 'schedules a retry' do
79
+ handler.stub(:handle_network_error)
80
+ scheduler.should_receive(:reconnect_after_network_error_in).with(subject)
81
+ subject.unbind
82
+ end
83
+ end
84
+
85
+ context 'due to a request to close the stream' do
86
+ it 'lets the stream to be closed' do
87
+ handler.stub(:stream_close_requested?).and_return(true)
88
+ handler.should_not_receive(:handle_http_error)
89
+ handler.should_not_receive(:handle_network_error)
90
+ scheduler.should_not_receive(:reconnect_after_http_error_in)
91
+ scheduler.should_not_receive(:reconnect_after_network_error_in)
92
+ subject.unbind
93
+ end
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,4 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nervion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Javier Acero
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0.beta.4
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0.beta.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: http_parser.rb
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.5.3
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.5.3
46
+ - !ruby/object:Gem::Dependency
47
+ name: yajl-ruby
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.1.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.1.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: cucumber
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: simplecov
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: A minimalistic Twitter Stream API Ruby client
111
+ email:
112
+ - j4cegu@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .rspec
119
+ - .rvmrc
120
+ - Gemfile
121
+ - Gemfile.lock
122
+ - LICENSE
123
+ - README.md
124
+ - Rakefile
125
+ - features/step_definitions/streaming_steps.rb
126
+ - features/streaming.feature
127
+ - features/support/env.rb
128
+ - features/support/streaming_api_double.rb
129
+ - fixtures/responses.rb
130
+ - fixtures/stream.txt
131
+ - lib/nervion.rb
132
+ - lib/nervion/callback_table.rb
133
+ - lib/nervion/client.rb
134
+ - lib/nervion/configuration.rb
135
+ - lib/nervion/facade.rb
136
+ - lib/nervion/http_parser.rb
137
+ - lib/nervion/oauth_header.rb
138
+ - lib/nervion/oauth_signature.rb
139
+ - lib/nervion/percent_encoder.rb
140
+ - lib/nervion/reconnection_scheduler.rb
141
+ - lib/nervion/request.rb
142
+ - lib/nervion/stream.rb
143
+ - lib/nervion/stream_handler.rb
144
+ - lib/nervion/version.rb
145
+ - nervion.gemspec
146
+ - spec/nervion/callback_table_spec.rb
147
+ - spec/nervion/client_spec.rb
148
+ - spec/nervion/configuration_spec.rb
149
+ - spec/nervion/facade_spec.rb
150
+ - spec/nervion/http_parser_spec.rb
151
+ - spec/nervion/oauth_header_spec.rb
152
+ - spec/nervion/oauth_signature_spec.rb
153
+ - spec/nervion/percent_encoder_spec.rb
154
+ - spec/nervion/reconnection_scheduler_spec.rb
155
+ - spec/nervion/request_spec.rb
156
+ - spec/nervion/stream_handler_spec.rb
157
+ - spec/nervion/stream_spec.rb
158
+ - spec/spec_helper.rb
159
+ homepage: https://github.com/jacegu/nervion
160
+ licenses: []
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ! '>='
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 1.8.24
180
+ signing_key:
181
+ specification_version: 3
182
+ summary: ''
183
+ test_files:
184
+ - features/step_definitions/streaming_steps.rb
185
+ - features/streaming.feature
186
+ - features/support/env.rb
187
+ - features/support/streaming_api_double.rb
188
+ - spec/nervion/callback_table_spec.rb
189
+ - spec/nervion/client_spec.rb
190
+ - spec/nervion/configuration_spec.rb
191
+ - spec/nervion/facade_spec.rb
192
+ - spec/nervion/http_parser_spec.rb
193
+ - spec/nervion/oauth_header_spec.rb
194
+ - spec/nervion/oauth_signature_spec.rb
195
+ - spec/nervion/percent_encoder_spec.rb
196
+ - spec/nervion/reconnection_scheduler_spec.rb
197
+ - spec/nervion/request_spec.rb
198
+ - spec/nervion/stream_handler_spec.rb
199
+ - spec/nervion/stream_spec.rb
200
+ - spec/spec_helper.rb