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
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzJmOTJkOTc1OWMyMWNlM2U3NjIzMmNiNWY5ZTI3MGI0YTFlNzZhZA==
4
+ MDNkYTBjM2I5MTE0YWViNzdlYTM1NzJiZjM2YzBkYzBjOWRkMjFiNg==
5
5
  data.tar.gz: !binary |-
6
- ZTUyMTI1MGJjNTRkMjQ0NGI0OTg0MDJiZGJiNTYyZGEyZjZjZTc3MA==
6
+ M2Y1NTIxMzM1NmQ2NzllNjE5ZmJiOTMyMGQxYzA5MzBhYzEyZmEwNQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OWZkNjgwYTBkNTIwODA3OTQyN2Q0ODU5YTFhOGY3MDUzNmRjYmZhYjhlYTk4
10
- NDFiMTkwMDljNzBiZWM1ZTQ1MmYyMTM4NTZhZDYzZTJmNGNkOGM4OWNlNjNk
11
- ZjQ0ZjYxYWI3OTM5ODFhYjU2M2YxNDViMTJmY2RkMTZhZTZmMGI=
9
+ ZTc0ZjFlNGUzMmY4ZTAzOGE2MWY2N2EzMDMzYzVjMTUyMWFjZjUwYjE0ZTgx
10
+ YzJhMjIwY2UyZmU5ZGI1MmM1ZTBhMDMzNjI4OGY2OGQyOGNjOTU3YmI5NTk1
11
+ MzhmZTJiYTcyNjI3ZGJlYzk1ZWUyNjBkNTVlM2M4M2QwZGI0OGE=
12
12
  data.tar.gz: !binary |-
13
- NTk4NmZjM2VkYWNlZmZjYWU2MDMwMjNiNGJmMzY3YzJmY2E0MDQwNjU1NDhh
14
- ZDE3YTMyODg1ZDEwZGUzNGExYmUyMjQ2MjFhNTlhODU5ODViNzA2MDFlNmFh
15
- MWRiNDMzYjkwYWUyZTY1MDM1NTk3ZGJkY2QyYTdjMzNjNzI4MjY=
13
+ MjVkZmM1YmExMjVmOTNmZmVlZjhkYTlmMDgwMjdjYTZhOGE2ZmE4OWQwMzhi
14
+ YzZmZmVjNTJkYzBmOGYyYjYzM2ZjNTYwZDkwNDRmOTJiZjU4NDJiOTUzM2Y3
15
+ YzEyNjcxOWIyYjRiNTM4MDUyODM0ZjExZGRlOGVhODNkNWQ4Njc=
data/.travis.yml CHANGED
@@ -4,6 +4,8 @@ rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
6
  - 2.2.0
7
+ before_install:
8
+ - git submodule update --init --recursive
7
9
  script: bundle exec rspec
8
10
  notifications:
9
11
  slack:
data/README.md CHANGED
@@ -26,42 +26,68 @@ Or install it yourself as:
26
26
 
27
27
  ## Using the REST API
28
28
 
29
+ All examples assume a client and/or channel has been created as follows:
30
+
31
+ ```ruby
32
+ client = Ably::Rest.new(api_key: 'xxxxx')
33
+ channel = client.channel('test')
34
+ ```
35
+
29
36
  ### Publishing a message to a channel
30
37
 
31
38
  ```ruby
32
- client = Ably::Rest.new(api_key: "xxxxx")
33
- channel = client.channel("test")
34
- channel.publish("myEvent", "Hello!") #=> true
39
+ channel.publish('myEvent', 'Hello!') #=> true
40
+ ```
41
+
42
+ ### Querying the History
43
+
44
+ ```ruby
45
+ mesage_history = channel.history #=> #<Ably::Models::PaginatedResource ...>
46
+ message_history.first # => #<Ably::Models::Message ...>
47
+ ```
48
+
49
+ ### Presence on a channel
50
+
51
+ ```ruby
52
+ members = channel.presence.get # => #<Ably::Models::PaginatedResource ...>
53
+ members.first # => #<Ably::Models::PresenceMessage ...>
35
54
  ```
36
55
 
37
- ### Fetching a channel's history
56
+ ### Querying the Presence History
38
57
 
39
58
  ```ruby
40
- client = Ably::Rest.new(api_key: "xxxxx")
41
- channel = client.channel("test")
42
- channel.history #=> [{:name=>"test", :data=>"payload"}]
59
+ presence_history = channel.presence.history # => #<Ably::Models::PaginatedResource ...>
60
+ presence_history.first # => #<Ably::Models::PresenceMessage ...>
43
61
  ```
44
62
 
45
- ### Authentication with a token
63
+ ### Generate Token and Token Request
46
64
 
47
65
  ```ruby
48
- client = Ably::Rest.new(api_key: "xxxxx")
49
- client.auth.authorise # creates a token and will use token authentication moving forwards
50
- client.auth.current_token #=> #<Ably::Models::Token>
51
- channel.publish("myEvent", "Hello!") #=> true, sent using token authentication
66
+ client.auth.request_token
67
+ # => #<Ably::Models::Token ...>
68
+
69
+ token = client.auth.create_token_request
70
+ # => {"id"=>...,
71
+ # "clientId"=>nil,
72
+ # "ttl"=>3600,
73
+ # "timestamp"=>...,
74
+ # "capability"=>"{\"*\":[\"*\"]}",
75
+ # "nonce"=>...,
76
+ # "mac"=>...}
77
+
78
+ client = Ably::Rest.new(token_id: token.id)
52
79
  ```
53
80
 
54
81
  ### Fetching your application's stats
55
82
 
56
83
  ```ruby
57
- client = Ably::Rest.new(api_key: "xxxxx")
58
- client.stats #=> [{:channels=>..., :apiRequests=>..., ...}]
84
+ stats = client.stats #=> #<Ably::Models::PaginatedResource ...>
85
+ stats.first = #<Ably::Models::Stat ...>
59
86
  ```
60
87
 
61
88
  ### Fetching the Ably service time
62
89
 
63
90
  ```ruby
64
- client = Ably::Rest.new(api_key: "xxxxx")
65
91
  client.time #=> 2013-12-12 14:23:34 +0000
66
92
  ```
67
93
 
data/SPEC.md CHANGED
@@ -1,942 +1,1078 @@
1
- # Ably REST Client Library 0.7.4 Specification
1
+ # Ably REST Client Library 0.8.1 Specification
2
2
 
3
3
  ### Ably::Auth
4
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb))_
4
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb))_
5
5
  * using JSON and MsgPack protocol
6
- * [has immutable options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L54)
6
+ * [has immutable options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L54)
7
7
  * #request_token
8
- * [returns a valid requested token in the expected format with valid issued_at and expires_at attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L69)
8
+ * [returns a valid requested token in the expected format with valid issued and expires attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L69)
9
9
  * with option :client_id
10
- * [overrides default and uses camelCase notation for all attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L95)
10
+ * [overrides default and uses camelCase notation for attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L101)
11
11
  * with option :capability
12
- * [overrides default and uses camelCase notation for all attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L95)
12
+ * [overrides default and uses camelCase notation for attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L101)
13
13
  * with option :nonce
14
- * [overrides default and uses camelCase notation for all attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L95)
14
+ * [overrides default and uses camelCase notation for attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L101)
15
15
  * with option :timestamp
16
- * [overrides default and uses camelCase notation for all attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L95)
16
+ * [overrides default and uses camelCase notation for attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L101)
17
17
  * with option :ttl
18
- * [overrides default and uses camelCase notation for all attributes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L95)
19
- * with :key_id & :key_secret options
20
- * [key_id is used in request and signing uses key_secret](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L124)
18
+ * [overrides default and uses camelCase notation for attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L101)
19
+ * with :key option
20
+ * [key_name is used in request and signing uses key_secret](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L130)
21
+ * with :key_name & :key_secret options
22
+ * [key_name is used in request and signing uses key_secret](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L159)
21
23
  * with :query_time option
22
- * [queries the server for the time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L132)
24
+ * [queries the server for the time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L167)
23
25
  * without :query_time option
24
- * [does not query the server for the time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L141)
26
+ * [does not query the server for the time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L176)
25
27
  * with :auth_url option
26
28
  * when response from :auth_url is a valid token request
27
- * [requests a token from :auth_url using an HTTP GET request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L188)
28
- * [returns a valid token generated from the token request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L193)
29
+ * [requests a token from :auth_url using an HTTP GET request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L224)
30
+ * [returns a valid token generated from the token request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L229)
29
31
  * with :query_params
30
- * [requests a token from :auth_url with the :query_params](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L200)
32
+ * [requests a token from :auth_url with the :query_params](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L236)
31
33
  * with :headers
32
- * [requests a token from :auth_url with the HTTP headers set](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L208)
34
+ * [requests a token from :auth_url with the HTTP headers set](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L244)
33
35
  * with POST
