sinapse 0.1.0

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.
@@ -0,0 +1,70 @@
1
+ require 'em-http-request'
2
+
3
+ module Goliath
4
+ module TestHelper
5
+ class EventSourceHelper
6
+ attr_reader :connection
7
+
8
+ def initialize(url, request_data = {})
9
+ @header = EM::Queue.new
10
+ @queue = EM::Queue.new
11
+
12
+ @connection = EM::HttpRequest.new(url).aget(request_data)
13
+
14
+ @connection.errback do |e|
15
+ if e.response_header.status >= 400
16
+ EM.stop_event_loop
17
+ raise "Error encountered during HTTP connection (#{e.response_header.status}): #{e}"
18
+ end
19
+ end
20
+
21
+ @connection.callback { EM.stop_event_loop }
22
+ @connection.headers { |h| @header.push(h) }
23
+ @connection.stream { |m| @queue.push(m) }
24
+ end
25
+
26
+ def headers
27
+ return @headers unless @headers.nil?
28
+
29
+ fiber = Fiber.current
30
+ @header.pop do |h|
31
+ @headers = h
32
+ fiber.resume(h)
33
+ end
34
+ Fiber.yield
35
+ end
36
+
37
+ def receive
38
+ fiber = Fiber.current
39
+ @queue.pop { |m| fiber.resume(m) }
40
+ Fiber.yield
41
+ end
42
+
43
+ def close
44
+ @connection.close
45
+ end
46
+ end
47
+
48
+ def aget_request(request_data = {}, &blk)
49
+ url = "http://localhost:#{@test_server_port}/"
50
+ client = EventSourceHelper.new(url, request_data)
51
+ blk.call(client) if blk
52
+ end
53
+
54
+ def sse_connect(query_params = nil, &blk)
55
+ query_params ||= {}
56
+ query_params[:query] ||= { access_token: 'valid' }
57
+
58
+ with_api(Sinapse::Server, { verbose: true, log_stdout: true }) do |server|
59
+ aget_request(query_params) do |client|
60
+ begin
61
+ blk.call(client) if blk
62
+ ensure
63
+ EM.stop_event_loop
64
+ EM.stop # ensures that we don't leak the Goliath server on failed assertions
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,13 @@
1
+ require 'goliath/test_helper'
2
+
3
+ Goliath.env = RACK_ENV
4
+
5
+ module Goliath
6
+ module TestHelper
7
+ def connect(query_params = nil, &blk)
8
+ with_api(Sinapse::Server) do
9
+ get_request(query_params, &blk)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ require 'msgpack'
2
+
3
+ module RedisTestHelper
4
+ def redis
5
+ @redis ||= Redis.new(driver: 'synchrony', url: Sinapse.config[:url])
6
+ end
7
+
8
+ def publish_until_received
9
+ EM.next_tick do
10
+ notify = lambda do
11
+ EM.next_tick { notify.call if yield == 0 }
12
+ end
13
+ notify.call
14
+ end
15
+ end
16
+
17
+ def wait_for_message(pattern)
18
+ EM.synchrony do
19
+ redis.psubscribe(pattern) do |on|
20
+ on.pmessage do |key, channel, data|
21
+ begin
22
+ data = MessagePack.unpack(data)
23
+ rescue MessagePack::MalformedFormatError
24
+ end
25
+ yield(channel, data)
26
+ redis.punsubscribe
27
+ end
28
+ end
29
+ EM.stop
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ require 'timeout'
2
+
3
+ class Minitest::Spec
4
+ def self.it(desc = 'anonymous', &block) # :nodoc:
5
+ return super unless block
6
+ super(desc) { Timeout.timeout(2) { self.instance_eval(&block) } }
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ $:.unshift File.expand_path("../../lib", File.realpath(__FILE__))
2
+ RACK_ENV ||= ENV['RACK_ENV'] ||= 'test'
3
+
4
+ require 'bundler/setup'
5
+ require 'minitest/autorun'
6
+ require 'minitest/reporters'
7
+ require 'sinapse'
8
+ require 'sinapse/server'
9
+
10
+ require_relative 'support/redis'
11
+ require_relative 'support/timeout'
12
+ require_relative 'support/goliath'
13
+ require_relative 'support/event_source'
14
+
15
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
16
+
17
+ class User < Struct.new(:id)
18
+ include Sinapse
19
+ def to_param; id.to_s; end
20
+ end
21
+
22
+ class Admin < Struct.new(:id)
23
+ include Sinapse
24
+ def to_param; id.to_s; end
25
+ end
26
+
27
+ class Room < Struct.new(:id)
28
+ include Sinapse::Publishable
29
+ def to_param; id.to_s; end
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,262 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinapse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Julien Portalier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZqdWxp
14
+ ZW4xGTAXBgoJkiaJk/IsZAEZFglwb3J0YWxpZXIxEzARBgoJkiaJk/IsZAEZFgNj
15
+ b20wHhcNMTQwMTE0MjIzMTQ4WhcNMTUwMTE0MjIzMTQ4WjBBMQ8wDQYDVQQDDAZq
16
+ dWxpZW4xGTAXBgoJkiaJk/IsZAEZFglwb3J0YWxpZXIxEzARBgoJkiaJk/IsZAEZ
17
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpxWuWRJXEz2+p
18
+ 2EW4NOPzkKloRLWoj+WQnqhQKT46GbH3ToDId8AMELTDIKpTQFiG2ty6D7S4IBFv
19
+ 7ceFKNk/EJc17mSYE1DzrtItor2/eeGC1zeNfvLjyDtyHKyKUZ891C1D0so5coUx
20
+ 2YbDW5npFkJkPaA5GneH7DFaCoIFLrD7ekbzaZAjlH+EH2fhd1XLhSsPEIiE+OnD
21
+ ilWnsPoRJAZwQOiVAtvh7xuc+29uSNndIIm2rU00SxbJnzsAq9ZddwPpMU/UcQpD
22
+ 4gCBCaNGzrLz4+upQdYEOuggM7rR3P934qfhIwb+aRGglqdNunmUrdCuhsGXrxq2
23
+ FvqwDvFZAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
24
+ BBQoESDCnNz3LmbpUzOrGeXOpk9sqjAfBgNVHREEGDAWgRRqdWxpZW5AcG9ydGFs
25
+ aWVyLmNvbTAfBgNVHRIEGDAWgRRqdWxpZW5AcG9ydGFsaWVyLmNvbTANBgkqhkiG
26
+ 9w0BAQUFAAOCAQEAML4w0F/VF0gi5JqMqYSO05TakAauG8jQX0hov5H8M0Xhl79G
27
+ BdUllH0QEw0cP6J2g46zAk0FGHIGthx0OKKi5YMYTs/KPqOVIAcJslt2sGIC1Ukm
28
+ wpOWIg1XMe68+JVTktBKcBFAvc0pLtty1TgdSd2wr7KQgfmBU9I8G6AoPYhJOhkG
29
+ SHTTSX3ms2/XePuSnyOfir/AQC7U0NalnKLNdwY9gkEdNwiTf5Ga/lZVDQ607bow
30
+ KVqCN//9bevjMk5OiMi9X3Wu/GtVWDwC6OTWFWKd54KgbuWlakO8LC1SMmStnCIF
31
+ W4qpyMWMZMcB4ZN/0mUVzY5xwrislBtsmQVUSw==
32
+ -----END CERTIFICATE-----
33
+ date: 2014-05-14 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: goliath
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 1.0.3
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 1.0.3
49
+ - !ruby/object:Gem::Dependency
50
+ name: redis
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 3.0.6
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.0.6
63
+ - !ruby/object:Gem::Dependency
64
+ name: hiredis
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ - !ruby/object:Gem::Dependency
78
+ name: connection_pool
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ - !ruby/object:Gem::Dependency
92
+ name: msgpack
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 0.5.0
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 0.5.0
105
+ - !ruby/object:Gem::Dependency
106
+ name: activesupport
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 3.0.0
112
+ type: :runtime
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 3.0.0
119
+ - !ruby/object:Gem::Dependency
120
+ name: bundler
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ type: :development
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ - !ruby/object:Gem::Dependency
134
+ name: rake
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ type: :development
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ - !ruby/object:Gem::Dependency
148
+ name: em-http-request
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - !ruby/object:Gem::Dependency
162
+ name: minitest
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 5.2.0
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: 5.2.0
175
+ - !ruby/object:Gem::Dependency
176
+ name: minitest-reporters
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ description: An EventSource push service for Ruby
190
+ email:
191
+ - julien@portalier.com
192
+ executables:
193
+ - sinapse
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - ".travis.yml"
198
+ - Gemfile
199
+ - Gemfile.lock
200
+ - LICENSE
201
+ - README.md
202
+ - Rakefile
203
+ - VERSION
204
+ - bin/sinapse
205
+ - certs/ysbaddaden.pem
206
+ - config/rainbows.rb
207
+ - ext/mkrf_conf.rb
208
+ - lib/sinapse.rb
209
+ - lib/sinapse/authentication.rb
210
+ - lib/sinapse/channels.rb
211
+ - lib/sinapse/config.rb
212
+ - lib/sinapse/cross_origin_resource_sharing.rb
213
+ - lib/sinapse/keep_alive.rb
214
+ - lib/sinapse/publishable.rb
215
+ - lib/sinapse/server.rb
216
+ - lib/sinapse/version.rb
217
+ - sinapse.gemspec
218
+ - test/authentication_test.rb
219
+ - test/channels_test.rb
220
+ - test/cross_origin_resource_sharing_test.rb
221
+ - test/publishable_test.rb
222
+ - test/server_test.rb
223
+ - test/support/event_source.rb
224
+ - test/support/goliath.rb
225
+ - test/support/redis.rb
226
+ - test/support/timeout.rb
227
+ - test/test_helper.rb
228
+ homepage: http://github.com/ysbaddaden/sinapse
229
+ licenses:
230
+ - MIT
231
+ metadata: {}
232
+ post_install_message:
233
+ rdoc_options: []
234
+ require_paths:
235
+ - lib
236
+ required_ruby_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ requirements: []
247
+ rubyforge_project:
248
+ rubygems_version: 2.2.2
249
+ signing_key:
250
+ specification_version: 4
251
+ summary: An EventSource push service for Ruby
252
+ test_files:
253
+ - test/authentication_test.rb
254
+ - test/channels_test.rb
255
+ - test/cross_origin_resource_sharing_test.rb
256
+ - test/publishable_test.rb
257
+ - test/server_test.rb
258
+ - test/support/event_source.rb
259
+ - test/support/goliath.rb
260
+ - test/support/redis.rb
261
+ - test/support/timeout.rb
262
+ - test/test_helper.rb
Binary file