Skip to content

Release v3.11.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 10:22
4f3fc6a

Summary

Most of Screenplay's projection surface rendered as a // TODO comment rather than code, and several constructs that did render diverged silently from what Chronicle actually does — the generated read model compiled, looked right, and behaved differently from the model. Studio renders through this path and commits the result straight to a repository, so that output ships.

This renders every projection block that has a model-bound attribute behind it, and closes the silent divergences found while doing so.

Added

  • join, all, every and remove via join blocks render as their model-bound attributes (#11)
  • nested blocks render as a sibling record the read model holds through a nullable [Nested] property, with a clear with inside one becoming the class-level [ClearWith] that nulls it (#11)
  • children blocks render as a sibling record plus an IEnumerable<T> collection carrying [ChildrenFrom], with remove with becoming a [RemovedWith] on that same property, nesting to any depth (#11)
  • no automap renders as [NoAutoMap] on the read model (#11)

Fixed

  • A key declared on a from block, or on one of its events, is carried onto [FromEvent]. Chronicle seeds every projection with the event source id and never derives routing from [Key], so a keyed projection was writing its documents under the event source id instead of the key it declared (#13)
  • no automap was not read at all, so a projection that disabled automapping rendered with it enabled and mapped event properties the model deliberately excluded (#13)
  • clear with on a read model emitted a class-level [ClearWith] that Chronicle only reads on a nested type, so it compiled and was then discarded (#13)

Changed

  • What no model-bound attribute can carry is now reported rather than dropped in silence: the system-wide subscription an all block declares, a per-block no automap, a children block that says nothing about its parent, a clear with inside children, a from naming events it does not map, and any mapping an earlier block already claimed (#13)
  • Specs compile the rendered output against the real Cratis assemblies, so a wrong attribute name, argument or target fails rather than passing a string comparison (#13)