ably 0.1.6 → 0.2.0

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +9 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +8 -1
  6. data/Rakefile +10 -0
  7. data/ably.gemspec +18 -18
  8. data/lib/ably.rb +6 -5
  9. data/lib/ably/auth.rb +11 -14
  10. data/lib/ably/exceptions.rb +18 -15
  11. data/lib/ably/logger.rb +102 -0
  12. data/lib/ably/models/error_info.rb +1 -1
  13. data/lib/ably/models/message.rb +19 -5
  14. data/lib/ably/models/message_encoders/base.rb +107 -0
  15. data/lib/ably/models/message_encoders/base64.rb +39 -0
  16. data/lib/ably/models/message_encoders/cipher.rb +80 -0
  17. data/lib/ably/models/message_encoders/json.rb +33 -0
  18. data/lib/ably/models/message_encoders/utf8.rb +33 -0
  19. data/lib/ably/models/paginated_resource.rb +23 -6
  20. data/lib/ably/models/presence_message.rb +19 -7
  21. data/lib/ably/models/protocol_message.rb +5 -4
  22. data/lib/ably/models/token.rb +2 -2
  23. data/lib/ably/modules/channels_collection.rb +0 -3
  24. data/lib/ably/modules/conversions.rb +3 -3
  25. data/lib/ably/modules/encodeable.rb +68 -0
  26. data/lib/ably/modules/event_emitter.rb +10 -4
  27. data/lib/ably/modules/event_machine_helpers.rb +6 -4
  28. data/lib/ably/modules/http_helpers.rb +7 -2
  29. data/lib/ably/modules/model_common.rb +2 -0
  30. data/lib/ably/modules/state_emitter.rb +10 -1
  31. data/lib/ably/realtime.rb +19 -12
  32. data/lib/ably/realtime/channel.rb +26 -13
  33. data/lib/ably/realtime/client.rb +31 -7
  34. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +14 -3
  35. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +13 -4
  36. data/lib/ably/realtime/connection.rb +152 -46
  37. data/lib/ably/realtime/connection/connection_manager.rb +168 -0
  38. data/lib/ably/realtime/connection/connection_state_machine.rb +56 -33
  39. data/lib/ably/realtime/connection/websocket_transport.rb +56 -29
  40. data/lib/ably/{models → realtime/models}/nil_channel.rb +1 -1
  41. data/lib/ably/realtime/presence.rb +38 -13
  42. data/lib/ably/rest.rb +7 -5
  43. data/lib/ably/rest/channel.rb +24 -3
  44. data/lib/ably/rest/client.rb +56 -17
  45. data/lib/ably/rest/middleware/encoder.rb +49 -0
  46. data/lib/ably/rest/middleware/exceptions.rb +3 -2
  47. data/lib/ably/rest/middleware/logger.rb +37 -0
  48. data/lib/ably/rest/presence.rb +10 -2
  49. data/lib/ably/util/crypto.rb +57 -29
  50. data/lib/ably/util/pub_sub.rb +11 -0
  51. data/lib/ably/version.rb +1 -1
  52. data/spec/acceptance/realtime/channel_spec.rb +65 -7
  53. data/spec/acceptance/realtime/connection_spec.rb +123 -27
  54. data/spec/acceptance/realtime/message_spec.rb +319 -34
  55. data/spec/acceptance/realtime/presence_history_spec.rb +58 -0
  56. data/spec/acceptance/realtime/presence_spec.rb +160 -18
  57. data/spec/acceptance/rest/auth_spec.rb +93 -49
  58. data/spec/acceptance/rest/base_spec.rb +10 -10
  59. data/spec/acceptance/rest/channel_spec.rb +35 -19
  60. data/spec/acceptance/rest/channels_spec.rb +8 -8
  61. data/spec/acceptance/rest/message_spec.rb +224 -0
  62. data/spec/acceptance/rest/presence_spec.rb +159 -23
  63. data/spec/acceptance/rest/stats_spec.rb +5 -5
  64. data/spec/acceptance/rest/time_spec.rb +4 -4
  65. data/spec/integration/rest/auth.rb +1 -1
  66. data/spec/resources/crypto-data-128.json +56 -0
  67. data/spec/resources/crypto-data-256.json +56 -0
  68. data/spec/rspec_config.rb +39 -0
  69. data/spec/spec_helper.rb +4 -42
  70. data/spec/support/api_helper.rb +1 -1
  71. data/spec/support/event_machine_helper.rb +0 -5
  72. data/spec/support/protocol_msgbus_helper.rb +3 -3
  73. data/spec/support/test_app.rb +3 -3
  74. data/spec/unit/logger_spec.rb +135 -0
  75. data/spec/unit/models/message_encoders/base64_spec.rb +181 -0
  76. data/spec/unit/models/message_encoders/cipher_spec.rb +260 -0
  77. data/spec/unit/models/message_encoders/json_spec.rb +135 -0
  78. data/spec/unit/models/message_encoders/utf8_spec.rb +100 -0
  79. data/spec/unit/models/message_spec.rb +16 -1
  80. data/spec/unit/models/paginated_resource_spec.rb +46 -0
  81. data/spec/unit/models/presence_message_spec.rb +18 -5
  82. data/spec/unit/models/token_spec.rb +1 -1
  83. data/spec/unit/modules/event_emitter_spec.rb +24 -10
  84. data/spec/unit/realtime/channel_spec.rb +3 -3
  85. data/spec/unit/realtime/channels_spec.rb +1 -1
  86. data/spec/unit/realtime/client_spec.rb +44 -2
  87. data/spec/unit/realtime/connection_spec.rb +2 -2
  88. data/spec/unit/realtime/incoming_message_dispatcher_spec.rb +4 -4
  89. data/spec/unit/realtime/presence_spec.rb +1 -1
  90. data/spec/unit/realtime/realtime_spec.rb +3 -3
  91. data/spec/unit/realtime/websocket_transport_spec.rb +24 -0
  92. data/spec/unit/rest/channels_spec.rb +1 -1
  93. data/spec/unit/rest/client_spec.rb +45 -10
  94. data/spec/unit/util/crypto_spec.rb +82 -0
  95. data/spec/unit/{modules → util}/pub_sub_spec.rb +13 -1
  96. metadata +43 -12
  97. data/spec/acceptance/crypto.rb +0 -63
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'support/protocol_msgbus_helper'
3
+
4
+ describe Ably::Realtime::Connection::WebsocketTransport do
5
+ let(:client_ignored) { double('Ably::Realtime::Client').as_null_object }
6
+ let(:connection) { instance_double('Ably::Realtime::Connection', client: client_ignored, id: nil) }
7
+
8
+ let(:websocket_transport_without_eventmachine) do
9
+ Ably::Realtime::Connection::WebsocketTransport.send(:allocate).tap do |websocket_transport|
10
+ websocket_transport.send(:initialize, connection)
11
+ end
12
+ end
13
+
14
+ before do
15
+ allow(Ably::Realtime::Connection::WebsocketTransport).to receive(:new).with(connection).and_return(websocket_transport_without_eventmachine)
16
+ end
17
+
18
+ subject do
19
+ Ably::Realtime::Connection::WebsocketTransport.new(connection)
20
+ end
21
+
22
+ it_behaves_like 'an incoming protocol message bus'
23
+ it_behaves_like 'an outgoing protocol message bus'
24
+ end
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe Ably::Rest::Channels do
4
4
  let(:client) { instance_double('Ably::Rest::Client') }
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe Ably::Rest do
4
4
  let(:options) { { api_key: 'app.key:secret' } }