34
- * [requests a token from :auth_url using an HTTP POST instead of the default GET](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L216)
35
- * when response from :auth_url is a token
36
- * [returns a Token created from the token JSON](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L240)
36
+ * [requests a token from :auth_url using an HTTP POST instead of the default GET](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L252)
37
+ * when response from :auth_url is a token details object
38
+ * [returns TokenDetails created from the token JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L277)
39
+ * when response from :auth_url is text/plain content type and a token string
40
+ * [returns TokenDetails created from the token JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L294)
37
41
  * when response is invalid
38
42
  * 500
39
- * [raises ServerError](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L255)
43
+ * [raises ServerError](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L307)
40
44
  * XML
41
- * [raises InvalidResponseBody](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L266)
42
- * with token_request_block that returns a token request
43
- * [calls the block when authenticating to obtain the request token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L284)
44
- * [uses the token request from the block when requesting a new token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L289)
45
- * with token_request_block that returns a token
46
- * [calls the block when authenticating to obtain the request token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L317)
47
- * [uses the token request from the block when requesting a new token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L322)
45
+ * [raises InvalidResponseBody](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L318)
46
+ * with a Proc for the :auth_callback option
47
+ * that returns a TokenRequest
48
+ * [calls the Proc when authenticating to obtain the request token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L337)
49
+ * [uses the token request returned from the callback when requesting a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L342)
50
+ * that returns a TokenDetails JSON object
51
+ * [calls the Proc when authenticating to obtain the request token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L371)
52
+ * [uses the token request returned from the callback when requesting a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L376)
53
+ * that returns a TokenDetails object
54
+ * [uses the token request returned from the callback when requesting a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L397)
55
+ * that returns a Token string
56
+ * [uses the token request returned from the callback when requesting a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L413)
57
+ * with client_id
58
+ * [returns a token with the client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L445)
48
59
  * before #authorise has been called
49
- * [has no current_token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L334)
60
+ * [has no current_token_details](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L452)
50
61
  * #authorise
51
- * [updates the persisted auth options thare are then used for subsequent authorise requests](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L381)
62
+ * [updates the persisted auth options that are then used for subsequent authorise requests](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L499)
52
63
  * when called for the first time since the client has been instantiated
53
- * [passes all options to #request_token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L345)
54
- * [returns a valid token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L350)
55
- * [issues a new token if option :force => true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L354)
64
+ * [passes all options to #request_token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L463)
65
+ * [returns a valid token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L468)
66
+ * [issues a new token if option :force => true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L472)
56
67
  * with previous authorisation
57
- * [does not request a token if current_token has not expired](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L365)
58
- * [requests a new token if token is expired](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L370)
59
- * [issues a new token if option :force => true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L376)
60
- * with token_request_block
61
- * [calls the block](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L397)
62
- * [uses the token request returned from the block when requesting a new token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L401)
68
+ * [does not request a token if current_token_details has not expired](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L483)
69
+ * [requests a new token if token is expired](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L488)
70
+ * [issues a new token if option :force => true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L494)
71
+ * with a Proc for the :auth_callback option
72
+ * [calls the Proc](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L515)
73
+ * [uses the token request returned from the callback when requesting a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L519)
63
74
  * for every subsequent #request_token
64
- * without a provided block
65
- * [calls the originally provided block](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L407)
75
+ * without a :auth_callback Proc
76
+ * [calls the originally provided block](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L525)
66
77
  * with a provided block
67
- * [does not call the originally provided block and calls the new #request_token block](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L414)
78
+ * [does not call the originally provided Proc and calls the new #request_token :auth_callback Proc](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L532)
68
79
  * #create_token_request
69
- * [uses the key ID from the client](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L430)
70
- * [uses the default TTL](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L434)
71
- * [uses the default capability](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L438)
80
+ * [uses the key name from the client](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L548)
81
+ * [uses the default TTL](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L552)
82
+ * [uses the default capability](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L556)
72
83
  * the nonce
73
- * [is unique for every request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L443)
74
- * [is at least 16 characters](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L448)
84
+ * [is unique for every request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L561)
85
+ * [is at least 16 characters](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L566)
75
86
  * with option :ttl
76
- * [overrides default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L459)
77
- * with option :capability
78
- * [overrides default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L459)
87
+ * [overrides default](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L577)
79
88
  * with option :nonce
80
- * [overrides default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L459)
81
- * with option :timestamp
82
- * [overrides default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L459)
89
+ * [overrides default](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L577)
83
90
  * with option :client_id
84
- * [overrides default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L459)
91
+ * [overrides default](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L577)
85
92
  * with additional invalid attributes
86
- * [are ignored](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L467)
93
+ * [are ignored](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L585)
87
94
  * when required fields are missing
88
- * [should raise an exception if key secret is missing](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L478)
89
- * [should raise an exception if key id is missing](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L482)
95
+ * [should raise an exception if key secret is missing](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L596)
96
+ * [should raise an exception if key name is missing](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L600)
90
97
  * with :query_time option
91
- * [queries the server for the timestamp](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L491)
98
+ * [queries the server for the timestamp](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L609)
92
99
  * with :timestamp option
93
- * [uses the provided timestamp in the token request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L501)
100
+ * [uses the provided timestamp in the token request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L619)
94
101
  * signing
95
- * [generates a valid HMAC](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L518)
102
+ * [generates a valid HMAC](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L641)
96
103
  * using token authentication
97
- * with :token_id option
98
- * [authenticates successfully using the provided :token_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L541)
99
- * [disallows publishing on unspecified capability channels](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L545)
100
- * [fails if timestamp is invalid](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L553)
101
- * [cannot be renewed automatically](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L561)
104
+ * with :token option
105
+ * [authenticates successfully using the provided :token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L664)
106
+ * [disallows publishing on unspecified capability channels](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L668)
107
+ * [fails if timestamp is invalid](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L676)
108
+ * [cannot be renewed automatically](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L684)
102
109
  * when implicit as a result of using :client id
103
110
  * and requests to the Ably server are mocked
104
- * [will send a token request to the server](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L591)
111
+ * [will send a token request to the server](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L712)
105
112
  * a token is created
106
- * [before a request is made](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L600)
107
- * [when a message is published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L604)
108
- * [with capability and TTL defaults](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L608)
109
- * when using an :api_key and basic auth
110
- * [#using_token_auth? is false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L623)
111
- * [#using_basic_auth? is true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/auth_spec.rb#L627)
113
+ * [before a request is made](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L721)
114
+ * [when a message is published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L725)
115
+ * [with capability and TTL defaults](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L729)
116
+ * when using an :key and basic auth
117
+ * [#using_token_auth? is false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L744)
118
+ * [#key attribute contains the key string](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L748)
119
+ * [#using_basic_auth? is true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/auth_spec.rb#L752)
112
120
 
113
121
  ### Ably::Rest
114
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb))_
122
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb))_
115
123
  * transport protocol
116
124
  * when protocol is not defined it defaults to :msgpack
117
- * [uses MsgPack](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L27)
125
+ * [uses MsgPack](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L27)
118
126
  * when option {:protocol=>:json} is used
119
- * [uses JSON](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L43)
127
+ * [uses JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L43)
120
128
  * when option {:use_binary_protocol=>false} is used
121
- * [uses JSON](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L43)
129
+ * [uses JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L43)
122
130
  * when option {:protocol=>:msgpack} is used
123
- * [uses MsgPack](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L60)
131
+ * [uses MsgPack](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L60)
124
132
  * when option {:use_binary_protocol=>true} is used
125
- * [uses MsgPack](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L60)
133
+ * [uses MsgPack](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L60)
126
134
  * using JSON and MsgPack protocol
127
135
  * failed requests
128
136
  * due to invalid Auth
129
- * [should raise an InvalidRequest exception with a valid error message and code](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L75)
137
+ * [should raise an InvalidRequest exception with a valid error message and code](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L75)
130
138
  * server error with JSON error response body
131
- * [should raise a ServerError exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L94)
139
+ * [should raise a ServerError exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L94)
132
140
  * 500 server error without a valid JSON response body
133
- * [should raise a ServerError exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L105)
141
+ * [should raise a ServerError exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L105)
134
142
  * token authentication failures
135
143
  * when auth#token_renewable?
136
- * [should automatically reissue a token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L143)
144
+ * [should automatically reissue a token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L143)
137
145
  * when NOT auth#token_renewable?
138
- * [should raise an InvalidToken exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/base_spec.rb#L156)
146
+ * [should raise an InvalidToken exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/base_spec.rb#L158)
139
147
 
140
148
  ### Ably::Rest::Channel
141
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb))_
149
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb))_
142
150
  * using JSON and MsgPack protocol
143
151
  * #publish
144
- * [should publish the message adn return true indicating success](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L17)
152
+ * [should publish the message and return true indicating success](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L17)
145
153
  * #history
146
- * [should return the current message history for the channel](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L39)
147
- * [should return paged history using the PaginatedResource model](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L67)
154
+ * [should return the current message history for the channel](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L39)
155
+ * [should return paged history using the PaginatedResource model](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L67)
148
156
  * message timestamps
149
- * [should all be after the messages were published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L52)
157
+ * [should all be after the messages were published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L52)
150
158
  * message IDs
151
- * [should be unique](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L60)
159
+ * [should be unique](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L60)
152
160
  * #history option
153
161
  * :start
154
162
  * with milliseconds since epoch value
155
- * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L116)
163
+ * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L123)
156
164
  * with a Time object value
157
- * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L126)
165
+ * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L133)
158
166
  * :end
