Codebase metrics¶
A measured snapshot of the orchestra codebase and its submodules,
counted with cloc. Charts show code lines
(blank and comment lines excluded) unless stated otherwise.
Snapshot
Measured on the 1.x branch, 2026-09-01. 1,048 files,
82,313 lines of code, 48,522 comment lines,
14,824 blank (145,659 lines in total). See
Methodology to reproduce.
At a glance¶
| Code | Comment | Blank | Files | Production | Test |
|---|---|---|---|---|---|
| 82,313 | 48,522 | 14,824 | 1,048 | 51,620 | 30,693 |
Production vs test¶
orchestra ships 30,693 lines of test code backing 51,620 lines of production code, a 59% test-to-production ratio.
Lines by language¶
| Language | Code | Comment | Blank | Files |
|---|---|---|---|---|
| PHP | 60,357 | 47,359 | 11,307 | 748 |
| YAML | 10,419 | 659 | 271 | 189 |
| Markdown | 6,923 | 0 | 1,486 | 53 |
| PO File | 3,594 | 34 | 1,664 | 34 |
| JavaScript | 339 | 173 | 24 | 5 |
| CSS | 287 | 91 | 61 | 5 |
| Text | 219 | 0 | 7 | 3 |
| JSON | 68 | 0 | 0 | 2 |
| Twig | 68 | 205 | 3 | 7 |
| SVG | 21 | 1 | 1 | 1 |
| HTML | 18 | 0 | 0 | 1 |
Composition¶
Across all languages, code is 57% of the lines, comments 33%, and blank lines 10%. The comment share reflects Drupal's docblock conventions.
By submodule¶
Production (brass) and test (steel) code per submodule, largest first.
| Submodule | Production | Test | Total |
|---|---|---|---|
| orchestra (core) | 23,022 | 9,628 | 32,650 |
| orchestra_ui | 3,282 | 2,216 | 5,498 |
| orchestra_views | 4,203 | 880 | 5,083 |
| orchestra_interaction | 2,417 | 2,170 | 4,587 |
| orchestra_inbox | 1,013 | 2,291 | 3,304 |
| orchestra_payment | 1,592 | 1,469 | 3,061 |
| orchestra_cm | 1,642 | 1,229 | 2,871 |
| orchestra_delegation | 1,012 | 1,536 | 2,548 |
| orchestra_interaction_webform | 942 | 1,602 | 2,544 |
| orchestra_inbox_views | 1,655 | 561 | 2,216 |
| orchestra_interaction_webform_examples | 1,585 | 136 | 1,721 |
| orchestra_examples | 1,315 | 272 | 1,587 |
| orchestra_modeler | 589 | 888 | 1,477 |
| orchestra_content | 625 | 608 | 1,233 |
| orchestra_bpmn_io | 564 | 428 | 992 |
| orchestra_eca | 491 | 436 | 927 |
| orchestra_easy_email | 667 | 213 | 880 |
| orchestra_interaction_task | 383 | 473 | 856 |
| orchestra_action | 365 | 396 | 761 |
| orchestra_server_api | 362 | 376 | 738 |
| orchestra_client | 359 | 372 | 731 |
| orchestra_audit_trail | 454 | 265 | 719 |
| orchestra_interaction_operation | 311 | 247 | 558 |
| orchestra_domain | 338 | 199 | 537 |
| orchestra_content_moderation | 239 | 281 | 520 |
| orchestra_presentation | 301 | 173 | 474 |
| orchestra_content_eca | 327 | 132 | 459 |
| orchestra_inbox_notification | 168 | 268 | 436 |
| orchestra_api | 201 | 225 | 426 |
| orchestra_interaction_notification | 226 | 157 | 383 |
| orchestra_vbo_inbox | 187 | 192 | 379 |
| orchestra_notification | 211 | 160 | 371 |
| orchestra_mail | 249 | 86 | 335 |
| orchestra_vbo | 155 | 128 | 283 |
| orchestra_payment_example | 168 | 0 | 168 |
Test suite¶
orchestra ships 228 automated test classes (1,016 test methods), counted by type below.
| Test type | Classes | Methods |
|---|---|---|
| Kernel | 184 | 903 |
| Functional | 24 | 55 |
| Unit | 12 | 49 |
| FunctionalJavascript | 8 | 9 |
| Total | 228 | 1,016 |
Architecture surface¶
What the module contains, counted across orchestra and its submodules: the Drupal building blocks (services, plugins, hooks, routes, entities) that make up its public and internal API.
| Element | Count |
|---|---|
| Services | 108 |
| Event subscribers | 15 |
| Hook implementations | 53 |
| Routes | 64 |
| Permissions | 11 |
| Forms | 31 |
| Controllers | 14 |
| Content entity types | 8 |
| Config entity types | 3 |
| Config schema types | 71 |
| Plugins | 111 |
Plugins break down by type as follows, largest first:
Methodology¶
This page is generated by
scripts/generate-metrics.php,
which reads the per-file JSON from cloc and writes this file. It executes no
commands: run cloc yourself and pipe it in,
from the module root, after a change worth reflecting:
cloc --exclude-dir=node_modules --by-file --json --quiet . | php scripts/generate-metrics.php
Line counts come from cloc per file, excluding node_modules and the
.tugboat preview scaffolding. Each file is attributed to the nearest
enclosing module (a directory with a *.info.yml); test-support modules under
a tests/ path count as their parent's test code. A file is test code when its
path contains a tests/ segment, production otherwise.
Test classes are counted by their directory under tests/src (Unit, Kernel,
Functional, FunctionalJavascript); the method column counts test-prefixed
methods plus those annotated @test or #[Test]. The architecture surface counts
service definitions in *.services.yml (excluding aliases), route and permission
keys in *.routing.yml and *.permissions.yml, #[Hook] attributes, plugin
classes under src/Plugin/, forms and controllers under src/Form and
src/Controller, entity-type attributes in src/Entity, and top-level types in
config/schema/*.yml, all summed across the module and its submodules.
The charts are static inline SVG generated from the measured data, so they need no JavaScript or charting plugin.