ably 0.1.4 → 0.1.5

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/ably.gemspec +1 -0
  3. data/lib/ably/auth.rb +9 -13
  4. data/lib/ably/models/idiomatic_ruby_wrapper.rb +27 -39
  5. data/lib/ably/modules/conversions.rb +31 -10
  6. data/lib/ably/modules/enum.rb +201 -0
  7. data/lib/ably/modules/event_emitter.rb +81 -0
  8. data/lib/ably/modules/event_machine_helpers.rb +21 -0
  9. data/lib/ably/modules/http_helpers.rb +13 -0
  10. data/lib/ably/modules/state.rb +67 -0
  11. data/lib/ably/realtime.rb +6 -1
  12. data/lib/ably/realtime/channel.rb +117 -56
  13. data/lib/ably/realtime/client.rb +7 -50
  14. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +116 -0
  15. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +63 -0
  16. data/lib/ably/realtime/connection.rb +97 -14
  17. data/lib/ably/realtime/models/error_info.rb +3 -2
  18. data/lib/ably/realtime/models/message.rb +28 -3
  19. data/lib/ably/realtime/models/nil_channel.rb +21 -0
  20. data/lib/ably/realtime/models/protocol_message.rb +35 -27
  21. data/lib/ably/rest/client.rb +39 -23
  22. data/lib/ably/rest/middleware/external_exceptions.rb +1 -1
  23. data/lib/ably/rest/middleware/parse_json.rb +7 -2
  24. data/lib/ably/rest/middleware/parse_message_pack.rb +23 -0
  25. data/lib/ably/rest/models/paged_resource.rb +4 -4
  26. data/lib/ably/util/pub_sub.rb +32 -0
  27. data/lib/ably/version.rb +1 -1
  28. data/spec/acceptance/realtime/channel_spec.rb +1 -0
  29. data/spec/acceptance/realtime/message_spec.rb +136 -0
  30. data/spec/acceptance/rest/base_spec.rb +51 -1
  31. data/spec/acceptance/rest/presence_spec.rb +7 -2
  32. data/spec/integration/modules/state_spec.rb +66 -0
  33. data/spec/{unit → integration/rest}/auth.rb +0 -0
  34. data/spec/support/api_helper.rb +5 -2
  35. data/spec/support/protocol_msgbus_helper.rb +29 -0
  36. data/spec/support/test_app.rb +14 -3
  37. data/spec/unit/{conversions.rb → modules/conversions_spec.rb} +1 -1
  38. data/spec/unit/modules/enum_spec.rb +263 -0
  39. data/spec/unit/modules/event_emitter_spec.rb +81 -0
  40. data/spec/unit/modules/pub_sub_spec.rb +74 -0
  41. data/spec/unit/realtime/channel_spec.rb +27 -0
  42. data/spec/unit/realtime/client_spec.rb +8 -0
  43. data/spec/unit/realtime/connection_spec.rb +40 -0
  44. data/spec/unit/realtime/error_info_spec.rb +9 -1
  45. data/spec/unit/realtime/incoming_message_dispatcher_spec.rb +36 -0
  46. data/spec/unit/realtime/message_spec.rb +2 -2
  47. data/spec/unit/realtime/protocol_message_spec.rb +78 -9
  48. data/spec/unit/rest/{rest_spec.rb → client_spec.rb} +0 -0
  49. data/spec/unit/rest/message_spec.rb +1 -1
  50. metadata +51 -9
  51. data/lib/ably/realtime/callbacks.rb +0 -15
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ably::Util::PubSub do
4
+ let(:options) { {} }
5
+ let(:obj) { double('example') }
6
+ let(:msg) { double('message') }
7
+
8
+ subject { Ably::Util::PubSub.new(options) }
9
+
10
+ context 'event fan out' do
11
+ specify do
12
+ expect(obj).to receive(:received_message).with(msg).twice
13
+ 2.times do
14
+ subject.subscribe(:message) { |msg| obj.received_message msg }
15
+ end
16
+ subject.publish :message, msg
17
+ end
18
+
19
+ it 'sends only messages to matching event names' do
20
+ expect(obj).to receive(:received_message).with(msg).once
21
+ subject.subscribe(:valid) { |msg| obj.received_message msg }
22
+ subject.publish :valid, msg
23
+ subject.publish :ignored, msg
24
+ subject.publish 'valid', msg
25
+ end
26
+
27
+ context 'with coercion' do
28
+ let(:options) do
29
+ { coerce_into: Proc.new { |event| String(event) } }
30
+ end
31
+
32
+ it 'calls the provided proc to coerce the event name' do
33
+ expect(obj).to receive(:received_message).with(msg).once
34
+ subject.subscribe('valid') { |msg| obj.received_message msg }
35
+ subject.publish :valid, msg
36
+ end
37
+ end
38
+
39
+ context 'without coercion' do
40
+ it 'only matches event names on type matches' do
41
+ expect(obj).to_not receive(:received_message).with(msg)
42
+ subject.subscribe('valid') { |msg| obj.received_message msg }
43
+ subject.publish :valid, msg
44
+ end
45
+ end
46
+ end
47
+
48
+ context '#off' do
49
+ let(:callback) { Proc.new { |msg| obj.received_message msg } }
50
+
51
+ before do
52
+ subject.subscribe(:message, &callback)
53
+ end
54
+
55
+ after do
56
+ subject.publish :message, msg
57
+ end
58
+
59
+ it 'deletes matching callbacks' do
60
+ expect(obj).to_not receive(:received_message).with(msg)
61
+ subject.unsubscribe(:message, &callback)
62
+ end
63
+
64
+ it 'deletes all callbacks if not block given' do
65
+ expect(obj).to_not receive(:received_message).with(msg)
66
+ subject.unsubscribe(:message)
67
+ end
68
+
69
+ it 'continues if the block does not exist' do
70
+ expect(obj).to receive(:received_message).with(msg)
71
+ subject.unsubscribe(:message) { true }
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require "support/protocol_msgbus_helper"
3
+
4
+ describe Ably::Realtime::Channel do
5
+ let(:client) { double(:client) }
6
+ let(:channel_name) { 'test' }
7
+
8
+ subject do
9
+ Ably::Realtime::Channel.new(client, channel_name)
10
+ end
11
+
12
+ describe 'callbacks' do
13
+ specify 'are supported for valid STATE events' do
14
+ state = nil
15
+ subject.on(:initialized) { state = :ready }
16
+ expect { subject.trigger(:initialized) }.to change { state }.to(:ready)
17
+ end
18
+
19
+ specify 'fail with unacceptable STATE event names' do
20
+ expect { subject.on(:invalid) }.to raise_error KeyError
21
+ expect { subject.trigger(:invalid) }.to raise_error KeyError
22
+ expect { subject.off(:invalid) }.to raise_error KeyError
23
+ end
24
+ end
25
+
26
+ it_behaves_like 'an incoming protocol message bus'
27
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+ require "support/protocol_msgbus_helper"
3
+
4
+ describe Ably::Realtime::Client do
5
+ subject do
6
+ Ably::Realtime::Client.new('appid.keyuid:keysecret')
7
+ end
8
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require "support/protocol_msgbus_helper"
3
+
4
+ describe Ably::Realtime::Connection do
5
+ let(:client) { double(:client) }
6
+ let(:klass) { Class.new(Ably::Realtime::Connection) do; end }
7
+
8
+ before do
9
+ # Override self.new with a generic implementation of new as EventMachine::Connection
10
+ # overrides self.new by default, and using EventMachine in unit tests is unnecessary
11
+ klass.instance_eval do
12
+ def self.new(*args)
13
+ obj = self.allocate
14
+ obj.orig_send :initialize, *args
15
+ obj
16
+ end
17
+ end
18
+ end
19
+
20
+ subject do
21
+ klass.new(client)
22
+ end
23
+
24
+ describe 'callbacks' do
25
+ specify 'are supported for valid STATE events' do
26
+ state = nil
27
+ subject.on(:initialized) { state = :ready }
28
+ expect { subject.trigger(:initialized) }.to change { state }.to(:ready)
29
+ end
30
+
31
+ specify 'fail with unacceptable STATE event names' do
32
+ expect { subject.on(:invalid) }.to raise_error KeyError
33
+ expect { subject.trigger(:invalid) }.to raise_error KeyError
34
+ expect { subject.off(:invalid) }.to raise_error KeyError
35
+ end
36
+ end
37
+
38
+ it_behaves_like 'an incoming protocol message bus'
39
+ it_behaves_like 'an outgoing protocol message bus'
40
+ end
@@ -4,7 +4,15 @@ require 'support/model_helper'
4
4
  describe Ably::Realtime::Models::ErrorInfo do
