0.1.4
Added
nqe.diff_page(), one page of a snapshot diff, the counterpart torun()
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()andstream()stripped a
fieldswrapper that Forward never sends. Its serializer holds a row in a
field it callsfieldsinternally 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 namedfieldsand 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()honourspathandwith_sourceathead. 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.headis now resolved to its commit
whenever either argument is used. -
attempts_per_minutecounts 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 byn / (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-typeit 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 apathnow 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. Usesource()for a single query's text.