bushido-faye 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/History.txt +247 -0
  2. data/README.rdoc +92 -0
  3. data/lib/faye-browser-min.js +1 -0
  4. data/lib/faye.rb +121 -0
  5. data/lib/faye/adapters/rack_adapter.rb +209 -0
  6. data/lib/faye/engines/connection.rb +60 -0
  7. data/lib/faye/engines/memory.rb +112 -0
  8. data/lib/faye/engines/proxy.rb +111 -0
  9. data/lib/faye/error.rb +49 -0
  10. data/lib/faye/mixins/logging.rb +47 -0
  11. data/lib/faye/mixins/publisher.rb +30 -0
  12. data/lib/faye/mixins/timeouts.rb +22 -0
  13. data/lib/faye/protocol/channel.rb +124 -0
  14. data/lib/faye/protocol/client.rb +378 -0
  15. data/lib/faye/protocol/extensible.rb +43 -0
  16. data/lib/faye/protocol/grammar.rb +58 -0
  17. data/lib/faye/protocol/publication.rb +5 -0
  18. data/lib/faye/protocol/server.rb +282 -0
  19. data/lib/faye/protocol/subscription.rb +24 -0
  20. data/lib/faye/transport/http.rb +76 -0
  21. data/lib/faye/transport/local.rb +22 -0
  22. data/lib/faye/transport/transport.rb +115 -0
  23. data/lib/faye/transport/web_socket.rb +99 -0
  24. data/lib/faye/util/namespace.rb +20 -0
  25. data/spec/browser.html +45 -0
  26. data/spec/encoding_helper.rb +7 -0
  27. data/spec/install.sh +78 -0
  28. data/spec/javascript/channel_spec.js +15 -0
  29. data/spec/javascript/client_spec.js +714 -0
  30. data/spec/javascript/engine/memory_spec.js +7 -0
  31. data/spec/javascript/engine_spec.js +417 -0
  32. data/spec/javascript/faye_spec.js +15 -0
  33. data/spec/javascript/grammar_spec.js +66 -0
  34. data/spec/javascript/node_adapter_spec.js +307 -0
  35. data/spec/javascript/publisher_spec.js +27 -0
  36. data/spec/javascript/server/connect_spec.js +168 -0
  37. data/spec/javascript/server/disconnect_spec.js +121 -0
  38. data/spec/javascript/server/extensions_spec.js +60 -0
  39. data/spec/javascript/server/handshake_spec.js +145 -0
  40. data/spec/javascript/server/integration_spec.js +124 -0
  41. data/spec/javascript/server/publish_spec.js +85 -0
  42. data/spec/javascript/server/subscribe_spec.js +247 -0
  43. data/spec/javascript/server/unsubscribe_spec.js +245 -0
  44. data/spec/javascript/server_spec.js +110 -0
  45. data/spec/javascript/transport_spec.js +130 -0
  46. data/spec/node.js +55 -0
  47. data/spec/phantom.js +17 -0
  48. data/spec/ruby/channel_spec.rb +17 -0
  49. data/spec/ruby/client_spec.rb +724 -0
  50. data/spec/ruby/engine/memory_spec.rb +7 -0
  51. data/spec/ruby/engine_examples.rb +427 -0
  52. data/spec/ruby/faye_spec.rb +14 -0
  53. data/spec/ruby/grammar_spec.rb +68 -0
  54. data/spec/ruby/publisher_spec.rb +27 -0
  55. data/spec/ruby/rack_adapter_spec.rb +236 -0
  56. data/spec/ruby/server/connect_spec.rb +170 -0
  57. data/spec/ruby/server/disconnect_spec.rb +120 -0
  58. data/spec/ruby/server/extensions_spec.rb +68 -0
  59. data/spec/ruby/server/handshake_spec.rb +143 -0
  60. data/spec/ruby/server/integration_spec.rb +126 -0
  61. data/spec/ruby/server/publish_spec.rb +81 -0
  62. data/spec/ruby/server/subscribe_spec.rb +247 -0
  63. data/spec/ruby/server/unsubscribe_spec.rb +247 -0
  64. data/spec/ruby/server_spec.rb +110 -0
  65. data/spec/ruby/transport_spec.rb +134 -0
  66. data/spec/spec_helper.rb +11 -0
  67. data/spec/testswarm +29 -0
  68. data/spec/thin_proxy.rb +37 -0
  69. metadata +302 -0
