ably 1.0.7 → 1.1.4.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +14 -0
  3. data/.travis.yml +10 -8
  4. data/CHANGELOG.md +58 -4
  5. data/LICENSE +1 -3
  6. data/README.md +9 -5
  7. data/Rakefile +32 -0
  8. data/SPEC.md +920 -565
  9. data/ably.gemspec +16 -11
  10. data/lib/ably/auth.rb +28 -2
  11. data/lib/ably/exceptions.rb +10 -4
  12. data/lib/ably/logger.rb +7 -1
  13. data/lib/ably/models/channel_state_change.rb +1 -1
  14. data/lib/ably/models/connection_state_change.rb +1 -1
  15. data/lib/ably/models/device_details.rb +87 -0
  16. data/lib/ably/models/device_push_details.rb +86 -0
  17. data/lib/ably/models/error_info.rb +23 -2
  18. data/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -4
  19. data/lib/ably/models/protocol_message.rb +32 -2
  20. data/lib/ably/models/push_channel_subscription.rb +89 -0
  21. data/lib/ably/modules/conversions.rb +1 -1
  22. data/lib/ably/modules/encodeable.rb +1 -1
  23. data/lib/ably/modules/exception_codes.rb +128 -0
  24. data/lib/ably/modules/model_common.rb +15 -2
  25. data/lib/ably/modules/state_machine.rb +2 -2
  26. data/lib/ably/realtime.rb +1 -0
  27. data/lib/ably/realtime/auth.rb +1 -1
  28. data/lib/ably/realtime/channel.rb +24 -102
  29. data/lib/ably/realtime/channel/channel_manager.rb +2 -6
  30. data/lib/ably/realtime/channel/channel_state_machine.rb +2 -2
  31. data/lib/ably/realtime/channel/publisher.rb +74 -0
  32. data/lib/ably/realtime/channel/push_channel.rb +62 -0
  33. data/lib/ably/realtime/client.rb +91 -3
  34. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +6 -2
  35. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +1 -1
  36. data/lib/ably/realtime/connection.rb +34 -20
  37. data/lib/ably/realtime/connection/connection_manager.rb +25 -9
  38. data/lib/ably/realtime/connection/websocket_transport.rb +1 -1
  39. data/lib/ably/realtime/presence.rb +4 -4
  40. data/lib/ably/realtime/presence/members_map.rb +3 -3
  41. data/lib/ably/realtime/push.rb +40 -0
  42. data/lib/ably/realtime/push/admin.rb +61 -0
  43. data/lib/ably/realtime/push/channel_subscriptions.rb +108 -0
  44. data/lib/ably/realtime/push/device_registrations.rb +105 -0
  45. data/lib/ably/rest.rb +1 -0
  46. data/lib/ably/rest/channel.rb +53 -17
  47. data/lib/ably/rest/channel/push_channel.rb +62 -0
  48. data/lib/ably/rest/client.rb +161 -35
  49. data/lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb +4 -1
  50. data/lib/ably/rest/middleware/parse_message_pack.rb +17 -1
  51. data/lib/ably/rest/presence.rb +1 -0
  52. data/lib/ably/rest/push.rb +42 -0
  53. data/lib/ably/rest/push/admin.rb +54 -0
  54. data/lib/ably/rest/push/channel_subscriptions.rb +121 -0
  55. data/lib/ably/rest/push/device_registrations.rb +103 -0
  56. data/lib/ably/version.rb +7 -2
  57. data/spec/acceptance/realtime/auth_spec.rb +22 -21
  58. data/spec/acceptance/realtime/channel_history_spec.rb +26 -20
  59. data/spec/acceptance/realtime/channel_spec.rb +177 -59
  60. data/spec/acceptance/realtime/client_spec.rb +153 -0
  61. data/spec/acceptance/realtime/connection_failures_spec.rb +72 -6
  62. data/spec/acceptance/realtime/connection_spec.rb +129 -18
  63. data/spec/acceptance/realtime/message_spec.rb +36 -34
  64. data/spec/acceptance/realtime/presence_spec.rb +201 -167
  65. data/spec/acceptance/realtime/push_admin_spec.rb +736 -0
  66. data/spec/acceptance/realtime/push_spec.rb +27 -0
  67. data/spec/acceptance/rest/auth_spec.rb +4 -3
  68. data/spec/acceptance/rest/base_spec.rb +2 -2
  69. data/spec/acceptance/rest/channel_spec.rb +79 -4
  70. data/spec/acceptance/rest/channels_spec.rb +6 -0
  71. data/spec/acceptance/rest/client_spec.rb +129 -10
  72. data/spec/acceptance/rest/message_spec.rb +158 -6
  73. data/spec/acceptance/rest/push_admin_spec.rb +952 -0
  74. data/spec/acceptance/rest/push_spec.rb +25 -0
  75. data/spec/acceptance/rest/time_spec.rb +1 -1
  76. data/spec/run_parallel_tests +33 -0
  77. data/spec/spec_helper.rb +1 -1
  78. data/spec/support/debug_failure_helper.rb +9 -5
  79. data/spec/support/test_app.rb +2 -2
  80. data/spec/unit/logger_spec.rb +10 -3
  81. data/spec/unit/models/device_details_spec.rb +102 -0
  82. data/spec/unit/models/device_push_details_spec.rb +101 -0
  83. data/spec/unit/models/error_info_spec.rb +51 -3
  84. data/spec/unit/models/message_spec.rb +17 -2
  85. data/spec/unit/models/presence_message_spec.rb +1 -1
  86. data/spec/unit/models/push_channel_subscription_spec.rb +86 -0
  87. data/spec/unit/modules/enum_spec.rb +1 -1
  88. data/spec/unit/realtime/client_spec.rb +13 -1
  89. data/spec/unit/realtime/connection_spec.rb +1 -1
  90. data/spec/unit/realtime/push_channel_spec.rb +36 -0
  91. data/spec/unit/rest/channel_spec.rb +8 -1
  92. data/spec/unit/rest/client_spec.rb +30 -0
  93. data/spec/unit/rest/push_channel_spec.rb +36 -0
  94. metadata +94 -31
