ably 1.0.7 → 1.1.4.rc

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 (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