ably 0.7.0 → 0.7.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 (49) hide show
  1. data/.travis.yml +2 -2
  2. data/Rakefile +2 -0
  3. data/SPEC.md +230 -194
  4. data/ably.gemspec +2 -0
  5. data/lib/ably/auth.rb +7 -5
  6. data/lib/ably/models/idiomatic_ruby_wrapper.rb +5 -7
  7. data/lib/ably/models/paginated_resource.rb +14 -21
  8. data/lib/ably/models/protocol_message.rb +1 -1
  9. data/lib/ably/modules/ably.rb +4 -0
  10. data/lib/ably/modules/async_wrapper.rb +2 -2
  11. data/lib/ably/modules/channels_collection.rb +31 -8
  12. data/lib/ably/modules/conversions.rb +10 -0
  13. data/lib/ably/modules/enum.rb +2 -3
  14. data/lib/ably/modules/state_emitter.rb +8 -8
  15. data/lib/ably/modules/state_machine.rb +7 -3
  16. data/lib/ably/realtime/channel.rb +6 -5
  17. data/lib/ably/realtime/channel/channel_manager.rb +11 -10
  18. data/lib/ably/realtime/channel/channel_state_machine.rb +10 -9
  19. data/lib/ably/realtime/channels.rb +3 -0
  20. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +11 -1
  21. data/lib/ably/realtime/connection.rb +55 -16
  22. data/lib/ably/realtime/connection/connection_manager.rb +25 -8
  23. data/lib/ably/realtime/connection/connection_state_machine.rb +9 -9
  24. data/lib/ably/realtime/connection/websocket_transport.rb +2 -2
  25. data/lib/ably/realtime/presence.rb +16 -17
  26. data/lib/ably/util/crypto.rb +1 -1
  27. data/lib/ably/version.rb +1 -1
  28. data/spec/acceptance/realtime/channel_history_spec.rb +6 -5
  29. data/spec/acceptance/realtime/connection_failures_spec.rb +103 -27
  30. data/spec/acceptance/realtime/connection_spec.rb +81 -17
  31. data/spec/acceptance/realtime/presence_spec.rb +82 -30
  32. data/spec/acceptance/rest/auth_spec.rb +22 -19
  33. data/spec/acceptance/rest/client_spec.rb +4 -4
  34. data/spec/acceptance/rest/presence_spec.rb +12 -6
  35. data/spec/rspec_config.rb +9 -0
  36. data/spec/shared/model_behaviour.rb +1 -1
  37. data/spec/spec_helper.rb +4 -1
  38. data/spec/support/event_machine_helper.rb +26 -37
  39. data/spec/support/markdown_spec_formatter.rb +96 -68
  40. data/spec/support/rest_testapp_before_retry.rb +15 -0
  41. data/spec/support/test_app.rb +4 -0
  42. data/spec/unit/models/idiomatic_ruby_wrapper_spec.rb +20 -2
  43. data/spec/unit/models/message_spec.rb +1 -1
  44. data/spec/unit/models/paginated_resource_spec.rb +15 -1
  45. data/spec/unit/modules/enum_spec.rb +10 -0
  46. data/spec/unit/realtime/channels_spec.rb +30 -0
  47. data/spec/unit/rest/channels_spec.rb +30 -0
  48. metadata +101 -35
  49. checksums.yaml +0 -7
@@ -0,0 +1,15 @@
1
+ # If a test fails and RSPEC_RETRY is set to true, create a new
2
+ # application before retrying the RSpec test again
3
+ #
4
+ RSpec.configure do |config|
5
+ config.around(:example) do |example|
6
+ example.run
7
+
8
+ next if example.metadata[:webmock] # new app is not needed for a mocked test
9
+
10
+ if example.exception && ENV['RSPEC_RETRY']
11
+ TestApp.reload
12
+ puts "** Test app reloaded before next retry **"
13
+ end
14
+ end
15
+ end
@@ -94,6 +94,10 @@ class TestApp
94
94
  sandbox_client.endpoint.host
95
95
  end
96
96
 
97
+ def realtime_host
98
+ host.gsub(/rest/, 'realtime')
99
+ end
100
+
97
101
  private
98
102
  def sandbox_client
99
103
  @sandbox_client ||= Ably::Rest::Client.new(api_key: 'app.key:secret', tls: true, environment: environment)
@@ -207,9 +207,27 @@ describe Ably::Models::IdiomaticRubyWrapper, :api_private do
207
207
  context 'iterable' do
208
208
  subject { Ably::Models::IdiomaticRubyWrapper.new(mixed_case_data, stop_at: [:hash_object, :array_object]) }
209
209
 
210
+ let(:expected_keys) { [:mixed_case, :simple, :hash_object, :array_object] }
211
+ let(:expected_vals) { mixed_case_data.map { |k,v| v } }
212
+
210
213
  it 'yields key value pairs' do
211
- expect(subject.map { |k,v| k }).to eql([:mixed_case, :simple, :hash_object, :array_object])
212
- expect(subject.map { |k,v| v }).to eql(mixed_case_data.map { |k,v| v })
214
+ expect(subject.map { |k,v| k }).to eql(expected_keys)
215
+ expect(subject.map { |k,v| v }).to eql(expected_vals)
216
+ end
217
+
218
+ context '#each' do
219
+ it 'returns an enumerator' do
220
+ expect(subject.each).to be_a(Enumerator)
221
+ end
222
+
223
+ it 'yields key value pairs' do
224
+ emitted = {}
225
+ subject.each do |key, val|
226
+ emitted[key] = val
227
+ end
228
+ expect(emitted.keys).to eql(expected_keys)
229
+ expect(emitted.values).to eql(expected_vals)
230
+ end
213
231
  end
214
232
  end
215
233
 
@@ -270,7 +270,7 @@ describe Ably::Models::Message do
270
270
  end
271
271
 
272
272
  it 'should not allow changes to the payload' do
273
- expect { message_0.data["test"] = true }.to raise_error RuntimeError, /can't modify frozen Hash/
273
+ expect { message_0.data["test"] = true }.to raise_error RuntimeError, /can't modify frozen.*Hash/
274
274
  end
275
275
 
276
276
  context 'with identical message objects' do
@@ -44,6 +44,20 @@ describe Ably::Models::PaginatedResource do
44
44
  expect(subject.map { |d| d }).to eql(body)
45
45
  end
46
46
 
47
+ context '#each' do
48
+ it 'returns an enumerator' do
49
+ expect(subject.each).to be_a(Enumerator)
50
+ end
51
+
52
+ it 'yields each item' do
53
+ items = []
54
+ subject.each do |item|
55
+ items << item
56
+ end
57
+ expect(items).to eq(body)
58
+ end
59
+ end
60
+
47
61
  it 'provides [] accessor method' do
48
62
  expect(subject[0][:id]).to eql(body[0][:id])
49
63
  expect(subject[1][:id]).to eql(body[1][:id])
@@ -114,7 +128,7 @@ describe Ably::Models::PaginatedResource do
114
128
  end
115
129
  end
116
130
 
117
- if defined?(EventMachine)
131
+ if defined?(Ably::Realtime)
118
132
  context 'with option async_blocking_operations: true' do
119
133
  include RSpec::EventMachine
120
134
 
@@ -130,6 +130,16 @@ describe Ably::Modules::Enum, :api_private do
130
130
  it 'behaves like Enumerable' do
131
131
  expect(subject.map(&:to_sym)).to eql([:value_zero, :value_1, :value_snake_case_2, :sentence_case])
132
132
  end
133
+
134
+ context '#each' do
135
+ it 'returns an enumerator' do
136
+ expect(subject.each).to be_a(Enumerator)
137
+ end
138
+
139
+ it 'yields each channel' do
140
+ expect(subject.each.map(&:to_sym)).to eql([:value_zero, :value_1, :value_snake_case_2, :sentence_case])
141
+ end
142
+ end
133
143
  end
134
144
 