@@ -0,0 +1,110 @@
1
+ require "spec_helper"
2
+
3
+ describe Faye::Server do
4
+ let(:engine) { mock "engine" }
5
+ let(:server) { Faye::Server.new }
6
+
7
+ before do
8
+ Faye::Engine.stub(:get).and_return engine
9
+ end
10
+
11
+ describe :process do
12
+ let(:handshake) {{"channel" => "/meta/handshake", "data" => "handshake" }}
13
+ let(:connect) {{"channel" => "/meta/connect", "data" => "connect" }}
14
+ let(:disconnect) {{"channel" => "/meta/disconnect", "data" => "disconnect" }}
15
+ let(:subscribe) {{"channel" => "/meta/subscribe", "data" => "subscribe" }}
16
+ let(:unsubscribe) {{"channel" => "/meta/unsubscribe", "data" => "unsubscribe"}}
17
+ let(:publish) {{"channel" => "/some/channel", "data" => "publish" }}
18
+
19
+ before do
20
+ engine.stub(:interval).and_return(0)
21
+ engine.stub(:timeout).and_return(60)
22
+ end
23
+
24
+ it "returns an empty response for no messages" do
25
+ response = nil
26
+ server.process([], false) { |r| response = r }
27
+ response.should == []
28
+ end
29
+
30
+ it "ignores invalid messages" do
31
+ response = nil
32
+ server.process([{}, {"channel" => "invalid"}], false) { |r| response = r }
33
+ response.should == [
34
+ { "successful" => false,
35
+ "error" => "405::Invalid channel"
36
+ },
37
+ { "channel" => "invalid",
38
+ "successful" => false,
39
+ "error" =>"405:invalid:Invalid channel"
40
+ }
41
+ ]
42
+ end
43
+
44
+ it "routes single messages to appropriate handlers" do
45
+ server.should_receive(:handshake).with(handshake, false)
46
+ server.process(handshake, false)
47
+ end
48
+
49
+ it "routes a list of messages to appropriate handlers" do
50
+ server.should_receive(:handshake).with(handshake, false)
51
+ server.should_receive(:connect).with(connect, false)
52
+ server.should_receive(:disconnect).with(disconnect, false)
53
+ server.should_receive(:subscribe).with(subscribe, false)
54
+ server.should_receive(:unsubscribe).with(unsubscribe, false)
55
+
56
+ engine.should_not_receive(:publish).with(handshake)
57
+ engine.should_not_receive(:publish).with(connect)
58
+ engine.should_not_receive(:publish).with(disconnect)
59
+ engine.should_not_receive(:publish).with(subscribe)
60
+ engine.should_not_receive(:publish).with(unsubscribe)
61
+ engine.should_receive(:publish).with(publish)
62
+
63
+ server.process([handshake, connect, disconnect, subscribe, unsubscribe, publish], false)
64
+ end
65
+
66
+ describe "handshaking" do
67
+ before do
68
+ response = {"channel" => "/meta/handshake", "successful" => true}
69
+ server.should_receive(:handshake).with(handshake, false).and_yield(response)
70
+ end
71
+
72
+ it "returns the handshake response with advice" do
73
+ server.process(handshake, false) do |response|
74
+ response.should == [
75
+ { "channel" => "/meta/handshake",
76
+ "successful" => true,
77
+ "advice" => {"reconnect" => "retry", "interval" => 0, "timeout" => 60000}
78
+ }
79
+ ]
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "connecting for messages" do
85
+ let(:messages) { [{"channel" => "/a"}, {"channel" => "/b"}] }
86
+
87
+ before do
88
+ server.should_receive(:connect).with(connect, false).and_yield(messages)
89
+ end
90
+
91
+ it "returns the new messages" do
92
+ server.process(connect, false) { |r| r.should == messages }
93
+ end
94
+ end
95
+ end
96
+
97
+ describe :flush_connection do
98
+ let(:message) {{"clientId" => "fakeclientid"}}
99
+
100
+ it "flushes the connection when given one message" do
101
+ engine.should_receive(:flush).with("fakeclientid")
102
+ server.flush_connection(message)
103
+ end
104
+
105
+ it "flushes the connection when given a list of messages" do
106
+ engine.should_receive(:flush).with("fakeclientid")
107
+ server.flush_connection([message])
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,134 @@
1
+ require "spec_helper"
2
+
3
+ describe Faye::Transport do
4
+ let :client do
5
+ client = mock("client")
6
+ client.stub(:endpoint).and_return("http://example.com/")
7
+ client
8
+ end
9
+
10
+ describe :get do
11
+ before do
12
+ Faye::Transport::Local.stub(:usable?).and_yield(false)
13
+ Faye::Transport::Http.stub(:usable?).and_yield(false)
14
+ end
15
+
16
+ def get_transport(connection_types)
17
+ transport = nil
18
+ Faye::Transport.get(client, connection_types) { |t| transport = t }
19
+ transport
20
+ end
21
+
22
+ let(:transport) { get_transport ["long-polling", "in-process"] }
23
+ let(:local_transport) { get_transport ["in-process"] }
24
+ let(:http_transport) { get_transport ["long-polling"] }
25
+
26
+ describe "when no transport is usable" do
27
+ it "raises an exception" do
28
+ lambda { transport }.should raise_error
29
+ end
30
+ end
31
+
32
+ describe "when a less preferred transport is usable" do
33
+ before do
34
+ Faye::Transport::Http.stub(:usable?).and_yield(true)
35
+ end
36
+
37
+ it "returns a transport of the usable type" do
38
+ transport.should be_kind_of(Faye::Transport::Http)
39
+ end
40
+
41
+ it "rasies an exception of the usable type is not requested" do
42
+ lambda { local_transport }.should raise_error
43
+ end
44
+
45
+ it "allows the usable type to be specifically selected" do
46
+ http_transport.should be_kind_of(Faye::Transport::Http)
47
+ end
48
+ end
49
+
50
+ describe "when all transports are usable" do
51
+ before do
52
+ Faye::Transport::Local.stub(:usable?).and_yield(true)
53
+ Faye::Transport::Http.stub(:usable?).and_yield(true)
54
+ end
55
+
56
+ it "returns the most preferred type" do
57
+ transport.should be_kind_of(Faye::Transport::Local)
58
+ end
59
+
60
+ it "allows types to be specifically selected" do
61
+ local_transport.should be_kind_of(Faye::Transport::Local)
62
+ http_transport.should be_kind_of(Faye::Transport::Http)
63
+ end
64
+ end
65
+ end
66
+
67
+ describe :send do
68
+ include EM::RSpec::FakeClock
69
+ before { clock.stub }
70
+ after { clock.reset }
71
+
72
+ before do
73
+ client.stub(:client_id).and_return("abc123")
74
+ end
75
+
76
+ describe "for batching transports" do
77
+ before do
78
+ transport_klass = Class.new(Faye::Transport) do
79
+ def batching?
80
+ true
81
+ end
82
+ end
83
+ @transport = transport_klass.new(client, "")
84
+ end
85
+
86
+ it "does not make an immediate request" do
87
+ @transport.should_not_receive(:request)
88
+ @transport.send({"batch" => "me"}, 60)
89
+ end
90
+
91
+ it "queues the message to be sent after a timeout" do
92
+ @transport.should_receive(:request).with([{"batch" => "me"}], 60)
93
+ @transport.send({"batch" => "me"}, 60)
94
+ clock.tick(0.01)
95
+ end
96
+
97
+ it "allows multiple messages to be batched together" do
98
+ @transport.should_receive(:request).with([{"id" => 1}, {"id" => 2}], 60)
99
+ @transport.send({"id" => 1}, 60)
100
+ @transport.send({"id" => 2}, 60)
101
+ clock.tick(0.01)
102
+ end
103
+
104
+ it "adds advice to connect messages sent with others" do
105
+ @transport.should_receive(:request).with([{"channel" => "/meta/connect", "advice" => {"timeout" => 0}}, {}], 60)
106
+ @transport.send({"channel" => "/meta/connect"}, 60)
107
+ @transport.send({}, 60)
108
+ clock.tick(0.01)
109
+ end
110
+
111
+ it "adds no advice to connect messages sent alone" do
112
+ @transport.should_receive(:request).with([{"channel" => "/meta/connect"}], 60)
113
+ @transport.send({"channel" => "/meta/connect"}, 60)
114
+ clock.tick(0.01)
115
+ end
116
+ end
117
+
118
+ describe "for non-batching transports" do
119
+ before do
120
+ transport_klass = Class.new(Faye::Transport) do
121
+ def batching?
122
+ false
123
+ end
124
+ end
125
+ @transport = transport_klass.new(client, "")
126
+ end
127
+
128
+ it "makes a request immediately" do
129
+ @transport.should_receive(:request).with([{"no" => "batch"}], 60)
130
+ @transport.send({"no" => "batch"}, 60)
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,11 @@
1
+ require 'bundler/setup'
2
+ dir = File.expand_path(File.dirname(__FILE__))
3
+ require dir + '/../lib/faye'
4
+ require dir + '/../vendor/em-rspec/lib/em-rspec'
5
+ require 'rack/test'
6
+
7
+ Faye.logger = lambda { |*| }
8
+
9
+ require 'encoding_helper'
10
+ require 'ruby/engine_examples'
11
+
data/spec/testswarm ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/ruby1.8
2
+
3
+ require 'rubygems'
4
+ require 'testswarm/client'
5
+
6
+ client = TestSwarm::Client.new('http://swarm.jcoglan.com')
7
+ project = client.project('faye', :auth => '6d26e250d81b32099fccc59db53a3a0e648f0e6d')
8
+
9
+ job = TestSwarm::Job.create(
10
+ :rcs => {
11
+ :type => "git",
12
+ :url => "git://github.com/faye/faye.git"
13
+ },
14
+ :directory => "/home/jcoglan/www/swarm.jcoglan.com/app/changeset/#{project.name}",
15
+ :diff => ["javascript", "spec/javascript"],
16
+ :inject => "spec/browser.html",
17
+
18
+ :build => ["npm install", "rm -rf build", "jake"]
19
+ )
20
+
21
+ exit unless job.new?
22
+
23
+ path = "#{client.url}/changeset/#{project.name}/#{job.revision}"
24
+ job.add_suite "Faye tests", "#{path}/spec/browser.html"
25
+
26
+ project.submit_job "Faye Commit #{job.revision}", job,
27
+ :browsers => "all",
28
+ :max => 5
29
+
@@ -0,0 +1,37 @@
1
+ require 'rack/proxy'
2
+
3
+ # This only exists so we can use Rack::Test to test the
4
+ # RackAdapter class, which assumes it's running on Thin
5
+
6
+ class ThinProxy < Rack::Proxy
7
+ HOST = 'localhost'
8
+ PORT = '8282'
9
+
10
+ def initialize(rack_app)
11
+ Thin::Logging.silent = true
12
+ handler = Rack::Handler.get('thin')
13
+
14
+ EM.stop if EM.reactor_running?
15
+ Thread.pass while EM.reactor_running?
16
+
17
+ Thread.new {
18
+ handler.run(rack_app, :Host => HOST, :Port => PORT) do |server|
19
+ @server = server
20
+ end
21
+ }
22
+ Thread.pass until EM.reactor_running?
23
+ end
24
+
25
+ def stop
26
+ EM.stop
27
+ @server.stop
28
+ Thread.pass while EM.reactor_running?
29
+ end
30
+
31
+ def rewrite_env(env)
32
+ env['HTTP_HOST'] = HOST
33
+ env['SERVER_PORT'] = PORT
34
+ env[Faye::RackAdapter::HTTP_X_NO_CONTENT_LENGTH] = '1'
35
+ env
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,302 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bushido-faye
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - James Coglan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cookiejar
16
+ requirement: &70180441377380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70180441377380
25
+ - !ruby/object:Gem::Dependency
26
+ name: em-http-request
27
+ requirement: &70180441342980 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.3.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70180441342980
36
+ - !ruby/object:Gem::Dependency
37
+ name: eventmachine
38
+ requirement: &70180441246260 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 0.12.0
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70180441246260
47
+ - !ruby/object:Gem::Dependency
48
+ name: faye-websocket
49
+ requirement: &70180449567400 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70180449567400
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack
60
+ requirement: &70180449421140 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 1.0.0
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70180449421140
69
+ - !ruby/object:Gem::Dependency
70
+ name: yajl-ruby
71
+ requirement: &70180449327920 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.0.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70180449327920
80
+ - !ruby/object:Gem::Dependency
81
+ name: compass
82
+ requirement: &70180441066600 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.10.0
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70180441066600
91
+ - !ruby/object:Gem::Dependency
92
+ name: jake
93
+ requirement: &70180441038240 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70180441038240
102
+ - !ruby/object:Gem::Dependency
103
+ name: rake
104
+ requirement: &70180440966160 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70180440966160
113
+ - !ruby/object:Gem::Dependency
114
+ name: rspec
115
+ requirement: &70180440965520 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: 2.8.0
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70180440965520
124
+ - !ruby/object:Gem::Dependency
125
+ name: rack-proxy
126
+ requirement: &70180440965000 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *70180440965000
135
+ - !ruby/object:Gem::Dependency
136
+ name: rack-test
137
+ requirement: &70180440964280 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *70180440964280
146
+ - !ruby/object:Gem::Dependency
147
+ name: rainbows
148
+ requirement: &70180440963320 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: 1.0.0
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *70180440963320
157
+ - !ruby/object:Gem::Dependency
158
+ name: RedCloth
159
+ requirement: &70180440962520 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ~>
163
+ - !ruby/object:Gem::Version
164
+ version: 3.0.0
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *70180440962520
168
+ - !ruby/object:Gem::Dependency
169
+ name: sinatra
170
+ requirement: &70180440962020 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *70180440962020
179
+ - !ruby/object:Gem::Dependency
180
+ name: staticmatic
181
+ requirement: &70180440961320 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *70180440961320
190
+ - !ruby/object:Gem::Dependency
191
+ name: thin
192
+ requirement: &70180440960660 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: 1.2.0
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *70180440960660
201
+ description:
202
+ email: akash@akash.im
203
+ executables: []
204
+ extensions: []
205
+ extra_rdoc_files:
206
+ - README.rdoc
207
+ files:
208
+ - History.txt
209
+ - README.rdoc
210
+ - lib/faye-browser-min.js
211
+ - spec/browser.html
212
+ - spec/encoding_helper.rb
213
+ - spec/install.sh
214
+ - spec/javascript/channel_spec.js
215
+ - spec/javascript/client_spec.js
216
+ - spec/javascript/engine/memory_spec.js
217
+ - spec/javascript/engine_spec.js
218
+ - spec/javascript/faye_spec.js
219
+ - spec/javascript/grammar_spec.js
220
+ - spec/javascript/node_adapter_spec.js
221
+ - spec/javascript/publisher_spec.js
222
+ - spec/javascript/server/connect_spec.js
223
+ - spec/javascript/server/disconnect_spec.js
224
+ - spec/javascript/server/extensions_spec.js
225
+ - spec/javascript/server/handshake_spec.js
226
+ - spec/javascript/server/integration_spec.js
227
+ - spec/javascript/server/publish_spec.js
228
+ - spec/javascript/server/subscribe_spec.js
229
+ - spec/javascript/server/unsubscribe_spec.js
230
+ - spec/javascript/server_spec.js
231
+ - spec/javascript/transport_spec.js
232
+ - spec/node.js
233
+ - spec/phantom.js
234
+ - spec/ruby/channel_spec.rb
235
+ - spec/ruby/client_spec.rb
236
+ - spec/ruby/engine/memory_spec.rb
237
+ - spec/ruby/engine_examples.rb
238
+ - spec/ruby/faye_spec.rb
239
+ - spec/ruby/grammar_spec.rb
240
+ - spec/ruby/publisher_spec.rb
241
+ - spec/ruby/rack_adapter_spec.rb
242
+ - spec/ruby/server/connect_spec.rb
243
+ - spec/ruby/server/disconnect_spec.rb
244
+ - spec/ruby/server/extensions_spec.rb
245
+ - spec/ruby/server/handshake_spec.rb
246
+ - spec/ruby/server/integration_spec.rb
247
+ - spec/ruby/server/publish_spec.rb
248
+ - spec/ruby/server/subscribe_spec.rb
249
+ - spec/ruby/server/unsubscribe_spec.rb
250
+ - spec/ruby/server_spec.rb
251
+ - spec/ruby/transport_spec.rb
252
+ - spec/spec_helper.rb
253
+ - spec/testswarm
254
+ - spec/thin_proxy.rb
255
+ - lib/faye/adapters/rack_adapter.rb
256
+ - lib/faye/engines/connection.rb
257
+ - lib/faye/engines/memory.rb
258
+ - lib/faye/engines/proxy.rb
259
+ - lib/faye/error.rb
260
+ - lib/faye/mixins/logging.rb
261
+ - lib/faye/mixins/publisher.rb
262
+ - lib/faye/mixins/timeouts.rb
263
+ - lib/faye/protocol/channel.rb
264
+ - lib/faye/protocol/client.rb
265
+ - lib/faye/protocol/extensible.rb
266
+ - lib/faye/protocol/grammar.rb
267
+ - lib/faye/protocol/publication.rb
268
+ - lib/faye/protocol/server.rb
269
+ - lib/faye/protocol/subscription.rb
270
+ - lib/faye/transport/http.rb
271
+ - lib/faye/transport/local.rb
272
+ - lib/faye/transport/transport.rb
273
+ - lib/faye/transport/web_socket.rb
274
+ - lib/faye/util/namespace.rb
275
+ - lib/faye.rb
276
+ homepage: http://faye.jcoglan.com
277
+ licenses: []
278
+ post_install_message:
279
+ rdoc_options:
280
+ - --main
281
+ - README.rdoc
282
+ require_paths:
283
+ - lib
284
+ required_ruby_version: !ruby/object:Gem::Requirement
285
+ none: false
286
+ requirements:
287
+ - - ! '>='
288
+ - !ruby/object:Gem::Version
289
+ version: '0'
290
+ required_rubygems_version: !ruby/object:Gem::Requirement
291
+ none: false
292
+ requirements:
293
+ - - ! '>='
294
+ - !ruby/object:Gem::Version
295
+ version: '0'
296
+ requirements: []
297
+ rubyforge_project:
298
+ rubygems_version: 1.8.17
299
+ signing_key:
300
+ specification_version: 3
301
+ summary: Simple pub/sub messaging for the web
302
+ test_files: []