ably-rest 0.7.5 → 0.8.1

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 (76) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +2 -0
  3. data/README.md +41 -15
  4. data/SPEC.md +654 -518
  5. data/lib/submodules/ably-ruby/.gitignore +1 -0
  6. data/lib/submodules/ably-ruby/.gitmodules +3 -0
  7. data/lib/submodules/ably-ruby/README.md +54 -26
  8. data/lib/submodules/ably-ruby/SPEC.md +468 -322
  9. data/lib/submodules/ably-ruby/ably.gemspec +4 -2
  10. data/lib/submodules/ably-ruby/lib/ably/auth.rb +185 -131
  11. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +1 -1
  12. data/lib/submodules/ably-ruby/lib/ably/models/paginated_resource.rb +31 -44
  13. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +2 -2
  14. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +1 -2
  15. data/lib/submodules/ably-ruby/lib/ably/models/stat.rb +67 -24
  16. data/lib/submodules/ably-ruby/lib/ably/models/stats_types.rb +131 -0
  17. data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +101 -0
  18. data/lib/submodules/ably-ruby/lib/ably/models/token_request.rb +108 -0
  19. data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +3 -2
  20. data/lib/submodules/ably-ruby/lib/ably/modules/http_helpers.rb +1 -1
  21. data/lib/submodules/ably-ruby/lib/ably/modules/message_emitter.rb +2 -2
  22. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +3 -7
  23. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +32 -5
  24. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +1 -0
  25. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +4 -8
  26. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +5 -3
  27. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +12 -1
  28. data/lib/submodules/ably-ruby/lib/ably/rest.rb +3 -7
  29. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +13 -10
  30. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +19 -20
  31. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +14 -12
  32. data/lib/submodules/ably-ruby/lib/ably/version.rb +1 -1
  33. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +74 -23
  34. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +3 -3
  35. data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +18 -18
  36. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +5 -5
  37. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +12 -12
  38. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +5 -5
  39. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +56 -13
  40. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +8 -8
  41. data/lib/submodules/ably-ruby/spec/acceptance/realtime/stats_spec.rb +1 -1
  42. data/lib/submodules/ably-ruby/spec/acceptance/realtime/time_spec.rb +1 -1
  43. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +262 -158
  44. data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +11 -9
  45. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +28 -21
  46. data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +1 -1
  47. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +30 -27
  48. data/lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb +1 -1
  49. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +10 -10
  50. data/lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb +93 -56
  51. data/lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb +50 -45
  52. data/lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb +1 -1
  53. data/lib/submodules/ably-ruby/spec/rspec_config.rb +3 -2
  54. data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +36 -28
  55. data/lib/submodules/ably-ruby/spec/spec_helper.rb +3 -0
  56. data/lib/submodules/ably-ruby/spec/support/api_helper.rb +3 -3
  57. data/lib/submodules/ably-ruby/spec/support/markdown_spec_formatter.rb +1 -1
  58. data/lib/submodules/ably-ruby/spec/support/test_app.rb +20 -33
  59. data/lib/submodules/ably-ruby/spec/unit/auth_spec.rb +18 -1
  60. data/lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb +81 -72
  61. data/lib/submodules/ably-ruby/spec/unit/models/stats_spec.rb +289 -0
  62. data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +111 -0
  63. data/lib/submodules/ably-ruby/spec/unit/models/token_request_spec.rb +110 -0
  64. data/lib/submodules/ably-ruby/spec/unit/modules/async_wrapper_spec.rb +1 -1
  65. data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +1 -1
  66. data/lib/submodules/ably-ruby/spec/unit/realtime/realtime_spec.rb +1 -1
  67. data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +1 -1
  68. data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +8 -8
  69. data/lib/submodules/ably-ruby/spec/unit/rest/rest_spec.rb +1 -1
  70. data/lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb +1 -1
  71. metadata +9 -7
  72. data/lib/submodules/ably-ruby/lib/ably/models/token.rb +0 -74
  73. data/lib/submodules/ably-ruby/spec/resources/crypto-data-128.json +0 -56
  74. data/lib/submodules/ably-ruby/spec/resources/crypto-data-256.json +0 -56
  75. data/lib/submodules/ably-ruby/spec/unit/models/stat_spec.rb +0 -113
  76. 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