You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit cf0babe
Browse filesBrowse the repository at this point in the historyBrowse files
Covers push/push_device_registrations.md, push_channel_subscriptions.md,
push_channels.md, push_admin_publish.md, batch_publish.md and
batch_presence.md, completing the REST unit tier.
The batch REST API and PushChannel are not implemented, so fifty-one tests
carry the deviation mark with the assertion the specification calls for:
forty-one for batch publish and presence, ten for PushChannel. Removing the
mark is all that is needed once each lands. The push admin surface does
exist, and a fifty-second test records that device ids are interpolated into
push paths unescaped, where channel names are quoted.
deviations.md now carries the totals for the tier: of 581 derived tests, 465
pass, 110 are gated behind RUN_DEVIATIONS and 6 cannot be run at all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
| RSH7, RSH7a–e, RSH6, RSH8 |`PushChannel`: `channel.push`, `client.device`, `LocalDevice`. The push *admin* surface (RSH1) does exist | 10 |
203
221
| RSL7 |`RestChannel#setOptions`. The realtime channel implements it; the REST `options` setter expects the kwargs dict `Channels.get` collected, so a `ChannelOptions` raises `TypeError`| 2 |
204
222
| RSP3a2, RSP3a3 |`clientId` and `connectionId` filters on `RestPresence#get`. `Presence.get` takes only `limit`, while `Presence.history` does take its documented params | 3 |
205
223
| TP5 |`size` on `PresenceMessage`. The related `maxMessageSize` gap is adapted rather than gated, below; `features.md` TM6 has no UTS test | 1 |
@@ -235,6 +253,7 @@ the mark is the only change needed once the SDK behaviour lands.
235
253
| Spec points | Behaviour |
236
254
|---|---|
237
255
| RSC19b | Caller-supplied headers override the configured `Authorization`, because `Http.make_request` applies `headers` after `auth_headers`. RSC19b says requests "unconditionally" use the configured mechanism |
256
+
| RSH1b1 | Device ids are interpolated raw into push paths (`ably/rest/push.py` lines 82, 106, 118), so an id containing `/` addresses a different resource and `:` is unescaped. `ably/rest/channel.py` does quote channel names, so the SDK is inconsistent with itself |
238
257
239
258
## Adapted Tests
240
259
@@ -250,7 +269,7 @@ comment above. These run, so they guard against regression.
250
269
| RSC18 | The constructor rejects basic auth over HTTP | Construction succeeds; 40103 is raised from `make_request` when a request needing Basic Auth is attempted, and no request goes out. RSA1/RSC18 say only "any attempt to use" | Compliant; the UTS is stricter than its source |
251
270
| REC1b1, REC1c1 | Code 40000, or a message containing "invalid" or "conflict" | 400/40106 with a specific message. The features spec mandates no code | Cosmetic |
252
271
| RSAN1a3 | Code 40003 for a missing `Annotation.type`| 400/40000 | Cosmetic; worth aligning cross-SDK |
253
-
272
+
| RSH1a | Empty `recipient` or `data` rejected with code 40000 |`TypeError` / `ValueError`, not an `AblyException`. The "no HTTP request" half is satisfied | Open bug, minor |
254
273
| HP6 |`errorCode` is a number | The raw header string, `'40101'`| Open bug, trivial |
255
274
| HP8 |`headers` is a map | A list of `(name, value)` pairs, so the lookup the spec describes is impossible without converting, and case-insensitivity is lost | Open bug; changing the return type is breaking |
256
275
| RSC19e | An error indicated idiomatically |`httpx.ConnectError` / `ReadTimeout` reach the caller unwrapped, because `AblyRest.request` carries no `@catch_all` unlike `time()` and `stats()`. The messages do name the failure | Borderline; defensible under RSC19e |
0 commit comments