Skip to content

v0.26.3 — -R works again against current rq and keeps rq's hedges; remote schemas say their cache age, fall back to a stale copy with disclosure, and retry transient failures; corrected queries no longer take a minute.

Latest

Choose a tag to compare

@dpep dpep released this 03 Oct 14:21
· 3 commits to main since this release
1972e8a

Added

  • A live schema whose refetch fails is answered from the expired copy
    instead of failing — when the endpoint is down, times out, answers 5xx, or
    answers with a GraphQL errors body, and a cached copy exists (also under
    --refresh). stderr says what failed and how old the copy is, even under
    -q; JSON source adds "stale": true and error. Exit 0: an answer
    was given. A 401/403 never falls back, and with no copy the fetch fails as
    before.
  • An answer from a cached copy of a live schema says how old it is:
    from a copy of <url> cached 41m ago — --refresh to refetch on stderr
    (silenced by -q), and a source object (url, cached: true,
    age_secs) on every JSON row and on the -J no_matches row. Rows from a
    file or a fresh fetch are unchanged.
  • A miss from a remembered discovery says so: no matches for "x" in schema.graphql (remembered from an earlier walk — --refresh re-walks), and
    the -J miss row carries source: {path, discovered: true, remembered}
    whenever gqls picked the schema.
  • A live fetch retries a transient failure. A refused or dropped
    connection, a 502/503/504, or a 429 (honouring Retry-After up to 5 s) is
    tried up to three times in all, with a short backoff, inside a 40 s budget —
    so a hung endpoint costs one timeout, not three. A 4xx refusal and a GraphQL
    errors body are never retried. -v says what was retried and why.
  • A fetch still running after 2 s says so (still waiting on <url>); a
    hung endpoint was silent for 30.
  • -R passes rq's hedges through. A class declared in several places shows
    also in <file:line> and carries declarations/also_in in JSON. A hit
    from a checkout rq is still indexing says rq still indexing: N of M files
    on stderr and carries rq's warming object; a hit rq held back as
    provisional (rq's exit 2) is kept, marked (provisional), with
    "provisional": true on every JSON row. Exit 0 — it's an answer.

Changed

  • --profile times the explain check and the miss diagnosis as their own
    phases
    (explain check, miss diagnosis); output is now just writing
    the results, which it was always presumed to be.
  • -R -j renames confidence to rq_confidence. It was rq's confidence
    in the name match, so a (guess) rq matched exactly read as
    "confidence": 1.0. gqls's own verdict is loose. A script reading
    confidence must read rq_confidence — though against rq 0.52.0 or newer
    -R failed outright, so no current setup was producing the old field.
  • -R exits 1 when rq is still indexing and found nothing, with rq's
    progress and hint, instead of exiting 0 under a no code definition found
    that read as definitive. A miss on a finished index still exits 0.
  • A failing rq is reported in its own words — its JSON error and its
    exit code — rather than the first stderr line beside exit Some(64).

Fixed

  • A failed fetch says what happened once. introspecting URL: URL: Network Error: Network Error: … reads introspecting URL: couldn't connect (Connection refused), and an HTTP failure names its status and the
    server's GraphQL error message (HTTP 401 Unauthorized: bad token).
  • A query correcting to a common field name no longer takes a minute.
    Deciding whether a query names one record re-scanned every name in the
    schema once per record it corrected to: on a 48k-record schema, emial
    (→ 2,811 email fields) took about 60 s and ñame 77 s. It is asked once
    per query now, and the check allocates nothing for ASCII names and runs in
    parallel — emial takes about 16 ms. Every result is unchanged.
  • -R works again. It passed rq --no-record, which rq removed in 0.52.0,
    so every resolve against a current rq failed with unexpected argument.
    gqls now passes rq only --ndjson --limit 10 (and --verbose under -v),
    and a test drives the installed rq when there is one.