Skip to content
CAI
Software that uses CAICheck a score

pellse/assembler

58.0

Adequate · 22 September 2026

4.3k

lines of production code

Java

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Java library for assembling data from sub-queries, specifically designed for reactive and asynchronous pipelines. It provides a modular caching and concurrency control framework, featuring thread-safe access, lock-based strategies, and integration with Spring Cache and Caffeine. The library also offers Kotlin extensions and standardized error handling for reactive streams.

Features

Add Kotlin extension functions for Assembler

Added Kotlin extension functions to the Assembler library, providing idiomatic Kotlin APIs for one-to-one and one-to-many mappings, as well as caching utilities via new \AssemblerKotlinSupport\ and \CacheUtils\ files.

assembler-kotlin-extension · high confidence

Asynchronous caching and concurrency control for rule-based data assembly

The Assembler library now provides built-in support for concurrent, asynchronous caching and lock-based concurrency control. Users can wrap their cache implementations with \ConcurrentCache\ to prevent cache stampedes and ensure thread-safe access to data. Additionally, the library introduces a \LockStrategy\ and \ReactiveGuard\ mechanism to manage read-write locking, allowing developers to configure specific locking behaviors for cache operations. This enables safer and more efficient assembly of sub-queries in reactive pipelines by handling concurrent access to shared resources.

assembler · high confidence

Introduce Spring Cache integration for the assembler

Added a new \assembler-spring-cache\ module that provides a \SpringCacheFactory\ to integrate Spring's \CacheManager\ with the assembler's caching system. This allows users to leverage Spring's caching abstractions for data retrieval and storage within the assembler pipeline, supporting both synchronous and asynchronous cache operations.

assembler-spring-cache · high confidence

New concurrency and caching abstractions for reactive streams

The library introduces new abstractions for handling concurrency and caching in reactive streams. A new \ErrorHandler\ interface provides standardized ways to handle errors in \Flux\ streams (e.g., \onErrorContinue\, \onErrorResume\). The caching layer is restructured with a \CacheEvent\ system to track updates and removals, and a \CacheContext\ that supports both one-to-one and one-to-many caching scenarios with configurable merge functions. Additionally, a \CASLockStrategy\ is introduced, implementing a lock strategy using compare-and-swap operations with a configurable CPU spin-wait loop (defaulting to 50 iterations with 50 nanoseconds pause) to manage concurrent access, alongside a \CoreLock\ hierarchy for read/write locks. These changes enable more robust and flexible caching and concurrency control within the assembler's reactive pipeline.

. · high confidence

Removals

Removal of legacy assembler and utility classes

The \EntityAssembler\ interface, \FluxEntityAssembler\, \SynchronousEntityAssembler\, and \EntityAssemblerBuilder\ classes have been removed from the \io.github.pellse.assembler\ package. Additionally, the \Mapper\ interface and \QueryUtils\ helper class in \io.github.pellse.util.query\ have been deleted, along with several checked functional interfaces and the \Unchecked\ utility class in \io.github.pellse.util.function.checked\. These changes reflect a restructuring of the assembler and query utilities, likely to support the creation of separate modules for different asynchronous and synchronous implementations.

src/main · high confidence

Behavioural changes

Caffeine cache implementation moved to new package

The Caffeine cache implementation has been reorganized into the \io.github.pellse.assembler.caching.caffeine\ package. The \CaffeineCacheFactory\ now returns anonymous classes as \Cache\ delegates, and the factory can be configured to use a Virtual Thread Executor when virtual thread support is detected.

assembler-cache-caffeine/src/main · high confidence

Upgrade Gradle wrapper to version 8.8

The Gradle wrapper configuration has been updated to use Gradle 8.8, replacing the previous version 3.5-rc-2. This change ensures the project uses a modern, stable release of the Gradle build tool, which may bring performance improvements, new features, and compatibility updates for the build process.

gradle · high confidence

Test coverage

Added long-running integration test for Caffeine cache behavior; Removed obsolete test files for entity assemblers.

Dependencies

Migrated build system to Gradle 8 with Java 21 and Reactor 3.7.5

