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