ably-rest 1.1.6 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/README.md +3 -1
  4. data/lib/ably-rest.rb +2 -0
  5. data/lib/submodules/ably-ruby/.github/workflows/check.yml +15 -1
  6. data/lib/submodules/ably-ruby/CHANGELOG.md +131 -0
  7. data/lib/submodules/ably-ruby/COPYRIGHT +1 -1
  8. data/lib/submodules/ably-ruby/README.md +14 -2
  9. data/lib/submodules/ably-ruby/SPEC.md +0 -7
  10. data/lib/submodules/ably-ruby/UPDATING.md +30 -0
  11. data/lib/submodules/ably-ruby/ably.gemspec +12 -7
  12. data/lib/submodules/ably-ruby/lib/ably/agent.rb +3 -0
  13. data/lib/submodules/ably-ruby/lib/ably/auth.rb +3 -3
  14. data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +6 -0
  15. data/lib/submodules/ably-ruby/lib/ably/models/channel_options.rb +97 -0
  16. data/lib/submodules/ably-ruby/lib/ably/models/connection_details.rb +8 -0
  17. data/lib/submodules/ably-ruby/lib/ably/models/delta_extras.rb +29 -0
  18. data/lib/submodules/ably-ruby/lib/ably/models/error_info.rb +6 -2
  19. data/lib/submodules/ably-ruby/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -0
  20. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +28 -3
  21. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +14 -0
  22. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +29 -12
  23. data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +7 -2
  24. data/lib/submodules/ably-ruby/lib/ably/modules/channels_collection.rb +22 -2
  25. data/lib/submodules/ably-ruby/lib/ably/modules/conversions.rb +34 -0
  26. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +18 -6
  27. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_state_machine.rb +10 -1
  28. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/publisher.rb +6 -0
  29. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +54 -22
  30. data/lib/submodules/ably-ruby/lib/ably/realtime/channels.rb +1 -1
  31. data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +14 -6
  32. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +13 -4
  33. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_state_machine.rb +4 -0
  34. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +2 -2
  35. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +31 -31
  36. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +27 -12
  37. data/lib/submodules/ably-ruby/lib/ably/util/crypto.rb +1 -1
  38. data/lib/submodules/ably-ruby/lib/ably/version.rb +2 -14
  39. data/lib/submodules/ably-ruby/lib/ably.rb +1 -0
  40. data/lib/submodules/ably-ruby/spec/acceptance/realtime/auth_spec.rb +1 -1
  41. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +25 -0
  42. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +466 -21
  43. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channels_spec.rb +59 -7
  44. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +59 -2
  45. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +256 -28
  46. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +77 -0
  47. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +3 -1
  48. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +31 -159
  49. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +18 -0
  50. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +84 -9
  51. data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +23 -6
  52. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +25 -21
  53. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +61 -3
  54. data/lib/submodules/ably-ruby/spec/lib/unit/models/channel_options_spec.rb +52 -0
  55. data/lib/submodules/ably-ruby/spec/shared/model_behaviour.rb +1 -1
  56. data/lib/submodules/ably-ruby/spec/spec_helper.rb +11 -2
  57. data/lib/submodules/ably-ruby/spec/support/test_app.rb +1 -1
  58. data/lib/submodules/ably-ruby/spec/unit/models/delta_extras_spec.rb +14 -0
  59. data/lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb +17 -1
  60. data/lib/submodules/ably-ruby/spec/unit/models/message_spec.rb +97 -0
  61. data/lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb +49 -0
  62. data/lib/submodules/ably-ruby/spec/unit/models/protocol_message_spec.rb +125 -27
  63. data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +14 -0
  64. data/lib/submodules/ably-ruby/spec/unit/realtime/channel_spec.rb +3 -2
  65. data/lib/submodules/ably-ruby/spec/unit/realtime/channels_spec.rb +53 -15
  66. data/lib/submodules/ably-ruby/spec/unit/realtime/incoming_message_dispatcher_spec.rb +38 -0
  67. data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +44 -1
  68. data/lib/submodules/ably-ruby/spec/unit/rest/channels_spec.rb +81 -14
  69. data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +47 -0
  70. data/spec/unit/client_spec.rb +30 -0
  71. metadata +11 -3
@@ -7,10 +7,11 @@ describe Ably::Rest::Channel do
7
7
  'Ably::Rest::Client',
8
8
  encoders: [],
9
9
  post: instance_double('Faraday::Response', status: 201),
