ably 1.0.6 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.travis.yml +10 -8
- data/CHANGELOG.md +75 -3
- data/LICENSE +1 -3
- data/README.md +12 -7
- data/Rakefile +32 -0
- data/SPEC.md +1277 -835
- data/ably.gemspec +14 -9
- data/lib/ably/auth.rb +30 -4
- data/lib/ably/exceptions.rb +10 -4
- data/lib/ably/logger.rb +7 -1
- data/lib/ably/models/channel_state_change.rb +1 -1
- data/lib/ably/models/connection_state_change.rb +1 -1
- data/lib/ably/models/device_details.rb +87 -0
- data/lib/ably/models/device_push_details.rb +86 -0
- data/lib/ably/models/error_info.rb +23 -2
- data/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -4
- data/lib/ably/models/protocol_message.rb +32 -2
- data/lib/ably/models/push_channel_subscription.rb +89 -0
- data/lib/ably/modules/conversions.rb +1 -1
- data/lib/ably/modules/encodeable.rb +1 -1
- data/lib/ably/modules/exception_codes.rb +128 -0
- data/lib/ably/modules/model_common.rb +15 -2
- data/lib/ably/modules/state_machine.rb +2 -2
- data/lib/ably/realtime.rb +1 -0
- data/lib/ably/realtime/auth.rb +1 -1
- data/lib/ably/realtime/channel.rb +24 -102
- data/lib/ably/realtime/channel/channel_manager.rb +2 -6
- data/lib/ably/realtime/channel/channel_state_machine.rb +2 -2
- data/lib/ably/realtime/channel/publisher.rb +74 -0
- data/lib/ably/realtime/channel/push_channel.rb +62 -0
- data/lib/ably/realtime/client.rb +91 -3
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +6 -2
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +1 -1
- data/lib/ably/realtime/connection.rb +34 -20
- data/lib/ably/realtime/connection/connection_manager.rb +25 -9
- data/lib/ably/realtime/connection/websocket_transport.rb +1 -1
- data/lib/ably/realtime/presence.rb +4 -4
- data/lib/ably/realtime/presence/members_map.rb +3 -3
- data/lib/ably/realtime/push.rb +40 -0
- data/lib/ably/realtime/push/admin.rb +61 -0
- data/lib/ably/realtime/push/channel_subscriptions.rb +108 -0
- data/lib/ably/realtime/push/device_registrations.rb +105 -0
- data/lib/ably/rest.rb +1 -0
- data/lib/ably/rest/channel.rb +53 -17
- data/lib/ably/rest/channel/push_channel.rb +62 -0
- data/lib/ably/rest/client.rb +154 -32
- data/lib/ably/rest/middleware/parse_message_pack.rb +17 -1
- data/lib/ably/rest/presence.rb +1 -0
- data/lib/ably/rest/push.rb +42 -0
- data/lib/ably/rest/push/admin.rb +54 -0
- data/lib/ably/rest/push/channel_subscriptions.rb +121 -0
- data/lib/ably/rest/push/device_registrations.rb +103 -0
- data/lib/ably/version.rb +7 -2
- data/spec/acceptance/realtime/auth_spec.rb +245 -17
- data/spec/acceptance/realtime/channel_history_spec.rb +26 -20
- data/spec/acceptance/realtime/channel_spec.rb +177 -59
- data/spec/acceptance/realtime/client_spec.rb +153 -0
- data/spec/acceptance/realtime/connection_failures_spec.rb +72 -6
- data/spec/acceptance/realtime/connection_spec.rb +129 -18
- data/spec/acceptance/realtime/message_spec.rb +36 -34
- data/spec/acceptance/realtime/presence_spec.rb +201 -167
- data/spec/acceptance/realtime/push_admin_spec.rb +736 -0
- data/spec/acceptance/realtime/push_spec.rb +27 -0
- data/spec/acceptance/rest/auth_spec.rb +41 -3
- data/spec/acceptance/rest/base_spec.rb +2 -2
- data/spec/acceptance/rest/channel_spec.rb +79 -4
- data/spec/acceptance/rest/channels_spec.rb +6 -0
- data/spec/acceptance/rest/client_spec.rb +129 -10
- data/spec/acceptance/rest/message_spec.rb +158 -6
- data/spec/acceptance/rest/push_admin_spec.rb +952 -0
- data/spec/acceptance/rest/push_spec.rb +25 -0
- data/spec/acceptance/rest/time_spec.rb +1 -1
- data/spec/run_parallel_tests +33 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/debug_failure_helper.rb +9 -5
- data/spec/support/test_app.rb +2 -2
- data/spec/unit/logger_spec.rb +10 -3
- data/spec/unit/models/device_details_spec.rb +102 -0
- data/spec/unit/models/device_push_details_spec.rb +101 -0
- data/spec/unit/models/error_info_spec.rb +51 -3
- data/spec/unit/models/message_spec.rb +17 -2
- data/spec/unit/models/presence_message_spec.rb +1 -1
- data/spec/unit/models/push_channel_subscription_spec.rb +86 -0
- data/spec/unit/modules/enum_spec.rb +1 -1
- data/spec/unit/realtime/client_spec.rb +13 -1
- data/spec/unit/realtime/connection_spec.rb +1 -1
- data/spec/unit/realtime/push_channel_spec.rb +36 -0
- data/spec/unit/rest/channel_spec.rb +8 -1
- data/spec/unit/rest/client_spec.rb +30 -0
- data/spec/unit/rest/push_channel_spec.rb +36 -0
- metadata +95 -26
@@ -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
|
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
|
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)
|
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.
|
4
|
+
version: 1.1.3
|
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:
|
12
|
+
date: 2020-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
@@ -57,16 +57,22 @@ dependencies:
|
|
57
57
|
name: faraday
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0.12'
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 2.0.0
|
63
66
|
type: :runtime
|
64
67
|
prerelease: false
|
65
68
|
version_requirements: !ruby/object:Gem::Requirement
|
66
69
|
requirements:
|
67
|
-
- - "
|
70
|
+
- - ">="
|
68
71
|
- !ruby/object:Gem::Version
|
69
72
|
version: '0.12'
|
73
|
+
- - "<"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.0.0
|
70
76
|
- !ruby/object:Gem::Dependency
|
71
77
|
name: excon
|
72
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,14 +121,14 @@ dependencies:
|
|
115
121
|
requirements:
|
116
122
|
- - ">="
|
117
123
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
124
|
+
version: 1.3.0
|
119
125
|
type: :runtime
|
120
126
|
prerelease: false
|
121
127
|
version_requirements: !ruby/object:Gem::Requirement
|
122
128
|
requirements:
|
123
129
|
- - ">="
|
124
130
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
131
|
+
version: 1.3.0
|
126
132
|
- !ruby/object:Gem::Dependency
|
127
133
|
name: addressable
|
128
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,20 +143,6 @@ dependencies:
|
|
137
143
|
- - ">="
|
138
144
|
- !ruby/object:Gem::Version
|
139
145
|
version: 2.0.0
|
140
|
-
- !ruby/object:Gem::Dependency
|
141
|
-
name: bundler
|
142
|
-
requirement: !ruby/object:Gem::Requirement
|
143
|
-
requirements:
|
144
|
-
- - "~>"
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '1.3'
|
147
|
-
type: :development
|
148
|
-
prerelease: false
|
149
|
-
version_requirements: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - "~>"
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: '1.3'
|
154
146
|
- !ruby/object:Gem::Dependency
|
155
147
|
name: rake
|
156
148
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,28 +177,28 @@ dependencies:
|
|
185
177
|
requirements:
|
186
178
|
- - "~>"
|
187
179
|
- !ruby/object:Gem::Version
|
188
|
-
version: 3.
|
180
|
+
version: 3.3.0
|
189
181
|
type: :development
|
190
182
|
prerelease: false
|
191
183
|
version_requirements: !ruby/object:Gem::Requirement
|
192
184
|
requirements:
|
193
185
|
- - "~>"
|
194
186
|
- !ruby/object:Gem::Version
|
195
|
-
version: 3.
|
187
|
+
version: 3.3.0
|
196
188
|
- !ruby/object:Gem::Dependency
|
197
189
|
name: rspec-retry
|
198
190
|
requirement: !ruby/object:Gem::Requirement
|
199
191
|
requirements:
|
200
192
|
- - "~>"
|
201
193
|
- !ruby/object:Gem::Version
|
202
|
-
version: '0.
|
194
|
+
version: '0.6'
|
203
195
|
type: :development
|
204
196
|
prerelease: false
|
205
197
|
version_requirements: !ruby/object:Gem::Requirement
|
206
198
|
requirements:
|
207
199
|
- - "~>"
|
208
200
|
- !ruby/object:Gem::Version
|
209
|
-
version: '0.
|
201
|
+
version: '0.6'
|
210
202
|
- !ruby/object:Gem::Dependency
|
211
203
|
name: yard
|
212
204
|
requirement: !ruby/object:Gem::Requirement
|
@@ -221,6 +213,34 @@ dependencies:
|
|
221
213
|
- - "~>"
|
222
214
|
- !ruby/object:Gem::Version
|
223
215
|
version: '0.9'
|
216
|
+
- !ruby/object:Gem::Dependency
|
217
|
+
name: rspec-instafail
|
218
|
+
requirement: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '1.0'
|
223
|
+
type: :development
|
224
|
+
prerelease: false
|
225
|
+
version_requirements: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '1.0'
|
230
|
+
- !ruby/object:Gem::Dependency
|
231
|
+
name: bundler
|
232
|
+
requirement: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: 1.3.0
|
237
|
+
type: :development
|
238
|
+
prerelease: false
|
239
|
+
version_requirements: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: 1.3.0
|
224
244
|
- !ruby/object:Gem::Dependency
|
225
245
|
name: webmock
|
226
246
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,6 +269,20 @@ dependencies:
|
|
249
269
|
- - ">="
|
250
270
|
- !ruby/object:Gem::Version
|
251
271
|
version: '0'
|
272
|
+
- !ruby/object:Gem::Dependency
|
273
|
+
name: parallel_tests
|
274
|
+
requirement: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - "~>"
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '2.22'
|
279
|
+
type: :development
|
280
|
+
prerelease: false
|
281
|
+
version_requirements: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - "~>"
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '2.22'
|
252
286
|
- !ruby/object:Gem::Dependency
|
253
287
|
name: pry
|
254
288
|
requirement: !ruby/object:Gem::Requirement
|
@@ -285,6 +319,7 @@ executables: []
|
|
285
319
|
extensions: []
|
286
320
|
extra_rdoc_files: []
|
287
321
|
files:
|
322
|
+
- ".editorconfig"
|
288
323
|
- ".gitignore"
|
289
324
|
- ".gitmodules"
|
290
325
|
- ".rspec"
|
@@ -305,6 +340,8 @@ files:
|
|
305
340
|
- lib/ably/models/cipher_params.rb
|
306
341
|
- lib/ably/models/connection_details.rb
|
307
342
|
- lib/ably/models/connection_state_change.rb
|
343
|
+
- lib/ably/models/device_details.rb
|
344
|
+
- lib/ably/models/device_push_details.rb
|
308
345
|
- lib/ably/models/error_info.rb
|
309
346
|
- lib/ably/models/http_paginated_response.rb
|
310
347
|
- lib/ably/models/idiomatic_ruby_wrapper.rb
|
@@ -318,6 +355,7 @@ files:
|
|
318
355
|
- lib/ably/models/paginated_result.rb
|
319
356
|
- lib/ably/models/presence_message.rb
|
320
357
|
- lib/ably/models/protocol_message.rb
|
358
|
+
- lib/ably/models/push_channel_subscription.rb
|
321
359
|
- lib/ably/models/stats.rb
|
322
360
|
- lib/ably/models/stats_types.rb
|
323
361
|
- lib/ably/models/token_details.rb
|
@@ -330,6 +368,7 @@ files:
|
|
330
368
|
- lib/ably/modules/enum.rb
|
331
369
|
- lib/ably/modules/event_emitter.rb
|
332
370
|
- lib/ably/modules/event_machine_helpers.rb
|
371
|
+
- lib/ably/modules/exception_codes.rb
|
333
372
|
- lib/ably/modules/http_helpers.rb
|
334
373
|
- lib/ably/modules/message_emitter.rb
|
335
374
|
- lib/ably/modules/message_pack.rb
|
@@ -345,6 +384,8 @@ files:
|
|
345
384
|
- lib/ably/realtime/channel.rb
|
346
385
|
- lib/ably/realtime/channel/channel_manager.rb
|
347
386
|
- lib/ably/realtime/channel/channel_state_machine.rb
|
387
|
+
- lib/ably/realtime/channel/publisher.rb
|
388
|
+
- lib/ably/realtime/channel/push_channel.rb
|
348
389
|
- lib/ably/realtime/channels.rb
|
349
390
|
- lib/ably/realtime/client.rb
|
350
391
|
- lib/ably/realtime/client/incoming_message_dispatcher.rb
|
@@ -358,8 +399,13 @@ files:
|
|
358
399
|
- lib/ably/realtime/presence/members_map.rb
|
359
400
|
- lib/ably/realtime/presence/presence_manager.rb
|
360
401
|
- lib/ably/realtime/presence/presence_state_machine.rb
|
402
|
+
- lib/ably/realtime/push.rb
|
403
|
+
- lib/ably/realtime/push/admin.rb
|
404
|
+
- lib/ably/realtime/push/channel_subscriptions.rb
|
405
|
+
- lib/ably/realtime/push/device_registrations.rb
|
361
406
|
- lib/ably/rest.rb
|
362
407
|
- lib/ably/rest/channel.rb
|
408
|
+
- lib/ably/rest/channel/push_channel.rb
|
363
409
|
- lib/ably/rest/channels.rb
|
364
410
|
- lib/ably/rest/client.rb
|
365
411
|
- lib/ably/rest/middleware/encoder.rb
|
@@ -370,6 +416,10 @@ files:
|
|
370
416
|
- lib/ably/rest/middleware/parse_json.rb
|
371
417
|
- lib/ably/rest/middleware/parse_message_pack.rb
|
372
418
|
- lib/ably/rest/presence.rb
|
419
|
+
- lib/ably/rest/push.rb
|
420
|
+
- lib/ably/rest/push/admin.rb
|
421
|
+
- lib/ably/rest/push/channel_subscriptions.rb
|
422
|
+
- lib/ably/rest/push/device_registrations.rb
|
373
423
|
- lib/ably/util/crypto.rb
|
374
424
|
- lib/ably/util/pub_sub.rb
|
375
425
|
- lib/ably/util/safe_deferrable.rb
|
@@ -384,6 +434,8 @@ files:
|
|
384
434
|
- spec/acceptance/realtime/message_spec.rb
|
385
435
|
- spec/acceptance/realtime/presence_history_spec.rb
|
386
436
|
- spec/acceptance/realtime/presence_spec.rb
|
437
|
+
- spec/acceptance/realtime/push_admin_spec.rb
|
438
|
+
- spec/acceptance/realtime/push_spec.rb
|
387
439
|
- spec/acceptance/realtime/stats_spec.rb
|
388
440
|
- spec/acceptance/realtime/time_spec.rb
|
389
441
|
- spec/acceptance/rest/auth_spec.rb
|
@@ -394,9 +446,12 @@ files:
|
|
394
446
|
- spec/acceptance/rest/encoders_spec.rb
|
395
447
|
- spec/acceptance/rest/message_spec.rb
|
396
448
|
- spec/acceptance/rest/presence_spec.rb
|
449
|
+
- spec/acceptance/rest/push_admin_spec.rb
|
450
|
+
- spec/acceptance/rest/push_spec.rb
|
397
451
|
- spec/acceptance/rest/stats_spec.rb
|
398
452
|
- spec/acceptance/rest/time_spec.rb
|
399
453
|
- spec/rspec_config.rb
|
454
|
+
- spec/run_parallel_tests
|
400
455
|
- spec/shared/client_initializer_behaviour.rb
|
401
456
|
- spec/shared/model_behaviour.rb
|
402
457
|
- spec/shared/protocol_msgbus_behaviour.rb
|
@@ -420,6 +475,8 @@ files:
|
|
420
475
|
- spec/unit/models/cipher_params_spec.rb
|
421
476
|
- spec/unit/models/connection_details_spec.rb
|
422
477
|
- spec/unit/models/connection_state_change_spec.rb
|
478
|
+
- spec/unit/models/device_details_spec.rb
|
479
|
+
- spec/unit/models/device_push_details_spec.rb
|
423
480
|
- spec/unit/models/error_info_spec.rb
|
424
481
|
- spec/unit/models/http_paginated_result_spec.rb
|
425
482
|
- spec/unit/models/idiomatic_ruby_wrapper_spec.rb
|
@@ -431,6 +488,7 @@ files:
|
|
431
488
|
- spec/unit/models/paginated_result_spec.rb
|
432
489
|
- spec/unit/models/presence_message_spec.rb
|
433
490
|
- spec/unit/models/protocol_message_spec.rb
|
491
|
+
- spec/unit/models/push_channel_subscription_spec.rb
|
434
492
|
- spec/unit/models/stats_spec.rb
|
435
493
|
- spec/unit/models/token_details_spec.rb
|
436
494
|
- spec/unit/models/token_request_spec.rb
|
@@ -445,12 +503,14 @@ files:
|
|
445
503
|
- spec/unit/realtime/connection_spec.rb
|
446
504
|
- spec/unit/realtime/incoming_message_dispatcher_spec.rb
|
447
505
|
- spec/unit/realtime/presence_spec.rb
|
506
|
+
- spec/unit/realtime/push_channel_spec.rb
|
448
507
|
- spec/unit/realtime/realtime_spec.rb
|
449
508
|
- spec/unit/realtime/safe_deferrable_spec.rb
|
450
509
|
- spec/unit/realtime/websocket_transport_spec.rb
|
451
510
|
- spec/unit/rest/channel_spec.rb
|
452
511
|
- spec/unit/rest/channels_spec.rb
|
453
512
|
- spec/unit/rest/client_spec.rb
|
513
|
+
- spec/unit/rest/push_channel_spec.rb
|
454
514
|
- spec/unit/rest/rest_spec.rb
|
455
515
|
- spec/unit/util/crypto_spec.rb
|
456
516
|
- spec/unit/util/pub_sub_spec.rb
|
@@ -473,8 +533,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
473
533
|
- !ruby/object:Gem::Version
|
474
534
|
version: '0'
|
475
535
|
requirements: []
|
476
|
-
|
477
|
-
rubygems_version: 2.7.6
|
536
|
+
rubygems_version: 3.1.2
|
478
537
|
signing_key:
|
479
538
|
specification_version: 4
|
480
539
|
summary: A Ruby client library for ably.io realtime messaging implemented using EventMachine
|
@@ -489,6 +548,8 @@ test_files:
|
|
489
548
|
- spec/acceptance/realtime/message_spec.rb
|
490
549
|
- spec/acceptance/realtime/presence_history_spec.rb
|
491
550
|
- spec/acceptance/realtime/presence_spec.rb
|
551
|
+
- spec/acceptance/realtime/push_admin_spec.rb
|
552
|
+
- spec/acceptance/realtime/push_spec.rb
|
492
553
|
- spec/acceptance/realtime/stats_spec.rb
|
493
554
|
- spec/acceptance/realtime/time_spec.rb
|
494
555
|
- spec/acceptance/rest/auth_spec.rb
|
@@ -499,9 +560,12 @@ test_files:
|
|
499
560
|
- spec/acceptance/rest/encoders_spec.rb
|
500
561
|
- spec/acceptance/rest/message_spec.rb
|
501
562
|
- spec/acceptance/rest/presence_spec.rb
|
563
|
+
- spec/acceptance/rest/push_admin_spec.rb
|
564
|
+
- spec/acceptance/rest/push_spec.rb
|
502
565
|
- spec/acceptance/rest/stats_spec.rb
|
503
566
|
- spec/acceptance/rest/time_spec.rb
|
504
567
|
- spec/rspec_config.rb
|
568
|
+
- spec/run_parallel_tests
|
505
569
|
- spec/shared/client_initializer_behaviour.rb
|
506
570
|
- spec/shared/model_behaviour.rb
|
507
571
|
- spec/shared/protocol_msgbus_behaviour.rb
|
@@ -525,6 +589,8 @@ test_files:
|
|
525
589
|
- spec/unit/models/cipher_params_spec.rb
|
526
590
|
- spec/unit/models/connection_details_spec.rb
|
527
591
|
- spec/unit/models/connection_state_change_spec.rb
|
592
|
+
- spec/unit/models/device_details_spec.rb
|
593
|
+
- spec/unit/models/device_push_details_spec.rb
|
528
594
|
- spec/unit/models/error_info_spec.rb
|
529
595
|
- spec/unit/models/http_paginated_result_spec.rb
|
530
596
|
- spec/unit/models/idiomatic_ruby_wrapper_spec.rb
|
@@ -536,6 +602,7 @@ test_files:
|
|
536
602
|
- spec/unit/models/paginated_result_spec.rb
|
537
603
|
- spec/unit/models/presence_message_spec.rb
|
538
604
|
- spec/unit/models/protocol_message_spec.rb
|
605
|
+
- spec/unit/models/push_channel_subscription_spec.rb
|
539
606
|
- spec/unit/models/stats_spec.rb
|
540
607
|
- spec/unit/models/token_details_spec.rb
|
541
608
|
- spec/unit/models/token_request_spec.rb
|
@@ -550,12 +617,14 @@ test_files:
|
|
550
617
|
- spec/unit/realtime/connection_spec.rb
|
551
618
|
- spec/unit/realtime/incoming_message_dispatcher_spec.rb
|
552
619
|
- spec/unit/realtime/presence_spec.rb
|
620
|
+
- spec/unit/realtime/push_channel_spec.rb
|
553
621
|
- spec/unit/realtime/realtime_spec.rb
|
554
622
|
- spec/unit/realtime/safe_deferrable_spec.rb
|
555
623
|
- spec/unit/realtime/websocket_transport_spec.rb
|
556
624
|
- spec/unit/rest/channel_spec.rb
|
557
625
|
- spec/unit/rest/channels_spec.rb
|
558
626
|
- spec/unit/rest/client_spec.rb
|
627
|
+
- spec/unit/rest/push_channel_spec.rb
|
559
628
|
- spec/unit/rest/rest_spec.rb
|
560
629
|
- spec/unit/util/crypto_spec.rb
|
561
630
|
- spec/unit/util/pub_sub_spec.rb
|