Skip to content
CAI
Software that uses CAICheck a score

Quick/Nimble

64.8

Adequate · 30 September 2026

8.8k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Nimble is a Swift testing library that provides a Domain Specific Language for writing expressive and readable assertion matchers. It supports multiple platforms including iOS, macOS, Linux, and Objective-C, and has been modernized to integrate with Swift Concurrency and the Swift Testing framework. The system enables developers to assert on both synchronous and asynchronous code with improved reliability and type safety.

How it got here

2014 — Initial project scaffolding and configuration

4 changes.

This period established the foundational structure of the Nimble project, including initial configuration files, Xcode project setup, and CI testing infrastructure. It also involved adopting Xcode's new build system and updating build tooling and dependency versions to ensure compatibility with modern Swift and platform requirements.

2015–2023 — Swift Concurrency and Platform Support

10 changes.

This period focused on modernizing Nimble by migrating its core assertion and matcher infrastructure to support Swift's async/await concurrency model, replacing legacy polling mechanisms with structured concurrency. The work also expanded platform compatibility by adding native support for non-Objective-C environments like Linux and ensuring full Objective-C DSL functionality within the Swift Package Manager. Additionally, automated release and documentation build scripts were introduced to streamline project maintenance.

Features

Automated release and documentation build scripts

The project now provides dedicated shell scripts to streamline the release and documentation processes. The new \script/release\ script automates the entire release workflow, including validating semantic versioning, updating the CocoaPods spec, creating signed Git tags, pushing to the CocoaPods trunk, and generating GitHub releases with automatic notes. Additionally, \script/build\_docs\ has been introduced to generate documentation using DocC, transforming the static README into hosted documentation with a specified base path.

script · high confidence

Initial project scaffolding and configuration

This change introduces the foundational configuration files for the Nimble project, including a \.gitignore\ to exclude build artifacts and IDE files, a \.swiftlint.yml\ to enforce code style rules (such as trailing commas and line lengths), and a \CONTRIBUTING.md\ guide for developers. It also adds a \test\ script to automate running tests across iOS, tvOS, watchOS, visionOS, and macOS via Xcode and Swift Package Manager, alongside a \Dockerfile.test\ for Linux-based CI testing. The \[e-mail redacted]\ manifest defines the package structure, specifying dependencies like \CwlPreconditionTesting\ and platform support, while \README.md\ provides installation instructions for SPM, CocoaPods, and Carthage.

(repo-wide) · high confidence

Objective-C support in the Swift Package version

The Nimble library now provides Objective-C compatibility when built via the Swift Package Manager. This change introduces the \Sources/NimbleObjectiveC\ module, which exposes Objective-C DSL functions (such as \NMB\_expect\, \NMB\_equal\, and \NMB\_beCloseTo\) and matchers to Swift Package users. It includes specific implementations for handling Objective-C types, exception capturing, and test observation registration, ensuring that Objective-C projects or mixed-language targets can utilize Nimble's assertion syntax within the SPM environment.

Sources/NimbleObjectiveC · high confidence

Support for async/await expressions and a new require DSL

Nimble now allows \expect\ to accept asynchronous closures, enabling direct assertions on async code without manual polling. A new \require\ DSL has been added to enforce that an expression matches a matcher, throwing an error if it does not, which helps in halting tests on failure. Additionally, the synchronous \waitUntil\ is now deprecated in favor of the new async-compatible waiting mechanisms.

Sources/Nimble · high confidence

Support for non-Objective-C environments via dummy exception capture

Nimble now supports building and running in environments without Objective-C runtime support (such as Linux) by introducing a new \ExceptionCapture\ adapter. This component provides a dummy implementation of \NMBExceptionCapture\ that executes code blocks directly without exception handling, allowing the library to function in non-Darwin platforms where \NSException\ is unavailable.

Sources/Nimble/Adapters/NonObjectiveC · high confidence

Behavioural changes

Adopts Xcode's New Build System

The Nimble workspace has been updated to use Xcode's latest build system. This change ensures compatibility with Xcode 9.3 and newer versions by configuring the workspace settings to explicitly select the 'Latest' build system, replacing the legacy build system.

Nimble.xcodeproj/project.xcworkspace · high confidence

Nimble matchers migrated to the new Predicate API with async support

The matchers in Sources/Nimble/Matchers have been rewritten to use the new Predicate-based API, replacing the legacy Matcher types. This change introduces AsyncMatcher and AsyncExpectation support, allowing matchers like allPass, beCloseTo, and beIdenticalTo to be used in async contexts. The migration also standardizes error messaging and improves type safety across the library.

Sources/Nimble/Matchers · high confidence

Replaced polling expectations with Swift Concurrency-based async implementations

