ably 0.7.2 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/LICENSE.txt +1 -1
  2. data/README.md +107 -24
  3. data/SPEC.md +531 -398
  4. data/lib/ably/auth.rb +23 -15
  5. data/lib/ably/exceptions.rb +9 -0
  6. data/lib/ably/models/message.rb +17 -9
  7. data/lib/ably/models/paginated_resource.rb +12 -8
  8. data/lib/ably/models/presence_message.rb +18 -10
  9. data/lib/ably/models/protocol_message.rb +15 -4
  10. data/lib/ably/modules/async_wrapper.rb +4 -3
  11. data/lib/ably/modules/event_emitter.rb +31 -2
  12. data/lib/ably/modules/message_emitter.rb +77 -0
  13. data/lib/ably/modules/safe_deferrable.rb +71 -0
  14. data/lib/ably/modules/safe_yield.rb +41 -0
  15. data/lib/ably/modules/state_emitter.rb +28 -8
  16. data/lib/ably/realtime.rb +0 -5
  17. data/lib/ably/realtime/channel.rb +24 -29
  18. data/lib/ably/realtime/channel/channel_manager.rb +54 -11
  19. data/lib/ably/realtime/channel/channel_state_machine.rb +21 -6
  20. data/lib/ably/realtime/client.rb +7 -2
  21. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +29 -26
  22. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +4 -4
  23. data/lib/ably/realtime/connection.rb +41 -9
  24. data/lib/ably/realtime/connection/connection_manager.rb +72 -24
  25. data/lib/ably/realtime/connection/connection_state_machine.rb +26 -4
  26. data/lib/ably/realtime/connection/websocket_transport.rb +19 -6
  27. data/lib/ably/realtime/presence.rb +74 -208
  28. data/lib/ably/realtime/presence/members_map.rb +264 -0
  29. data/lib/ably/realtime/presence/presence_manager.rb +59 -0
  30. data/lib/ably/realtime/presence/presence_state_machine.rb +64 -0
  31. data/lib/ably/rest/channel.rb +1 -1
  32. data/lib/ably/rest/client.rb +6 -2
  33. data/lib/ably/rest/presence.rb +1 -1
  34. data/lib/ably/util/pub_sub.rb +3 -1
  35. data/lib/ably/util/safe_deferrable.rb +18 -0
  36. data/lib/ably/version.rb +1 -1
  37. data/spec/acceptance/realtime/channel_history_spec.rb +2 -2
  38. data/spec/acceptance/realtime/channel_spec.rb +28 -6
  39. data/spec/acceptance/realtime/connection_failures_spec.rb +116 -46
  40. data/spec/acceptance/realtime/connection_spec.rb +55 -10
  41. data/spec/acceptance/realtime/message_spec.rb +32 -0
  42. data/spec/acceptance/realtime/presence_spec.rb +456 -96
  43. data/spec/acceptance/realtime/stats_spec.rb +2 -2
  44. data/spec/acceptance/realtime/time_spec.rb +2 -2
  45. data/spec/acceptance/rest/auth_spec.rb +75 -7
  46. data/spec/shared/client_initializer_behaviour.rb +8 -0
  47. data/spec/shared/safe_deferrable_behaviour.rb +71 -0
  48. data/spec/support/api_helper.rb +1 -1
  49. data/spec/support/event_machine_helper.rb +1 -1
  50. data/spec/support/test_app.rb +13 -7
  51. data/spec/unit/models/message_spec.rb +15 -14
  52. data/spec/unit/models/paginated_resource_spec.rb +4 -4
  53. data/spec/unit/models/presence_message_spec.rb +17 -17
  54. data/spec/unit/models/stat_spec.rb +4 -4
  55. data/spec/unit/modules/async_wrapper_spec.rb +28 -9
  56. data/spec/unit/modules/event_emitter_spec.rb +50 -0
  57. data/spec/unit/modules/state_emitter_spec.rb +76 -2
  58. data/spec/unit/realtime/channel_spec.rb +51 -20
  59. data/spec/unit/realtime/channels_spec.rb +3 -3
  60. data/spec/unit/realtime/connection_spec.rb +30 -0
  61. data/spec/unit/realtime/presence_spec.rb +52 -26
  62. data/spec/unit/realtime/safe_deferrable_spec.rb +12 -0
  63. metadata +85 -39
  64. checksums.yaml +0 -7
  65. data/.ruby-version.old +0 -1
@@ -2,8 +2,8 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Ably::Realtime::Channels do
5
- let(:connection) { instance_double('Ably::Realtime::Connection', on: true) }
6
- let(:client) { instance_double('Ably::Realtime::Client', connection: connection) }
5
+ let(:connection) { instance_double('Ably::Realtime::Connection', unsafe_on: true, on_resume: true) }
6
+ let(:client) { instance_double('Ably::Realtime::Client', connection: connection, client_id: 'clientId') }
7
7
  let(:channel_name) { 'unique' }
8
8
  let(:options) { { 'bizarre' => 'value' } }
9
9
 
@@ -41,7 +41,7 @@ describe Ably::Realtime::Channels do
41
41
  end
42
42
 
43
43
  context 'destroying channels' do
44
- it '#release detatches and then releases the channel resoures' do
44
+ it '#release detaches and then releases the channel resources' do
45
45
  released_channel = subject.get(channel_name, options)
46
46
  expect(released_channel).to receive(:detach).and_yield
47
47
  subject.release(channel_name)
@@ -30,4 +30,34 @@ describe Ably::Realtime::Connection do
30
30
 
31
31
  it_behaves_like 'an incoming protocol message bus'
32
32
  it_behaves_like 'an outgoing protocol message bus'
33
+
34
+ describe 'connection resume callbacks', api_private: true do
35
+ let(:callbacks) { [] }
36
+
37
+ describe '#resumed' do
38
+ it 'triggers callbacks' do
39
+ subject.on_resume { callbacks << true }
40
+ subject.resumed
41
+ expect(callbacks.count).to eql(1)
42
+ end
43
+ end
44
+
45
+ describe '#on_resume' do
46
+ it 'registers a callback' do
47
+ subject.on_resume { callbacks << true }
48
+ subject.resumed
49
+ expect(callbacks.count).to eql(1)
50
+ end
51
+ end
52
+
53
+ describe '#off_resume' do
54
+ it 'registers a callback' do
55
+ subject.on_resume { callbacks << true }
56
+ additional_proc = proc { raise 'This should not be called' }
57
+ subject.off_resume &additional_proc
58
+ subject.resumed
59
+ expect(callbacks.count).to eql(1)
60
+ end
61
+ end
62
+ end
33
63
  end
@@ -28,7 +28,7 @@ describe Ably::Realtime::Presence do
28
28
  Ably::Models::PresenceMessage.new({
29
29
  'action' => 0,
30
30
  'connection_id' => random_str,
31
- }, instance_double('Ably::Models::ProtocolMessage'))
31
+ }, protocol_message: instance_double('Ably::Models::ProtocolMessage'))
32
32
  end
33
33
  let(:msgbus) { subject.__incoming_msgbus__ }
34
34
 
@@ -47,63 +47,89 @@ describe Ably::Realtime::Presence do
47
47
 
48
48
  context 'subscriptions' do
49
49
  let(:message_history) { Hash.new { |hash, key| hash[key] = 0 } }
50
- let(:presence_action) { Ably::Models::PresenceMessage::ACTION.Enter }
51
- let(:message) do
52
- instance_double('Ably::Models::PresenceMessage', action: presence_action, connection_id: random_str, decode: true, member_key: random_str)
50
+ let(:enter_action) { Ably::Models::PresenceMessage::ACTION.Enter }
51
+ let(:enter_message) do
52
+ instance_double('Ably::Models::PresenceMessage', action: enter_action, connection_id: random_str, decode: true, member_key: random_str)
53
+ end
54
+ let(:leave_message) do
55
+ instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Leave, connection_id: random_str, decode: true, member_key: random_str)
56
+ end
57
+ let(:update_message) do
58
+ instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Update, connection_id: random_str, decode: true, member_key: random_str)
53
59
  end
54
60
 
55
61
  context '#subscribe' do
56
- before do
57
- subject.sync_completed
62
+ specify 'without a block raises an invalid ArgumentError' do
63
+ expect { subject.subscribe }.to raise_error ArgumentError
58
64
  end
59
65
 
60
- specify 'to all presence state actions' do
66
+ specify 'with no action specified subscribes the provided block to all action' do
61
67
  subject.subscribe { |message| message_history[:received] += 1}
62
- subject.__incoming_msgbus__.publish(:presence, message)
68
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
63
69
  expect(message_history[:received]).to eql(1)
64
70
  end
65
71
 
66
- specify 'to specific presence state actions' do
67
- subject.subscribe(presence_action) { |message| message_history[:received] += 1 }
72
+ specify 'with a single action argument subscribes that block to matching actions' do
73
+ subject.subscribe(enter_action) { |message| message_history[:received] += 1 }
68
74
  subject.subscribe(:leave) { |message| message_history[:received] += 1 }
69
- subject.__incoming_msgbus__.publish(:presence, message)
75
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
70
76
  expect(message_history[:received]).to eql(1)
71
77
  end
72
- end
73
78
 
74
- context '#unsubscribe' do
75
- before do
76
- subject.sync_completed
79
+ specify 'with a multiple action arguments subscribes that block to all of those actions' do
80
+ subject.subscribe(:leave, enter_action) { |message| message_history[:received] += 1 }
81
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
82
+ expect(message_history[:received]).to eql(1)
83
+ subject.__incoming_msgbus__.publish(:presence, leave_message)
84
+ expect(message_history[:received]).to eql(2)
85
+
86
+ # This message should be ignored as subscribed to :leave and :enter
87
+ subject.__incoming_msgbus__.publish(:presence, update_message)
88
+ expect(message_history[:received]).to eql(2)
77
89
  end
78
90
 
91
+ specify 'with a multiple duplicate action arguments subscribes that block to all of those unique actions once' do
92
+ subject.subscribe(enter_action, enter_action) { |message| message_history[:received] += 1 }
93
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
94
+ expect(message_history[:received]).to eql(1)
95
+ end
96
+ end
97
+
98
+ context '#unsubscribe' do
79
99
  let(:callback) do
80
100
  Proc.new { |message| message_history[:received] += 1 }
81
101
  end
82
102
  before do
83
- subject.subscribe(presence_action, &callback)
103
+ subject.subscribe(enter_action, &callback)
84
104
  end
85
105
 
86
- specify 'to all presence state actions' do
106
+ specify 'with no action specified unsubscribes that block from all events' do
87
107
  subject.unsubscribe &callback
88
- subject.__incoming_msgbus__.publish(:presence, message)
108
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
109
+ expect(message_history[:received]).to eql(0)
110
+ end
111
+
112
+ specify 'with a single action argument unsubscribes the provided block with the matching action' do
113
+ subject.unsubscribe enter_action, &callback
114
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
89
115
  expect(message_history[:received]).to eql(0)
90
116
  end
91
117
 
92
- specify 'to specific presence state actions' do
93
- subject.unsubscribe presence_action, &callback
94
- subject.__incoming_msgbus__.publish(:presence, message)
118
+ specify 'with multiple action arguments unsubscribes each of those matching actions with the provided block' do
119
+ subject.unsubscribe :update, :leave, enter_action, &callback
120
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
95
121
  expect(message_history[:received]).to eql(0)
96
122
  end
97
123
 
98
- specify 'to specific non-matching presence state actions' do
124
+ specify 'with a non-matching action argument has no effect' do
99
125
  subject.unsubscribe :leave, &callback
100
- subject.__incoming_msgbus__.publish(:presence, message)
126
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
101
127
  expect(message_history[:received]).to eql(1)
102
128
  end
103
129
 
104
- specify 'all callbacks by not providing a callback' do
105
- subject.unsubscribe presence_action
106
- subject.__incoming_msgbus__.publish(:presence, message)
130
+ specify 'with no block argument unsubscribes all blocks for the action argument' do
131
+ subject.unsubscribe enter_action
132
+ subject.__incoming_msgbus__.publish(:presence, enter_message)
107
133
  expect(message_history[:received]).to eql(0)
108
134
  end
109
135
  end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'shared/safe_deferrable_behaviour'
4
+ require 'ably/realtime'
5
+
6
+ [Ably::Models::ProtocolMessage, Ably::Models::Message, Ably::Models::PresenceMessage].each do |model_klass|
7
+ describe model_klass do
8
+ subject { model_klass.new(action: 1) }
9
+
10
+ it_behaves_like 'a safe Deferrable'
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.4
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Lewis Marshall
@@ -9,202 +10,230 @@ authors:
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2015-02-10 00:00:00.000000000 Z
13
+ date: 2015-03-09 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: eventmachine
16
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
- - - "~>"
20
+ - - ~>
19
21
  - !ruby/object:Gem::Version
20
22
  version: '1.0'
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
24
27
  requirements:
25
- - - "~>"
28
+ - - ~>
26
29
  - !ruby/object:Gem::Version
27
30
  version: '1.0'
28
31
  - !ruby/object:Gem::Dependency
29
32
  name: em-http-request
30
33
  requirement: !ruby/object:Gem::Requirement
34
+ none: false
31
35
  requirements:
32
- - - "~>"
36
+ - - ~>
33
37
  - !ruby/object:Gem::Version
34
38
  version: '1.1'
35
39
  type: :runtime
36
40
  prerelease: false
37
41
  version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
38
43
  requirements:
39
- - - "~>"
44
+ - - ~>
40
45
  - !ruby/object:Gem::Version
41
46
  version: '1.1'
42
47
  - !ruby/object:Gem::Dependency
43
48
  name: statesman
44
49
  requirement: !ruby/object:Gem::Requirement
50
+ none: false
45
51
  requirements:
46
- - - "~>"
52
+ - - ~>
47
53
  - !ruby/object:Gem::Version
48
54
  version: 1.0.0
49
55
  type: :runtime
50
56
  prerelease: false
51
57
  version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
52
59
  requirements:
53
- - - "~>"
60
+ - - ~>
54
61
  - !ruby/object:Gem::Version
55
62
  version: 1.0.0
56
63
  - !ruby/object:Gem::Dependency
57
64
  name: faraday
58
65
  requirement: !ruby/object:Gem::Requirement
66
+ none: false
59
67
  requirements:
60
- - - "~>"
68
+ - - ~>
61
69
  - !ruby/object:Gem::Version
62
70
  version: '0.9'
63
71
  type: :runtime
64
72
  prerelease: false
65
73
  version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
66
75
  requirements:
67
- - - "~>"
76
+ - - ~>
68
77
  - !ruby/object:Gem::Version
69
78
  version: '0.9'
70
79
  - !ruby/object:Gem::Dependency
71
80
  name: json
72
81
  requirement: !ruby/object:Gem::Requirement
82
+ none: false
73
83
  requirements:
74
- - - ">="
84
+ - - ! '>='
75
85
  - !ruby/object:Gem::Version
76
86
  version: '0'
77
87
  type: :runtime
78
88
  prerelease: false
79
89
  version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
80
91
  requirements:
81
- - - ">="
92
+ - - ! '>='
82
93
  - !ruby/object:Gem::Version
83
94
  version: '0'
84
95
  - !ruby/object:Gem::Dependency
85
96
  name: websocket-driver
86
97
  requirement: !ruby/object:Gem::Requirement
98
+ none: false
87
99
  requirements:
88
- - - "~>"
100
+ - - ~>
89
101
  - !ruby/object:Gem::Version
90
102
  version: '0.3'
91
103
  type: :runtime
92
104
  prerelease: false
93
105
  version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
94
107
  requirements:
95
- - - "~>"
108
+ - - ~>
96
109
  - !ruby/object:Gem::Version
97
110
  version: '0.3'
98
111
  - !ruby/object:Gem::Dependency
99
112
  name: msgpack-ably
100
113
  requirement: !ruby/object:Gem::Requirement
114
+ none: false
101
115
  requirements:
102
- - - "~>"
116
+ - - ~>
103
117
  - !ruby/object:Gem::Version
104
118
  version: 0.5.10
105
119
  type: :runtime
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
108
123
  requirements:
109
- - - "~>"
124
+ - - ~>
110
125
  - !ruby/object:Gem::Version
111
126
  version: 0.5.10
112
127
  - !ruby/object:Gem::Dependency
113
128
  name: bundler
114
129
  requirement: !ruby/object:Gem::Requirement
130
+ none: false
115
131
  requirements:
116
- - - "~>"
132
+ - - ~>
117
133
  - !ruby/object:Gem::Version
118
134
  version: '1.3'
119
135
  type: :development
120
136
  prerelease: false
121
137
  version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
122
139
  requirements:
123
- - - "~>"
140
+ - - ~>
124
141
  - !ruby/object:Gem::Version
125
142
  version: '1.3'
126
143
  - !ruby/object:Gem::Dependency
127
144
  name: rake
128
145
  requirement: !ruby/object:Gem::Requirement
146
+ none: false
129
147
  requirements:
130
- - - ">="
148
+ - - ! '>='
131
149
  - !ruby/object:Gem::Version
132
150
  version: '0'
133
151
  type: :development
134
152
  prerelease: false
135
153
  version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
136
155
  requirements:
137
- - - ">="
156
+ - - ! '>='
138
157
  - !ruby/object:Gem::Version
139
158
  version: '0'
140
159
  - !ruby/object:Gem::Dependency
141
160
  name: redcarpet
142
161
  requirement: !ruby/object:Gem::Requirement
162
+ none: false
143
163
  requirements:
144
- - - ">="
164
+ - - ! '>='
145
165
  - !ruby/object:Gem::Version
146
166
  version: '0'
147
167
  type: :development
148
168
  prerelease: false
149
169
  version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
150
171
  requirements:
151
- - - ">="
172
+ - - ! '>='
152
173
  - !ruby/object:Gem::Version
153
174
  version: '0'
154
175
  - !ruby/object:Gem::Dependency
155
176
  name: rspec
156
177
  requirement: !ruby/object:Gem::Requirement
178
+ none: false
157
179
  requirements:
158
- - - "~>"
180
+ - - ~>
159
181
  - !ruby/object:Gem::Version
160
182
  version: 3.1.0
161
183
  type: :development
162
184
  prerelease: false
163
185
  version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
164
187
  requirements:
165
- - - "~>"
188
+ - - ~>
166
189
  - !ruby/object:Gem::Version
167
190
  version: 3.1.0
168
191
  - !ruby/object:Gem::Dependency
169
192
  name: rspec-retry
170
193
  requirement: !ruby/object:Gem::Requirement
194
+ none: false
171
195
  requirements:
172
- - - ">="
196
+ - - ! '>='
173
197
  - !ruby/object:Gem::Version
174
198
  version: '0'
175
199
  type: :development
176
200
  prerelease: false
177
201
  version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
178
203
  requirements:
179
- - - ">="
204
+ - - ! '>='
180
205
  - !ruby/object:Gem::Version
181
206
  version: '0'
182
207
  - !ruby/object:Gem::Dependency
183
208
  name: yard
184
209
  requirement: !ruby/object:Gem::Requirement
210
+ none: false
185
211
  requirements:
186
- - - ">="
212
+ - - ! '>='
187
213
  - !ruby/object:Gem::Version
188
214
  version: '0'
189
215
  type: :development
190
216
  prerelease: false
191
217
  version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
192
219
  requirements:
193
- - - ">="
220
+ - - ! '>='
194
221
  - !ruby/object:Gem::Version
195
222
  version: '0'
196
223
  - !ruby/object:Gem::Dependency
197
224
  name: webmock
198
225
  requirement: !ruby/object:Gem::Requirement
226
+ none: false
199
227
  requirements:
200
- - - ">="
228
+ - - ! '>='
201
229
  - !ruby/object:Gem::Version
202
230
  version: '0'
203
231
  type: :development
204
232
  prerelease: false
205
233
  version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
206
235
  requirements:
207
- - - ">="
236
+ - - ! '>='
208
237
  - !ruby/object:Gem::Version
209
238
  version: '0'
210
239
  description: A Ruby client library for ably.io, the real-time messaging service
@@ -215,10 +244,9 @@ executables: []
215
244
  extensions: []
216
245
  extra_rdoc_files: []
217
246
  files:
218
- - ".gitignore"
219
- - ".rspec"
220
- - ".ruby-version.old"
221
- - ".travis.yml"
247
+ - .gitignore
248
+ - .rspec
249
+ - .travis.yml
222
250
  - Gemfile
223
251
  - LICENSE.txt
224
252
  - README.md
@@ -252,8 +280,11 @@ files:
252
280
  - lib/ably/modules/event_emitter.rb
253
281
  - lib/ably/modules/event_machine_helpers.rb
254
282
  - lib/ably/modules/http_helpers.rb
283
+ - lib/ably/modules/message_emitter.rb
255
284
  - lib/ably/modules/message_pack.rb
256
285
  - lib/ably/modules/model_common.rb
286
+ - lib/ably/modules/safe_deferrable.rb
287
+ - lib/ably/modules/safe_yield.rb
257
288
  - lib/ably/modules/state_emitter.rb
258
289
  - lib/ably/modules/state_machine.rb