5
5
  subject { Ably::Realtime::Models::ErrorInfo }
6
6
 
7
- it_behaves_like 'a realtime model', with_simple_attributes: %w(code status message) do
7
+ it_behaves_like 'a realtime model', with_simple_attributes: %w(code status_code message) do
8
8
  let(:model_args) { [] }
9
9
  end
10
+
11
+ context '#status' do
12
+ subject { Ably::Realtime::Models::ErrorInfo.new('statusCode' => 401) }
13
+ it 'is an alias for #status_code' do
14
+ expect(subject.status).to eql(subject.status_code)
15
+ expect(subject.status).to eql(401)
16
+ end
17
+ end
10
18
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ably::Realtime::Client::IncomingMessageDispatcher do
4
+ let(:msgbus) do
5
+ Ably::Util::PubSub.new
6
+ end
7
+ let(:client) do
8
+ double(:client,
9
+ connection: double('connection', __incoming_protocol_msgbus__: msgbus),
10
+ channels: {}
11
+ )
12
+ end
13
+
14
+ subject { Ably::Realtime::Client::IncomingMessageDispatcher.new(client) }
15
+
16
+ context '#initialize' do
17
+ it 'should subscribe to protocol messages from the connection' do
18
+ expect(msgbus).to receive(:subscribe).with(:message).and_call_original
19
+ subject
20
+ end
21
+ end
22
+
23
+ context '#dispatch_protocol_message' do
24
+ before { subject }
25
+
26
+ it 'should raise an exception if a message is sent that is not a ProtocolMessage' do
27
+ expect { msgbus.publish :message, nil }.to raise_error ArgumentError
28
+ end
29
+
30
+ it 'should warn if a message is received for a non-existent channel' do
31
+ allow(subject).to receive_message_chain(:logger, :debug)
32
+ expect(subject).to receive_message_chain(:logger, :warn)
33
+ msgbus.publish :message, Ably::Realtime::Models::ProtocolMessage.new(:action => :attached, channel: 'unknown')
34
+ end
35
+ end
36
+ end
@@ -38,7 +38,7 @@ describe Ably::Realtime::Models::Message do
38
38
  end