The polling and async utilities in Sources/Nimble/Utils have been rewritten to use Swift structured concurrency (async/await) instead of the previous RunLoop-based polling mechanism. This introduces new internal types like AsyncPollResult, BlockingTask, and ResultTracker, and replaces the old NimbleTimeInterval with a Sendable NimbleTimeInterval enum to support async timers. Users benefit from more reliable async expectations (toEventually, toAlways, toNever) that are less prone to flakiness under heavy system loads and are compatible with modern Swift concurrency models, although synchronous waitUntil calls remain and are flagged as incompatible with Swift Testing's parallel execution.

Sources/Nimble/Utils · high confidence

Unified assertion handling with Swift Testing support and async capabilities

Nimble now uses a pluggable \AssertionHandler\ protocol to route expectation failures, defaulting to a handler that detects and forwards to Swift Testing when available, or falling back to XCTest. This change introduces native support for async contexts, providing \async\ versions of \withAssertionHandler\, \gatherExpectations\, and \gatherFailingExpectations\ so that assertions work correctly inside asynchronous closures. The adapter layer also includes an \AssertionDispatcher\ to allow multiple handlers to receive messages simultaneously and ensures the global environment is correctly tracked per thread.

Sources/Nimble/Adapters · high confidence

Test coverage

Added Objective-C test suite for Nimble matchers; Added async matcher test coverage; Added tests for async/await, require DSL, and Swift Testing support.

Dependencies

Update build tooling and dependency versions

The project's development environment and dependency specifications have been updated. The Gemfile now specifies CocoaPods 1.16 and Jazzy 0.15, with the lockfile reflecting these versions and their transitive dependencies. The Swift Package Manager configuration (Package.swift) has been updated to require Swift 6.0 tools and targets platforms including macOS 10.15, iOS 13, tvOS 13, watchOS 6, and visionOS 1. Dependencies on CwlPreconditionTesting and CwlCatchException have been bumped to versions 2.2.0 and 2.2.1 respectively, and the Swift DocC plugin is included for documentation generation.

(dependencies) · high confidence

Housekeeping

Initial project configuration for Nimble

The Nimble Xcode project is initialized with a new \project.pbxproj\ file and a default scheme (\Nimble.xcscheme\). This configuration establishes the build targets for the \Nimble.framework\ and its associated tests, setting up the foundational structure required to compile and run the library's assertion matchers and test suite in Xcode.

Nimble.xcodeproj · 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 63 → 65 (+1.4)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 97 → 96 (-0.9)
  • Architecture 100 → 95 (-5.4)
  • Maturity 50 → 54 (+3.2)
  • Readiness 64 → 63 (-0.6)
  • Security 70 → 79 (+8.5)

Resolved (3)

  • Documentation: no architecture or design documentation (README.md)
  • Outdated: cocoapods
  • Outdated: jazzy

New (39)

  • Duplicated block (10 lines × 2) (Sources/Nimble/Expectation.swift)
  • Duplicated block (10 lines × 2) (Sources/Nimble/Requirement.swift)
  • Duplicated block (11 lines × 2) (Sources/Nimble/Matchers/ThrowError.swift)
  • Duplicated block (12 lines × 2) (Sources/Nimble/Matchers/Equal.swift)
  • Duplicated block (13 lines × 4) (Sources/Nimble/Matchers/SatisfyAllOf.swift)
  • Duplicated block (15 lines × 2) (Sources/NimbleSharedTestHelpers/utils.swift)
  • Duplicated block (16 lines × 2) (Sources/Nimble/Matchers/ThrowError.swift)
  • Duplicated block (16–18 lines × 2) (Sources/NimbleSharedTestHelpers/utils.swift)
  • Duplicated block (17 lines × 2) (Sources/Nimble/Matchers/BeResult.swift)
  • Duplicated block (19 lines × 2) (Sources/Nimble/Matchers/AllPass.swift)
  • Duplicated block (21 lines × 2) (Sources/Nimble/Matchers/BeResult.swift)
  • Duplicated block (6 lines × 2) (Sources/Nimble/DSL.swift)
  • Duplicated block (6 lines × 2) (Sources/Nimble/DSL.swift)
  • Duplicated block (6 lines × 2) (Sources/Nimble/DSL.swift)
  • Duplicated block (6 lines × 2) (Sources/Nimble/DSL.swift)
  • Duplicated block (7 lines × 2) (Sources/Nimble/DSL+Require.swift)
  • Duplicated block (7 lines × 2) (Sources/Nimble/DSL+Require.swift)
  • Duplicated block (7 lines × 2) (Sources/Nimble/DSL+Require.swift)
  • Duplicated block (7 lines × 2) (Sources/Nimble/DSL+Require.swift)
  • Duplicated block (7 lines × 4) (Sources/Nimble/Matchers/BeginWithPrefix.swift)
  • …and 19 more

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

Survey your own repository

Quick/Nimble 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 30 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 727f75d91a0f7501d08d938966d17e6728b76a2a — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-cb25ca4feafa.