SPEC.md in ably-0.7.0 vs SPEC.md in ably-0.7.1
- old
+ new
@@ -1,6 +1,6 @@
-# Ably Client Library 0.7.0 Specification
+# Ably Real-time & REST Client Library 0.7.1 Specification
### Ably::Realtime::Channel#history
_(see [spec/acceptance/realtime/channel_history_spec.rb](./spec/acceptance/realtime/channel_history_spec.rb))_
* using JSON and MsgPack protocol
* [returns a Deferrable](./spec/acceptance/realtime/channel_history_spec.rb#L20)
@@ -8,17 +8,17 @@
* [retrieves real-time history](./spec/acceptance/realtime/channel_history_spec.rb#L33)
* with two clients publishing messages on the same channel
* [retrieves real-time history on both channels](./spec/acceptance/realtime/channel_history_spec.rb#L45)
* with lots of messages published with a single client and channel
* as one ProtocolMessage
- * [retrieves history forwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L86)
- * [retrieves history backwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L95)
+ * [retrieves history forwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L87)
+ * [retrieves history backwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L96)
* in multiple ProtocolMessages
- * [retrieves limited history forwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L106)
- * [retrieves limited history backwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L117)
+ * [retrieves limited history forwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L107)
+ * [retrieves limited history backwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L118)
* and REST history
- * [return the same results with unique matching message IDs](./spec/acceptance/realtime/channel_history_spec.rb#L133)
+ * [return the same results with unique matching message IDs](./spec/acceptance/realtime/channel_history_spec.rb#L134)
### Ably::Realtime::Channel
_(see [spec/acceptance/realtime/channel_spec.rb](./spec/acceptance/realtime/channel_spec.rb))_
* using JSON and MsgPack protocol
* initialization
@@ -167,18 +167,25 @@
* after successfully reconnecting and resuming
* [retains connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L326)
* [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L343)
* when messages were published whilst the client was disconnected
* [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L363)
+ * when failing to resume because the connection_key is not or no longer valid
+ * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L403)
+ * [detaches all channels](./spec/acceptance/realtime/connection_failures_spec.rb#L418)
+ * [emits an error on the channel and sets the error reason](./spec/acceptance/realtime/connection_failures_spec.rb#L436)
* fallback host feature
* with custom realtime websocket host option
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L419)
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L472)
* with non-production environment
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L436)
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L489)
* with production environment
- * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L459)
- * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L478)
+ * when the Internet is down
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L517)
+ * when the Internet is up
+ * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L534)
+ * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L553)
### Ably::Realtime::Connection
_(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/connection_spec.rb))_
* using JSON and MsgPack protocol
* intialization
@@ -200,77 +207,88 @@
* with immediately expiring token
* [renews the token on connect, and only makes one subsequent attempt to obtain a new token](./spec/acceptance/realtime/connection_spec.rb#L107)
* [uses the primary host for subsequent connection and auth requests](./spec/acceptance/realtime/connection_spec.rb#L117)
* when connected with a valid non-expired token
* that then expires following the connection being opened
- * PENDING: *[retains connection state](./spec/acceptance/realtime/connection_spec.rb#L162)*
- * PENDING: *[changes state to failed if a new token cannot be issued](./spec/acceptance/realtime/connection_spec.rb#L163)*
+ * PENDING: *[retains connection state](./spec/acceptance/realtime/connection_spec.rb#L164)*
+ * PENDING: *[changes state to failed if a new token cannot be issued](./spec/acceptance/realtime/connection_spec.rb#L165)*
* the server
* [disconnects the client, and the client automatically renews the token and then reconnects](./spec/acceptance/realtime/connection_spec.rb#L141)
* for non-renewable tokens
* that are expired
* opening a new connection
- * [transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L178)
+ * [transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L180)
* when connected
- * PENDING: *[transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L191)*
+ * PENDING: *[transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L193)*
* initialization state changes
* with implicit #connect
- * [are triggered in order](./spec/acceptance/realtime/connection_spec.rb#L219)
+ * [are triggered in order](./spec/acceptance/realtime/connection_spec.rb#L221)
* with explicit #connect
- * [are triggered in order](./spec/acceptance/realtime/connection_spec.rb#L225)
+ * [are triggered in order](./spec/acceptance/realtime/connection_spec.rb#L227)
* #connect
- * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L233)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L238)
+ * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L235)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L240)
* when already connected
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L247)
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L249)
* once connected
* connection#id
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L264)
- * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L271)
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L278)
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L266)
+ * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L273)
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L280)
* connection#key
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L287)
- * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L294)
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L301)
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L289)
+ * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L296)
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L303)
* following a previous connection being opened and closed
- * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L311)
+ * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L313)
* #close
- * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L329)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L336)
+ * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L331)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L338)
* when already closed
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L347)
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L349)
* when connection state is
* :initialized
- * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L375)
+ * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L377)
* :connected
- * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L393)
+ * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L395)
* with an unresponsive connection
- * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L423)
+ * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L425)
* #ping
- * [echoes a heart beat](./spec/acceptance/realtime/connection_spec.rb#L446)
+ * [echoes a heart beat](./spec/acceptance/realtime/connection_spec.rb#L448)
* when not connected
- * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L456)
+ * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L458)
* recovery
* #recovery_key
- * [is composed of connection id and serial that is kept up to date with each message sent](./spec/acceptance/realtime/connection_spec.rb#L489)
- * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L510)
- * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L534)
+ * [is composed of connection id and serial that is kept up to date with each message sent](./spec/acceptance/realtime/connection_spec.rb#L491)
+ * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L512)
+ * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L536)
* opening a new connection using a recently disconnected connection's #recovery_key
* connection#id and connection#key after recovery
- * [remain the same](./spec/acceptance/realtime/connection_spec.rb#L548)
+ * [remain the same](./spec/acceptance/realtime/connection_spec.rb#L550)
* when messages have been sent whilst the old connection is disconnected
* the new connection
- * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L573)
+ * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L575)
* with :recover option
* with invalid syntax
- * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L598)
- * with invalid value
- * PENDING: *[triggers an error on the connection object, sets the #error_reason and connects anyway](./spec/acceptance/realtime/connection_spec.rb#L607)*
+ * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L600)
+ * with invalid formatted value sent to server
+ * [triggers a fatal error on the connection object, sets the #error_reason and disconnects](./spec/acceptance/realtime/connection_spec.rb#L609)
+ * with expired (missing) value sent to server
+ * [triggers an error on the connection object, sets the #error_reason, yet will connect anyway](./spec/acceptance/realtime/connection_spec.rb#L623)
* with many connections simultaneously
- * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L624)
+ * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L641)
* when a state transition is unsupported
- * [emits a StateChangeError](./spec/acceptance/realtime/connection_spec.rb#L644)
+ * [emits a StateChangeError](./spec/acceptance/realtime/connection_spec.rb#L661)
+ * undocumented method
+ * #internet_up?
+ * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L676)
+ * when the Internet is up
+ * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L682)
+ * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L689)
+ * when the Internet is down
+ * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L701)
+ * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L708)
### Ably::Realtime::Channel Message
_(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/message_spec.rb))_
* using JSON and MsgPack protocol
* [sends a String data payload](./spec/acceptance/realtime/message_spec.rb#L25)
@@ -359,15 +377,15 @@
* [ensures REST presence history message IDs match ProtocolMessage wrapped message and connection IDs via Realtime](./spec/acceptance/realtime/presence_history_spec.rb#L41)
### Ably::Realtime::Presence
_(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/presence_spec.rb))_
* using JSON and MsgPack protocol
- * PENDING: *[ensure connection_id is unique and updated on ENTER](./spec/acceptance/realtime/presence_spec.rb#L943)*
- * PENDING: *[ensure connection_id for presence member matches the messages they publish on the channel](./spec/acceptance/realtime/presence_spec.rb#L944)*
- * PENDING: *[stop a call to get when the channel has not been entered](./spec/acceptance/realtime/presence_spec.rb#L945)*
- * PENDING: *[stop a call to get when the channel has been entered but the list is not up to date](./spec/acceptance/realtime/presence_spec.rb#L946)*
- * PENDING: *[presence will resume sync if connection is dropped mid-way](./spec/acceptance/realtime/presence_spec.rb#L947)*
+ * PENDING: *[ensure connection_id is unique and updated on ENTER](./spec/acceptance/realtime/presence_spec.rb#L995)*
+ * PENDING: *[ensure connection_id for presence member matches the messages they publish on the channel](./spec/acceptance/realtime/presence_spec.rb#L996)*
+ * PENDING: *[stop a call to get when the channel has not been entered](./spec/acceptance/realtime/presence_spec.rb#L997)*
+ * PENDING: *[stop a call to get when the channel has been entered but the list is not up to date](./spec/acceptance/realtime/presence_spec.rb#L998)*
+ * PENDING: *[presence will resume sync if connection is dropped mid-way](./spec/acceptance/realtime/presence_spec.rb#L999)*
* when attached (but not present) on a presence channel with an anonymous client (no client ID)
* [maintains state as other clients enter and leave the channel](./spec/acceptance/realtime/presence_spec.rb#L24)
* #sync_complete?
* when attaching to a channel without any members present
* [is true and the presence channel is considered synced immediately](./spec/acceptance/realtime/presence_spec.rb#L53)
@@ -394,94 +412,97 @@
* when provided as argument option to #enter
* [remains intact following #leave](./spec/acceptance/realtime/presence_spec.rb#L181)
* #update
* [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L224)
* [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L249)
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L259)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L266)
+ * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L259)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L269)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L276)
* when ENTERED
* [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L234)
* #leave
- * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L321)
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L326)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L333)
+ * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L332)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L337)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L344)
* :data option
* when set to a string
- * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L282)
+ * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L293)
* when set to nil
- * FAILED: ~~[emits nil data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L295)~~
+ * [emits the previously defined value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L306)
* when not passed as an argument
- * [emits the original data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L308)
+ * [emits the previously defined value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L319)
* :left event
- * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L345)
- * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L356)
+ * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L356)
+ * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L367)
* entering/updating/leaving presence state on behalf of another client_id
* #enter_client
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L407)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L412)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L418)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L423)
* multiple times on the same channel with different client_ids
- * [has no affect on the client's presence state and only enters on behalf of the provided client_id](./spec/acceptance/realtime/presence_spec.rb#L377)
- * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L391)
+ * [has no affect on the client's presence state and only enters on behalf of the provided client_id](./spec/acceptance/realtime/presence_spec.rb#L388)
+ * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L402)
* #update_client
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L469)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L474)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L492)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L497)
* multiple times on the same channel with different client_ids
- * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L422)
- * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L446)
+ * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L433)
+ * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L457)
+ * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L469)
* #leave_client
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L572)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L577)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L595)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L600)
* leaves a channel
* multiple times on the same channel with different client_ids
- * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L485)
- * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L509)
+ * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L508)
+ * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L532)
* with a new value in :data option
- * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L533)
+ * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L556)
* with a nil value in :data option
- * FAILED: ~~[emits the leave event with a nil value](./spec/acceptance/realtime/presence_spec.rb#L546)~~
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L569)
* with no :data option
- * [emits the leave event with the previous data value](./spec/acceptance/realtime/presence_spec.rb#L559)
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L582)
* #get
- * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L587)
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L592)
- * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L599)
- * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L614)
- * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L629)
- * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L646)
- * [returns both members on both simultaneously connected clients](./spec/acceptance/realtime/presence_spec.rb#L668)
+ * [returns a Deferrable](./spec/acceptance/realtime/presence_spec.rb#L610)
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L615)
+ * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L622)
+ * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L637)
+ * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L659)
+ * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L683)
* when a member enters and then leaves
- * [has no members](./spec/acceptance/realtime/presence_spec.rb#L656)
+ * [has no members](./spec/acceptance/realtime/presence_spec.rb#L693)
+ * with lots of members on different clients
+ * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L710)
* #subscribe
* with no arguments
- * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L694)
+ * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L746)
* #unsubscribe
* with no arguments
- * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L714)
+ * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L766)
* REST #get
- * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L733)
- * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L746)
+ * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L785)
+ * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L798)
* client_id with ASCII_8BIT
* in connection set up
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L763)
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L815)
* in channel options
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L776)
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L828)
* encoding and decoding of presence message data
- * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L800)
+ * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L852)
* #subscribe
- * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L819)
- * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L831)
- * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L845)
+ * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L871)
+ * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L883)
+ * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L897)
* #get
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L861)
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L913)
* REST #get
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L874)
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L926)
* when cipher settings do not match publisher
- * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L889)
- * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L902)
+ * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L941)
+ * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L954)
* leaving
- * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L919)
- * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L929)
+ * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L971)
+ * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L981)
### Ably::Realtime::Client#stats
_(see [spec/acceptance/realtime/stats_spec.rb](./spec/acceptance/realtime/stats_spec.rb))_
* using JSON and MsgPack protocol
* fetching stats
@@ -496,110 +517,110 @@
* [should return a deferrable object](./spec/acceptance/realtime/time_spec.rb#L19)
### Ably::Auth
_(see [spec/acceptance/rest/auth_spec.rb](./spec/acceptance/rest/auth_spec.rb))_
* using JSON and MsgPack protocol
- * [has immutable options](./spec/acceptance/rest/auth_spec.rb#L52)
+ * [has immutable options](./spec/acceptance/rest/auth_spec.rb#L54)
* #request_token
- * [returns the requested token](./spec/acceptance/rest/auth_spec.rb#L60)
- * option :client_id
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L91)
- * option :capability
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L91)
- * option :nonce
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L91)
- * option :timestamp
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L91)
- * option :ttl
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L91)
+ * [returns the requested token](./spec/acceptance/rest/auth_spec.rb#L62)
+ * with option :client_id
+ * [overrides default and uses camelCase notation for all attributes](./spec/acceptance/rest/auth_spec.rb#L93)
+ * with option :capability
+ * [overrides default and uses camelCase notation for all attributes](./spec/acceptance/rest/auth_spec.rb#L93)
+ * with option :nonce
+ * [overrides default and uses camelCase notation for all attributes](./spec/acceptance/rest/auth_spec.rb#L93)
+ * with option :timestamp
+ * [overrides default and uses camelCase notation for all attributes](./spec/acceptance/rest/auth_spec.rb#L93)
+ * with option :ttl
+ * [overrides default and uses camelCase notation for all attributes](./spec/acceptance/rest/auth_spec.rb#L93)
* with :key_id & :key_secret options
- * [key_id is used in request and signing uses key_secret](./spec/acceptance/rest/auth_spec.rb#L120)
+ * [key_id is used in request and signing uses key_secret](./spec/acceptance/rest/auth_spec.rb#L122)
* with :query_time option
- * [queries the server for the time](./spec/acceptance/rest/auth_spec.rb#L128)
+ * [queries the server for the time](./spec/acceptance/rest/auth_spec.rb#L130)
* without :query_time option
- * [queries the server for the time](./spec/acceptance/rest/auth_spec.rb#L137)
+ * [does not query the server for the time](./spec/acceptance/rest/auth_spec.rb#L139)
* with :auth_url option
* when response is valid
- * [requests a token from :auth_url using an HTTP GET request](./spec/acceptance/rest/auth_spec.rb#L184)
+ * [requests a token from :auth_url using an HTTP GET request](./spec/acceptance/rest/auth_spec.rb#L186)
* with :query_params
- * [requests a token from :auth_url with the :query_params](./spec/acceptance/rest/auth_spec.rb#L192)
+ * [requests a token from :auth_url with the :query_params](./spec/acceptance/rest/auth_spec.rb#L194)
* with :headers
- * [requests a token from :auth_url with the HTTP headers set](./spec/acceptance/rest/auth_spec.rb#L200)
+ * [requests a token from :auth_url with the HTTP headers set](./spec/acceptance/rest/auth_spec.rb#L202)
* with POST
- * [requests a token from :auth_url using an HTTP POST instead of the default GET](./spec/acceptance/rest/auth_spec.rb#L208)
+ * [requests a token from :auth_url using an HTTP POST instead of the default GET](./spec/acceptance/rest/auth_spec.rb#L210)
* when response is invalid
* 500
- * [raises ServerError](./spec/acceptance/rest/auth_spec.rb#L221)
+ * [raises ServerError](./spec/acceptance/rest/auth_spec.rb#L223)
* XML
- * [raises InvalidResponseBody](./spec/acceptance/rest/auth_spec.rb#L232)
+ * [raises InvalidResponseBody](./spec/acceptance/rest/auth_spec.rb#L234)
* with token_request_block
- * [calls the block when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L250)
- * [uses the token request from the block when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L255)
+ * [calls the block when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L252)
+ * [uses the token request from the block when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L257)
* before #authorise has been called
- * [has no current_token](./spec/acceptance/rest/auth_spec.rb#L262)
+ * [has no current_token](./spec/acceptance/rest/auth_spec.rb#L264)
* #authorise
- * [updates the persisted auth options thare are then used for subsequent authorise requests](./spec/acceptance/rest/auth_spec.rb#L309)
+ * [updates the persisted auth options thare are then used for subsequent authorise requests](./spec/acceptance/rest/auth_spec.rb#L311)
* when called for the first time since the client has been instantiated
- * [passes all options to #request_token](./spec/acceptance/rest/auth_spec.rb#L273)
- * [returns a valid token](./spec/acceptance/rest/auth_spec.rb#L278)
- * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L282)
+ * [passes all options to #request_token](./spec/acceptance/rest/auth_spec.rb#L275)
+ * [returns a valid token](./spec/acceptance/rest/auth_spec.rb#L280)
+ * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L284)
* with previous authorisation
- * [does not request a token if current_token has not expired](./spec/acceptance/rest/auth_spec.rb#L293)
- * [requests a new token if token is expired](./spec/acceptance/rest/auth_spec.rb#L298)
- * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L304)
+ * [does not request a token if current_token has not expired](./spec/acceptance/rest/auth_spec.rb#L295)
+ * [requests a new token if token is expired](./spec/acceptance/rest/auth_spec.rb#L300)
+ * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L306)
* with token_request_block
- * [calls the block](./spec/acceptance/rest/auth_spec.rb#L325)
- * [uses the token request returned from the block when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L329)
+ * [calls the block](./spec/acceptance/rest/auth_spec.rb#L327)
+ * [uses the token request returned from the block when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L331)
* for every subsequent #request_token
* without a provided block
- * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L335)
+ * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L337)
* with a provided block
- * [does not call the originally provided block and calls the new #request_token block](./spec/acceptance/rest/auth_spec.rb#L342)
+ * [does not call the originally provided block and calls the new #request_token block](./spec/acceptance/rest/auth_spec.rb#L344)
* #create_token_request
- * [uses the key ID from the client](./spec/acceptance/rest/auth_spec.rb#L358)
- * [uses the default TTL](./spec/acceptance/rest/auth_spec.rb#L362)
- * [uses the default capability](./spec/acceptance/rest/auth_spec.rb#L366)
+ * [uses the key ID from the client](./spec/acceptance/rest/auth_spec.rb#L360)
+ * [uses the default TTL](./spec/acceptance/rest/auth_spec.rb#L364)
+ * [uses the default capability](./spec/acceptance/rest/auth_spec.rb#L368)
* the nonce
- * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L371)
- * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L376)
+ * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L373)
+ * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L378)
* with option :ttl
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L387)
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L389)
* with option :capability
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L387)
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L389)
* with option :nonce
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L387)
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L389)
* with option :timestamp
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L387)
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L389)
* with option :client_id
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L387)
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L389)
* with additional invalid attributes
- * [are ignored](./spec/acceptance/rest/auth_spec.rb#L395)
+ * [are ignored](./spec/acceptance/rest/auth_spec.rb#L397)
* when required fields are missing
- * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L405)
- * [should raise an exception if key id is missing](./spec/acceptance/rest/auth_spec.rb#L409)
+ * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L408)
+ * [should raise an exception if key id is missing](./spec/acceptance/rest/auth_spec.rb#L412)
* with :query_time option
- * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L418)
+ * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L421)
* with :timestamp option
- * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L428)
+ * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L431)
* signing
- * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L445)
+ * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L448)
* using token authentication
* with :token_id option
- * [authenticates successfully using the provided :token_id](./spec/acceptance/rest/auth_spec.rb#L468)
- * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L472)
- * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L480)
- * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L488)
+ * [authenticates successfully using the provided :token_id](./spec/acceptance/rest/auth_spec.rb#L471)
+ * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L475)
+ * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L483)
+ * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L491)
* when implicit as a result of using :client id
* and requests to the Ably server are mocked
- * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L518)
+ * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L521)
* a token is created
- * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L527)
- * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L531)
- * [with capability and TTL defaults](./spec/acceptance/rest/auth_spec.rb#L535)
+ * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L530)
+ * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L534)
+ * [with capability and TTL defaults](./spec/acceptance/rest/auth_spec.rb#L538)
* when using an :api_key and basic auth
- * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L550)
- * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L554)
+ * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L553)
+ * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L557)
### Ably::Rest
_(see [spec/acceptance/rest/base_spec.rb](./spec/acceptance/rest/base_spec.rb))_
* transport protocol
* when protocol is not defined it defaults to :msgpack
@@ -807,41 +828,41 @@
* #get
* [returns current members on the channel with their action set to :present](./spec/acceptance/rest/presence_spec.rb#L31)
* with :limit option
* [returns a paged response limiting number of members per page](./spec/acceptance/rest/presence_spec.rb#L45)
* #history
- * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L58)
+ * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L64)
* with options
* direction: :forwards
- * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L74)
+ * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L80)
* direction: :backwards
- * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L89)
+ * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L95)
* #history
* with time range options
* :start
* with milliseconds since epoch value
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L134)
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L140)
* with Time object value
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L144)
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L150)
* :end
* with milliseconds since epoch value
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L134)
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L140)
* with Time object value
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L144)
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L150)
* decoding
* valid decodeable content
* #get
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L202)
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L208)
* #history
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L219)
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L225)
* invalid data
* #get
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L250)
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L254)
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L256)
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L260)
* #history
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L274)
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L278)
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L280)
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L284)
### Ably::Rest::Client#stats
_(see [spec/acceptance/rest/stats_spec.rb](./spec/acceptance/rest/stats_spec.rb))_
* using JSON and MsgPack protocol
* fetching application stats
@@ -1133,33 +1154,36 @@
_(see [spec/unit/models/paginated_resource_spec.rb](./spec/unit/models/paginated_resource_spec.rb))_
* [returns correct length from body](./spec/unit/models/paginated_resource_spec.rb#L30)
* [supports alias methods for length](./spec/unit/models/paginated_resource_spec.rb#L34)
* [is Enumerable](./spec/unit/models/paginated_resource_spec.rb#L39)
* [is iterable](./spec/unit/models/paginated_resource_spec.rb#L43)
- * [provides [] accessor method](./spec/unit/models/paginated_resource_spec.rb#L47)
- * [#first gets the first item in page](./spec/unit/models/paginated_resource_spec.rb#L53)
- * [#last gets the last item in page](./spec/unit/models/paginated_resource_spec.rb#L57)
+ * [provides [] accessor method](./spec/unit/models/paginated_resource_spec.rb#L61)
+ * [#first gets the first item in page](./spec/unit/models/paginated_resource_spec.rb#L67)
+ * [#last gets the last item in page](./spec/unit/models/paginated_resource_spec.rb#L71)
+ * #each
+ * [returns an enumerator](./spec/unit/models/paginated_resource_spec.rb#L48)
+ * [yields each item](./spec/unit/models/paginated_resource_spec.rb#L52)
* with non paged http response
- * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L161)
- * [is the last page](./spec/unit/models/paginated_resource_spec.rb#L165)
- * [does not support pagination](./spec/unit/models/paginated_resource_spec.rb#L169)
- * [raises an exception when accessing next page](./spec/unit/models/paginated_resource_spec.rb#L173)
- * [raises an exception when accessing first page](./spec/unit/models/paginated_resource_spec.rb#L177)
+ * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L175)
+ * [is the last page](./spec/unit/models/paginated_resource_spec.rb#L179)
+ * [does not support pagination](./spec/unit/models/paginated_resource_spec.rb#L183)
+ * [raises an exception when accessing next page](./spec/unit/models/paginated_resource_spec.rb#L187)
+ * [raises an exception when accessing first page](./spec/unit/models/paginated_resource_spec.rb#L191)
* with paged http response
- * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L195)
- * [is not the last page](./spec/unit/models/paginated_resource_spec.rb#L199)
- * [supports pagination](./spec/unit/models/paginated_resource_spec.rb#L203)
+ * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L209)
+ * [is not the last page](./spec/unit/models/paginated_resource_spec.rb#L213)
+ * [supports pagination](./spec/unit/models/paginated_resource_spec.rb#L217)
* accessing next page
- * [returns another PaginatedResource](./spec/unit/models/paginated_resource_spec.rb#L231)
- * [retrieves the next page of results](./spec/unit/models/paginated_resource_spec.rb#L235)
- * [is not the first page](./spec/unit/models/paginated_resource_spec.rb#L240)
- * [is the last page](./spec/unit/models/paginated_resource_spec.rb#L244)
- * [raises an exception if trying to access the last page when it is the last page](./spec/unit/models/paginated_resource_spec.rb#L248)
+ * [returns another PaginatedResource](./spec/unit/models/paginated_resource_spec.rb#L245)
+ * [retrieves the next page of results](./spec/unit/models/paginated_resource_spec.rb#L249)
+ * [is not the first page](./spec/unit/models/paginated_resource_spec.rb#L254)
+ * [is the last page](./spec/unit/models/paginated_resource_spec.rb#L258)
+ * [raises an exception if trying to access the last page when it is the last page](./spec/unit/models/paginated_resource_spec.rb#L262)
* and then first page
- * [returns a PaginatedResource](./spec/unit/models/paginated_resource_spec.rb#L259)
- * [retrieves the first page of results](./spec/unit/models/paginated_resource_spec.rb#L263)
- * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L267)
+ * [returns a PaginatedResource](./spec/unit/models/paginated_resource_spec.rb#L273)
+ * [retrieves the first page of results](./spec/unit/models/paginated_resource_spec.rb#L277)
+ * [is the first page](./spec/unit/models/paginated_resource_spec.rb#L281)
### Ably::Models::PresenceMessage
_(see [spec/unit/models/presence_message_spec.rb](./spec/unit/models/presence_message_spec.rb))_
* behaves like a model
* attributes
@@ -1442,10 +1466,16 @@
* #fetch
* [retrieves a channel if it exists](./spec/unit/realtime/channels_spec.rb#L31)
* [calls the block if channel is missing](./spec/unit/realtime/channels_spec.rb#L36)
* destroying channels
* [#release detatches and then releases the channel resoures](./spec/unit/realtime/channels_spec.rb#L44)
+ * is Enumerable
+ * [allows enumeration](./spec/unit/realtime/channels_spec.rb#L61)
+ * [provides #length](./spec/unit/realtime/channels_spec.rb#L77)
+ * #each
+ * [returns an enumerator](./spec/unit/realtime/channels_spec.rb#L66)
+ * [yields each channel](./spec/unit/realtime/channels_spec.rb#L70)
### Ably::Realtime::Client
_(see [spec/unit/realtime/client_spec.rb](./spec/unit/realtime/client_spec.rb))_
* behaves like a client initializer
* with invalid arguments
@@ -1565,10 +1595,16 @@
* #fetch
* [retrieves a channel if it exists](./spec/unit/rest/channels_spec.rb#L30)
* [calls the block if channel is missing](./spec/unit/rest/channels_spec.rb#L35)
* destroying channels
* [#release releases the channel resoures](./spec/unit/rest/channels_spec.rb#L43)
+ * is Enumerable
+ * [allows enumeration](./spec/unit/rest/channels_spec.rb#L59)
+ * [provides #length](./spec/unit/rest/channels_spec.rb#L75)
+ * #each
+ * [returns an enumerator](./spec/unit/rest/channels_spec.rb#L64)
+ * [yields each channel](./spec/unit/rest/channels_spec.rb#L68)
### Ably::Rest::Client
_(see [spec/unit/rest/client_spec.rb](./spec/unit/rest/client_spec.rb))_
* behaves like a client initializer
* with invalid arguments
@@ -1669,8 +1705,8 @@
-------
## Test summary
-* Passing tests: 786
-* Pending tests: 12
-* Failing tests: 2
+* Passing tests: 811
+* Pending tests: 11
+* Failing tests: 0