159
167
  * with milliseconds since epoch value
160
- * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L116)
168
+ * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L123)
161
169
  * with a Time object value
162
- * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channel_spec.rb#L126)
170
+ * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channel_spec.rb#L133)
163
171
 
164
172
  ### Ably::Rest::Channels
165
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb))_
173
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb))_
166
174
  * using JSON and MsgPack protocol
167
175
  * using shortcut method #channel on the client object
168
176
  * behaves like a channel
169
- * [returns a channel object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L6)
170
- * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L11)
177
+ * [returns a channel object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L6)
178
+ * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L11)
171
179
  * using #get method on client#channels
172
180
  * behaves like a channel
173
- * [returns a channel object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L6)
174
- * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L11)
181
+ * [returns a channel object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L6)
182
+ * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L11)
175
183
  * using undocumented array accessor [] method on client#channels
176
184
  * behaves like a channel
177
- * [returns a channel object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L6)
178
- * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/channels_spec.rb#L11)
185
+ * [returns a channel object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L6)
186
+ * [returns channel object and passes the provided options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/channels_spec.rb#L11)
179
187
 
180
188
  ### Ably::Rest::Client
181
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb))_
189
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb))_
182
190
  * using JSON and MsgPack protocol
183
191
  * #initialize
184
- * with an auth block
185
- * [calls the block to get a new token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L20)
192
+ * with a :auth_callback Proc
193
+ * [calls the auth Proc to get a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L20)
186
194
  * with an auth URL
187
- * [sends an HTTP request to the provided URL to get a new token](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L34)
195
+ * [sends an HTTP request to the provided URL to get a new token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L34)
188
196
  * using tokens
189
197
  * when expired
190
- * [creates a new token automatically when the old token expires](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L55)
198
+ * [creates a new token automatically when the old token expires](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L58)
191
199
  * when token has not expired
192
- * [reuses the existing token for every request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L69)
200
+ * [reuses the existing token for every request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L72)
193
201
  * connection transport
194
202
  * for default host
195
- * [is configured to timeout connection opening in 4 seconds](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L85)
196
- * [is configured to timeout connection requests in 15 seconds](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L89)
203
+ * [is configured to timeout connection opening in 4 seconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L88)
204
+ * [is configured to timeout connection requests in 15 seconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L92)
197
205
  * for the fallback hosts
198
- * [is configured to timeout connection opening in 4 seconds](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L95)
199
- * [is configured to timeout connection requests in 15 seconds](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L99)
206
+ * [is configured to timeout connection opening in 4 seconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L98)
207
+ * [is configured to timeout connection requests in 15 seconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L102)
200
208
  * fallback hosts
201
209
  * configured
202
- * [should make connection attempts to A.ably-realtime.com, B.ably-realtime.com, C.ably-realtime.com, D.ably-realtime.com, E.ably-realtime.com](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L112)
210
+ * [should make connection attempts to A.ably-realtime.com, B.ably-realtime.com, C.ably-realtime.com, D.ably-realtime.com, E.ably-realtime.com](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L115)
203
211
  * when environment is NOT production
204
- * [does not retry failed requests with fallback hosts when there is a connection error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L129)
212
+ * [does not retry failed requests with fallback hosts when there is a connection error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L132)
205
213
  * when environment is production
206
214
  * and connection times out
207
- * [tries fallback hosts 3 times](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L169)
215
+ * [tries fallback hosts 3 times](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L172)
208
216
  * and the total request time exeeds 10 seconds
209
- * [makes no further attempts to any fallback hosts](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L184)
217
+ * [makes no further attempts to any fallback hosts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L187)
210
218
  * and connection fails
211
- * [tries fallback hosts 3 times](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L200)
219
+ * [tries fallback hosts 3 times](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L203)
212
220
  * with a custom host
213
221
  * that does not exist
214
- * [fails immediately and raises a Faraday Error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L216)
222
+ * [fails immediately and raises a Faraday Error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L219)
215
223
  * fallback hosts
216
- * [are never used](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L237)
224
+ * [are never used](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L240)
217
225
  * that times out
218
- * [fails immediately and raises a Faraday Error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L252)
226
+ * [fails immediately and raises a Faraday Error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L255)
219
227
  * fallback hosts
220
- * [are never used](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/client_spec.rb#L265)
228
+ * [are never used](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/client_spec.rb#L268)
221
229
 
222
230
  ### Ably::Models::MessageEncoders
223
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb))_
231
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb))_
224
232
  * with binary transport protocol
225
233
  * without encryption
226
234
  * with UTF-8 data
227
- * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L41)
235
+ * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L41)
228
236
  * with binary data
229
- * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L52)
237
+ * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L52)
230
238
  * with JSON data
231
- * [stringifies the JSON and sets the encoding attribute to "json"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L63)
239
+ * [stringifies the JSON and sets the encoding attribute to "json"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L63)
232
240
  * with encryption
233
241
  * with UTF-8 data
234
- * [applies utf-8 and cipher encoding and sets the encoding attribute to "utf-8/cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L78)
242
+ * [applies utf-8 and cipher encoding and sets the encoding attribute to "utf-8/cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L78)
235
243
  * with binary data
236
- * [applies cipher encoding and sets the encoding attribute to "cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L89)
244
+ * [applies cipher encoding and sets the encoding attribute to "cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L89)
237
245
  * with JSON data
238
- * [applies json, utf-8 and cipher encoding and sets the encoding attribute to "json/utf-8/cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L100)
246
+ * [applies json, utf-8 and cipher encoding and sets the encoding attribute to "json/utf-8/cipher+aes-128-cbc"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L100)
239
247
  * with text transport protocol
240
248
  * without encryption
241
249
  * with UTF-8 data
242
- * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L117)
250
+ * [does not apply any encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L117)
243
251
  * with binary data
244
- * [applies a base64 encoding and sets the encoding attribute to "base64"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L128)
252
+ * [applies a base64 encoding and sets the encoding attribute to "base64"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L128)
245
253
  * with JSON data
246
- * [stringifies the JSON and sets the encoding attribute to "json"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L139)
254
+ * [stringifies the JSON and sets the encoding attribute to "json"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L139)
247
255
  * with encryption
248
256
  * with UTF-8 data
249
- * [applies utf-8, cipher and base64 encodings and sets the encoding attribute to "utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L154)
257
+ * [applies utf-8, cipher and base64 encodings and sets the encoding attribute to "utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L154)
250
258
  * with binary data
251
- * [applies cipher and base64 encoding and sets the encoding attribute to "utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L165)
259
+ * [applies cipher and base64 encoding and sets the encoding attribute to "utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L165)
252
260
  * with JSON data
253
- * [applies json, utf-8, cipher and base64 encoding and sets the encoding attribute to "json/utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/encoders_spec.rb#L176)
261
+ * [applies json, utf-8, cipher and base64 encoding and sets the encoding attribute to "json/utf-8/cipher+aes-128-cbc/base64"](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/encoders_spec.rb#L176)
254
262
 
255
263
  ### Ably::Rest::Channel messages
256
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb))_
264
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb))_
257
265
  * using JSON and MsgPack protocol
258
266
  * publishing with an ASCII_8BIT message name
259
- * [is converted into UTF_8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L18)
267
+ * [is converted into UTF_8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L18)
260
268
  * encryption and encoding
261
269
  * with #publish and #history
262
270
  * with AES-128-CBC using crypto-data-128.json fixtures
263
271
  * item 0 with encrypted encoding utf-8/cipher+aes-128-cbc/base64
264
272
  * behaves like an Ably encrypter and decrypter
265
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
266
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
273
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
274
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
267
275
  * item 1 with encrypted encoding cipher+aes-128-cbc/base64
268
276
  * behaves like an Ably encrypter and decrypter
269
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
270
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
277
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
278
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
271
279
  * item 2 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
272
280
  * behaves like an Ably encrypter and decrypter
273
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
274
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
281
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
282
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
275
283
  * item 3 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
276
284
  * behaves like an Ably encrypter and decrypter
277
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
278
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
285
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
286
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
279
287
  * with AES-256-CBC using crypto-data-256.json fixtures
280
288
  * item 0 with encrypted encoding utf-8/cipher+aes-256-cbc/base64
281
289
  * behaves like an Ably encrypter and decrypter
282
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
283
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
290
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
291
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
284
292
  * item 1 with encrypted encoding cipher+aes-256-cbc/base64
285
293
  * behaves like an Ably encrypter and decrypter
286
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
287
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
294
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
295
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
288
296
  * item 2 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
289
297
  * behaves like an Ably encrypter and decrypter
290
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
291
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
298
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
299
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
292
300
  * item 3 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
293
301
  * behaves like an Ably encrypter and decrypter
294
- * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L65)
295
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L80)
302
+ * [encrypts message automatically when published](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L65)
303
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L80)
296
304
  * when publishing lots of messages
297
- * [encrypts on #publish and decrypts on #history](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L113)
305
+ * [encrypts on #publish and decrypts on #history](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L113)
298
306
  * when retrieving #history with a different protocol
299
- * [delivers a String ASCII-8BIT payload to the receiver](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L140)
300
- * [delivers a String UTF-8 payload to the receiver](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L140)
301
- * [delivers a Hash payload to the receiver](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L140)
307
+ * [delivers a String ASCII-8BIT payload to the receiver](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L140)
308
+ * [delivers a String UTF-8 payload to the receiver](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L140)
309
+ * [delivers a Hash payload to the receiver](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L140)
302
310
  * when publishing on an unencrypted channel and retrieving with #history on an encrypted channel
303
- * [does not attempt to decrypt the message](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L156)
311
+ * [does not attempt to decrypt the message](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L156)
304
312
  * when publishing on an encrypted channel and retrieving with #history on an unencrypted channel
305
- * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L177)
306
- * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L183)
313
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L177)
314
+ * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L183)
307
315
  * publishing on an encrypted channel and retrieving #history with a different algorithm on another client
308
- * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L204)
309
- * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L210)
316
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L204)
317
+ * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L210)
310
318
  * publishing on an encrypted channel and subscribing with a different key on another client