259
290
  - lib/ably/modules/statesman_monkey_patch.rb
@@ -272,6 +303,9 @@ files:
272
303
  - lib/ably/realtime/connection/websocket_transport.rb
273
304
  - lib/ably/realtime/models/nil_channel.rb
274
305
  - lib/ably/realtime/presence.rb
306
+ - lib/ably/realtime/presence/members_map.rb
307
+ - lib/ably/realtime/presence/presence_manager.rb
308
+ - lib/ably/realtime/presence/presence_state_machine.rb
275
309
  - lib/ably/rest.rb
276
310
  - lib/ably/rest/channel.rb
277
311
  - lib/ably/rest/channels.rb
@@ -286,6 +320,7 @@ files:
286
320
  - lib/ably/rest/presence.rb
287
321
  - lib/ably/util/crypto.rb
288
322
  - lib/ably/util/pub_sub.rb
323
+ - lib/ably/util/safe_deferrable.rb
289
324
  - lib/ably/version.rb
290
325
  - spec/acceptance/realtime/channel_history_spec.rb
291
326
  - spec/acceptance/realtime/channel_spec.rb
@@ -313,6 +348,7 @@ files:
313
348
  - spec/shared/client_initializer_behaviour.rb
314
349
  - spec/shared/model_behaviour.rb
315
350
  - spec/shared/protocol_msgbus_behaviour.rb
351
+ - spec/shared/safe_deferrable_behaviour.rb
316
352
  - spec/spec_helper.rb
317
353
  - spec/support/api_helper.rb
318
354
  - spec/support/event_machine_helper.rb
@@ -348,6 +384,7 @@ files:
348
384
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
349
385
  - spec/unit/realtime/presence_spec.rb
350
386
  - spec/unit/realtime/realtime_spec.rb
387
+ - spec/unit/realtime/safe_deferrable_spec.rb
351
388
  - spec/unit/realtime/websocket_transport_spec.rb
352
389
  - spec/unit/rest/channel_spec.rb
353
390
  - spec/unit/rest/channels_spec.rb
@@ -358,26 +395,33 @@ files:
358
395
  homepage: http://github.com/ably/ably-ruby
359
396
  licenses:
360
397
  - MIT
361
- metadata: {}
362
398
  post_install_message:
363
399
  rdoc_options: []
364
400
  require_paths:
365
401
  - lib
366
402
  required_ruby_version: !ruby/object:Gem::Requirement
403
+ none: false
367
404
  requirements:
368
- - - ">="
405
+ - - ! '>='
369
406
  - !ruby/object:Gem::Version
370
407
  version: '0'
408
+ segments:
409
+ - 0
410
+ hash: 3024375831519817759
371
411
  required_rubygems_version: !ruby/object:Gem::Requirement
412
+ none: false
372
413
  requirements:
373
- - - ">="
414
+ - - ! '>='
374
415
  - !ruby/object:Gem::Version
375
416
  version: '0'
417
+ segments:
418
+ - 0
419
+ hash: 3024375831519817759
376
420
  requirements: []
377
421
  rubyforge_project:
378
- rubygems_version: 2.2.2
422
+ rubygems_version: 1.8.23.2
379
423
  signing_key:
380
- specification_version: 4
424
+ specification_version: 3
381
425
  summary: A Ruby client library for ably.io, the real-time messaging service
382
426
  test_files:
383
427
  - spec/acceptance/realtime/channel_history_spec.rb
@@ -406,6 +450,7 @@ test_files:
406
450
  - spec/shared/client_initializer_behaviour.rb
407
451
  - spec/shared/model_behaviour.rb
408
452
  - spec/shared/protocol_msgbus_behaviour.rb
453
+ - spec/shared/safe_deferrable_behaviour.rb
409
454
  - spec/spec_helper.rb
410
455
  - spec/support/api_helper.rb
411
456
  - spec/support/event_machine_helper.rb
@@ -441,6 +486,7 @@ test_files:
441
486
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
442
487
  - spec/unit/realtime/presence_spec.rb
443
488
  - spec/unit/realtime/realtime_spec.rb
489
+ - spec/unit/realtime/safe_deferrable_spec.rb
444
490
  - spec/unit/realtime/websocket_transport_spec.rb
445
491
  - spec/unit/rest/channel_spec.rb
446
492
  - spec/unit/rest/channels_spec.rb