39
39
 
40
40
  it 'autofills a missing timestamp for all messages' do
41
- expect(json_object["timestamp"].to_i).to be_within(1).of(as_since_epoch(Time.now))
41
+ expect(json_object["timestamp"].to_i).to be_within(50).of(as_since_epoch(Time.now))
42
42
  end
43
43
  end
44
44
 
@@ -55,7 +55,7 @@ describe Ably::Realtime::Models::Message do
55
55
  let(:ably_time) { Time.now + 5 }
56
56
  let(:sender_time_0) { Time.now - 5 }
57
57
  let(:sender_time_1) { Time.now - 3 }
58
- let(:message_serial) { SecureRandom.hex }
58
+ let(:message_serial) { SecureRandom.random_number(1_000_000) }
59
59
  let(:connection_id) { SecureRandom.hex }
60
60
 
61
61
  let(:message_0_payload) do
@@ -6,7 +6,7 @@ describe Ably::Realtime::Models::ProtocolMessage do
6
6
  subject { Ably::Realtime::Models::ProtocolMessage }
7
7
 
8
8
  it_behaves_like 'a realtime model',
9
- with_simple_attributes: %w(action count channel channel_serial connection_id connection_serial) do
9
+ with_simple_attributes: %w(channel channel_serial connection_id connection_serial) do
10
10
 
11
11
  let(:model_args) { [] }
12
12
  end
@@ -22,11 +22,23 @@ describe Ably::Realtime::Models::ProtocolMessage do
22
22
  end
