Skip to content

0.1.4

Choose a tag to compare

@captainpacket captainpacket released this 07 Sep 16:48
· 44 commits to main since this release

Added

  • nqe.diff_page(), one page of a snapshot diff, the counterpart to run()
    for diffs. diff() pages to completion, which is the wrong shape for showing
    an operator the first rows that changed: it fetches the whole diff to display
    fifty rows. Page guards cannot stand in, because a page ceiling raises rather
    than stopping, which is right for a ceiling and wrong for a limit. Requested
    by the NetBox integration, which was slicing a complete diff.

Fixed

  • NQE result rows are no longer rewritten. rows() and stream() stripped a
    fields wrapper that Forward never sends. Its serializer holds a row in a
    field it calls fields internally and writes the row's own entries at the top
    level, confirmed against the server source, the API description and a live
    instance. The stripping silently rewrote the result of
    select {fields: {...}}, dropping a level and a key name, and it could not be
    detected downstream because a row with one key named fields and the envelope
    it was mistaken for are identical on the wire.

    This also settles a shape disagreement reported by an integration: run() and
    result_page() never stripped, so asking for one bounded page returned
    different rows than iterating all of them. All four paths now agree.

  • nqe.repo.queries() honours path and with_source at head. Forward
    ignores both there and returns the whole library without source, so a path
    filter looked applied and a source audit read every query as
    source-unavailable and passed vacuously. head is now resolved to its commit
    whenever either argument is used.

  • attempts_per_minute counts intervals, not attempts. The window runs from the
    first attempt to the most recent, which spans one fewer interval than there
    are attempts, so the rate was overstated by n / (n - 1): 100% at two
    attempts, 5% at twenty. The error was pessimistic, so a release gate comparing
    it against Forward's published ceiling could fail a build on a rate that was
    within the limit.

  • Forward's error body is parsed on its own merits rather than on the
    content-type it arrives with. A proxy that rewrote or dropped the header
    turned a described denial into a bare status. That mattered because Forward
    exposes no endpoint for an account's entitlements, so a refusal's message is
    the only signal a licence-tier denial exists, and losing it fails silently:
    the denial looks like any other 4xx. A body that is not a JSON object still
    parses to nothing, so an HTML gateway page is unchanged. A test now pins that
    the message and the raw body reach the exception verbatim.

Changed

  • nqe.repo.queries(with_source=True) without a path now raises
    ForwardConfigurationError. Forward returns committed source one query at a
    time and rejects the combination with a message naming the parameters rather
    than the reason. Use source() for a single query's text.