ably-rest 0.7.5 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +2 -0
- data/README.md +41 -15
- data/SPEC.md +654 -518
- data/lib/submodules/ably-ruby/.gitignore +1 -0
- data/lib/submodules/ably-ruby/.gitmodules +3 -0
- data/lib/submodules/ably-ruby/README.md +54 -26
- data/lib/submodules/ably-ruby/SPEC.md +468 -322
- data/lib/submodules/ably-ruby/ably.gemspec +4 -2
- data/lib/submodules/ably-ruby/lib/ably/auth.rb +185 -131
- data/lib/submodules/ably-ruby/lib/ably/models/message.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/models/paginated_resource.rb +31 -44
- data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +2 -2
- data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +1 -2
- data/lib/submodules/ably-ruby/lib/ably/models/stat.rb +67 -24
- data/lib/submodules/ably-ruby/lib/ably/models/stats_types.rb +131 -0
- data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +101 -0
- data/lib/submodules/ably-ruby/lib/ably/models/token_request.rb +108 -0
- data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +3 -2
- data/lib/submodules/ably-ruby/lib/ably/modules/http_helpers.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/modules/message_emitter.rb +2 -2
- data/lib/submodules/ably-ruby/lib/ably/realtime.rb +3 -7
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +32 -5
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +1 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +4 -8
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +5 -3
- data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +12 -1
- data/lib/submodules/ably-ruby/lib/ably/rest.rb +3 -7
- data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +13 -10
- data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +19 -20
- data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +14 -12
- data/lib/submodules/ably-ruby/lib/ably/version.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +74 -23
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +3 -3
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +18 -18
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +5 -5
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +12 -12
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +5 -5
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +56 -13
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +8 -8
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/stats_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/time_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +262 -158
- data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +11 -9
- data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +28 -21
- data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +30 -27
- data/lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +10 -10
- data/lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb +93 -56
- data/lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb +50 -45
- data/lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/rspec_config.rb +3 -2
- data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +36 -28
- data/lib/submodules/ably-ruby/spec/spec_helper.rb +3 -0
- data/lib/submodules/ably-ruby/spec/support/api_helper.rb +3 -3
- data/lib/submodules/ably-ruby/spec/support/markdown_spec_formatter.rb +1 -1
- data/lib/submodules/ably-ruby/spec/support/test_app.rb +20 -33
- data/lib/submodules/ably-ruby/spec/unit/auth_spec.rb +18 -1
- data/lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb +81 -72
- data/lib/submodules/ably-ruby/spec/unit/models/stats_spec.rb +289 -0
- data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +111 -0
- data/lib/submodules/ably-ruby/spec/unit/models/token_request_spec.rb +110 -0
- data/lib/submodules/ably-ruby/spec/unit/modules/async_wrapper_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/unit/realtime/realtime_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +8 -8
- data/lib/submodules/ably-ruby/spec/unit/rest/rest_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb +1 -1
- metadata +9 -7
- data/lib/submodules/ably-ruby/lib/ably/models/token.rb +0 -74
- data/lib/submodules/ably-ruby/spec/resources/crypto-data-128.json +0 -56
- data/lib/submodules/ably-ruby/spec/resources/crypto-data-256.json +0 -56
- data/lib/submodules/ably-ruby/spec/unit/models/stat_spec.rb +0 -113
- data/lib/submodules/ably-ruby/spec/unit/models/token_spec.rb +0 -86
@@ -1,56 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"algorithm": "aes",
|
3
|
-
"mode": "cbc",
|
4
|
-
"keylength": 128,
|
5
|
-
"key": "WUP6u0K7MXI5Zeo0VppPwg==",
|
6
|
-
"iv": "HO4cYSP8LybPYBPZPHQOtg==",
|
7
|
-
"items": [
|
8
|
-
{
|
9
|
-
"encoded": {
|
10
|
-
"name": "example",
|
11
|
-
"data": "The quick brown fox jumped over the lazy dog"
|
12
|
-
},
|
13
|
-
"encrypted": {
|
14
|
-
"name": "example",
|
15
|
-
"data": "HO4cYSP8LybPYBPZPHQOtmHItcxYdSvcNUC6kXVpMn0VFL+9z2/5tJ6WFbR0SBT1xhFRuJ+MeBGTU3yOY9P5ow==",
|
16
|
-
"encoding": "utf-8/cipher+aes-128-cbc/base64"
|
17
|
-
}
|
18
|
-
},
|
19
|
-
{
|
20
|
-
"encoded": {
|
21
|
-
"name": "example",
|
22
|
-
"data": "AAECAwQFBgcICQoLDA0ODw==",
|
23
|
-
"encoding": "base64"
|
24
|
-
},
|
25
|
-
"encrypted": {
|
26
|
-
"name": "example",
|
27
|
-
"data": "HO4cYSP8LybPYBPZPHQOtuB3dfKG08yw7J4qx3kkjxdW0eoZv+nGAp76OKqYQ327",
|
28
|
-
"encoding": "cipher+aes-128-cbc/base64"
|
29
|
-
}
|
30
|
-
},
|
31
|
-
{
|
32
|
-
"encoded": {
|
33
|
-
"name": "example",
|
34
|
-
"data": "{\"example\":{\"json\":\"Object\"}}",
|
35
|
-
"encoding": "json"
|
36
|
-
},
|
37
|
-
"encrypted": {
|
38
|
-
"name": "example",
|
39
|
-
"data": "HO4cYSP8LybPYBPZPHQOtuD53yrD3YV3NBoTEYBh4U0N1QXHbtkfsDfTspKeLQFt",
|
40
|
-
"encoding": "json/utf-8/cipher+aes-128-cbc/base64"
|
41
|
-
}
|
42
|
-
},
|
43
|
-
{
|
44
|
-
"encoded": {
|
45
|
-
"name": "example",
|
46
|
-
"data": "[\"example\",\"json\",\"array\"]",
|
47
|
-
"encoding": "json"
|
48
|
-
},
|
49
|
-
"encrypted": {
|
50
|
-
"name": "example",
|
51
|
-
"data": "HO4cYSP8LybPYBPZPHQOtvmStzmExkdjvrn51J6cmaTZrGl+EsJ61sgxmZ6j6jcA",
|
52
|
-
"encoding": "json/utf-8/cipher+aes-128-cbc/base64"
|
53
|
-
}
|
54
|
-
}
|
55
|
-
]
|
56
|
-
}
|
@@ -1,56 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"algorithm": "aes",
|
3
|
-
"mode": "cbc",
|
4
|
-
"keylength": 256,
|
5
|
-
"key": "o9qXZoPGDNla50VnRwH7cGqIrpyagTxGsRgimKJbY40=",
|
6
|
-
"iv": "NMDl1Acnel8HVdu1cEWdrw==",
|
7
|
-
"items": [
|
8
|
-
{
|
9
|
-
"encoded": {
|
10
|
-
"name": "example",
|
11
|
-
"data": "The quick brown fox jumped over the lazy dog"
|
12
|
-
},
|
13
|
-
"encrypted": {
|
14
|
-
"name": "example",
|
15
|
-
"data": "NMDl1Acnel8HVdu1cEWdr9CGPYFoBoLgJCzoybbQbnyfwx3UQ8CGuKyP/g56Za/JB3xW6XGkNzrHYvZwad4fvA==",
|
16
|
-
"encoding": "utf-8/cipher+aes-256-cbc/base64"
|
17
|
-
}
|
18
|
-
},
|
19
|
-
{
|
20
|
-
"encoded": {
|
21
|
-
"name": "example",
|
22
|
-
"data": "AAECAwQFBgcICQoLDA0ODw==",
|
23
|
-
"encoding": "base64"
|
24
|
-
},
|
25
|
-
"encrypted": {
|
26
|
-
"name": "example",
|
27
|
-
"data": "NMDl1Acnel8HVdu1cEWdr8UFEi56Ms0zPHszbppM61BC8Yf6ndq+kiCj9xXW97/O",
|
28
|
-
"encoding": "cipher+aes-256-cbc/base64"
|
29
|
-
}
|
30
|
-
},
|
31
|
-
{
|
32
|
-
"encoded": {
|
33
|
-
"name": "example",
|
34
|
-
"data": "{\"example\":{\"json\":\"Object\"}}",
|
35
|
-
"encoding": "json"
|
36
|
-
},
|
37
|
-
"encrypted": {
|
38
|
-
"name": "example",
|
39
|
-
"data": "NMDl1Acnel8HVdu1cEWdr21pS5//hdtQf3QqQzZM/jWAtn09Vh52E6jMdC3mWS98",
|
40
|
-
"encoding": "json/utf-8/cipher+aes-256-cbc/base64"
|
41
|
-
}
|
42
|
-
},
|
43
|
-
{
|
44
|
-
"encoded": {
|
45
|
-
"name": "example",
|
46
|
-
"data": "[\"example\",\"json\",\"array\"]",
|
47
|
-
"encoding": "json"
|
48
|
-
},
|
49
|
-
"encrypted": {
|
50
|
-
"name": "example",
|
51
|
-
"data": "NMDl1Acnel8HVdu1cEWdr4J5sVAFpnXsz0fTtsuwOaTRU+6P5GaWlNjePWwiOZCQ",
|
52
|
-
"encoding": "json/utf-8/cipher+aes-256-cbc/base64"
|
53
|
-
}
|
54
|
-
}
|
55
|
-
]
|
56
|
-
}
|
@@ -1,113 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
require 'shared/model_behaviour'
|
4
|
-
|
5
|
-
describe Ably::Models::Stat do
|
6
|
-
include Ably::Modules::Conversions
|
7
|
-
|
8
|
-
subject { Ably::Models::Stat }
|
9
|
-
|
10
|
-
it_behaves_like 'a model', with_simple_attributes: %w(interval_id all inbound outbound persisted connections channels api_requests token_requests) do
|
11
|
-
let(:model_args) { [] }
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#interval_granularity' do
|
15
|
-
subject { Ably::Models::Stat.new(interval_id: '2004-02') }
|
16
|
-
|
17
|
-
it 'returns the granularity of the interval_id' do
|
18
|
-
expect(subject.interval_granularity).to eq(:month)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '#interval_time' do
|
23
|
-
subject { Ably::Models::Stat.new(interval_id: '2004-02-01:05:06') }
|
24
|
-
|
25
|
-
it 'returns a Time object representing the start of the interval' do
|
26
|
-
expect(subject.interval_time.to_i).to eql(Time.new(2004, 02, 01, 05, 06, 00, '+00:00').to_i)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'class methods' do
|
31
|
-
describe '#to_interval_id' do
|
32
|
-
context 'when time zone of time argument is UTC' do
|
33
|
-
it 'converts time 2014-02-03:05:06 with granularity :month into 2014-02' do
|
34
|
-
expect(subject.to_interval_id(Time.new(2014, 2, 1, 0, 0, 0, '+00:00'), :month)).to eql('2014-02')
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'converts time 2014-02-03:05:06 with granularity :day into 2014-02-03' do
|
38
|
-
expect(subject.to_interval_id(Time.new(2014, 2, 3, 0, 0, 0, '+00:00'), :day)).to eql('2014-02-03')
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'converts time 2014-02-03:05:06 with granularity :hour into 2014-02-03:05' do
|
42
|
-
expect(subject.to_interval_id(Time.new(2014, 2, 3, 5, 0, 0, '+00:00'), :hour)).to eql('2014-02-03:05')
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'converts time 2014-02-03:05:06 with granularity :minute into 2014-02-03:05:06' do
|
46
|
-
expect(subject.to_interval_id(Time.new(2014, 2, 3, 5, 6, 0, '+00:00'), :minute)).to eql('2014-02-03:05:06')
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'fails with invalid granularity' do
|
50
|
-
expect { subject.to_interval_id(Time.now, :invalid) }.to raise_error KeyError
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'fails with invalid time' do
|
54
|
-
expect { subject.to_interval_id(nil, :month) }.to raise_error ArgumentError
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'when time zone of time argument is +02:00' do
|
59
|
-
it 'converts time 2014-02-03:06 with granularity :hour into 2014-02-03:04 at UTC +00:00' do
|
60
|
-
expect(subject.to_interval_id(Time.new(2014, 2, 3, 6, 0, 0, '+02:00'), :hour)).to eql('2014-02-03:04')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe '#from_interval_id' do
|
66
|
-
it 'converts a month interval_id 2014-02 into a Time object in UTC 0' do
|
67
|
-
expect(subject.from_interval_id('2014-02')).to eql(Time.gm(2014, 2))
|
68
|
-
expect(subject.from_interval_id('2014-02').utc_offset).to eql(0)
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'converts a day interval_id 2014-02-03 into a Time object in UTC 0' do
|
72
|
-
expect(subject.from_interval_id('2014-02-03')).to eql(Time.gm(2014, 2, 3))
|
73
|
-
expect(subject.from_interval_id('2014-02-03').utc_offset).to eql(0)
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'converts an hour interval_id 2014-02-03:05 into a Time object in UTC 0' do
|
77
|
-
expect(subject.from_interval_id('2014-02-03:05')).to eql(Time.gm(2014, 2, 3, 5))
|
78
|
-
expect(subject.from_interval_id('2014-02-03:05').utc_offset).to eql(0)
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'converts a minute interval_id 2014-02-03:05:06 into a Time object in UTC 0' do
|
82
|
-
expect(subject.from_interval_id('2014-02-03:05:06')).to eql(Time.gm(2014, 2, 3, 5, 6))
|
83
|
-
expect(subject.from_interval_id('2014-02-03:05:06').utc_offset).to eql(0)
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'fails with an invalid interval_id 14-20' do
|
87
|
-
expect { subject.from_interval_id('14-20') }.to raise_error ArgumentError
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#granularity_from_interval_id' do
|
92
|
-
it 'returns a :month interval_id for 2014-02' do
|
93
|
-
expect(subject.granularity_from_interval_id('2014-02')).to eq(:month)
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'returns a :day interval_id for 2014-02-03' do
|
97
|
-
expect(subject.granularity_from_interval_id('2014-02-03')).to eq(:day)
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'returns a :hour interval_id for 2014-02-03:05' do
|
101
|
-
expect(subject.granularity_from_interval_id('2014-02-03:05')).to eq(:hour)
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'returns a :minute interval_id for 2014-02-03:05:06' do
|
105
|
-
expect(subject.granularity_from_interval_id('2014-02-03:05:06')).to eq(:minute)
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'fails with an invalid interval_id 14-20' do
|
109
|
-
expect { subject.granularity_from_interval_id('14-20') }.to raise_error ArgumentError
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Ably::Models::Token do
|
4
|
-
subject { Ably::Models::Token }
|
5
|
-
|
6
|
-
it_behaves_like 'a model', with_simple_attributes: %w(id capability client_id nonce) do
|
7
|
-
let(:model_args) { [] }
|
8
|
-
end
|
9
|
-
|
10
|
-
context 'defaults' do
|
11
|
-
let(:one_hour) { 60 * 60 }
|
12
|
-
let(:all_capabilities) { { "*" => ["*"] } }
|
13
|
-
|
14
|
-
it 'should default TTL to 1 hour' do
|
15
|
-
expect(Ably::Models::Token::DEFAULTS[:ttl]).to eql(one_hour)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should default capability to all' do
|
19
|
-
expect(Ably::Models::Token::DEFAULTS[:capability]).to eql(all_capabilities)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should only have defaults for :ttl and :capability' do
|
23
|
-
expect(Ably::Models::Token::DEFAULTS.keys).to contain_exactly(:ttl, :capability)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'attributes' do
|
28
|
-
let(:unique_value) { 'unique_value' }
|
29
|
-
|
30
|
-
context '#key_id' do
|
31
|
-
subject { Ably::Models::Token.new({ key: unique_value }) }
|
32
|
-
it 'retrieves attribute :key' do
|
33
|
-
expect(subject.key_id).to eql(unique_value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
{ :issued_at => :issued_at, :expires_at => :expires }.each do |method_name, attribute|
|
38
|
-
let(:time) { Time.now }
|
39
|
-
context "##{method_name}" do
|
40
|
-
subject { Ably::Models::Token.new({ attribute.to_sym => time.to_i }) }
|
41
|
-
|
42
|
-
it "retrieves attribute :#{attribute} as Time" do
|
43
|
-
expect(subject.public_send(method_name)).to be_a(Time)
|
44
|
-
expect(subject.public_send(method_name).to_i).to eql(time.to_i)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context '#expired?' do
|
50
|
-
let(:expire_time) { Time.now + Ably::Models::Token::TOKEN_EXPIRY_BUFFER }
|
51
|
-
|
52
|
-
context 'once grace period buffer has passed' do
|
53
|
-
subject { Ably::Models::Token.new(expires: expire_time - 1) }
|
54
|
-
|
55
|
-
it 'is true' do
|
56
|
-
expect(subject.expired?).to eql(true)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'within grace period buffer' do
|
61
|
-
subject { Ably::Models::Token.new(expires: expire_time + 1) }
|
62
|
-
|
63
|
-
it 'is false' do
|
64
|
-
expect(subject.expired?).to eql(false)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context '==' do
|
71
|
-
let(:token_attributes) { { id: 'unique' } }
|
72
|
-
|
73
|
-
it 'is true when attributes are the same' do
|
74
|
-
new_token = -> { Ably::Models::Token.new(token_attributes) }
|
75
|
-
expect(new_token[]).to eq(new_token[])
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'is false when attributes are not the same' do
|
79
|
-
expect(Ably::Models::Token.new(id: 1)).to_not eq(Ably::Models::Token.new(id: 2))
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'is false when class type differs' do
|
83
|
-
expect(Ably::Models::Token.new(id: 1)).to_not eq(nil)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|