23
23
  end
24
24
 
25
- context '#action_sym' do
25
+ context '#action' do
26
26
  let(:protocol_message) { subject.new(action: 14) }
27
27
 
28
- it 'returns the symbol equivalent' do
29
- expect(protocol_message.action_sym).to eql(:presence)
28
+ it 'returns an Enum that behaves like a symbol' do
29
+ expect(protocol_message.action).to eq(:presence)
30
+ end
31
+
32
+ it 'returns an Enum that behaves like a Numeric' do
33
+ expect(protocol_message.action).to eq(14)
34
+ end
35
+
36
+ it 'returns an Enum that behaves like a String' do
37
+ expect(protocol_message.action).to eq('Presence')
38
+ end
39
+
40
+ it 'returns an Enum that matchdes the ACTION constant' do
41
+ expect(protocol_message.action).to eql(Ably::Realtime::Models::ProtocolMessage::ACTION.Presence)
30
42
  end
31
43
  end
32
44
 
@@ -38,6 +50,55 @@ describe Ably::Realtime::Models::ProtocolMessage do
38
50
  end
39
51
  end
40
52
 
53
+ context '#message_serial' do
54
+ let(:protocol_message) { subject.new(msg_serial: "55") }
55
+ it 'converts :msg_serial to an Integer' do
56
+ expect(protocol_message.message_serial).to be_a(Integer)
57
+ expect(protocol_message.message_serial).to eql(55)
58
+ end
59
+ end
60
+
61
+ context '#count' do
62
+ context 'when missing' do
63
+ let(:protocol_message) { subject.new({}) }
64
+ it 'is 1' do
65
+ expect(protocol_message.count).to eql(1)
66
+ end
67
+ end
68
+
69
+ context 'when non numeric' do
70
+ let(:protocol_message) { subject.new(count: 'A') }
71
+ it 'is 1' do
72
+ expect(protocol_message.count).to eql(1)
73
+ end
74
+ end
75
+
76
+ context 'when greater than 1' do
77
+ let(:protocol_message) { subject.new(count: '666') }
78
+ it 'is the value of count' do
79
+ expect(protocol_message.count).to eql(666)
80
+ end
81
+ end
82
+ end
83
+
84
+ context '#has_message_serial?' do
85
+ context 'without msg_serial' do
86
+ let(:protocol_message) { subject.new({}) }
87
+
88
+ it 'returns false' do
89
+ expect(protocol_message.has_message_serial?).to eql(false)
90
+ end
91
+ end
92
+
93
+ context 'with msg_serial' do
94
+ let(:protocol_message) { subject.new(msg_serial: "55") }
95
+
96
+ it 'returns true' do
97
+ expect(protocol_message.has_message_serial?).to eql(true)
98
+ end
99
+ end
100
+ end
101
+
41
102
  context '#error' do
42
103
  context 'with no error attribute' do
43
104
  let(:protocol_message) { subject.new(action: 1) }
@@ -68,9 +129,9 @@ describe Ably::Realtime::Models::ProtocolMessage do
68
129
 
69
130
  context '#to_json' do
70
131
  let(:json_object) { JSON.parse(model.to_json) }
71
- let(:message) { { 'name' => 'event', 'clientId' => 'joe' } }
72
- let(:attached_action) { Ably::Realtime::Models::ProtocolMessage.action!(:attached) }
73
- let(:message_action) { Ably::Realtime::Models::ProtocolMessage.action!(:message) }
132
+ let(:message) { { 'name' => 'event', 'clientId' => 'joe', 'timestamp' => as_since_epoch(Time.now) } }
133
+ let(:attached_action) { Ably::Realtime::Models::ProtocolMessage::ACTION.Attached }
134
+ let(:message_action) { Ably::Realtime::Models::ProtocolMessage::ACTION.Message }
74
135
 
75
136
  context 'with valid data' do
76
137
  let(:model) { subject.new({ :action => attached_action, :channelSerial => 'unique', messages: [message] }) }
@@ -88,7 +149,7 @@ describe Ably::Realtime::Models::ProtocolMessage do
88
149
  let(:model) { subject.new({ clientId: 'joe' }) }
