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