The codebase, measured
Everything below is counted out of this repository's git history at the moment the running image was built. No number here was typed by hand, none of it is rounded in our favour, and a week of writing code without tests would show up on the second chart the day it happened.
162,661
lines of application code
1,433 files under app/src
224,789
lines of tests
976 PHPUnit classes, 56 Playwright specs
9,858
test cases
9,728 unit and functional, 130 browser flows
1.38×
test code per line of code
was 0.90× on day one
112 days, 1,718 commits on main, 102 of those days with a commit on them. That is about 1,429 lines of application code and 1,986 lines of test a day, every day, including the ones nobody worked.
Code, and the tests that hold it
The PHPUnit suite has been larger than the application it tests since the second week, and the gap has widened since.
- PHPUnit tests 217,737 lines
- Application code 162,661 lines
- Playwright suite 7,052 lines
- as at 8 Nov
Test code per line of application code
The one chart here that can go down. Shipping a feature with its tests barely moves it; shipping one without them bends it, and it does not recover on its own.
- Test lines per line of code 1.38×
- as at 8 Nov
Unit and functional tests
Counted as PHPUnit counts them, before data providers multiply them.
- Test methods 9,728
- Test classes 976
- as at 8 Nov
Browser flows
Playwright, driving a real browser against a real stack in CI on every pull request.
- Browser flows 130
- Spec files 56
- as at 8 Nov
Everything else
The templates a page is drawn from, the migrations the database is built by, and the prose explaining why any of it is shaped as it is.
- Twig templates 28,097 lines
- Documentation 32,812 lines
- Build & ops scripts 22,429 lines
- Migrations 9,986 lines
- Frontend assets 3,905 lines
- Configuration 3,655 lines
- as at 8 Nov
Where the 488,334 lines are
Today's tree, by the same buckets the charts use. Vendored dependencies are not counted, and neither are the four sibling repositories — the CLI, the tray app, the Terraform provider and the shared Go client are checked out here but released on their own cadence, and folding them in would make the curve mean nothing.
| Bucket | Files | Lines | Share | Since day one |
|---|---|---|---|---|
| PHPUnit tests | 1,033 | 217,737 | 44.6% | +215,407 |
| Application code (PHP) | 1,433 | 162,661 | 33.3% | +160,070 |
| Documentation | 114 | 32,812 | 6.7% | +32,433 |
| Twig templates | 355 | 28,097 | 5.8% | +27,902 |
| Build & ops scripts | 216 | 22,429 | 4.6% | +22,359 |
| Doctrine migrations | 175 | 9,986 | 2.0% | +9,516 |
| Playwright suite | 74 | 7,052 | 1.4% | +7,052 |
| Frontend assets | 37 | 3,905 | 0.8% | +3,792 |
| Configuration | 43 | 3,655 | 0.7% | +3,368 |
How this is counted
- One sample per day.
- Taken from the last commit on main that day, walking first-parent — the state a merge shipped, not the intermediate states inside somebody's branch. Days nobody committed on are absent rather than carried forward, so a flat segment is a real quiet fortnight and not an invented point.
- Lines are lines.
- Blank lines and comments included, because deciding which comments count is a judgement and this page is trying not to make any. Binary files and vendored dependencies are excluded; so are the four sibling repositories checked out alongside this one.
- Tests are counted the way the suite runs them.
- public function test* under tests/ and test( in a .spec.ts — the same three patterns App\Service\Testing\TestSuiteMetrics uses for the lozenges on the front page, so the two cannot drift. The executed count is higher: data providers multiply methods, and projections multiply flows.
- Coverage is a gate, not a measurement.
- There is no coverage report inside a running container, and there could not be one describing this exact build. What there is instead is a promise CI keeps on every push: the suite runs under coverage and the build fails below 100% of app/src. Lower that gate and the boast lowers with it, in the same commit.
Measured at build from commit ffbacda8, . The whole series is available as /codebase.json.