@@ -547,7 +547,7 @@ describe Ably::Models::PresenceMessage do
547
547
  clone = model.shallow_clone(id: 'newId', action: 1, timestamp: protocol_message_timestamp + 1000)
548
548
  expect(clone.id).to match(/newId/)
549
549
  expect(clone.connection_id).to eql(protocol_connection_id)
550
- expect(as_since_epoch(clone.timestamp)).to eq(protocol_message_timestamp + 1000)
550
+ expect(as_since_epoch(clone.timestamp)).to be_within(5).of(protocol_message_timestamp + 1000)
551
551
  expect(clone.action).to eq(1)
552
552
  end
553
553
 
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'shared/model_behaviour'
4
+
5
+ describe Ably::Models::PushChannelSubscription do
6
+ include Ably::Modules::Conversions
7
+
8
+ subject { Ably::Models::PushChannelSubscription }
9
+
10
+ %w(channel client_id device_id).each do |string_attribute|
11
+ describe "##{string_attribute} and ##{string_attribute}=" do
12
+ let(:empty_device_details) do
13
+ if string_attribute == 'device_id'
14
+ subject.new(channel: 'default', device_id: 'default')
15
+ else
16
+ subject.new(channel: 'default', client_id: 'default')
17
+ end
18
+ end
19
+ let(:new_val) { random_str }
20
+
21
+ specify 'setter accepts a string value and getter returns the new value' do
22
+ expect(empty_device_details.public_send(string_attribute)).to eql('default')
23
+ empty_device_details.public_send("#{string_attribute}=", new_val)
24
+ expect(empty_device_details.public_send(string_attribute)).to eql(new_val)
25
+ end
26
+
27
+ specify 'setter accepts nil' do
28
+ empty_device_details.public_send("#{string_attribute}=", new_val)
29
+ expect(empty_device_details.public_send(string_attribute)).to eql(new_val)
30
+ empty_device_details.public_send("#{string_attribute}=", nil)
31
+ expect(empty_device_details.public_send(string_attribute)).to be_nil
32
+ end
33
+
34
+ specify 'rejects non string or nil values' do
35
+ expect { empty_device_details.public_send("#{string_attribute}=", {}) }.to raise_error(ArgumentError)
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'camelCase constructor attributes' do
41
+ let(:client_id) { random_str }
42
+ let(:device_details) { subject.new(channel: 'foo', 'clientId' => client_id ) }
43
+
44
+ specify 'are rubyfied and exposed as underscore case' do
45
+ expect(device_details.client_id).to eql(client_id)
46
+ end
47
+
48
+ specify 'are generated when the object is serialised to JSON' do
49
+ expect(JSON.parse(device_details.to_json)["clientId"]).to eql(client_id)
50
+ end
51
+ end
52
+
53
+ describe 'conversion method PushChannelSubscription' do
54
+ let(:channel) { 'foo' }
55
+ let(:device_id) { 'bar' }
56
+
57
+ it 'accepts a PushChannelSubscription object' do
58
+ push_channel_sub = PushChannelSubscription(channel: channel, device_id: device_id)
59
+ expect(push_channel_sub.channel).to eql('foo')
60
+ expect(push_channel_sub.client_id).to be_nil
61
+ expect(push_channel_sub.device_id).to eql('bar')
62
+ end
63
+ end
64
+
65
+ describe '#for_client_id constructor' do
66
+ context 'with a valid object' do
67
+ let(:channel) { 'foo' }
68
+ let(:client_id) { 'bob' }
69
+
70
+ it 'accepts a Hash object' do
71
+ push_channel_sub = Ably::Models::PushChannelSubscription.for_client_id(channel, client_id)
72
+ expect(push_channel_sub.channel).to eql('foo')
73
+ expect(push_channel_sub.client_id).to eql('bob')
74
+ expect(push_channel_sub.device_id).to be_nil
75
+ end
76
+ end
77
+
78
+ context 'with an invalid valid object' do
79
+ let(:subscription) { { channel: 'foo' } }
80
+
81
+ it 'accepts a Hash object' do
82
+ expect { Ably::Models::PushChannelSubscription.for_device(subscription) }.to raise_error(ArgumentError)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -53,7 +53,7 @@ describe Ably::Modules::Enum, :api_private do
53
53
  end
