sebastianbergmann/object-enumerator
69.3
Adequate · 19 September 2026
447
lines of production code
PHP
primary language
1
measurement over time
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.