@@ -8,31 +8,31 @@ describe Ably::Rest do
8
8
  end
9
9
 
10
10
  describe Ably::Rest::Client do
11
- describe "initializing the client" do
12
- it "should disallow an invalid key" do
11
+ describe 'initializing the client' do
12
+ it 'should disallow an invalid key' do
13
13
  expect { Ably::Rest::Client.new({}) }.to raise_error(ArgumentError, /api_key is missing/)
14
14
  expect { Ably::Rest::Client.new(api_key: 'invalid') }.to raise_error(ArgumentError, /api_key is invalid/)
15
15
  expect { Ably::Rest::Client.new(api_key: 'invalid:asdad') }.to raise_error(ArgumentError, /api_key is invalid/)
16
16
  expect { Ably::Rest::Client.new(api_key: 'appid.keyuid:keysecret') }.to_not raise_error
17
17
  end
18
18
 
19
- it "should disallow api_key and key_id" do
19
+ it 'should disallow api_key and key_id' do
20
20
  expect { Ably::Rest::Client.new(api_key: 'valid', key_id: 'invalid') }.to raise_error(ArgumentError, /api_key and key_id or key_secret are mutually exclusive/)
21
21
  end
22
22
 
23
- it "should disallow api_key and key_secret" do
23
+ it 'should disallow api_key and key_secret' do
24
24
  expect { Ably::Rest::Client.new(api_key: 'valid', key_secret: 'invalid') }.to raise_error(ArgumentError, /api_key and key_id or key_secret are mutually exclusive/)