54
54
 
55
55
  it 'allows different type comparison 2' do
56
- skip 'Unless we monkeypath Symbols, the == operator is never invoked'
56
+ skip 'Unless we monkeypatch Symbols, the == operator is never invoked'
57
57
  expect([:value_zero].include?(subject.ValueZero)).to eql(true)
58
58
  end
59
59
 
@@ -13,7 +13,7 @@ describe Ably::Realtime::Client do
13
13
  let(:client_options) { { key: 'appid.keyuid:keysecret', auto_connect: false } }
14
14
 
15
15
  it 'passes on the options to the initializer' do
16
- rest_client = instance_double('Ably::Rest::Client', auth: instance_double('Ably::Auth'), options: client_options)
16
+ rest_client = instance_double('Ably::Rest::Client', auth: instance_double('Ably::Auth'), options: client_options, environment: 'production', use_tls?: true, custom_tls_port: nil)
17
17
  expect(Ably::Rest::Client).to receive(:new).with(hash_including(client_options)).and_return(rest_client)
18
18
  subject
19
19
  end
@@ -28,6 +28,18 @@ describe Ably::Realtime::Client do
28
28
  end
29
29
  end
30
30
 
31
+ context 'push' do
32
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
33
+
34
+ specify '#device is not supported and raises an exception' do
35
+ expect { subject.device }.to raise_error Ably::Exceptions::PushNotificationsNotSupported
36
+ end
37
+
38
+ specify '#push returns a Push object' do
39
+ expect(subject.push).to be_a(Ably::Realtime::Push)
40
+ end
41
+ end
42
+
31
43
  after(:all) do
32
44
  sleep 1 # let realtime library shut down any open clients
33
45
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'shared/protocol_msgbus_behaviour'
3
3
 
4
4
  describe Ably::Realtime::Connection do
