Skip to content

Formbase 0.11.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 04:40
· 68 commits to main since this release

Pairs with MorphDB 0.12.x. A minor: a form type's raw stream is now readable over HTTP, page by
page, and a projection that builds nothing says why — which changes the public
NotProjectedException constructor in Formbase.Core. Everything on the wire is additive. The M3L
hint adapter maps and records more of what a declaration says, on M3L.Native 0.14.0.

Added

  • GET /formtypes/{type}/documents reads a form type's raw stream page by page, oldest first, after
    a watermark cursor (after, limit — default 100, at most 1000). Until now the only raw read was a
    single document by an id the caller had to already hold, and records carry only declared columns —
    so across the HTTP boundary, fields nothing had declared could not be read at all. Each page
    carries rawHead, read before the page and never passed, so a caller is caught up exactly when the
    last watermark it received equals it; limit=0 reads the head alone. An out-of-range limit or a
    negative after is refused with 400 rather than adjusted. In Formbase.Core,
    FormbaseEngine.ReadDocumentsAsync and DocumentPage are the same read for an embedding host.

Changed

  • The README's HTTP surface summary no longer says writing a declaration is not on the surface: PUT
    and DELETE /formtypes/{type}/declaration have been served since 0.8.0.

  • POST /formtypes/{type}/projection says why it built nothing. A run on a form type with no
    declaration answered 200 with projected: false and three empty diagnostic lists — and empty
    lists read as "nothing was lost", so the response looked like a successful run with nothing to
    do. It now carries notProjectedReason: noDeclaration when only a declaration can give the form
    type a shape, nothingToInfer when schema intelligence is installed but had no documents to infer
    from; null whenever projected is true. Additive on the wire.

  • The /problems/not-projected detail names the one remedy that applies instead of offering two.
    It used to say "declare field hints or trigger a projection" in every case, and with nothing
    declared the second remedy is a projection run that projects nothing — a loop the server never
    named. With nothing declared it now says to declare first; with a declared shape not yet built it
    says to trigger a projection. The problem type is unchanged. In Formbase.Core,
    NotProjectedException takes the state as a second constructor argument and exposes it as
    HasSchema.

  • The M3L hint adapter now maps the whole numeric catalog. byte, short and long join
    integer in the integer slot — that slot is emitted as a 64-bit column, so no rung of the ladder
    loses a value — and double and percentage join float, decimal and money in the decimal
    slot. Until now a field declared with any of those five names was reported as an unmapped type
    and degraded to a text column, which understated what the vocabulary can carry. binary is
    deliberately unchanged: it is the one catalog type with no slot to map to, so it still degrades
    to text with a recorded gap.

  • The M3L hint adapter counts two losses it used to let through unrecorded. A declared type
    parameter (string(50), decimal(10,2)) is recorded as a constraint gap, and an array field —
    which lands in a single JSONB column — is recorded with the element type and item nullability it
    cannot carry. Neither behaviour changes: the same columns come out. What changes is that the gap
    list, which exists to make the loss countable, no longer omits these two.

  • The M3L hint adapter records the three composition and ownership constructs M3L 0.13.0 makes
    structural. A model declared ::aspect(Base) or ::subtype(Base) is recorded with its base link,
    the same way an inherited model already is; a field contributed by ::extend keeps its column
    and is recorded with the owner it came from; and a model under a # Prefix: (or namespace) owner
    is recorded with that owner, since the form type is still identified by the bare model name. The
    hints themselves are unchanged — before 0.13.0 the base kinds were not models at all and were
    skipped without a trace, so this also stops an aspect or subtype from being silently emitted as a
    standalone table.

Documentation

  • The compose bundle is documented as needing --build, and its opening smoke check is now
    GET /health/ready rather than GET /settings. The host service is built from the tree, so
    docker compose up on its own brings back whatever image the last build left — a checkout that
    has moved on since then comes up serving the older one. /settings answers 200 from any
    build and so cannot tell the two apart; the readiness probe answers 404 on a build that
    predates the store health checks. The container health check already asked the same question
    from inside and a stale bundle never reported healthy, but nothing said to look there.

Dependencies

  • M3L.Native to 0.14.0. 0.11.0 adds a multi-file validation entry point (ValidateMulti and its
    typed and result-returning siblings) alongside the existing multi-file parse, and 0.12.0 widens
    the type catalog with byte, short and double and states float as 32-bit; the three new
    type names are mapped by the hint adapter in this same release. 0.13.0 adds the # Prefix: owner
    header, ::extend blocks (merged into their target's fields, each carrying its origin) and the
    ::aspect / ::subtype base kinds, which are now ordinary models with a base rather than untyped
    generic kinds — a document that used those three words as custom kinds changes meaning. The
    adapter's handling of them is described above. 0.14.0 resolves enum inheritance into an enum's
    values and tightens validation (a later hop of a lookup path without a reference, a value name
    repeated across inheritance, an argument on an extend header); the hint adapter parses without
    validating and maps enum types to text, so its output does not change.
  • MorphDB.Client to 0.12.2, and the MorphDB server image in docker-compose.yml, the README and
    the live fixtures to 0.12.2. The producer's releases since 0.12.0 are patches carrying dependency
    rounds and documentation corrections; no wire member moves. The suite with the live MorphDB tests
    passes unchanged against the published 0.12.2 image (330/330).
  • Microsoft.NET.Test.Sdk to 18.10.1 (tests only).