25
25
  end
26
26
 
27
27
  context 'using key_id and key_secret' do
28
28
  let(:client) { Ably::Rest::Client.new(key_id: 'id', key_secret: 'secret') }
29
29
 
30
- it "should allow key_id and key_secret in place of api_key" do
30
+ it 'should allow key_id and key_secret in place of api_key' do
31
31
  expect(client.auth.api_key).to eql('id:secret')
32
32
  end
33
33
  end
34
34
 
35
- context "with a string key instead of options" do
35
+ context 'with a string key instead of options' do
36
36
  let(:options) { 'app.key:secret' }
37
37
  subject { Ably::Rest::Client.new(options) }
38
38
 
@@ -49,17 +49,17 @@ describe Ably::Rest do
49
49
  end
50
50
  end
51
51
 
52
- context "with a client_id" do
52
+ context 'with a client_id' do
53
53
  it "should require a valid key" do
54
54
  expect { Ably::Rest::Client.new(client_id: 'valid') }.to raise_error(ArgumentError, /client_id cannot be provided without a complete API key/)
55
55
  end
56
56
  end
57
57
 
58
- it "should default to the production REST end point" do
58
+ it 'should default to the production REST end point' do
59
59
  expect(Ably::Rest::Client.new(api_key: 'appid.keyuid:keysecret').endpoint.to_s).to eql('https://rest.ably.io')
60
60
  end
61
61
 
62
- it "should allow an environment to be set" do
62
+ it 'should allow an environment to be set' do
63
63
  expect(Ably::Rest::Client.new(api_key: 'appid.keyuid:keysecret', environment: 'sandbox').endpoint.to_s).to eql('https://sandbox-rest.ably.io')
64
64
  end
65
65
 
@@ -108,6 +108,41 @@ describe Ably::Rest do
108
108
  expect(subject.auth_options).to eql({ option: 1 })
109
109
  end
110
110
  end
111
+
112
+ context 'logger' do
113
+ context 'defaults' do
114
+ subject { Ably::Rest::Client.new(options) }
115
+
116
+ it 'uses default Ruby Logger by default' do
117
+ expect(subject.logger.logger).to be_a(::Logger)
118
+ end
119
+
120
+ it 'defaults to Logger::ERROR log level' do
121
+ expect(subject.logger.log_level).to eql(::Logger::ERROR)
122
+ end
123
+ end
124
+
125
+ context 'with custom logger and log_level' do
126
+ let(:custom_logger) do
127
+ Class.new do
128
+ extend Forwardable
129
+ def initialize
130
+ @logger = Logger.new(STDOUT)
131
+ end
132
+ def_delegators :@logger, :fatal, :error, :warn, :info, :debug, :level, :level=
133
+ end
134
+ end
135
+ subject { Ably::Rest::Client.new(options.merge(logger: custom_logger.new, log_level: :debug)) }
136
+
137
+ it 'uses the custom logger' do
138
+ expect(subject.logger.logger.class).to eql(custom_logger)
139
+ end
140
+
141
+ it 'sets the custom log level' do
142
+ expect(subject.logger.log_level).to eql(Logger::DEBUG)
143
+ end
144
+ end
145
+ end
111
146
  end
112
147
  end
113
148
  end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require 'msgpack'