The project's build configuration has been modernized: the root build script now targets Java 21 and uses Gradle 8.0.2, while the root project version is set to 0.7.11. Key dependencies have been updated, including Project Reactor to 3.7.5 and JSpecify to 1.0.0. Additionally, the build now publishes artifacts to Maven Central with proper signing and Javadoc/JAR sources, and enables virtual threads for the bounded elastic scheduler.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 54 → 58 (+4.3)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 99 → 100 (+0.3)
  • Architecture 88 → 96 (+7.8)
  • Maturity 64 → 64 (+0.0)
  • Readiness 26 → 32 (+6.7)
  • Security 100 → 100 (+0.0)

Resolved (18)

  • Boundary-crossing change coupling: CaffeineCacheFactory.java ↔ ObservableCacheFactory.java (assembler-cache-caffeine/src/main/java/io/github/pellse/assembler/caching/caffeine/CaffeineCacheFactory.java)
  • Change coupling: ConcurrentCacheFactory.java ↔ ObservableCacheFactory.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/ConcurrentCacheFactory.java)
  • Change coupling: DeferCacheFactory.java ↔ MapperCacheFactory.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/DeferCacheFactory.java)
  • Change coupling: DeferCacheFactory.java ↔ ObservableCacheFactory.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/DeferCacheFactory.java)
  • Change coupling: MapperCacheFactory.java ↔ ObservableCacheFactory.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/MapperCacheFactory.java)
  • Change coupling: ObservableCacheFactory.java ↔ StreamTableFactory.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/ObservableCacheFactory.java)
  • Change coupling: ObservableCacheFactory.java ↔ StreamTableFactoryBuilder.java (assembler/src/main/java/io/github/pellse/assembler/caching/factory/ObservableCacheFactory.java)
  • Change coupling: OneToManyCache.java ↔ OneToOneCache.java (assembler/src/main/java/io/github/pellse/assembler/caching/OneToManyCache.java)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/AsyncCacheFactory.java)
  • Duplicated block (8 lines × 2) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/MapperCacheFactory.java)
  • Duplicated block (9 lines × 2) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/AsyncCacheFactory.java)
  • No exposed public API
  • Test reliability not included
  • The assembler-cache-caffeine README is a single Maven/Javadoc badge with no content, so the caching module's API and usage are not visible. (assembler-cache-caffeine/README.md)
  • The assembler-spring-cache README is a single Maven/Javadoc badge with no content, so the caching module's API and usage are not visible. (assembler-spring-cache/README.md)
  • single-maintainer — knowledge-concentration (bus factor) risk

New (13)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (21 lines × 2) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/AsyncCacheFactory.java)
  • Duplicated block (7 lines × 3) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/AsyncCacheFactory.java)
  • Duplicated block (9 lines × 3) (assembler/src/main/java/io/github/pellse/assembler/caching/factory/AsyncCacheFactory.java)
  • High interface indirection
  • No ADRs found
  • No assertions: testChainedAssemblers (assembler/src/test/java/io/github/pellse/assembler/test/ChainedAssemblerTest.java)
  • No assertions: testEmbeddedAssemblers (assembler/src/test/java/io/github/pellse/assembler/test/EmbeddedAssemblerTest.java)
  • No assertions: testLongRunningAutoCachingEvents (assembler-cache-caffeine/src/test/java/io/github/pellse/assembler/caching/caffeine/AssemblerCaffeineCacheTest.java)
  • No assertions: testLongRunningAutoCachingEvents (assembler-spring-cache/src/test/java/io/github/pellse/assembler/caching/spring/SpringCacheAssemblerTest.java)
  • No assertions: testLongRunningAutoCachingEvents (assembler/src/test/java/io/github/pellse/assembler/test/CacheTest.java)

Architecture

  • Containers 0 added · 0 removed · contexts 1 added · 1 removed · edges 0 added · 0 removed

Added bounded contexts (1)

  • assembler

Removed bounded contexts (1)

  • .

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

pellse/assembler was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 22 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit d31821fce7f5f118316194bd81986f7fee8f5099 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-90d5d2fe38ee.