311
- * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L231)
312
- * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/message_spec.rb#L237)
319
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L231)
320
+ * [logs a Cipher exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/message_spec.rb#L237)
313
321
 
314
322
  ### Ably::Rest::Presence
315
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb))_
323
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb))_
316
324
  * using JSON and MsgPack protocol
317
325
  * tested against presence fixture data set up in test app
318
326
  * #get
319
- * [returns current members on the channel with their action set to :present](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L30)
327
+ * [returns current members on the channel with their action set to :present](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L41)
320
328
  * with :limit option
321
- * [returns a paged response limiting number of members per page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L44)
329
+ * [returns a paged response limiting number of members per page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L55)
322
330
  * #history
323
- * [returns recent presence activity](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L62)
331
+ * [returns recent presence activity](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L67)
324
332
  * with options
325
333
  * direction: :forwards
326
- * [returns recent presence activity forwards with most recent history last](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L78)
334
+ * [returns recent presence activity forwards with most recent history last](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L83)
327
335
  * direction: :backwards
328
- * [returns recent presence activity backwards with most recent history first](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L93)
336
+ * [returns recent presence activity backwards with most recent history first](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L98)
329
337
  * #history
330
338
  * with time range options
331
339
  * :start
332
340
  * with milliseconds since epoch value
333
- * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L138)
341
+ * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L150)
334
342
  * with Time object value
335
- * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L148)
343
+ * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L160)
336
344
  * :end
337
345
  * with milliseconds since epoch value
338
- * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L138)
346
+ * [uses this value in the history request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L150)
339
347
  * with Time object value
340
- * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L148)
348
+ * [converts the value to milliseconds since epoch in the hisotry request](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L160)
341
349
  * decoding
350
+ * with encoded fixture data
351
+ * #history
352
+ * [decodes encoded and encryped presence fixture data automatically](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L180)
353
+ * #get
354
+ * [decodes encoded and encryped presence fixture data automatically](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L187)
355
+ * decoding permutations using mocked #history
342
356
  * valid decodeable content
343
357
  * #get
344
- * [automaticaly decodes presence messages](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L206)
358
+ * [automaticaly decodes presence messages](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L243)
345
359
  * #history
346
- * [automaticaly decodes presence messages](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L223)
360
+ * [automaticaly decodes presence messages](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L260)
347
361
  * invalid data
348
362
  * #get
349
- * [returns the messages still encoded](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L254)
350
- * [logs a cipher error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L258)
363
+ * [returns the messages still encoded](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L291)
364
+ * [logs a cipher error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L295)
351
365
  * #history
352
- * [returns the messages still encoded](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L278)
353
- * [logs a cipher error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/presence_spec.rb#L282)
366
+ * [returns the messages still encoded](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L315)
367
+ * [logs a cipher error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/presence_spec.rb#L319)
354
368
 
355
369
  ### Ably::Rest::Client#stats
356
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb))_
370
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/stats_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb))_
357
371
  * using JSON and MsgPack protocol
358
372
  * fetching application stats
359
373
  * by minute
360
374
  * with :from set to last interval and :limit set to 1
361
- * [retrieves only one stat](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L50)
362
- * [returns all aggregated message data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L54)
363
- * [returns inbound realtime all data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L59)
364
- * [returns inbound realtime message data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L64)
365
- * [returns outbound realtime all data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L69)
366
- * [returns persisted presence all data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L74)
367
- * [returns connections all data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L79)
368
- * [returns channels all data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L84)
369
- * [returns api_requests data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L89)
370
- * [returns token_requests data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L94)
371
- * [returns stat objects with #interval_granularity equal to :minute](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L99)
372
- * [returns stat objects with #interval_id matching :start](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L103)
373
- * [returns stat objects with #interval_time matching :start Time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L107)
375
+ * [retrieves only one stat](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L50)
376
+ * [returns zero value for any missing metrics](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L54)
377
+ * [returns all aggregated message data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L59)
378
+ * [returns inbound realtime all data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L64)
379
+ * [returns inbound realtime message data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L69)
380
+ * [returns outbound realtime all data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L74)
381
+ * [returns persisted presence all data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L79)
382
+ * [returns connections all data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L84)
383
+ * [returns channels all data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L89)
384
+ * [returns api_requests data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L94)
385
+ * [returns token_requests data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L99)
386
+ * [returns stat objects with #interval_granularity equal to :minute](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L104)
387
+ * [returns stat objects with #interval_id matching :start](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L108)
388
+ * [returns stat objects with #interval_time matching :start Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L112)
374
389
  * with :start set to first interval, :limit set to 1 and direction :forwards
375
- * [returns the first interval stats as stats are provided forwards from :start](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L117)
376
- * [returns 3 pages of stats](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L121)
390
+ * [returns the first interval stats as stats are provided forwards from :start](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L122)
391
+ * [returns 3 pages of stats](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L126)
377
392
  * with :end set to last interval, :limit set to 1 and direction :backwards
378
- * [returns the 3rd interval stats first as stats are provided backwards from :end](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L134)
379
- * [returns 3 pages of stats](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L138)
393
+ * [returns the 3rd interval stats first as stats are provided backwards from :end](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L139)
394
+ * [returns 3 pages of stats](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L143)
380
395
  * by hour
381
- * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L162)
396
+ * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L167)
382
397
  * by day
383
- * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L162)
398
+ * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L167)
384
399
  * by month
385
- * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/stats_spec.rb#L162)
400
+ * [should aggregate the stats for that period](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/stats_spec.rb#L167)
386
401
 
387
402
  ### Ably::Rest::Client#time
388
- _(see [lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/time_spec.rb))_
403
+ _(see [lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/time_spec.rb))_
389
404
  * using JSON and MsgPack protocol
390
405
  * fetching the service time
391
- * [should return the service time as a Time object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/acceptance/rest/time_spec.rb#L10)
406
+ * [should return the service time as a Time object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/acceptance/rest/time_spec.rb#L10)
392
407
 
393
408
  ### Ably::Auth
394
- _(see [lib/submodules/ably-ruby/spec/unit/auth_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb))_
409
+ _(see [lib/submodules/ably-ruby/spec/unit/auth_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb))_
395
410
  * client_id option
396
411
  * with nil value
397
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L19)
412
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L19)
398
413
  * as UTF_8 string
399
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L27)
400
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L31)
414
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L27)
415
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L31)
401
416
  * as SHIFT_JIS string
402
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L39)
403
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L43)
417
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L39)
418
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L43)
404
419
  * as ASCII_8BIT string
405
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L51)
406
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L55)
420
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L51)
421
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L55)
407
422
  * as Integer