5
- let(:client) { instance_double('Ably::Realtime::Client', logger: double('logger').as_null_object) }
5
+ let(:client) { instance_double('Ably::Realtime::Client', logger: double('logger').as_null_object, recover: nil, endpoint: double('endpoint', host: 'realtime.ably.io')) }
6
6
 
7
7
  subject do
8
8
  Ably::Realtime::Connection.new(client, {}).tap do |connection|
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ably::Realtime::Channel::PushChannel do
4
+ subject { Ably::Realtime::Channel::PushChannel }
5
+
6
+ let(:channel_name) { 'unique' }
7
+ let(:client) { double('client').as_null_object }
8
+ let(:channel) { Ably::Realtime::Channel.new(client, channel_name) }
9
+
10
+ it 'is constructed with a channel' do
11
+ expect(subject.new(channel)).to be_a(Ably::Realtime::Channel::PushChannel)
12
+ end
13
+
14
+ it 'raises an exception if constructed with an invalid type' do
15
+ expect { subject.new(Hash.new) }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it 'exposes the channel as attribute #channel' do
19
+ expect(subject.new(channel).channel).to eql(channel)
20
+ end
21
+
22
+ it 'is available in the #push attribute of the channel' do
23
+ expect(channel.push).to be_a(Ably::Realtime::Channel::PushChannel)
24
+ expect(channel.push.channel).to eql(channel)
25
+ end
26
+
27
+ context 'methods not implemented as push notifications' do
28
+ subject { Ably::Realtime::Channel::PushChannel.new(channel) }
29
+
30
+ %w(subscribe_device subscribe_client_id unsubscribe_device unsubscribe_client_id get_subscriptions).each do |method_name|
31
+ specify "##{method_name} raises an unsupported exception" do
32
+ expect { subject.public_send(method_name, 'foo') }.to raise_error(Ably::Exceptions::PushNotificationsNotSupported)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,7 +2,14 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Ably::Rest::Channel do
5
- let(:client) { instance_double('Ably::Rest::Client', encoders: [], post: instance_double('Faraday::Response', status: 201)) }
5
+ let(:client) do
6
+ instance_double(
7
+ 'Ably::Rest::Client',
8
+ encoders: [],
9
+ post: instance_double('Faraday::Response', status: 201),
10
+ idempotent_rest_publishing: false,
11
+ )
12
+ end
6
13
  let(:channel_name) { 'unique' }
7
14
 
8
15
  subject { Ably::Rest::Channel.new(client, channel_name) }
@@ -20,6 +20,24 @@ describe Ably::Rest::Client do
20
20
  end
21
21
  end
22
22
 
23
+ context 'fallback_retry_timeout (#RSC15f)' do
24
+ context 'default' do
25
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
26
+
27
+ it 'is set to 10 minutes' do
28
+ expect(subject.options.fetch(:fallback_retry_timeout)).to eql(10 * 60)
29
+ end
30
+ end
31
+
32
+ context 'when provided' do
33
+ let(:client_options) { { key: 'appid.keyuid:keysecret', fallback_retry_timeout: 30 } }
34
+
35
+ it 'configures a new timeout' do
36
+ expect(subject.options.fetch(:fallback_retry_timeout)).to eql(30)
37
+ end
38
+ end
39
+ end
40
+
23
41
  context ':use_token_auth' do
24
42
  context 'set to false' do
25
43
  context 'with a key and :tls => false' do
@@ -57,4 +75,16 @@ describe Ably::Rest::Client do
57
75
  expect(subject.add_request_ids).to eql(true)
58
76
  end
59
77
  end