3
+
4
+ describe Ably::Util::Crypto do
5
+ let(:seret_key) { SecureRandom.hex }
6
+ let(:cipher_options) { { key: seret_key } }
7
+ subject { Ably::Util::Crypto.new(cipher_options) }
8
+
9
+ context 'defaults' do
10
+ let(:expected_defaults) do
11
+ {
12
+ algorithm: 'AES',
13
+ mode: 'CBC',
14
+ key_length: 128
15
+ }
16
+ end
17
+
18
+ specify 'match other client libraries' do
19
+ expect(Ably::Util::Crypto::DEFAULTS).to eql(expected_defaults)
20
+ expect(Ably::Util::Crypto::BLOCK_LENGTH).to eql(16)
21
+ end
22
+ end
23
+
24
+ context 'encrypts & decrypt' do
25
+ let(:string) { SecureRandom.hex }
26
+ let(:byte_array) { SecureRandom.hex.to_msgpack.unpack('C*') }
27
+
28
+ specify 'a string' do
29
+ encrypted = subject.encrypt(string)
30
+ expect(subject.decrypt(encrypted)).to eql(string)
31
+ end
32
+ end
33
+
34
+ context 'encrypting an empty string' do
35
+ let(:empty_string) { '' }
36
+
37
+ it 'raises an ErgumentError' do
38
+ expect { subject.encrypt(empty_string) }.to raise_error ArgumentError, /data must not be empty/
39
+ end
40
+ end
41
+
42
+ context 'using shared client lib fixture data' do
43
+ let(:resources_root) { File.expand_path('../../../resources', __FILE__) }
44
+ let(:encryption_data_128) { JSON.parse(File.read(File.join(resources_root, 'crypto-data-128.json'))) }
45
+ let(:encryption_data_256) { JSON.parse(File.read(File.join(resources_root, 'crypto-data-256.json'))) }
46
+
47
+ shared_examples 'an Ably encrypter and decrypter' do
48
+ let(:algorithm) { data['algorithm'].upcase }
49
+ let(:mode) { data['mode'].upcase }
50
+ let(:key_length) { data['keylength'] }
51
+ let(:secret_key) { Base64.decode64(data['key']) }
52
+ let(:iv) { Base64.decode64(data['iv']) }
53
+
54
+ let(:cipher_options) { { key: secret_key, algorithm: algorithm, mode: mode, key_length: key_length } }
55
+
56
+ context 'text payload' do
57
+ let(:payload) { data['items'].first['encoded']['data'] }
58
+ let(:encrypted) { data['items'].first['encrypted']['data'] }
59
+
60
+ it 'encrypts exactly the same binary data as other client libraries' do
61
+ expect(subject.encrypt(payload, iv: iv)).to eql(Base64.decode64(encrypted))
62
+ end
63
+
64
+ it 'decrypts exactly the same binary data as other client libraries' do
65
+ expect(subject.decrypt(Base64.decode64(encrypted))).to eql(payload)
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'with AES-128-CBC' do
71
+ let(:data) { encryption_data_128 }
72
+
73
+ it_behaves_like 'an Ably encrypter and decrypter'
74
+ end
75
+
76
+ context 'with AES-256-CBC' do
77
+ let(:data) { encryption_data_256 }
78
+
79
+ it_behaves_like 'an Ably encrypter and decrypter'
80
+ end
81
+ end
82
+ end
@@ -8,7 +8,7 @@ describe Ably::Util::PubSub do
8
8
  subject { Ably::Util::PubSub.new(options) }
9
9
 
10
10
  context 'event fan out' do
11
- specify do
11
+ specify 'allows publishing to more than on subscriber' do
12
12
  expect(obj).to receive(:received_message).with(msg).twice
13
13
  2.times do
14
14
  subject.subscribe(:message) { |msg| obj.received_message msg }
@@ -34,6 +34,18 @@ describe Ably::Util::PubSub do
34
34
  subject.subscribe('valid') { |msg| obj.received_message msg }
35
35
  subject.publish :valid, msg
36
36
  end
37
+
38
+ context 'and two different configurations but sharing the same class' do
39
+ let!(:exception_pubsub) { Ably::Util::PubSub.new(coerce_into: Proc.new { raise KeyError }) }
40
+
41
+ it 'does not share state' do
42
+ expect(obj).to receive(:received_message).with(msg).once
43
+ subject.subscribe('valid') { |msg| obj.received_message msg }
44
+ subject.publish :valid, msg
45
+
46
+ expect { exception_pubsub.publish :fail }.to raise_error KeyError
47
+ end
48
+ end
37
49
  end
38
50
 
39
51
  context 'without coercion' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ably
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lewis Marshall
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-31 00:00:00.000000000 Z
12
+ date: 2014-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 1.0.0.beta2
34
+ version: 1.0.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 1.0.0.beta2
41
+ version: 1.0.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: faraday
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -82,19 +82,19 @@ dependencies:
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.3'
84
84
  - !ruby/object:Gem::Dependency
85
- name: msgpack
85
+ name: msgpack-ably
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0.5'
90
+ version: 0.5.10
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '0.5'
97
+ version: 0.5.10
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: bundler
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -188,6 +188,7 @@ extensions: []
188
188
  extra_rdoc_files: []
189
189
  files:
190
190
  - ".gitignore"
191
+ - ".travis.yml"
191
192
  - Gemfile
192
193
  - LICENSE.txt
193
194
  - README.md
@@ -196,16 +197,22 @@ files:
196
197
  - lib/ably.rb
197
198
  - lib/ably/auth.rb