408
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/auth_spec.rb#L63)
423
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L63)
424
+ * defaults
425
+ * [should default TTL to 1 hour](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L73)
426
+ * [should default capability to all](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L77)
427
+ * [should only have defaults for :ttl and :capability](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/auth_spec.rb#L81)
409
428
 
410
429
  ### Ably::Logger
411
- _(see [lib/submodules/ably-ruby/spec/unit/logger_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/logger_spec.rb))_
412
- * [uses the language provided Logger by default](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/logger_spec.rb#L15)
430
+ _(see [lib/submodules/ably-ruby/spec/unit/logger_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/logger_spec.rb))_
431
+ * [uses the language provided Logger by default](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/logger_spec.rb#L15)
413
432
  * with a custom Logger
414
433
  * with an invalid interface
415
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/logger_spec.rb#L116)
434
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/logger_spec.rb#L116)
416
435
  * with a valid interface
417
- * [is used](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/logger_spec.rb#L135)
436
+ * [is used](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/logger_spec.rb#L135)
418
437
 
419
438
  ### Ably::Models::ErrorInfo
420
- _(see [lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/error_info_spec.rb))_
439
+ _(see [lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/error_info_spec.rb))_
421
440
  * behaves like a model
422
441
  * attributes
423
442
  * #code
424
- * [retrieves attribute :code](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
443
+ * [retrieves attribute :code](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
425
444
  * #status_code
426
- * [retrieves attribute :status_code](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
445
+ * [retrieves attribute :status_code](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
427
446
  * #message
428
- * [retrieves attribute :message](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
447
+ * [retrieves attribute :message](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
429
448
  * #==
430
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
431
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
432
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
449
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
450
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
451
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
433
452
  * is immutable
434
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
435
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
453
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
454
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
436
455
  * #status
437
- * [is an alias for #status_code](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/error_info_spec.rb#L13)
456
+ * [is an alias for #status_code](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/error_info_spec.rb#L13)
438
457
 
439
458
  ### Ably::Models::Message
440
- _(see [lib/submodules/ably-ruby/spec/unit/models/message_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb))_
459
+ _(see [lib/submodules/ably-ruby/spec/unit/models/message_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb))_
441
460
  * behaves like a model
442
461
  * attributes
443
462
  * #name
444
- * [retrieves attribute :name](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
463
+ * [retrieves attribute :name](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
445
464
  * #client_id
446
- * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
465
+ * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
447
466
  * #data
448
- * [retrieves attribute :data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
467
+ * [retrieves attribute :data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
449
468
  * #encoding
450
- * [retrieves attribute :encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
469
+ * [retrieves attribute :encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
451
470
  * #==
452
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
453
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
454
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
471
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
472
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
473
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
455
474
  * is immutable
456
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
457
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
475
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
476
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
458
477
  * #timestamp
459
- * [retrieves attribute :timestamp as Time object from ProtocolMessage](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L22)
478
+ * [retrieves attribute :timestamp as Time object from ProtocolMessage](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L22)
460
479
  * #connection_id attribute
461
480
  * when this model has a connectionId attribute
462
481
  * but no protocol message
463
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L37)
482
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L37)
464
483
  * with a protocol message with a different connectionId
465
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L45)
484
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L45)
466
485
  * when this model has no connectionId attribute
467
486
  * and no protocol message
468
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L55)
487
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L55)
469
488
  * with a protocol message with a connectionId
470
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L63)
489
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L63)
471
490
  * initialized with
472
491
  * :name
473
492
  * as UTF_8 string
474
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L90)
475
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L94)
493
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L90)
494
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L94)
476
495
  * as SHIFT_JIS string
477
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L102)
478
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L106)
496
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L102)
497
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L106)
479
498
  * as ASCII_8BIT string
480
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L114)
481
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L118)
499
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L114)
500
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L118)
482
501
  * as Integer
483
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L126)
502
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L126)
484
503
  * as Nil
485
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L134)
504
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L134)
486
505
  * :client_id
487
506
  * as UTF_8 string
488
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L90)
489
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L94)
507
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L90)
508
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L94)
490
509
  * as SHIFT_JIS string
491
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L102)
492
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L106)
510
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L102)
511
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L106)
493
512
  * as ASCII_8BIT string
494
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L114)
495
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L118)
513
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L114)
514
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L118)
496
515
  * as Integer
497
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L126)
516
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L126)
498
517
  * as Nil
499
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L134)
518
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L134)
500
519
  * :encoding
501
520
  * as UTF_8 string
502
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L90)
503
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L94)
521
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L90)
522
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L94)
504
523
  * as SHIFT_JIS string
505
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L102)
506
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L106)
524
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L102)
525
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L106)
507
526
  * as ASCII_8BIT string
508
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L114)
509
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L118)
527
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L114)
528
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L118)
510
529
  * as Integer
511
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L126)
530
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L126)
512
531
  * as Nil
513
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/message_spec.rb#L134)
532
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/message_spec.rb#L134)
514
533
 
515
534
  ### Ably::Models::PaginatedResource
516
- _(see [lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb))_
517
- * [returns correct length from body](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L30)
518
- * [supports alias methods for length](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L34)
519
- * [is Enumerable](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L39)
520
- * [is iterable](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L43)
521
- * [provides [] accessor method](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L61)
522
- * [#first gets the first item in page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L67)
523
- * [#last gets the last item in page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L71)
524
- * #each
525
- * [returns an enumerator](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L48)
526
- * [yields each item](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L52)
535
+ _(see [lib/submodules/ably-ruby/spec/unit/models/paginated_resource_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb))_
536
+ * #items
537
+ * [returns correct length from body](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L31)
538
+ * [is Enumerable](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L35)
539
+ * [is iterable](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L39)
540
+ * [provides [] accessor method](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L57)
541
+ * [#first gets the first item in page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L63)
542
+ * [#last gets the last item in page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L67)
543
+ * #each
544
+ * [returns an enumerator](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L44)
545
+ * [yields each item](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L48)
527
546
  * with non paged http response
528
- * [is the first page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L175)
529
- * [is the last page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L179)
530
- * [does not support pagination](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L183)
531
- * [raises an exception when accessing next page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L187)
532
- * [raises an exception when accessing first page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L191)
547
+ * [is the first page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L172)
548
+ * [is the last page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L176)
549
+ * [does not have next page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L180)
550
+ * [does not support pagination](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L184)
551
+ * [returns nil when accessing next page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L188)
552
+ * [returns nil when accessing first page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L192)
533
553
  * with paged http response
534
- * [is the first page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L209)
535
- * [is not the last page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L213)
536
- * [supports pagination](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L217)
554
+ * [is the first page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L210)
555
+ * [has next page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L214)
556
+ * [is not the last page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L218)
557
+ * [supports pagination](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L222)
537
558
  * accessing next page
538
- * [returns another PaginatedResource](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L245)
539
- * [retrieves the next page of results](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L249)
540
- * [is not the first page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L254)
541
- * [is the last page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L258)
542
- * [raises an exception if trying to access the last page when it is the last page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L262)
559
+ * [returns another PaginatedResource](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L250)
560
+ * [retrieves the next page of results](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L254)
561
+ * [is not the first page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L259)
562
+ * [does not have a next page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L263)
563
+ * [is the last page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L267)
564
+ * [returns nil when trying to access the last page when it is the last page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L271)
543
565
  * and then first page
544
- * [returns a PaginatedResource](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L273)
545
- * [retrieves the first page of results](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L277)
546
- * [is the first page](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/paginated_resource_spec.rb#L281)
566
+ * [returns a PaginatedResource](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L282)
567
+ * [retrieves the first page of results](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L286)
568
+ * [is the first page](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/paginated_resource_spec.rb#L290)
547
569
 
548
570
  ### Ably::Models::PresenceMessage
549
- _(see [lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb))_
571
+ _(see [lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb))_
550
572
  * behaves like a model
551
573
  * attributes
552
574
  * #client_id
553
- * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
575
+ * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
554
576
  * #data
555
- * [retrieves attribute :data](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
577
+ * [retrieves attribute :data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
556
578
  * #encoding
557
- * [retrieves attribute :encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
579
+ * [retrieves attribute :encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
558
580
  * #==
559
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
560
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
561
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
581
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
582
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
583
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
562
584
  * is immutable
563
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
564
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
585
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
586
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
565
587
  * #connection_id attribute
566
588
  * when this model has a connectionId attribute
567
589
  * but no protocol message
568
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L25)
590
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L25)
569
591
  * with a protocol message with a different connectionId
570
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L33)
592
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L33)
571
593
  * when this model has no connectionId attribute
572
594
  * and no protocol message
573
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L43)
595
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L43)
574
596
  * with a protocol message with a connectionId
575
- * [uses the model value](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L51)
597
+ * [uses the model value](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L51)
576
598
  * #member_key attribute
577
- * [is string in format connection_id:client_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L61)
599
+ * [is string in format connection_id:client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L61)
578
600
  * with the same client id across multiple connections
579
- * [is unique](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L69)
601
+ * [is unique](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L69)
580
602
  * with a single connection and different client_ids
581
- * [is unique](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L78)
603
+ * [is unique](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L78)
582
604
  * #timestamp
583
- * [retrieves attribute :timestamp as a Time object from ProtocolMessage](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L86)
605
+ * [retrieves attribute :timestamp as a Time object from ProtocolMessage](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L86)
584
606
  * initialized with
585
607
  * :client_id
586
608
  * as UTF_8 string
587
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L138)
588
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L142)
609
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L138)
610
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L142)
589
611
  * as SHIFT_JIS string