10
- idempotent_rest_publishing: false,
10
+ idempotent_rest_publishing: false, max_message_size: max_message_size
11
11
  )
12
12
  end
13
13
  let(:channel_name) { 'unique' }
14
+ let(:max_message_size) { nil }
14
15
 
15
16
  subject { Ably::Rest::Channel.new(client, channel_name) }
16
17
 
@@ -126,5 +127,47 @@ describe Ably::Rest::Channel do
126
127
  expect { subject.publish(encoded_value, 'data') }.to raise_error ArgumentError, /must be a String/
127
128
  end
128
129
  end
130
+
131
+ context 'max message size exceeded' do
132
+ context 'when max_message_size is nil' do
133
+ context 'and a message size is 65537 bytes' do
134
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
135
+ expect { subject.publish('x' * 65537, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when max_message_size is 65536 bytes' do
141
+ let(:max_message_size) { 65536 }
142
+
143
+ context 'and a message size is 65537 bytes' do
144
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
145
+ expect { subject.publish('x' * 65537, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
146
+ end
147
+ end
148
+
149
+ context 'and a message size is 10 bytes' do
150
+ it 'should send a message' do
151
+ expect(subject.publish('x' * 10, 'data')).to eq(true)
152
+ end
153
+ end
154
+ end
155
+
156
+ context 'when max_message_size is 10 bytes' do
157
+ let(:max_message_size) { 10 }
158
+
159
+ context 'and a message size is 11 bytes' do
160
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
161
+ expect { subject.publish('x' * 11, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
162
+ end
163
+ end
164
+
165
+ context 'and a message size is 2 bytes' do
166
+ it 'should send a message' do
167
+ expect(subject.publish('x' * 2, 'data')).to eq(true)
168
+ end
169
+ end
170
+ end
171
+ end
129
172
  end
130
173
  end
@@ -2,30 +2,97 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Ably::Rest::Channels do
5
- let(:client) { instance_double('Ably::Rest::Client') }
5
+ let(:client) { instance_double('Ably::Rest::Client', logger: double('logger').as_null_object) }
6
6
  let(:channel_name) { 'unique'.encode(Encoding::UTF_8) }
7
- let(:options) { { 'bizarre' => 'value' } }
7
+ let(:options) do
8
+ { params: { 'bizarre' => 'value' } }
9
+ end
8
10
 
9
11
  subject { Ably::Rest::Channels.new(client) }
10
12
 
11
- context 'creating channels' do
12
- it '#get creates a channel' do
13
- expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
14
- subject.get(channel_name, options)
15
- end
13
+ describe '#get' do
14
+ context "when channel doesn't exist" do
15
+ shared_examples 'creates a channel' do
16
+ it 'creates a channel (RSN3a)' do
17
+ expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
18
+ subject.get(channel_name, options)
19
+ end
20
+ end
16
21
 
17
- it '#get will reuse the channel object' do
18
- channel = subject.get(channel_name, options)
19
- expect(channel).to be_a(Ably::Rest::Channel)
20
- expect(subject.get(channel_name, options).object_id).to eql(channel.object_id)
22
+ describe 'hash' do
23
+ let(:channel_options) { options }
24
+ it { expect(channel_options).to be_a(Hash) }
25
+
26
+ include_examples 'creates a channel'
27
+ end
28
+
29
+ describe 'ChannelOptions object' do
30
+ let(:channel_options) { Ably::Models::ChannelOptions.new(options) }
31
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
32
+
33
+ include_examples 'creates a channel'
34
+ end
21
35
  end
22
36
 
23
- it '[] creates a channel' do
24
- expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
25
- subject.get(channel_name, options)
37
+ context 'when an existing channel exists' do
38
+ shared_examples 'reuse a channel object if it exists' do
39
+ it 'will reuse a channel object if it exists (RSN3a)' do
40
+ channel = subject.get(channel_name, channel_options)
41
+ expect(channel).to be_a(Ably::Rest::Channel)
42
+ expect(subject.get(channel_name, channel_options).object_id).to eql(channel.object_id)
43
+ end
44
+ end
45
+
46
+ describe 'hash' do
47
+ let(:channel_options) { options }
48
+ it { expect(channel_options).to be_a(Hash) }
49
+
50
+ include_examples 'reuse a channel object if it exists'
51
+ end
52
+
53
+ describe 'ChannelOptions object' do
54
+ let(:channel_options) { Ably::Models::ChannelOptions.new(options) }
55
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
56
+
57
+ include_examples 'reuse a channel object if it exists'
58
+ end
59
+
60
+ context 'with new channel_options modes' do
61
+ shared_examples 'update channel with provided options :modes' do
62
+ it 'will update channel with provided options modes (RSN3c)' do
63
+ channel = subject.get(channel_name, channel_options)
64
+ expect(channel.options.modes).to eq(modes)
65
+
66
+ subject.get(channel_name, channel_options)
67
+ expect(channel.options.modes).to eq(modes)
68
+ end
69
+ end
70
+
71
+ let(:modes) { %i[subscribe] }
72
+ let(:new_options) { { modes: modes } }
73
+
74
+ describe 'hash' do
75
+ let(:channel_options) { new_options }
76
+ it { expect(channel_options).to be_a(Hash) }
77
+
78
+ include_examples 'update channel with provided options :modes'
79
+ end
80
+
81
+ describe 'ChannelOptions object' do
82
+ let(:channel_options) { Ably::Models::ChannelOptions.new(new_options) }
83
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
84
+
85
+ include_examples 'update channel with provided options :modes'
86
+ end
87
+ end
26
88
  end
27
89
  end
28
90
 
91
+ it '[] creates a channel' do
92
+ expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
93
+ subject.get(channel_name, options)
94
+ end
95
+
29
96
  context '#fetch' do
30
97
  it 'retrieves a channel if it exists' do
31
98
  channel = subject.get(channel_name, options)
@@ -38,6 +38,26 @@ describe Ably::Rest::Client do
38
38
  end
39
39
  end
40
40
 
41
+ context 'use agent' do
42
+ context 'set agent to non-default value' do
43
+ context 'default agent' do
44
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
45
+
46
+ it 'should return default ably agent' do
47
+ expect(subject.agent).to eq(Ably::AGENT)
48
+ end
49
+ end
50
+
51
+ context 'custom agent' do
52
+ let(:client_options) { { key: 'appid.keyuid:keysecret', agent: 'example-gem/1.1.4 ably-ruby/1.1.5 ruby/3.0.0' } }
53
+
54
+ it 'should overwrite client.agent' do
55
+ expect(subject.agent).to eq('example-gem/1.1.4 ably-ruby/1.1.5 ruby/3.0.0')
56
+ end
57
+ end
58
+ end
59
+ end
60
+
41
61
  context ':use_token_auth' do
42
62
  context 'set to false' do
43
63
  context 'with a key and :tls => false' do
@@ -67,6 +87,33 @@ describe Ably::Rest::Client do
67
87
  end
68
88
  end
69
89
  end
90
+
91
+ context 'max_message_size' do
92
+ context 'is not present' do
93
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
94
+
95
+ it 'should return default 65536 (#TO3l8)' do
96
+ expect(subject.max_message_size).to eq(Ably::Rest::Client::MAX_MESSAGE_SIZE)
97
+ end
98
+ end
99
+
100
+ context 'is nil' do
101
+ let(:client_options) { { key: 'appid.keyuid:keysecret', max_message_size: nil } }
102
+
103
+ it 'should return default 65536 (#TO3l8)' do
104
+ expect(Ably::Rest::Client::MAX_MESSAGE_SIZE).to eq(65536)
105
+ expect(subject.max_message_size).to eq(Ably::Rest::Client::MAX_MESSAGE_SIZE)
106
+ end
107
+ end
108
+
109
+ context 'is customized 131072 bytes' do
110
+ let(:client_options) { { key: 'appid.keyuid:keysecret', max_message_size: 131072 } }
111
+
112
+ it 'should return 131072' do
113
+ expect(subject.max_message_size).to eq(131072)
114
+ end
115
+ end
116
+ end
70
117
  end
71
118
 
72
119
  context 'request_id generation' do
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Ably::Rest::Client do
5
+ subject do
6
+ Ably::Rest::Client.new(client_options)
7
+ end
8
+
9
+ context 'initializer options' do
10
+ context 'default agent' do
11
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
12
+
13
+ it 'should return Ably::AGENT identifier' do
14
+ expect(subject.agent).to eq(Ably::AGENT)
15
+ end
16
+
17
+ it 'should show ably-ruby ruby and ably-ruby-rest identifier' do
18
+ expect(subject.agent).to match(/^ably-ruby\/\d.\d.\d ruby\/\d.\d.\d ably-ruby-rest$/)
19
+ end
20
+ end
21
+
22
+ context 'custom agent' do
23
+ let(:client_options) { { key: 'appid.keyuid:keysecret', agent: 'my-custom-agent/1.1' } }
24
+
25
+ it 'should show my-custom-agent/1.1' do
26
+ expect(subject.agent).to eq('my-custom-agent/1.1')
27
+ end
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew O'Riordan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-25 00:00:00.000000000 Z
11
+ date: 2022-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -283,16 +283,20 @@ files:
283
283
  - lib/submodules/ably-ruby/README.md
284
284
  - lib/submodules/ably-ruby/Rakefile
285
285
  - lib/submodules/ably-ruby/SPEC.md
286
+ - lib/submodules/ably-ruby/UPDATING.md
286
287
  - lib/submodules/ably-ruby/ably.gemspec
287
288
  - lib/submodules/ably-ruby/lib/ably.rb
289
+ - lib/submodules/ably-ruby/lib/ably/agent.rb
288
290
  - lib/submodules/ably-ruby/lib/ably/auth.rb
289
291
  - lib/submodules/ably-ruby/lib/ably/exceptions.rb
290
292
  - lib/submodules/ably-ruby/lib/ably/logger.rb
291
293
  - lib/submodules/ably-ruby/lib/ably/models/auth_details.rb
294
+ - lib/submodules/ably-ruby/lib/ably/models/channel_options.rb
292
295
  - lib/submodules/ably-ruby/lib/ably/models/channel_state_change.rb
293
296
  - lib/submodules/ably-ruby/lib/ably/models/cipher_params.rb
294
297
  - lib/submodules/ably-ruby/lib/ably/models/connection_details.rb
295
298
  - lib/submodules/ably-ruby/lib/ably/models/connection_state_change.rb
299
+ - lib/submodules/ably-ruby/lib/ably/models/delta_extras.rb
296
300
  - lib/submodules/ably-ruby/lib/ably/models/device_details.rb
297
301
  - lib/submodules/ably-ruby/lib/ably/models/device_push_details.rb
298
302
  - lib/submodules/ably-ruby/lib/ably/models/error_info.rb
@@ -404,6 +408,7 @@ files:
404
408
  - lib/submodules/ably-ruby/spec/acceptance/rest/push_spec.rb
405
409
  - lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb
406
410
  - lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb
411
+ - lib/submodules/ably-ruby/spec/lib/unit/models/channel_options_spec.rb
407
412
  - lib/submodules/ably-ruby/spec/rspec_config.rb
408
413
  - lib/submodules/ably-ruby/spec/run_parallel_tests
409
414
  - lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb
@@ -430,6 +435,7 @@ files:
430
435
  - lib/submodules/ably-ruby/spec/unit/models/cipher_params_spec.rb
431
436
  - lib/submodules/ably-ruby/spec/unit/models/connection_details_spec.rb
432
437
  - lib/submodules/ably-ruby/spec/unit/models/connection_state_change_spec.rb
438
+ - lib/submodules/ably-ruby/spec/unit/models/delta_extras_spec.rb
433
439
  - lib/submodules/ably-ruby/spec/unit/models/device_details_spec.rb
434
440
  - lib/submodules/ably-ruby/spec/unit/models/device_push_details_spec.rb
435
441
  - lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb
@@ -472,6 +478,7 @@ files:
472
478
  - spec/acceptance/rest_spec.rb
473
479
  - spec/spec_helper.rb
474
480
  - spec/unit/base_spec.rb
481
+ - spec/unit/client_spec.rb
475
482
  - spec/unit/models_spec.rb
476
483
  - spec/unit/modules_spec.rb
477
484
  - spec/unit/rest_spec.rb
@@ -495,7 +502,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
495
502
  - !ruby/object:Gem::Version
496
503
  version: '0'
497
504
  requirements: []
498
- rubygems_version: 3.0.3
505
+ rubygems_version: 3.3.7
499
506
  signing_key:
500
507
  specification_version: 4
501
508
  summary: A Ruby REST only client library for ably.io realtime messaging
@@ -503,6 +510,7 @@ test_files:
503
510
  - spec/acceptance/rest_spec.rb
504
511
  - spec/spec_helper.rb
505
512
  - spec/unit/base_spec.rb
513
+ - spec/unit/client_spec.rb
506
514
  - spec/unit/models_spec.rb
507
515
  - spec/unit/modules_spec.rb
508
516
  - spec/unit/rest_spec.rb