198
199
  - lib/ably/exceptions.rb
200
+ - lib/ably/logger.rb
199
201
  - lib/ably/models/error_info.rb
200
202
  - lib/ably/models/idiomatic_ruby_wrapper.rb
201
203
  - lib/ably/models/message.rb
202
- - lib/ably/models/nil_channel.rb
204
+ - lib/ably/models/message_encoders/base.rb
205
+ - lib/ably/models/message_encoders/base64.rb
206
+ - lib/ably/models/message_encoders/cipher.rb
207
+ - lib/ably/models/message_encoders/json.rb
208
+ - lib/ably/models/message_encoders/utf8.rb
203
209
  - lib/ably/models/paginated_resource.rb
204
210
  - lib/ably/models/presence_message.rb
205
211
  - lib/ably/models/protocol_message.rb
206
212
  - lib/ably/models/token.rb
207
213
  - lib/ably/modules/channels_collection.rb
208
214
  - lib/ably/modules/conversions.rb
215
+ - lib/ably/modules/encodeable.rb
209
216
  - lib/ably/modules/enum.rb
210
217
  - lib/ably/modules/event_emitter.rb
211
218
  - lib/ably/modules/event_machine_helpers.rb
@@ -220,23 +227,26 @@ files:
220
227
  - lib/ably/realtime/client/incoming_message_dispatcher.rb
221
228
  - lib/ably/realtime/client/outgoing_message_dispatcher.rb
222
229
  - lib/ably/realtime/connection.rb
230
+ - lib/ably/realtime/connection/connection_manager.rb
223
231
  - lib/ably/realtime/connection/connection_state_machine.rb
224
232
  - lib/ably/realtime/connection/websocket_transport.rb
233
+ - lib/ably/realtime/models/nil_channel.rb
225
234
  - lib/ably/realtime/presence.rb
226
235
  - lib/ably/rest.rb
227
236
  - lib/ably/rest/channel.rb
228
237
  - lib/ably/rest/channels.rb
229
238
  - lib/ably/rest/client.rb
239
+ - lib/ably/rest/middleware/encoder.rb
230
240
  - lib/ably/rest/middleware/exceptions.rb
231
241
  - lib/ably/rest/middleware/external_exceptions.rb
232
242
  - lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb
243
+ - lib/ably/rest/middleware/logger.rb
233
244
  - lib/ably/rest/middleware/parse_json.rb
234
245
  - lib/ably/rest/middleware/parse_message_pack.rb
235
246
  - lib/ably/rest/presence.rb
236
247
  - lib/ably/util/crypto.rb
237
248
  - lib/ably/util/pub_sub.rb
238
249
  - lib/ably/version.rb
239
- - spec/acceptance/crypto.rb
240
250
  - spec/acceptance/realtime/channel_history_spec.rb
241
251
  - spec/acceptance/realtime/channel_spec.rb
242
252
  - spec/acceptance/realtime/connection_spec.rb
@@ -247,19 +257,28 @@ files:
247
257
  - spec/acceptance/rest/base_spec.rb
248
258
  - spec/acceptance/rest/channel_spec.rb
249
259
  - spec/acceptance/rest/channels_spec.rb
260
+ - spec/acceptance/rest/message_spec.rb
250
261
  - spec/acceptance/rest/presence_spec.rb
251
262
  - spec/acceptance/rest/stats_spec.rb
252
263
  - spec/acceptance/rest/time_spec.rb
253
264
  - spec/integration/modules/state_emitter_spec.rb
254
265
  - spec/integration/rest/auth.rb
266
+ - spec/resources/crypto-data-128.json
267
+ - spec/resources/crypto-data-256.json
268
+ - spec/rspec_config.rb
255
269
  - spec/spec_helper.rb
256
270
  - spec/support/api_helper.rb
257
271
  - spec/support/event_machine_helper.rb
258
272
  - spec/support/model_helper.rb
259
273
  - spec/support/protocol_msgbus_helper.rb
260
274
  - spec/support/test_app.rb
275
+ - spec/unit/logger_spec.rb
261
276
  - spec/unit/models/error_info_spec.rb
262
277
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
278
+ - spec/unit/models/message_encoders/base64_spec.rb
279
+ - spec/unit/models/message_encoders/cipher_spec.rb
280
+ - spec/unit/models/message_encoders/json_spec.rb
281
+ - spec/unit/models/message_encoders/utf8_spec.rb
263
282
  - spec/unit/models/message_spec.rb