78
+
79
+ context 'push' do
80
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
81
+
82
+ specify '#device is not supported and raises an exception' do
83
+ expect { subject.device }.to raise_error Ably::Exceptions::PushNotificationsNotSupported
84
+ end
85
+
86
+ specify '#push returns a Push object' do
87
+ expect(subject.push).to be_a(Ably::Rest::Push)
88
+ end
89
+ end
60
90
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ably::Rest::Channel::PushChannel do
4
+ subject { Ably::Rest::Channel::PushChannel }
5
+
6
+ let(:channel_name) { 'unique' }
7
+ let(:client) { double('client').as_null_object }
8
+ let(:channel) { Ably::Rest::Channel.new(client, channel_name) }
9
+
10
+ it 'is constructed with a channel' do
11
+ expect(subject.new(channel)).to be_a(Ably::Rest::Channel::PushChannel)
12
+ end
13
+
14
+ it 'raises an exception if constructed with an invalid type' do
15
+ expect { subject.new(Hash.new) }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it 'exposes the channel as attribute #channel' do
19
+ expect(subject.new(channel).channel).to eql(channel)
20
+ end
21
+
22
+ it 'is available in the #push attribute of the channel' do
23
+ expect(channel.push).to be_a(Ably::Rest::Channel::PushChannel)
24
+ expect(channel.push.channel).to eql(channel)
25
+ end
26
+
27
+ context 'methods not implemented as push notifications' do
28
+ subject { Ably::Rest::Channel::PushChannel.new(channel) }
29
+
30
+ %w(subscribe_device subscribe_client_id unsubscribe_device unsubscribe_client_id get_subscriptions).each do |method_name|
31
+ specify "##{method_name} raises an unsupported exception" do
32
+ expect { subject.public_send(method_name, 'foo') }.to raise_error(Ably::Exceptions::PushNotificationsNotSupported)
33
+ end
34
+ end
35
+ end
36
+ end
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: 1.0.7
4
+ version: 1.1.4.rc
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: 2018-06-18 00:00:00.000000000 Z
12
+ date: 2020-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -59,28 +59,28 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '0.12'
62
+ version: '1.0'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '0.12'
69
+ version: '1.0'
70
70
  - !ruby/object:Gem::Dependency
71
- name: excon
71
+ name: typhoeus
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0.55'
76
+ version: '1.4'
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '0.55'
83
+ version: '1.4'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: json
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -115,14 +115,14 @@ dependencies:
115
115
  requirements:
116
116
  - - ">="
117
117
  - !ruby/object:Gem::Version
118
- version: 0.6.2
118
+ version: 1.3.0
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: 0.6.2
125
+ version: 1.3.0
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: addressable
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -138,89 +138,103 @@ dependencies:
138
138
  - !ruby/object:Gem::Version
139
139
  version: 2.0.0
140
140
  - !ruby/object:Gem::Dependency
141
- name: bundler
141
+ name: rake
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: '1.3'
146
+ version: '13.0'
147
147
  type: :development
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: '1.3'
153
+ version: '13.0'
154
154
  - !ruby/object:Gem::Dependency
155
- name: rake
155
+ name: redcarpet
156
156
  requirement: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: '11.3'
160
+ version: '3.3'
161
161
  type: :development
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: '11.3'
167
+ version: '3.3'
168
168
  - !ruby/object:Gem::Dependency
169
- name: redcarpet
169
+ name: rspec
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
- version: '3.3'
174
+ version: 3.10.0
175
175
  type: :development
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
- version: '3.3'
181
+ version: 3.10.0
182
182
  - !ruby/object:Gem::Dependency
183
- name: rspec
183
+ name: rspec-retry
184
184
  requirement: !ruby/object:Gem::Requirement
185
185
  requirements:
186
186
  - - "~>"
187
187
  - !ruby/object:Gem::Version
188
- version: 3.2.0
188
+ version: '0.6'
189
189
  type: :development
190
190
  prerelease: false
191
191
  version_requirements: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - "~>"
194
194
  - !ruby/object:Gem::Version
195
- version: 3.2.0
195
+ version: '0.6'
196
196
  - !ruby/object:Gem::Dependency
197
- name: rspec-retry
197
+ name: yard
198
198
  requirement: !ruby/object:Gem::Requirement
199
199
  requirements:
200
200
  - - "~>"
201
201
  - !ruby/object:Gem::Version
202
- version: '0.4'
202
+ version: '0.9'
203
203
  type: :development
204
204
  prerelease: false
205
205
  version_requirements: !ruby/object:Gem::Requirement
206
206
  requirements:
207
207
  - - "~>"
208
208
  - !ruby/object:Gem::Version
209
- version: '0.4'
209
+ version: '0.9'
210
210
  - !ruby/object:Gem::Dependency
211
- name: yard
211
+ name: rspec-instafail
212
212
  requirement: !ruby/object:Gem::Requirement
213
213
  requirements:
214
214
  - - "~>"
215
215
  - !ruby/object:Gem::Version
216
- version: '0.9'
216
+ version: '1.0'
217
217
  type: :development
218
218
  prerelease: false
219
219
  version_requirements: !ruby/object:Gem::Requirement
220
220
  requirements:
221
221
  - - "~>"
222
222
  - !ruby/object:Gem::Version
223
- version: '0.9'
223
+ version: '1.0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: bundler
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: 2.2.1
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: 2.2.1
224
238
  - !ruby/object:Gem::Dependency
225
239
  name: webmock
226
240
  requirement: !ruby/object:Gem::Requirement
@@ -249,6 +263,20 @@ dependencies:
249
263
  - - ">="
250
264
  - !ruby/object:Gem::Version
251
265
  version: '0'
266
+ - !ruby/object:Gem::Dependency
267
+ name: parallel_tests
268
+ requirement: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - "~>"
271
+ - !ruby/object:Gem::Version
272
+ version: '2.22'
273
+ type: :development
274
+ prerelease: false
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - "~>"
278
+ - !ruby/object:Gem::Version
279
+ version: '2.22'
252
280
  - !ruby/object:Gem::Dependency
253
281
  name: pry
254
282
  requirement: !ruby/object:Gem::Requirement
@@ -285,6 +313,7 @@ executables: []
285
313
  extensions: []
286
314
  extra_rdoc_files: []
287
315
  files:
316
+ - ".editorconfig"
288
317
  - ".gitignore"
289
318
  - ".gitmodules"
290
319
  - ".rspec"
@@ -305,6 +334,8 @@ files:
305
334
  - lib/ably/models/cipher_params.rb
306
335
  - lib/ably/models/connection_details.rb
307
336
  - lib/ably/models/connection_state_change.rb
337
+ - lib/ably/models/device_details.rb
338
+ - lib/ably/models/device_push_details.rb
308
339
  - lib/ably/models/error_info.rb
309
340
  - lib/ably/models/http_paginated_response.rb
310
341
  - lib/ably/models/idiomatic_ruby_wrapper.rb
@@ -318,6 +349,7 @@ files:
318
349
  - lib/ably/models/paginated_result.rb
319
350
  - lib/ably/models/presence_message.rb
320
351
  - lib/ably/models/protocol_message.rb
352
+ - lib/ably/models/push_channel_subscription.rb
321
353
  - lib/ably/models/stats.rb
322
354
  - lib/ably/models/stats_types.rb
323
355
  - lib/ably/models/token_details.rb
@@ -330,6 +362,7 @@ files:
330
362
  - lib/ably/modules/enum.rb
331
363
  - lib/ably/modules/event_emitter.rb
332
364
  - lib/ably/modules/event_machine_helpers.rb
365
+ - lib/ably/modules/exception_codes.rb
333
366
  - lib/ably/modules/http_helpers.rb
334
367
  - lib/ably/modules/message_emitter.rb
335
368
  - lib/ably/modules/message_pack.rb
@@ -345,6 +378,8 @@ files:
345
378
  - lib/ably/realtime/channel.rb
346
379
  - lib/ably/realtime/channel/channel_manager.rb
347
380
  - lib/ably/realtime/channel/channel_state_machine.rb
381
+ - lib/ably/realtime/channel/publisher.rb
382
+ - lib/ably/realtime/channel/push_channel.rb
348
383
  - lib/ably/realtime/channels.rb
349
384
  - lib/ably/realtime/client.rb
350
385
  - lib/ably/realtime/client/incoming_message_dispatcher.rb
@@ -358,8 +393,13 @@ files:
358
393
  - lib/ably/realtime/presence/members_map.rb
359
394
  - lib/ably/realtime/presence/presence_manager.rb
360
395
  - lib/ably/realtime/presence/presence_state_machine.rb
396
+ - lib/ably/realtime/push.rb
397
+ - lib/ably/realtime/push/admin.rb
398
+ - lib/ably/realtime/push/channel_subscriptions.rb
399
+ - lib/ably/realtime/push/device_registrations.rb
361
400
  - lib/ably/rest.rb
362
401
  - lib/ably/rest/channel.rb
402
+ - lib/ably/rest/channel/push_channel.rb
363
403
  - lib/ably/rest/channels.rb
364
404
  - lib/ably/rest/client.rb
365
405
  - lib/ably/rest/middleware/encoder.rb
@@ -370,6 +410,10 @@ files:
370
410
  - lib/ably/rest/middleware/parse_json.rb
371
411
  - lib/ably/rest/middleware/parse_message_pack.rb
372
412
  - lib/ably/rest/presence.rb
413
+ - lib/ably/rest/push.rb
414
+ - lib/ably/rest/push/admin.rb
415
+ - lib/ably/rest/push/channel_subscriptions.rb
416
+ - lib/ably/rest/push/device_registrations.rb
373
417
  - lib/ably/util/crypto.rb
374
418
  - lib/ably/util/pub_sub.rb
375
419
  - lib/ably/util/safe_deferrable.rb
@@ -384,6 +428,8 @@ files:
384
428
  - spec/acceptance/realtime/message_spec.rb
385
429
  - spec/acceptance/realtime/presence_history_spec.rb
386
430
  - spec/acceptance/realtime/presence_spec.rb
431
+ - spec/acceptance/realtime/push_admin_spec.rb
432
+ - spec/acceptance/realtime/push_spec.rb
387
433
  - spec/acceptance/realtime/stats_spec.rb
388
434
  - spec/acceptance/realtime/time_spec.rb
389
435
  - spec/acceptance/rest/auth_spec.rb
@@ -394,9 +440,12 @@ files:
394
440
  - spec/acceptance/rest/encoders_spec.rb
395
441
  - spec/acceptance/rest/message_spec.rb
396
442
  - spec/acceptance/rest/presence_spec.rb
443
+ - spec/acceptance/rest/push_admin_spec.rb
444
+ - spec/acceptance/rest/push_spec.rb
397
445
  - spec/acceptance/rest/stats_spec.rb
398
446
  - spec/acceptance/rest/time_spec.rb
399
447
  - spec/rspec_config.rb
448
+ - spec/run_parallel_tests
400
449
  - spec/shared/client_initializer_behaviour.rb
401
450
  - spec/shared/model_behaviour.rb
402
451
  - spec/shared/protocol_msgbus_behaviour.rb
@@ -420,6 +469,8 @@ files:
420
469
  - spec/unit/models/cipher_params_spec.rb
421
470
  - spec/unit/models/connection_details_spec.rb
422
471
  - spec/unit/models/connection_state_change_spec.rb
472
+ - spec/unit/models/device_details_spec.rb
473
+ - spec/unit/models/device_push_details_spec.rb
423
474
  - spec/unit/models/error_info_spec.rb
424
475
  - spec/unit/models/http_paginated_result_spec.rb
425
476
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
@@ -431,6 +482,7 @@ files:
431
482
  - spec/unit/models/paginated_result_spec.rb
432
483
  - spec/unit/models/presence_message_spec.rb
433
484
  - spec/unit/models/protocol_message_spec.rb
485
+ - spec/unit/models/push_channel_subscription_spec.rb
434
486
  - spec/unit/models/stats_spec.rb
435
487
  - spec/unit/models/token_details_spec.rb
436
488
  - spec/unit/models/token_request_spec.rb
@@ -445,12 +497,14 @@ files:
445
497
  - spec/unit/realtime/connection_spec.rb
446
498
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
447
499
  - spec/unit/realtime/presence_spec.rb
500
+ - spec/unit/realtime/push_channel_spec.rb
448
501
  - spec/unit/realtime/realtime_spec.rb
449
502
  - spec/unit/realtime/safe_deferrable_spec.rb
450
503
  - spec/unit/realtime/websocket_transport_spec.rb
451
504
  - spec/unit/rest/channel_spec.rb
452
505
  - spec/unit/rest/channels_spec.rb
453
506
  - spec/unit/rest/client_spec.rb
507
+ - spec/unit/rest/push_channel_spec.rb
454
508
  - spec/unit/rest/rest_spec.rb
455
509
  - spec/unit/util/crypto_spec.rb
456
510
  - spec/unit/util/pub_sub_spec.rb
@@ -469,12 +523,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
469
523
  version: '0'
470
524
  required_rubygems_version: !ruby/object:Gem::Requirement
471
525
  requirements:
472
- - - ">="
526
+ - - ">"
473
527
  - !ruby/object:Gem::Version
474
- version: '0'
528
+ version: 1.3.1
475
529
  requirements: []
476
- rubyforge_project:
477
- rubygems_version: 2.7.6
530
+ rubygems_version: 3.0.3
478
531
  signing_key:
479
532
  specification_version: 4
480
533
  summary: A Ruby client library for ably.io realtime messaging implemented using EventMachine
@@ -489,6 +542,8 @@ test_files:
489
542
  - spec/acceptance/realtime/message_spec.rb
490
543
  - spec/acceptance/realtime/presence_history_spec.rb
491
544
  - spec/acceptance/realtime/presence_spec.rb
545
+ - spec/acceptance/realtime/push_admin_spec.rb
546
+ - spec/acceptance/realtime/push_spec.rb
492
547
  - spec/acceptance/realtime/stats_spec.rb
493
548
  - spec/acceptance/realtime/time_spec.rb
494
549
  - spec/acceptance/rest/auth_spec.rb
@@ -499,9 +554,12 @@ test_files:
499
554
  - spec/acceptance/rest/encoders_spec.rb
500
555
  - spec/acceptance/rest/message_spec.rb
501
556
  - spec/acceptance/rest/presence_spec.rb
557
+ - spec/acceptance/rest/push_admin_spec.rb
558
+ - spec/acceptance/rest/push_spec.rb
502
559
  - spec/acceptance/rest/stats_spec.rb
503
560
  - spec/acceptance/rest/time_spec.rb
504
561
  - spec/rspec_config.rb
562
+ - spec/run_parallel_tests
505
563
  - spec/shared/client_initializer_behaviour.rb
506
564
  - spec/shared/model_behaviour.rb
507
565
  - spec/shared/protocol_msgbus_behaviour.rb
@@ -525,6 +583,8 @@ test_files:
525
583
  - spec/unit/models/cipher_params_spec.rb
526
584
  - spec/unit/models/connection_details_spec.rb
527
585
  - spec/unit/models/connection_state_change_spec.rb
586
+ - spec/unit/models/device_details_spec.rb
587
+ - spec/unit/models/device_push_details_spec.rb
528
588
  - spec/unit/models/error_info_spec.rb
529
589
  - spec/unit/models/http_paginated_result_spec.rb
530
590
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
@@ -536,6 +596,7 @@ test_files:
536
596
  - spec/unit/models/paginated_result_spec.rb
537
597
  - spec/unit/models/presence_message_spec.rb
538
598
  - spec/unit/models/protocol_message_spec.rb
599
+ - spec/unit/models/push_channel_subscription_spec.rb
539
600
  - spec/unit/models/stats_spec.rb
540
601
  - spec/unit/models/token_details_spec.rb
541
602
  - spec/unit/models/token_request_spec.rb
@@ -550,12 +611,14 @@ test_files:
550
611
  - spec/unit/realtime/connection_spec.rb
551
612
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
552
613
  - spec/unit/realtime/presence_spec.rb
614
+ - spec/unit/realtime/push_channel_spec.rb
553
615
  - spec/unit/realtime/realtime_spec.rb
554
616
  - spec/unit/realtime/safe_deferrable_spec.rb
555
617
  - spec/unit/realtime/websocket_transport_spec.rb
556
618
  - spec/unit/rest/channel_spec.rb
557
619
  - spec/unit/rest/channels_spec.rb
558
620
  - spec/unit/rest/client_spec.rb
621
+ - spec/unit/rest/push_channel_spec.rb
559
622
  - spec/unit/rest/rest_spec.rb
560
623
  - spec/unit/util/crypto_spec.rb
561
624
  - spec/unit/util/pub_sub_spec.rb