590
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L150)
591
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L154)
612
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L150)
613
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L154)
592
614
  * as ASCII_8BIT string
593
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L162)
594
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L166)
615
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L162)
616
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L166)
595
617
  * as Integer
596
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L174)
618
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L174)
597
619
  * as Nil
598
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L182)
620
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L182)
599
621
  * :connection_id
600
622
  * as UTF_8 string
601
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L138)
602
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L142)
623
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L138)
624
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L142)
603
625
  * as SHIFT_JIS string
604
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L150)
605
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L154)
626
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L150)
627
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L154)
606
628
  * as ASCII_8BIT string
607
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L162)
608
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L166)
629
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L162)
630
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L166)
609
631
  * as Integer
610
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L174)
632
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L174)
611
633
  * as Nil
612
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L182)
634
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L182)
613
635
  * :encoding
614
636
  * as UTF_8 string
615
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L138)
616
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L142)
637
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L138)
638
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L142)
617
639
  * as SHIFT_JIS string
618
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L150)
619
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L154)
640
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L150)
641
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L154)
620
642
  * as ASCII_8BIT string
621
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L162)
622
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L166)
643
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L162)
644
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L166)
623
645
  * as Integer
624
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L174)
646
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L174)
625
647
  * as Nil
626
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/presence_message_spec.rb#L182)
648
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/presence_message_spec.rb#L182)
627
649
 
628
650
  ### Ably::Models::ProtocolMessage
629
- _(see [lib/submodules/ably-ruby/spec/unit/models/protocol_message_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb))_
651
+ _(see [lib/submodules/ably-ruby/spec/unit/models/protocol_message_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb))_
630
652
  * behaves like a model
631
653
  * attributes
632
654
  * #id
633
- * [retrieves attribute :id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
655
+ * [retrieves attribute :id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
634
656
  * #channel
635
- * [retrieves attribute :channel](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
657
+ * [retrieves attribute :channel](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
636
658
  * #channel_serial
637
- * [retrieves attribute :channel_serial](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
659
+ * [retrieves attribute :channel_serial](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
638
660
  * #connection_id
639
- * [retrieves attribute :connection_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
661
+ * [retrieves attribute :connection_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
640
662
  * #==
641
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
642
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
643
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
663
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
664
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
665
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
644
666
  * is immutable
645
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
646
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
667
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
668
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
647
669
  * attributes
648
670
  * #timestamp
649
- * [retrieves attribute :timestamp as Time object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L74)
671
+ * [retrieves attribute :timestamp as Time object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L74)
650
672
  * #count
651
673
  * when missing
652
- * [is 1](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L83)
674
+ * [is 1](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L83)
653
675
  * when non numeric
654
- * [is 1](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L90)
676
+ * [is 1](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L90)
655
677
  * when greater than 1
656
- * [is the value of count](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L97)
678
+ * [is the value of count](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L97)
657
679
  * #message_serial
658
- * [converts :msg_serial to an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L105)
680
+ * [converts :msg_serial to an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L105)
659
681
  * #has_message_serial?
660
682
  * without msg_serial
661
- * [returns false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L115)
683
+ * [returns false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L115)
662
684
  * with msg_serial
663
- * [returns true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L123)
685
+ * [returns true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L123)
664
686
  * #connection_serial
665
- * [converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L131)
687
+ * [converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L131)
666
688
  * #flags
667
689
  * when nil
668
- * [is zero](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L141)
690
+ * [is zero](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L141)
669
691
  * when numeric
670
- * [is an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L149)
692
+ * [is an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L149)
671
693
  * when has_presence
672
- * [#has_presence_flag? is true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L157)
694
+ * [#has_presence_flag? is true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L157)
673
695
  * when has another future flag
674
- * [#has_presence_flag? is false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L165)
696
+ * [#has_presence_flag? is false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L165)
675
697
  * #has_connection_serial?
676
698
  * without connection_serial
677
- * [returns false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L175)
699
+ * [returns false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L175)
678
700
  * with connection_serial
679
- * [returns true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L183)
701
+ * [returns true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L183)
680
702
  * #serial
681
703
  * with underlying msg_serial
682
- * [converts :msg_serial to an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L192)
704
+ * [converts :msg_serial to an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L192)
683
705
  * with underlying connection_serial
684
- * [converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L200)
706
+ * [converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L200)
685
707
  * with underlying connection_serial and msg_serial
686
- * [prefers connection_serial and converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L208)
708
+ * [prefers connection_serial and converts :connection_serial to an Integer](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L208)
687
709
  * #has_serial?
688
710
  * without msg_serial or connection_serial
689
- * [returns false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L219)
711
+ * [returns false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L219)
690
712
  * with msg_serial
691
- * [returns true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L227)
713
+ * [returns true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L227)
692
714
  * with connection_serial
693
- * [returns true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L235)
715
+ * [returns true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L235)
694
716
  * #error
695
717
  * with no error attribute
696
- * [returns nil](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L245)
718
+ * [returns nil](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L245)
697
719
  * with nil error
698
- * [returns nil](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L253)
720
+ * [returns nil](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L253)
699
721
  * with error
700
- * [returns a valid ErrorInfo object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/protocol_message_spec.rb#L261)
722
+ * [returns a valid ErrorInfo object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/protocol_message_spec.rb#L261)
701
723
 
702
- ### Ably::Models::Stat
703
- _(see [lib/submodules/ably-ruby/spec/unit/models/stat_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb))_
704
- * behaves like a model
705
- * attributes
706
- * #interval_id
707
- * [retrieves attribute :interval_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
708
- * #all
709
- * [retrieves attribute :all](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
710
- * #inbound
711
- * [retrieves attribute :inbound](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
712
- * #outbound
713
- * [retrieves attribute :outbound](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
714
- * #persisted
715
- * [retrieves attribute :persisted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
716
- * #connections
717
- * [retrieves attribute :connections](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
718
- * #channels
719
- * [retrieves attribute :channels](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
720
- * #api_requests
721
- * [retrieves attribute :api_requests](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
722
- * #token_requests
723
- * [retrieves attribute :token_requests](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
724
- * #==
725
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
726
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
727
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
728
- * is immutable
729
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
730
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
724
+ ### Ably::Models::Stats
725
+ _(see [lib/submodules/ably-ruby/spec/unit/models/stats_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb))_
726
+ * #all stats
727
+ * [returns a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L17)
728
+ * [returns value for message counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L21)
729
+ * [returns value for all data transferred](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L25)
730
+ * [returns zero for empty values](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L29)
731
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L33)
732
+ * #all
733
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
734
+ * #presence
735
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
736
+ * #messages
737
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
738
+ * #persisted stats
739
+ * [returns a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L17)
740
+ * [returns value for message counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L21)
741
+ * [returns value for all data transferred](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L25)
742
+ * [returns zero for empty values](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L29)
743
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L33)
744
+ * #all
745
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
746
+ * #presence
747
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
748
+ * #messages
749
+ * [is a MessageCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L39)
750
+ * #inbound stats
751
+ * [returns a MessageTraffic object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L59)
752
+ * [returns value for realtime message counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L63)
753
+ * [returns value for all presence data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L67)
754
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L71)
755
+ * #realtime
756
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
757
+ * #rest
758
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
759
+ * #webhook
760
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
761
+ * #all
762
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
763
+ * #outbound stats
764
+ * [returns a MessageTraffic object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L59)
765
+ * [returns value for realtime message counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L63)
766
+ * [returns value for all presence data](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L67)
767
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L71)
768
+ * #realtime
769
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
770
+ * #rest
771
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
772
+ * #webhook
773
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
774
+ * #all
775
+ * [is a MessageTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L77)
776
+ * #connections stats
777
+ * [returns a ConnectionTypes object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L91)
778
+ * [returns value for tls opened counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L95)
779
+ * [returns value for all peak connections](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L99)
780
+ * [returns zero for empty values](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L103)
781
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L107)
782
+ * #tls
783
+ * [is a ResourceCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L113)
784
+ * #plain
785
+ * [is a ResourceCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L113)
786
+ * #all
787
+ * [is a ResourceCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L113)
788
+ * #channels stats
789
+ * [returns a ResourceCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L126)
790
+ * [returns value for opened counts](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L130)
791
+ * [returns value for peak channels](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L134)
792
+ * [returns zero for empty values](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L138)
793
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L142)
794
+ * #opened
795
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L148)
796
+ * #peak
797
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L148)
798
+ * #mean
799
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L148)
800
+ * #min
801
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L148)
802
+ * #refused
803
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L148)
804
+ * #api_requests stats
805
+ * [returns a RequestCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L164)
806
+ * [returns value for succeeded](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L168)
807
+ * [returns value for failed](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L172)
808
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L176)
809
+ * #succeeded
810
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
811
+ * #failed
812
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
813
+ * #refused
814
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
815
+ * #token_requests stats
816
+ * [returns a RequestCount object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L164)
817
+ * [returns value for succeeded](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L168)
818
+ * [returns value for failed](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L172)
819
+ * [raises an exception for unknown attributes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L176)
820
+ * #succeeded
821
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
822
+ * #failed
823
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
824
+ * #refused
825
+ * [is a Integer object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L182)
731
826
  * #interval_granularity
732
- * [returns the granularity of the interval_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L17)
827
+ * [returns the granularity of the interval_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L193)
733
828
  * #interval_time
734
- * [returns a Time object representing the start of the interval](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L25)
829
+ * [returns a Time object representing the start of the interval](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L201)
735
830
  * class methods
736
831
  * #to_interval_id
737
832
  * when time zone of time argument is UTC
738
- * [converts time 2014-02-03:05:06 with granularity :month into 2014-02](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L33)
739
- * [converts time 2014-02-03:05:06 with granularity :day into 2014-02-03](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L37)
740
- * [converts time 2014-02-03:05:06 with granularity :hour into 2014-02-03:05](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L41)
741
- * [converts time 2014-02-03:05:06 with granularity :minute into 2014-02-03:05:06](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L45)
742
- * [fails with invalid granularity](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L49)
743
- * [fails with invalid time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L53)
833
+ * [converts time 2014-02-03:05:06 with granularity :month into 2014-02](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L209)
834
+ * [converts time 2014-02-03:05:06 with granularity :day into 2014-02-03](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L213)
835
+ * [converts time 2014-02-03:05:06 with granularity :hour into 2014-02-03:05](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L217)
836
+ * [converts time 2014-02-03:05:06 with granularity :minute into 2014-02-03:05:06](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L221)
837
+ * [fails with invalid granularity](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L225)
838
+ * [fails with invalid time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L229)
744
839
  * when time zone of time argument is +02:00
745
- * [converts time 2014-02-03:06 with granularity :hour into 2014-02-03:04 at UTC +00:00](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L59)
840
+ * [converts time 2014-02-03:06 with granularity :hour into 2014-02-03:04 at UTC +00:00](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L235)
746
841
  * #from_interval_id
747
- * [converts a month interval_id 2014-02 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L66)
748
- * [converts a day interval_id 2014-02-03 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L71)
749
- * [converts an hour interval_id 2014-02-03:05 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L76)
750
- * [converts a minute interval_id 2014-02-03:05:06 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L81)
751
- * [fails with an invalid interval_id 14-20](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L86)
842
+ * [converts a month interval_id 2014-02 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L242)
843
+ * [converts a day interval_id 2014-02-03 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L247)
844
+ * [converts an hour interval_id 2014-02-03:05 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L252)
845
+ * [converts a minute interval_id 2014-02-03:05:06 into a Time object in UTC 0](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L257)
846
+ * [fails with an invalid interval_id 14-20](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L262)
752
847
  * #granularity_from_interval_id
753
- * [returns a :month interval_id for 2014-02](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L92)
754
- * [returns a :day interval_id for 2014-02-03](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L96)
755
- * [returns a :hour interval_id for 2014-02-03:05](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L100)
756
- * [returns a :minute interval_id for 2014-02-03:05:06](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L104)
757
- * [fails with an invalid interval_id 14-20](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/stat_spec.rb#L108)
848
+ * [returns a :month interval_id for 2014-02](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L268)
849
+ * [returns a :day interval_id for 2014-02-03](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L272)
850
+ * [returns a :hour interval_id for 2014-02-03:05](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L276)
851
+ * [returns a :minute interval_id for 2014-02-03:05:06](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L280)
852
+ * [fails with an invalid interval_id 14-20](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/stats_spec.rb#L284)
758
853
 
759
- ### Ably::Models::Token
760
- _(see [lib/submodules/ably-ruby/spec/unit/models/token_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb))_
854
+ ### Ably::Models::TokenDetails
855
+ _(see [lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb))_
761
856
  * behaves like a model
762
857
  * attributes
763
- * #id
764
- * [retrieves attribute :id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
765
- * #capability
766
- * [retrieves attribute :capability](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
858
+ * #token
859
+ * [retrieves attribute :token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
860
+ * #key_name
861
+ * [retrieves attribute :key_name](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
767
862
  * #client_id
768
- * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
769
- * #nonce
770
- * [retrieves attribute :nonce](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L15)
863
+ * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
771
864
  * #==
772
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L41)
773
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L46)
774
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L50)
865
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
866
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
867
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
775
868
  * is immutable
776
- * [prevents changes](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L76)
777
- * [dups options](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/model_behaviour.rb#L80)
778
- * defaults
779
- * [should default TTL to 1 hour](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L14)
780
- * [should default capability to all](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L18)
781
- * [should only have defaults for :ttl and :capability](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L22)
869
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
870
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
782
871
  * attributes
783
- * #key_id
784
- * [retrieves attribute :key](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L32)
785
- * #issued_at
786
- * [retrieves attribute :issued_at as Time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L42)
787
- * #expires_at
788
- * [retrieves attribute :expires as Time](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L42)
872
+ * #capability
873
+ * [retrieves attribute :capability as parsed JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L21)
874
+ * #issued with :issued option as milliseconds in constructor
875
+ * [retrieves attribute :issued as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L31)
876
+ * #issued with :issued option as a Time in constructor
877
+ * [retrieves attribute :issued as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L40)
878
+ * #issued when converted to JSON
879
+ * [is in milliseconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L49)
880
+ * #expires with :expires option as milliseconds in constructor
881
+ * [retrieves attribute :expires as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L31)
882
+ * #expires with :expires option as a Time in constructor
883
+ * [retrieves attribute :expires as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L40)
884
+ * #expires when converted to JSON
885
+ * [is in milliseconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L49)
789
886
  * #expired?
790
887
  * once grace period buffer has passed
791
- * [is true](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L55)
888
+ * [is true](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L61)
792
889
  * within grace period buffer
793
- * [is false](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L63)
890
+ * [is false](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L69)
794
891
  * ==
795
- * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L73)
796
- * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L78)
797
- * [is false when class type differs](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/models/token_spec.rb#L82)
892
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L79)
893
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L84)
894
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_details_spec.rb#L88)
798
895
 
799
- ### Ably::Rest::Channels
800
- _(see [lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb))_
896
+ ### Ably::Models::TokenRequest
897
+ _(see [lib/submodules/ably-ruby/spec/unit/models/token_request_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb))_
898
+ * behaves like a model
899
+ * attributes
900
+ * #key_name
901
+ * [retrieves attribute :key_name](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
902
+ * #client_id
903
+ * [retrieves attribute :client_id](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
904
+ * #nonce
905
+ * [retrieves attribute :nonce](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
906
+ * #mac
907
+ * [retrieves attribute :mac](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L15)
908
+ * #==
909
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L41)
910
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L46)
911
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L50)
912
+ * is immutable
913
+ * [prevents changes](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L76)
914
+ * [dups options](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/model_behaviour.rb#L80)
915
+ * attributes
916
+ * #capability
917
+ * [retrieves attribute :capability as parsed JSON](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L18)
918
+ * #timestamp
919
+ * with :timestamp option as milliseconds in constructor
920
+ * [retrieves attribute :timestamp as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L29)
921
+ * with :timestamp option as Time in constructor
922
+ * [retrieves attribute :timestamp as Time](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L38)
923
+ * when converted to JSON
924
+ * [is in milliseconds since epoch](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L47)
925
+ * #ttl
926
+ * with :ttl option as milliseconds in constructor
927
+ * [retrieves attribute :ttl as seconds](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L59)
928
+ * when converted to JSON
929
+ * [is in milliseconds since epoch](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L68)
930
+ * ==
931
+ * [is true when attributes are the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L78)
932
+ * [is false when attributes are not the same](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L83)
933
+ * [is false when class type differs](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/models/token_request_spec.rb#L87)
934
+
935
+ ### Ably::Rest::Channel
936
+ _(see [lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb))_
801
937
  * #initializer
802
938
  * as UTF_8 string
803
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L16)
804
- * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L20)
939
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L16)
940
+ * [remains as UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L20)
805
941
  * as SHIFT_JIS string
806
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L28)
807
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L32)
942
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L28)
943
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L32)
808
944
  * as ASCII_8BIT string
809
- * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L40)
810
- * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L44)
945
+ * [gets converted to UTF-8](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L40)
946
+ * [is compatible with original encoding](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L44)
811
947
  * as Integer
812
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L52)
948
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L52)
813
949
  * as Nil
814
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L60)
950
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L60)
815
951
  * #publish name argument
816
952
  * as UTF_8 string
817
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L72)
953
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L72)
818
954
  * as SHIFT_JIS string
819
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L80)
955
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L80)
820
956
  * as ASCII_8BIT string
821
- * [is permitted](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L88)
957
+ * [is permitted](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L88)
822
958
  * as Integer
823
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L96)
959
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L96)
824
960
  * as Nil
825
- * [raises an argument error](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channel_spec.rb#L104)
961
+ * [raises an argument error](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channel_spec.rb#L104)
826
962
 
827
963
  ### Ably::Rest::Channels
828
- _(see [lib/submodules/ably-ruby/spec/unit/rest/channels_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb))_
964
+ _(see [lib/submodules/ably-ruby/spec/unit/rest/channels_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb))_
829
965
  * creating channels
830
- * [#get creates a channel](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L12)
831
- * [#get will reuse the channel object](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L17)
832
- * [[] creates a channel](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L23)
966
+ * [#get creates a channel](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L12)
967
+ * [#get will reuse the channel object](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L17)
968
+ * [[] creates a channel](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L23)
833
969
  * #fetch
834
- * [retrieves a channel if it exists](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L30)
835
- * [calls the block if channel is missing](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L35)
970
+ * [retrieves a channel if it exists](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L30)
971
+ * [calls the block if channel is missing](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L35)
836
972
  * destroying channels
837
- * [#release releases the channel resoures](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L43)
973
+ * [#release releases the channel resoures](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L43)
838
974
  * is Enumerable
839
- * [allows enumeration](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L59)
840
- * [provides #length](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L75)
975
+ * [allows enumeration](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L59)
976
+ * [provides #length](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L75)
841
977
  * #each
842
- * [returns an enumerator](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L64)
843
- * [yields each channel](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/channels_spec.rb#L68)
978
+ * [returns an enumerator](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L64)
979
+ * [yields each channel](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/channels_spec.rb#L68)
844
980
 
845
981
  ### Ably::Rest::Client
846
- _(see [lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/client_spec.rb))_
982
+ _(see [lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/client_spec.rb))_
847
983
  * behaves like a client initializer
848
984
  * with invalid arguments
849
985
  * empty hash
850
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L28)
986
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L28)
851
987
  * nil
852
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L36)
853
- * api_key: "invalid"
854
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L44)
855
- * api_key: "invalid:asdad"
856
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L52)
857
- * api_key and key_id
858
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L60)
859
- * api_key and key_secret
860
- * [raises an exception](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L68)
988
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L36)
989
+ * key: "invalid"
990
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L44)
991
+ * key: "invalid:asdad"
992
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L52)
993
+ * key and key_name
994
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L60)
995
+ * key and key_secret
996
+ * [raises an exception](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L68)
861
997
  * client_id as only option
862
- * [requires a valid key](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L76)
998
+ * [requires a valid key](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L76)
863
999
  * with valid arguments
864
- * api_key only
865
- * [connects to the Ably service](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L87)
866
- * key_id and key_secret
867
- * [constructs an api_key](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L95)
1000
+ * key only
1001
+ * [connects to the Ably service](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L87)
868
1002
  * with a string key instead of options hash
869
- * [sets the api_key](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L103)
870
- * [sets the key_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L107)
871
- * [sets the key_secret](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L111)
1003
+ * [sets the key](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L103)
1004
+ * [sets the key_name](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L107)
1005
+ * [sets the key_secret](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L111)
872
1006
  * with a string token key instead of options hash
873
- * [sets the token_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L119)
1007
+ * [sets the token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L119)
874
1008
  * with token
875
- * [sets the token_id](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L127)
1009
+ * [sets the token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L127)
1010
+ * with token_details
1011
+ * [sets the token](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L135)
876
1012
  * endpoint
877
- * [defaults to production](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L133)
1013
+ * [defaults to production](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L141)
878
1014
  * with environment option
879
- * [uses an alternate endpoint](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L140)
1015
+ * [uses an alternate endpoint](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L148)
880
1016
  * tls
881
- * [defaults to TLS](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L159)
1017
+ * [defaults to TLS](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L167)
882
1018
  * set to false
883
- * [uses plain text](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L150)
884
- * [uses HTTP](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L154)
1019
+ * [uses plain text](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L158)
1020
+ * [uses HTTP](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L162)
885
1021
  * logger
886
1022
  * default
887
- * [uses Ruby Logger](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L166)
888
- * [specifies Logger::ERROR log level](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L170)
1023
+ * [uses Ruby Logger](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L174)
1024
+ * [specifies Logger::ERROR log level](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L178)
889
1025
  * with log_level :none
890
- * [silences all logging with a NilLogger](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L178)
1026
+ * [silences all logging with a NilLogger](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L186)
891
1027
  * with custom logger and log_level
892
- * [uses the custom logger](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L196)
893
- * [sets the custom log level](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L200)
1028
+ * [uses the custom logger](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L204)
1029
+ * [sets the custom log level](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L208)
894
1030
  * delegators
895
- * [delegates :client_id to .auth](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L210)
896
- * [delegates :auth_options to .auth](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/shared/client_initializer_behaviour.rb#L215)
1031
+ * [delegates :client_id to .auth](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L218)
1032
+ * [delegates :auth_options to .auth](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/shared/client_initializer_behaviour.rb#L223)
897
1033
  * initializer options
898
1034
  * TLS
899
1035
  * disabled
900
- * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/client_spec.rb#L17)
1036
+ * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/client_spec.rb#L17)
901
1037
  * :use_token_auth
902
1038
  * set to false
903
- * with an api_key with :tls => false
904
- * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/client_spec.rb#L28)
905
- * without an api_key
906
- * [fails as an api_key is required if not using token auth](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/client_spec.rb#L36)
1039
+ * with an key with :tls => false
1040
+ * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/client_spec.rb#L28)
1041
+ * without an key
1042
+ * [fails as an key is required if not using token auth](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/client_spec.rb#L36)
907
1043
  * set to true
908
- * without an api_key or token_id
909
- * [fails as an api_key is required to issue tokens](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/client_spec.rb#L46)
1044
+ * without an key or token
1045
+ * [fails as an key is required to issue tokens](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/client_spec.rb#L46)
910
1046
 
911
1047
  ### Ably::Rest
912
- _(see [lib/submodules/ably-ruby/spec/unit/rest/rest_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/rest_spec.rb))_
913
- * [constructor returns an Ably::Rest::Client](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/rest/rest_spec.rb#L7)
1048
+ _(see [lib/submodules/ably-ruby/spec/unit/rest/rest_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/rest_spec.rb))_
1049
+ * [constructor returns an Ably::Rest::Client](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/rest/rest_spec.rb#L7)
914
1050
 
915
1051
  ### Ably::Util::Crypto
916
- _(see [lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb))_
1052
+ _(see [lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb))_
917
1053
  * defaults
918
- * [match other client libraries](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L18)
1054
+ * [match other client libraries](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L18)
919
1055
  * encrypts & decrypt
920
- * [#encrypt encrypts a string](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L28)
921
- * [#decrypt decrypts a string](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L33)
1056
+ * [#encrypt encrypts a string](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L28)
1057
+ * [#decrypt decrypts a string](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L33)
922
1058
  * encrypting an empty string
923
- * [raises an ArgumentError](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L42)
1059
+ * [raises an ArgumentError](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L42)
924
1060
  * using shared client lib fixture data
925
1061
  * with AES-128-CBC
926
1062
  * behaves like an Ably encrypter and decrypter
927
1063
  * text payload
928
- * [encrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L65)
929
- * [decrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L69)
1064
+ * [encrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L65)
1065
+ * [decrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L69)
930
1066
  * with AES-256-CBC
931
1067
  * behaves like an Ably encrypter and decrypter
932
1068
  * text payload
933
- * [encrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L65)
934
- * [decrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/da0271f013cdb065e3bd4a68e4753d8435c28457/spec/unit/util/crypto_spec.rb#L69)
1069
+ * [encrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L65)
1070
+ * [decrypts exactly the same binary data as other client libraries](https://github.com/ably/ably-ruby/tree/c18ace85cb292a991d41de5770eaad23d60b4c69/spec/unit/util/crypto_spec.rb#L69)
935
1071
 
936
1072
  -------
937
1073
 
938
1074
  ## Test summary
939
1075
 
940
- * Passing tests: 448
1076
+ * Passing tests: 528
941
1077
  * Pending tests: 0
942
1078
  * Failing tests: 0