ably-rest 0.7.3 → 0.7.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 (69) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +1 -0
  3. data/SPEC.md +480 -472
  4. data/lib/ably-rest.rb +1 -1
  5. data/lib/submodules/ably-ruby/LICENSE.txt +1 -1
  6. data/lib/submodules/ably-ruby/README.md +107 -24
  7. data/lib/submodules/ably-ruby/SPEC.md +531 -398
  8. data/lib/submodules/ably-ruby/lib/ably/auth.rb +24 -16
  9. data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +9 -0
  10. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +17 -9
  11. data/lib/submodules/ably-ruby/lib/ably/models/paginated_resource.rb +12 -8
  12. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +18 -10
  13. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +15 -4
  14. data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +4 -3
  15. data/lib/submodules/ably-ruby/lib/ably/modules/event_emitter.rb +31 -2
  16. data/lib/submodules/ably-ruby/lib/ably/modules/message_emitter.rb +77 -0
  17. data/lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb +71 -0
  18. data/lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb +41 -0
  19. data/lib/submodules/ably-ruby/lib/ably/modules/state_emitter.rb +28 -8
  20. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +0 -5
  21. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +24 -29
  22. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +54 -11
  23. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_state_machine.rb +21 -6
  24. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +7 -2
  25. data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +29 -26
  26. data/lib/submodules/ably-ruby/lib/ably/realtime/client/outgoing_message_dispatcher.rb +4 -4
  27. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +41 -9
  28. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +72 -24
  29. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_state_machine.rb +26 -4
  30. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb +19 -6
  31. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +74 -208
  32. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb +264 -0
  33. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/presence_manager.rb +59 -0
  34. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/presence_state_machine.rb +64 -0
  35. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +1 -1
  36. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +6 -2
  37. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +1 -1
  38. data/lib/submodules/ably-ruby/lib/ably/util/pub_sub.rb +3 -1
  39. data/lib/submodules/ably-ruby/lib/ably/util/safe_deferrable.rb +18 -0
  40. data/lib/submodules/ably-ruby/lib/ably/version.rb +1 -1
  41. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +2 -2
  42. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +28 -6
  43. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +116 -46
  44. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +55 -10
  45. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +32 -0
  46. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +456 -96
  47. data/lib/submodules/ably-ruby/spec/acceptance/realtime/stats_spec.rb +2 -2
  48. data/lib/submodules/ably-ruby/spec/acceptance/realtime/time_spec.rb +2 -2
  49. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +96 -7
  50. data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +8 -0
  51. data/lib/submodules/ably-ruby/spec/shared/safe_deferrable_behaviour.rb +71 -0
  52. data/lib/submodules/ably-ruby/spec/support/api_helper.rb +1 -1
  53. data/lib/submodules/ably-ruby/spec/support/event_machine_helper.rb +1 -1
  54. data/lib/submodules/ably-ruby/spec/support/test_app.rb +13 -7
  55. data/lib/submodules/ably-ruby/spec/unit/models/message_spec.rb +15 -14
  56. data/lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb +4 -4
  57. data/lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb +17 -17
  58. data/lib/submodules/ably-ruby/spec/unit/models/stat_spec.rb +4 -4
  59. data/lib/submodules/ably-ruby/spec/unit/modules/async_wrapper_spec.rb +28 -9
  60. data/lib/submodules/ably-ruby/spec/unit/modules/event_emitter_spec.rb +50 -0
  61. data/lib/submodules/ably-ruby/spec/unit/modules/state_emitter_spec.rb +76 -2
  62. data/lib/submodules/ably-ruby/spec/unit/realtime/channel_spec.rb +51 -20
  63. data/lib/submodules/ably-ruby/spec/unit/realtime/channels_spec.rb +3 -3
  64. data/lib/submodules/ably-ruby/spec/unit/realtime/connection_spec.rb +30 -0
  65. data/lib/submodules/ably-ruby/spec/unit/realtime/presence_spec.rb +52 -26
  66. data/lib/submodules/ably-ruby/spec/unit/realtime/safe_deferrable_spec.rb +12 -0
  67. data/spec/spec_helper.rb +5 -0
  68. metadata +12 -4
  69. data/lib/submodules/ably-ruby/.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
@@ -15,6 +15,11 @@ require 'support/private_api_formatter'
15
15
  require 'support/protocol_helper'
16
16
  require 'support/random_helper'
17
17
 
18
+ # Load in all shared behaviours
19
+ Dir.glob(File.expand_path("../lib/submodules/ably-ruby/spec/shared/*.rb", File.dirname(__FILE__))).each do |file|
20
+ require file
21
+ end
22
+
18
23
  require 'rspec_config'