135
145
  context 'defined Enum from Hash class' do
@@ -48,4 +48,34 @@ describe Ably::Realtime::Channels do
48
48
  expect(subject.get(channel_name, options).object_id).to_not eql(released_channel.object_id)
49
49
  end
50
50
  end
51
+
52
+ context 'is Enumerable' do
53
+ let(:channel_count) { 5 }
54
+ let(:mock_channel) { instance_double('Ably::Realtime::Channel') }
55
+
56
+ before do
57
+ allow(Ably::Realtime::Channel).to receive(:new).and_return(mock_channel)
58
+ channel_count.times { |index| subject.get("channel-#{index}") }
59
+ end
60
+
61
+ it 'allows enumeration' do
62
+ expect(subject.map.count).to eql(channel_count)
63
+ end
64
+
65
+ context '#each' do
66
+ it 'returns an enumerator' do
67
+ expect(subject.each).to be_a(Enumerator)
68
+ end
69
+
70
+ it 'yields each channel' do
71
+ subject.each do |channel|
72
+ expect(channel).to eql(mock_channel)
73
+ end
74
+ end
75
+ end
76
+
77
+ it 'provides #length' do
78
+ expect(subject.length).to eql(channel_count)
79
+ end
80
+ end
51
81
  end
@@ -46,4 +46,34 @@ describe Ably::Rest::Channels do
46
46
  expect(subject.get(channel_name, options).object_id).to_not eql(released_channel.object_id)
47
47
  end
48
48
  end
49
+
50
+ context 'is Enumerable' do
51
+ let(:channel_count) { 5 }
52
+ let(:mock_channel) { instance_double('Ably::Rest::Channel') }
53
+
54
+ before do
55
+ allow(Ably::Rest::Channel).to receive(:new).and_return(mock_channel)
56
+ channel_count.times { |index| subject.get("channel-#{index}") }
57
+ end
58
+
59
+ it 'allows enumeration' do
60
+ expect(subject.map.count).to eql(channel_count)
61
+ end
62
+
63
+ context '#each' do
64
+ it 'returns an enumerator' do
65
+ expect(subject.each).to be_a(Enumerator)
66
+ end
67
+
68
+ it 'yields each channel' do
69
+ subject.each do |channel|
70
+ expect(channel).to eql(mock_channel)
71
+ end
72
+ end
73
+ end
74
+
75
+ it 'provides #length' do
76
+ expect(subject.length).to eql(channel_count)
77
+ end
78
+ end
49
79
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Lewis Marshall
@@ -9,174 +10,230 @@ authors:
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2015-01-12 00:00:00.000000000 Z
13
+ date: 2015-01-18 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: eventmachine
16
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
- - - "~>"
20
+ - - ~>
19
21
  - !ruby/object:Gem::Version
20
22
  version: '1.0'
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
24
27
  requirements:
25
- - - "~>"
28
+ - - ~>
26
29
  - !ruby/object:Gem::Version
27
30
  version: '1.0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: em-http-request
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: '1.1'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
28
47
  - !ruby/object:Gem::Dependency
29
48
  name: statesman
30
49
  requirement: !ruby/object:Gem::Requirement
50
+ none: false
31
51
  requirements:
32
- - - "~>"
52
+ - - ~>
33
53
  - !ruby/object:Gem::Version
34
54
  version: 1.0.0
35
55
  type: :runtime
36
56
  prerelease: false
37
57
  version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
38
59
  requirements:
39
- - - "~>"
60
+ - - ~>
40
61
  - !ruby/object:Gem::Version
41
62
  version: 1.0.0
42
63
  - !ruby/object:Gem::Dependency
43
64
  name: faraday
44
65
  requirement: !ruby/object:Gem::Requirement
66
+ none: false
45
67
  requirements:
46
- - - "~>"
68
+ - - ~>
47
69
  - !ruby/object:Gem::Version
48
70
  version: '0.9'
49
71
  type: :runtime
50
72
  prerelease: false
51
73
  version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
52
75
  requirements:
53
- - - "~>"
76
+ - - ~>
54
77
  - !ruby/object:Gem::Version
55
78
  version: '0.9'
56
79
  - !ruby/object:Gem::Dependency
57
80
  name: json
58
81
  requirement: !ruby/object:Gem::Requirement
82
+ none: false
59
83
  requirements:
60
- - - ">="
84
+ - - ! '>='
61
85
  - !ruby/object:Gem::Version
62
86
  version: '0'
63
87
  type: :runtime
64
88
  prerelease: false
65
89
  version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
66
91
  requirements:
67
- - - ">="
92
+ - - ! '>='
68
93
  - !ruby/object:Gem::Version
69
94
  version: '0'
70
95
  - !ruby/object:Gem::Dependency
71
96
  name: websocket-driver
72
97
  requirement: !ruby/object:Gem::Requirement
98
+ none: false
73
99
  requirements:
74
- - - "~>"
100
+ - - ~>
75
101
  - !ruby/object:Gem::Version
76
102
  version: '0.3'
77
103
  type: :runtime
78
104
  prerelease: false
79
105
  version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
80
107
  requirements:
81
- - - "~>"
108
+ - - ~>
82
109
  - !ruby/object:Gem::Version
83
110
  version: '0.3'
84
111
  - !ruby/object:Gem::Dependency
85
112
  name: msgpack-ably
86
113
  requirement: !ruby/object:Gem::Requirement
114
+ none: false
87
115
  requirements:
88
- - - "~>"
116
+ - - ~>
89
117
  - !ruby/object:Gem::Version
90
118
  version: 0.5.10
91
119
  type: :runtime
92
120
  prerelease: false
93
121
  version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
94
123
  requirements:
95
- - - "~>"
124
+ - - ~>
96
125
  - !ruby/object:Gem::Version
97
126
  version: 0.5.10
98
127
  - !ruby/object:Gem::Dependency
99
128
  name: bundler
100
129
  requirement: !ruby/object:Gem::Requirement
130
+ none: false
101
131
  requirements:
102
- - - "~>"
132
+ - - ~>
103
133
  - !ruby/object:Gem::Version
104
134
  version: '1.3'
105
135
  type: :development
106
136
  prerelease: false
107
137
  version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
108
139
  requirements:
109
- - - "~>"
140
+ - - ~>
110
141
  - !ruby/object:Gem::Version
111
142
  version: '1.3'
112
143
  - !ruby/object:Gem::Dependency
113
144
  name: rake
114
145
  requirement: !ruby/object:Gem::Requirement
146
+ none: false
115
147
  requirements:
116
- - - ">="
148
+ - - ! '>='
117
149
  - !ruby/object:Gem::Version
118
150
  version: '0'
119
151
  type: :development
120
152
  prerelease: false
121
153
  version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
122
155
  requirements:
123
- - - ">="
156
+ - - ! '>='
124
157
  - !ruby/object:Gem::Version
125
158
  version: '0'
126
159
  - !ruby/object:Gem::Dependency
127
160
  name: redcarpet
128
161
  requirement: !ruby/object:Gem::Requirement
162
+ none: false
129
163
  requirements:
130
- - - ">="
164
+ - - ! '>='
131
165
  - !ruby/object:Gem::Version
132
166
  version: '0'
133
167
  type: :development
134
168
  prerelease: false
135
169
  version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
136
171
  requirements:
137
- - - ">="
172
+ - - ! '>='
138
173
  - !ruby/object:Gem::Version
139
174
  version: '0'
140
175
  - !ruby/object:Gem::Dependency
141
176
  name: rspec
142
177
  requirement: !ruby/object:Gem::Requirement
178
+ none: false
143
179
  requirements:
144
- - - "~>"
180
+ - - ~>
145
181
  - !ruby/object:Gem::Version
146
182
  version: 3.1.0
147
183
  type: :development
148
184
  prerelease: false
149
185
  version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
150
187
  requirements:
151
- - - "~>"
188
+ - - ~>
152
189
  - !ruby/object:Gem::Version
153
190
  version: 3.1.0
191
+ - !ruby/object:Gem::Dependency
192
+ name: rspec-retry
193
+ requirement: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
154
207
  - !ruby/object:Gem::Dependency
155
208
  name: yard
156
209
  requirement: !ruby/object:Gem::Requirement
210
+ none: false
157
211
  requirements:
158
- - - ">="
212
+ - - ! '>='
159
213
  - !ruby/object:Gem::Version
160
214
  version: '0'
161
215
  type: :development
162
216
  prerelease: false
163
217
  version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
164
219
  requirements:
165
- - - ">="
220
+ - - ! '>='
166
221
  - !ruby/object:Gem::Version
167
222
  version: '0'
168
223
  - !ruby/object:Gem::Dependency
169
224
  name: webmock
170
225
  requirement: !ruby/object:Gem::Requirement
226
+ none: false
171
227
  requirements:
172
- - - ">="
228
+ - - ! '>='
173
229
  - !ruby/object:Gem::Version
174
230
  version: '0'
175
231
  type: :development
176
232
  prerelease: false
177
233
  version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
178
235
  requirements:
179
- - - ">="
236
+ - - ! '>='
180
237
  - !ruby/object:Gem::Version
181
238
  version: '0'
182
239
  description: A Ruby client library for ably.io, the real-time messaging service
@@ -187,10 +244,10 @@ executables: []
187
244
  extensions: []
188
245
  extra_rdoc_files: []
189
246
  files:
190
- - ".gitignore"
191
- - ".rspec"
192
- - ".ruby-version.old"
193
- - ".travis.yml"
247
+ - .gitignore
248
+ - .rspec
249
+ - .ruby-version.old
250
+ - .travis.yml
194
251
  - Gemfile
195
252
  - LICENSE.txt
196
253
  - README.md
@@ -291,6 +348,7 @@ files:
291
348
  - spec/support/private_api_formatter.rb
292
349
  - spec/support/protocol_helper.rb
293
350
  - spec/support/random_helper.rb
351
+ - spec/support/rest_testapp_before_retry.rb
294
352
  - spec/support/test_app.rb
295
353
  - spec/unit/auth_spec.rb
296
354
  - spec/unit/logger_spec.rb
@@ -327,26 +385,33 @@ files:
327
385
  homepage: http://github.com/ably/ably-ruby
328
386
  licenses:
329
387
  - MIT
330
- metadata: {}
331
388
  post_install_message:
332
389
  rdoc_options: []
333
390
  require_paths:
334
391
  - lib
335
392
  required_ruby_version: !ruby/object:Gem::Requirement
393
+ none: false
336
394
  requirements:
337
- - - ">="
395
+ - - ! '>='
338
396
  - !ruby/object:Gem::Version
339
397
  version: '0'
398
+ segments:
399
+ - 0
400
+ hash: -4532338095489684894
340
401
  required_rubygems_version: !ruby/object:Gem::Requirement
402
+ none: false
341
403
  requirements:
342
- - - ">="
404
+ - - ! '>='
343
405
  - !ruby/object:Gem::Version
344
406
  version: '0'
407
+ segments:
408
+ - 0
409
+ hash: -4532338095489684894
345
410
  requirements: []
346
411
  rubyforge_project:
347
- rubygems_version: 2.2.2
412
+ rubygems_version: 1.8.23.2
348
413
  signing_key:
349
- specification_version: 4
414
+ specification_version: 3
350
415
  summary: A Ruby client library for ably.io, the real-time messaging service
351
416
  test_files:
352
417
  - spec/acceptance/realtime/channel_history_spec.rb
@@ -382,6 +447,7 @@ test_files:
382
447
  - spec/support/private_api_formatter.rb
383
448
  - spec/support/protocol_helper.rb
384
449
  - spec/support/random_helper.rb
450
+ - spec/support/rest_testapp_before_retry.rb
385
451
  - spec/support/test_app.rb
386
452
  - spec/unit/auth_spec.rb
387
453
  - spec/unit/logger_spec.rb