ably 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
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