19
24
 
20
25
  def require_tests_from(path, options = {})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew O'Riordan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-10 00:00:00.000000000 Z
11
+ date: 2015-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -173,7 +173,6 @@ files:
173
173
  - lib/ably-rest/modules/eventmachine_deferrable.rb
174
174
  - lib/submodules/ably-ruby/.gitignore
175
175
  - lib/submodules/ably-ruby/.rspec
176
- - lib/submodules/ably-ruby/.ruby-version.old
177
176
  - lib/submodules/ably-ruby/.travis.yml
178
177
  - lib/submodules/ably-ruby/Gemfile
179
178
  - lib/submodules/ably-ruby/LICENSE.txt
@@ -208,8 +207,11 @@ files:
208
207
  - lib/submodules/ably-ruby/lib/ably/modules/event_emitter.rb
209
208
  - lib/submodules/ably-ruby/lib/ably/modules/event_machine_helpers.rb
210
209
  - lib/submodules/ably-ruby/lib/ably/modules/http_helpers.rb
210
+ - lib/submodules/ably-ruby/lib/ably/modules/message_emitter.rb
211
211
  - lib/submodules/ably-ruby/lib/ably/modules/message_pack.rb
212
212
  - lib/submodules/ably-ruby/lib/ably/modules/model_common.rb
213
+ - lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb
214
+ - lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
213
215
  - lib/submodules/ably-ruby/lib/ably/modules/state_emitter.rb
214
216
  - lib/submodules/ably-ruby/lib/ably/modules/state_machine.rb
215
217
  - lib/submodules/ably-ruby/lib/ably/modules/statesman_monkey_patch.rb
@@ -228,6 +230,9 @@ files:
228
230
  - lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb
229
231
  - lib/submodules/ably-ruby/lib/ably/realtime/models/nil_channel.rb
230
232
  - lib/submodules/ably-ruby/lib/ably/realtime/presence.rb
233
+ - lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb
234
+ - lib/submodules/ably-ruby/lib/ably/realtime/presence/presence_manager.rb
235
+ - lib/submodules/ably-ruby/lib/ably/realtime/presence/presence_state_machine.rb
231
236
  - lib/submodules/ably-ruby/lib/ably/rest.rb
232
237
  - lib/submodules/ably-ruby/lib/ably/rest/channel.rb
233
238
  - lib/submodules/ably-ruby/lib/ably/rest/channels.rb
@@ -242,6 +247,7 @@ files:
242
247
  - lib/submodules/ably-ruby/lib/ably/rest/presence.rb
243
248
  - lib/submodules/ably-ruby/lib/ably/util/crypto.rb
244
249
  - lib/submodules/ably-ruby/lib/ably/util/pub_sub.rb
250
+ - lib/submodules/ably-ruby/lib/ably/util/safe_deferrable.rb
245
251
  - lib/submodules/ably-ruby/lib/ably/version.rb
246
252
  - lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb
247
253
  - lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb
@@ -269,6 +275,7 @@ files:
269
275
  - lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb
270
276
  - lib/submodules/ably-ruby/spec/shared/model_behaviour.rb
271
277
  - lib/submodules/ably-ruby/spec/shared/protocol_msgbus_behaviour.rb
278
+ - lib/submodules/ably-ruby/spec/shared/safe_deferrable_behaviour.rb
272
279
  - lib/submodules/ably-ruby/spec/spec_helper.rb
273
280
  - lib/submodules/ably-ruby/spec/support/api_helper.rb
274
281
  - lib/submodules/ably-ruby/spec/support/event_machine_helper.rb
@@ -304,6 +311,7 @@ files:
304
311
  - lib/submodules/ably-ruby/spec/unit/realtime/incoming_message_dispatcher_spec.rb
305
312
  - lib/submodules/ably-ruby/spec/unit/realtime/presence_spec.rb
306
313
  - lib/submodules/ably-ruby/spec/unit/realtime/realtime_spec.rb
314
+ - lib/submodules/ably-ruby/spec/unit/realtime/safe_deferrable_spec.rb
307
315
  - lib/submodules/ably-ruby/spec/unit/realtime/websocket_transport_spec.rb
308
316
  - lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb
309
317
  - lib/submodules/ably-ruby/spec/unit/rest/channels_spec.rb
@@ -338,7 +346,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
346
  version: '0'
339
347
  requirements: []
340
348
  rubyforge_project:
341
- rubygems_version: 2.4.5
349
+ rubygems_version: 2.4.6
342
350
  signing_key:
343
351
  specification_version: 4
344
352
  summary: A Ruby REST only client library for ably.io, the real-time messaging service
@@ -1 +0,0 @@
1
- 1.9.3-p547