89
150
 
90
151
  it 'it raises an exception' do
91
- expect { model.to_json }.to raise_error RuntimeError, /cannot generate valid JSON/
152
+ expect { model.to_json }.to raise_error KeyError, /Action '' is not supported by ProtocolMessage/
92
153
  end
93
154
  end
94
155
 
@@ -96,7 +157,15 @@ describe Ably::Realtime::Models::ProtocolMessage do
96
157
  let(:model) { subject.new({ :action => message_action }) }
97
158
 
98
159
  it 'it raises an exception' do
99
- expect { model.to_json }.to raise_error RuntimeError, /cannot generate valid JSON/
160
+ expect { model.to_json }.to raise_error TypeError, /msg_serial is missing/
161
+ end
162
+ end
163
+
164
+ context 'is aliased by #to_s' do
165
+ let(:model) { subject.new({ :action => attached_action, :channelSerial => 'unique', messages: [message], :timestamp => as_since_epoch(Time.now) }) }
166
+
167
+ specify do
168
+ expect(json_object).to eql(JSON.parse("#{model}"))
100
169
  end
101
170
  end
102
171
  end
@@ -28,7 +28,7 @@ describe Ably::Rest::Models::Message do
28
28
  subject { Ably::Rest::Models::Message.new(attributes) }
29
29
 
30
30
  it 'provides access to #json' do
31
- expect(subject.json).to eql(attributes)
31
+ expect(subject.json).to eq(attributes)
32
32
  end
33
33
  end
34
34
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lewis Marshall
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-27 00:00:00.000000000 Z
12
+ date: 2014-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: msgpack
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: bundler
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +184,20 @@ files:
170
184
  - lib/ably/exceptions.rb
171
185
  - lib/ably/models/idiomatic_ruby_wrapper.rb
172
186
  - lib/ably/modules/conversions.rb
187
+ - lib/ably/modules/enum.rb
188
+ - lib/ably/modules/event_emitter.rb
189
+ - lib/ably/modules/event_machine_helpers.rb
173
190
  - lib/ably/modules/http_helpers.rb
191
+ - lib/ably/modules/state.rb
174
192
  - lib/ably/realtime.rb
175
- - lib/ably/realtime/callbacks.rb
176
193
  - lib/ably/realtime/channel.rb
177
194
  - lib/ably/realtime/client.rb
195
+ - lib/ably/realtime/client/incoming_message_dispatcher.rb
196
+ - lib/ably/realtime/client/outgoing_message_dispatcher.rb
178
197
  - lib/ably/realtime/connection.rb
179
198
  - lib/ably/realtime/models/error_info.rb
180
199
  - lib/ably/realtime/models/message.rb
200
+ - lib/ably/realtime/models/nil_channel.rb
181
201
  - lib/ably/realtime/models/protocol_message.rb
182
202
  - lib/ably/realtime/models/shared.rb
183
203
  - lib/ably/rest.rb
@@ -187,15 +207,18 @@ files:
187
207
  - lib/ably/rest/middleware/exceptions.rb
188
208
  - lib/ably/rest/middleware/external_exceptions.rb
189
209
  - lib/ably/rest/middleware/parse_json.rb
210
+ - lib/ably/rest/middleware/parse_message_pack.rb
190
211
  - lib/ably/rest/models/message.rb
191
212
  - lib/ably/rest/models/paged_resource.rb
192
213
  - lib/ably/rest/models/presence_message.rb
193
214
  - lib/ably/rest/presence.rb
194
215
  - lib/ably/token.rb
195
216
  - lib/ably/util/crypto.rb
217
+ - lib/ably/util/pub_sub.rb
196
218
  - lib/ably/version.rb
197
219
  - spec/acceptance/crypto.rb
198
220
  - spec/acceptance/realtime/channel_spec.rb
221
+ - spec/acceptance/realtime/message_spec.rb
199
222
  - spec/acceptance/rest/auth_spec.rb
200
223
  - spec/acceptance/rest/base_spec.rb
201
224
  - spec/acceptance/rest/channel_spec.rb
@@ -203,21 +226,30 @@ files:
203
226
  - spec/acceptance/rest/presence_spec.rb