264
283
  - spec/unit/models/paginated_resource_spec.rb
265
284
  - spec/unit/models/presence_message_spec.rb
@@ -268,7 +287,6 @@ files:
268
287
  - spec/unit/modules/conversions_spec.rb
269
288
  - spec/unit/modules/enum_spec.rb
270
289
  - spec/unit/modules/event_emitter_spec.rb
271
- - spec/unit/modules/pub_sub_spec.rb
272
290
  - spec/unit/realtime/channel_spec.rb
273
291
  - spec/unit/realtime/channels_spec.rb
274
292
  - spec/unit/realtime/client_spec.rb
@@ -276,8 +294,11 @@ files:
276
294
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
277
295
  - spec/unit/realtime/presence_spec.rb
278
296
  - spec/unit/realtime/realtime_spec.rb
297
+ - spec/unit/realtime/websocket_transport_spec.rb
279
298
  - spec/unit/rest/channels_spec.rb
280
299
  - spec/unit/rest/client_spec.rb
300
+ - spec/unit/util/crypto_spec.rb
301
+ - spec/unit/util/pub_sub_spec.rb
281
302
  homepage: http://github.com/ably/ably-ruby
282
303
  licenses:
283
304
  - MIT
@@ -303,7 +324,6 @@ signing_key:
303
324
  specification_version: 4
304
325
  summary: A Ruby client library for ably.io, the real-time messaging service
305
326
  test_files:
306
- - spec/acceptance/crypto.rb
307
327
  - spec/acceptance/realtime/channel_history_spec.rb
308
328
  - spec/acceptance/realtime/channel_spec.rb
309
329
  - spec/acceptance/realtime/connection_spec.rb
@@ -314,19 +334,28 @@ test_files:
314
334
  - spec/acceptance/rest/base_spec.rb
315
335
  - spec/acceptance/rest/channel_spec.rb
316
336
  - spec/acceptance/rest/channels_spec.rb
337
+ - spec/acceptance/rest/message_spec.rb
317
338
  - spec/acceptance/rest/presence_spec.rb
318
339
  - spec/acceptance/rest/stats_spec.rb
319
340
  - spec/acceptance/rest/time_spec.rb
320
341
  - spec/integration/modules/state_emitter_spec.rb
321
342
  - spec/integration/rest/auth.rb
343
+ - spec/resources/crypto-data-128.json
344
+ - spec/resources/crypto-data-256.json
345
+ - spec/rspec_config.rb
322
346
  - spec/spec_helper.rb
323
347
  - spec/support/api_helper.rb
324
348
  - spec/support/event_machine_helper.rb
325
349
  - spec/support/model_helper.rb
326
350
  - spec/support/protocol_msgbus_helper.rb
327
351
  - spec/support/test_app.rb
352
+ - spec/unit/logger_spec.rb
328
353
  - spec/unit/models/error_info_spec.rb
329
354
  - spec/unit/models/idiomatic_ruby_wrapper_spec.rb
355
+ - spec/unit/models/message_encoders/base64_spec.rb
356
+ - spec/unit/models/message_encoders/cipher_spec.rb
357
+ - spec/unit/models/message_encoders/json_spec.rb
358
+ - spec/unit/models/message_encoders/utf8_spec.rb
330
359
  - spec/unit/models/message_spec.rb
331
360
  - spec/unit/models/paginated_resource_spec.rb
332
361
  - spec/unit/models/presence_message_spec.rb
@@ -335,7 +364,6 @@ test_files:
335
364
  - spec/unit/modules/conversions_spec.rb
336
365
  - spec/unit/modules/enum_spec.rb
337
366
  - spec/unit/modules/event_emitter_spec.rb
338
- - spec/unit/modules/pub_sub_spec.rb
339
367
  - spec/unit/realtime/channel_spec.rb
340
368
  - spec/unit/realtime/channels_spec.rb
341
369
  - spec/unit/realtime/client_spec.rb
@@ -343,6 +371,9 @@ test_files:
343
371
  - spec/unit/realtime/incoming_message_dispatcher_spec.rb
344
372
  - spec/unit/realtime/presence_spec.rb
345
373
  - spec/unit/realtime/realtime_spec.rb
374
+ - spec/unit/realtime/websocket_transport_spec.rb
346
375
  - spec/unit/rest/channels_spec.rb
347
376
  - spec/unit/rest/client_spec.rb
377
+ - spec/unit/util/crypto_spec.rb
378
+ - spec/unit/util/pub_sub_spec.rb
348
379
  has_rdoc: