Skip to content
CAI
Software that uses CAICheck a score

sebastianbergmann/object-enumerator

69.3

Adequate · 19 September 2026

447

lines of production code

PHP

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a PHP library providing an object enumeration utility designed to traverse and serialize complex data structures, including those with cyclic references and inheritance hierarchies. It ensures type safety and robustness by strictly handling recursion contexts and modernizing its development workflow with PHP 8.4, PHPUnit 13, and comprehensive static analysis. The project focuses on maintaining high code quality through automated tooling, strict coding standards, and thorough unit testing of edge cases.

Behavioural changes

136 commits (0 fixes) modifying tools

A change to existing behaviour in tools — 136 commits, 4 files.

tools · medium confidence · unverified

Modernized build automation and developer tooling

The project has replaced its legacy Travis CI and Symfony CS setup with a modernized workflow using GitHub Actions, PHPStan (level 10), and PHP-CS-Fixer. Build tooling is now managed via Phive and a local Composer binary, with automated dependency updates handled by Renovate. Additionally, the license has been updated to BSD 3-Clause, a security policy has been added, and archive exports are now configured to exclude development artifacts.

(repo-wide) · high confidence

New script to extract release notes from changelog

A new PHP script, \build/scripts/extract-release-notes.php\, has been added to the build tooling. This utility reads the \ChangeLog.md\ file and extracts the section corresponding to a specific version tag provided as an argument. It is designed to isolate release notes for a given version, supporting the automated creation of release artifacts when tags are pushed.

build · high confidence

Refactored object enumeration to handle cyclic references and improve type safety

The Enumerator class has been refactored to strictly handle cyclic references and improve robustness. The public API now uses strict typing (declare(strict\_types=1)) and type hints for parameters and return values, ensuring predictable behavior. Internally, the enumeration logic was rewritten to use a private recursive helper method that processes arrays and objects without relying on array\_merge, preventing potential issues with array index reordering. The change also ensures that modifications made by the RecursionContext do not interfere with the traversal process by working on a copy of the array before marking it as processed, thereby fixing infinite recursion bugs for self-referencing structures.

src · high confidence

Test coverage

Added test fixtures for property hooks and inheritance scenarios; Added unit tests for the Enumerator class; Removed legacy PHPUnit 4 test suite for Enumerator.

Dependencies

PHPStan static analysis tooling upgraded to version 2.2.14 with strict rules

The local PHPStan installation in tools/.phpstan has been updated to version 2.2.14, bringing the core static analysis engine and its strict rules extension (phpstan-strict-rules) to version 2.0.12. This upgrade also includes the ergebnis/phpstan-rules package (version 2.13.1), which enforces additional coding standards such as requiring classes to be final, preventing the use of @phpstan-ignore comments, and disallowing named arguments in function calls. These changes enhance the rigor of static analysis checks applied to the codebase.

tools/.phpstan · high confidence

Upgrade to PHP 8.4 and PHPUnit 13, bump recursion-context to v8

The project now requires PHP 8.4 or higher and has upgraded the test runner to PHPUnit 13.3.4. The core dependency sebastian/recursion-context has been updated to version 8.0.1, which aligns with the new PHP version requirements. Additionally, the development branch has been renamed from master to main, and the package version has been bumped to 8.1-dev to reflect these breaking changes.

(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

Baseline

  • First survey — no prior run to compare against. CAI 69.

Lenses

  • Code Health 100
  • Architecture 69
  • Maturity 61
  • Readiness 78
  • Security 89

Changes since last survey

  • 300 commits — 294 feature/other, 6 fixes

By area

  • .phive/phars.xml — 94 commits
  • (root) — 75 commits
  • .github/workflows — 53 commits
  • tools/.phpstan — 38 commits
  • (repo) — 18 commits
  • src/Enumerator.php — 6 commits
  • tests/unit — 4 commits
  • .psalm/baseline.xml — 3 commits
  • tests/_fixture — 3 commits
  • .github/FUNDING.yml — 2 commits
  • .psalm/config.xml — 2 commits
  • .github/CODE_OF_CONDUCT.md — 1 commit
  • .github/CONTRIBUTING.md — 1 commit

Notable commits

  • fix: Fix CS/WS issues
  • fix: Fix CS/WS issues
  • fix: Fix infinite recursion for arrays that reference themselves
  • fix: Fix issues identified by PHPStan
  • fix: Fix package name
  • fix: Fix/Tweak
  • change: * Install PHPStan using Composer in order to be able to use phpstan/phpstan-strict-rules and tomasvotruba/type-coverage * Configure phpstan/phpstan-strict-rules, tomasvotruba/type-coverage, and ergebnis/phpstan-rules * Update PHPStan configuration * Put Phive binary under version control and manage it through "ant update-tools"
  • change: Add Liberapay and Tidelift
  • change: Add Security Policy
  • change: Add documentation on how to contribute
  • change: Add link to security policy
  • change: Add missing tests for Enumerator::enumerate()
  • change: Add tests for lazy objects
  • change: Add tests for property hooks
  • change: Add thanks.dev
  • change: Allow write operations
  • change: Also automerge minor updates
  • change: Bump
  • change: Bump
  • change: Bump
  • …and 280 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

sebastianbergmann/object-enumerator 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 19 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 2aba92adfe124c13f58ed24ba8195c00ddc34f85 — 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-13a154b7f5d1.