204
227
  - spec/acceptance/rest/stats_spec.rb
205
228
  - spec/acceptance/rest/time_spec.rb
229
+ - spec/integration/modules/state_spec.rb
230
+ - spec/integration/rest/auth.rb
206
231
  - spec/spec_helper.rb
207
232
  - spec/support/api_helper.rb
208
233
  - spec/support/event_machine_helper.rb
209
234
  - spec/support/model_helper.rb
235
+ - spec/support/protocol_msgbus_helper.rb
210
236
  - spec/support/test_app.rb
211
- - spec/unit/auth.rb
212
- - spec/unit/conversions.rb
213
237
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
238
+ - spec/unit/modules/conversions_spec.rb
239
+ - spec/unit/modules/enum_spec.rb
240
+ - spec/unit/modules/event_emitter_spec.rb
241
+ - spec/unit/modules/pub_sub_spec.rb
242
+ - spec/unit/realtime/channel_spec.rb
243
+ - spec/unit/realtime/client_spec.rb
244
+ - spec/unit/realtime/connection_spec.rb
214
245
  - spec/unit/realtime/error_info_spec.rb
246
+ - spec/unit/realtime/incoming_message_dispatcher_spec.rb
215
247
  - spec/unit/realtime/message_spec.rb
216
248
  - spec/unit/realtime/protocol_message_spec.rb
217
249
  - spec/unit/realtime/realtime_spec.rb
250
+ - spec/unit/rest/client_spec.rb
218
251
  - spec/unit/rest/message_spec.rb
219
252
  - spec/unit/rest/paged_resource_spec.rb
220
- - spec/unit/rest/rest_spec.rb
221
253
  - spec/unit/token_spec.rb
222
254
  homepage: http://github.com/ably/ably-ruby
223
255
  licenses:
@@ -246,6 +278,7 @@ summary: A Ruby client library for ably.io, the real-time messaging service
246
278
  test_files:
247
279
  - spec/acceptance/crypto.rb
248
280
  - spec/acceptance/realtime/channel_spec.rb
281
+ - spec/acceptance/realtime/message_spec.rb
249
282
  - spec/acceptance/rest/auth_spec.rb
250
283
  - spec/acceptance/rest/base_spec.rb
251
284
  - spec/acceptance/rest/channel_spec.rb
@@ -253,20 +286,29 @@ test_files:
253
286
  - spec/acceptance/rest/presence_spec.rb
254
287
  - spec/acceptance/rest/stats_spec.rb
255
288
  - spec/acceptance/rest/time_spec.rb
289
+ - spec/integration/modules/state_spec.rb
290
+ - spec/integration/rest/auth.rb
256
291
  - spec/spec_helper.rb
257
292
  - spec/support/api_helper.rb
258
293
  - spec/support/event_machine_helper.rb
259
294
  - spec/support/model_helper.rb
295
+ - spec/support/protocol_msgbus_helper.rb
260
296
  - spec/support/test_app.rb
261
- - spec/unit/auth.rb
262
- - spec/unit/conversions.rb
263
297
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
298
+ - spec/unit/modules/conversions_spec.rb
299
+ - spec/unit/modules/enum_spec.rb
300
+ - spec/unit/modules/event_emitter_spec.rb
301
+ - spec/unit/modules/pub_sub_spec.rb
302
+ - spec/unit/realtime/channel_spec.rb
303
+ - spec/unit/realtime/client_spec.rb
304
+ - spec/unit/realtime/connection_spec.rb
264
305
  - spec/unit/realtime/error_info_spec.rb
306
+ - spec/unit/realtime/incoming_message_dispatcher_spec.rb
265
307
  - spec/unit/realtime/message_spec.rb
266
308
  - spec/unit/realtime/protocol_message_spec.rb
267
309
  - spec/unit/realtime/realtime_spec.rb
310
+ - spec/unit/rest/client_spec.rb
268
311
  - spec/unit/rest/message_spec.rb
269
312
  - spec/unit/rest/paged_resource_spec.rb
270
- - spec/unit/rest/rest_spec.rb
271
313
  - spec/unit/token_spec.rb
272
314
  has_rdoc: