Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 10 Sep 16:13
· 119 commits to main since this release
5052058

Upgrade if you are on 0.1.0 or 0.2.0

0.1.0 and 0.2.0 are yanked and their releases withdrawn. 0.3.0 is the release to
install.

Breaking

Two behaviours callers may be relying on are different, which is why this is
0.3.0 and not 0.2.1.

0.2.0 0.3.0
wait_until_running(), wait_for_guest() refused a suspended or stopped computer outright refuse only one the platform is holding nothing for; a start it has already admitted is waited for
wait_for_guest() at its deadline raised TimeoutError, whatever the probe had hit re-raises a permanent error — authentication, permission, billing, a missing computer, TLS; only transient failures become a readiness timeout
is_transient() answered True for every ConflictError but MoveRequiredError also answers False for a template_image_preparing conflict, which wants a deliberate continuation rather than a blind retry

Added

  • start(resume_only=True) resumes a saved session without cold-booting a
    stopped computer (#80). If no saved session remains, the request succeeds and
    the computer stays stopped — the method refreshes and returns the computer, so
    read its state when you need to know which of the two happened. Both clients
    take the keyword. It needs a platform that understands resume_only; an older
    one may ignore it and cold-boot, and a successful response does not say which
    happened.
  • create(template_transfer=...) continues onto an image the platform has
    already prepared, rather than starting a fresh build, after a 409 whose
    code is template_image_preparing (#83). The refusal carries
    body["preparation"] — the preparation's own state and error, failure
    included, which deserves diagnosis before any retry. The token requires the
    original nonempty template, cannot be combined with size, and is not a
    create idempotency key: stop after success, and never replay an ambiguous or
    lost response. The README works both the sync and async shape end to end.
  • APIError.retry_after — Retry-After as seconds, HTTP-date form
    included, None when the header is absent or malformed (#83). It now reaches
    every refusal that carries one; before, only RateLimitError had it. A delay
    is not permission to replay the request.

Fixed

  • A valid event stream could fail when several small events arrived in one
    decompressed chunk
    (#85). The decoder applied its size limit to the chunk
    before splitting it into events, so a burst past the limit was rejected
    although no single frame was near it. The bound now applies per normalized
    frame and to the incomplete tail, UTF-8 flush output included, and the scan
    advances a cursor rather than recopying the rest of the burst. Oversized
    frames, complete or not, are still refused; order, delimiter accounting,
    UTF-8, BOM, CRLF and terminal-event handling are unchanged.
  • A permanent failure at a guest-readiness deadline is no longer buried
    (#84). wait_for_guest() raised TimeoutError when its last probe had been
    refused outright, hiding the error the caller had to handle. Both clients keep
    it; only transient failures become a readiness timeout.
  • A start already under way is no longer refused (#81). The two waits told a
    computer nobody is starting apart from one whose start has been admitted using
    the running-pool figure the platform publishes, and treat its absence as
    unknown rather than as nothing coming: a host too old to report it, or one that
    could not be reached, has not said a start is not happening. Waiting there
    costs a timeout; refusing costs a machine. A memory fork, which reserves its
    RAM at the start of its disk copy and resumes itself at the end while
    reporting building throughout, is waited for as well.