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.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.travis.yml +10 -8
- data/CHANGELOG.md +58 -4
- data/LICENSE +1 -3
- data/README.md +9 -5
- data/Rakefile +32 -0
- data/SPEC.md +920 -565
- data/ably.gemspec +16 -11
- data/lib/ably/auth.rb +28 -2
- 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 +161 -35
- data/lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb +4 -1
- 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 +22 -21
- 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 +4 -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 +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
|
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.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:
|
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
|
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
|
69
|
+
version: '1.0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: typhoeus
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
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: '
|
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:
|
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:
|
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:
|
141
|
+
name: rake
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
144
|
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
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: '
|
153
|
+
version: '13.0'
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
|
-
name:
|
155
|
+
name: redcarpet
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
157
157
|
requirements:
|
158
158
|
- - "~>"
|
159
159
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
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: '
|
167
|
+
version: '3.3'
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
|
-
name:
|
169
|
+
name: rspec
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
172
|
- - "~>"
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
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:
|
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:
|
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:
|
195
|
+
version: '0.6'
|
196
196
|
- !ruby/object:Gem::Dependency
|
197
|
-
name:
|
197
|
+
name: yard
|
198
198
|
requirement: !ruby/object:Gem::Requirement
|
199
199
|
requirements:
|
200
200
|
- - "~>"
|
201
201
|
- !ruby/object:Gem::Version
|
202
|
-
version: '0.
|
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.
|
209
|
+
version: '0.9'
|
210
210
|
- !ruby/object:Gem::Dependency
|
211
|
-
name:
|
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
|
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
|
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:
|
528
|
+
version: 1.3.1
|
475
529
|
requirements: []
|
476
|
-
|
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
|