Skip to content

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-10-21, with cloc 2.08. 1,634 files, 160,239 lines of code, 108,751 comment lines, 28,206 blank (297,196 lines in total). See Methodology to reproduce.

At a glance

Code Comment Blank Files Production Test
160,239 108,751 28,206 1,634 84,539 75,700

Production vs test

Orchestra ships 75,700 lines of test code backing 84,539 lines of production code, a 90% test-to-production ratio.

Lines by language

Language Code Comment Blank Files
PHP 127,834 106,614 22,721 1,269
YAML 13,883 1,305 470 238
Markdown 11,422 0 2,302 53
PO File 5,563 37 2,570 37
JavaScript 640 314 44 8
CSS 387 162 85 8
Text 302 0 9 4
Twig 100 318 4 13
JSON 69 0 0 2
SVG 21 1 1 1
HTML 18 0 0 1

Composition

Across all languages, code is 54% of the lines, comments 37%, and blank lines 9%. 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_engine 27,438 27,032 54,470
orchestra (core) 14,656 613 15,269
orchestra_ui 4,586 4,748 9,334
orchestra_interaction 3,502 4,483 7,985
orchestra_views 5,095 2,242 7,337
orchestra_cm 3,024 4,080 7,104
orchestra_inbox 1,303 4,877 6,180
orchestra_interaction_webform 1,537 3,668 5,205
orchestra_server 2,149 2,671 4,820
orchestra_payment 1,792 2,583 4,375
orchestra_client 1,886 1,904 3,790
orchestra_inbox_views 2,052 1,366 3,418
orchestra_delegation 1,209 2,171 3,380
orchestra_remote_process 1,016 1,688 2,704
orchestra_examples 2,044 430 2,474
orchestra_modeler 809 1,610 2,419
orchestra_content 906 1,330 2,236
orchestra_interaction_webform_examples 1,777 192 1,969
orchestra_client_webform 979 941 1,920
orchestra_easy_email 926 595 1,521
orchestra_eca 641 865 1,506
orchestra_bpmn_io 634 828 1,462
orchestra_interaction_task 419 695 1,114
orchestra_domain 497 537 1,034
orchestra_group 359 617 976
orchestra_interaction_operation 337 548 885
orchestra_audit_trail 509 354 863
orchestra_action 293 428 721
orchestra_presentation 396 224 620
orchestra_vbo_inbox 240 327 567
orchestra_content_moderation 293 274 567
orchestra_mail 252 218 470
orchestra_content_eca 206 217 423
orchestra_webform 307 60 367
orchestra_vbo 172 148 320
orchestra_content_action 108 136 244
orchestra_payment_example 190 0 190

Test suite

Orchestra ships 413 automated test classes (2,873 test methods), counted by type below.

Test type Classes Methods
Kernel 322 2,588
Unit 47 179
Functional 26 74
FunctionalJavascript 18 32
Total 413 2,873

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 177
Event subscribers 20
Hook implementations 78
Routes 89
Permissions 13
Forms 54
Controllers 22
Content entity types 8
Config entity types 6
Config schema types 115
Plugins 148

Plugins break down by type as follows, largest first:

Methodology

This page is generated by scripts/generate-metrics.php, run from the module root after a change worth reflecting:

php scripts/generate-metrics.php

It measures the files git ls-files reports, so a checkout that has installed vendor/, previewed the docs into site/ or pulled a node_modules/ counts the same as the archive a release ships. This page is left out of that list: the script writes it, and a page that counts itself changes the tree it just measured, so no two regenerations agree. The snapshot above names the cloc version, because cloc counts differently from one version to the next; that is the version to run to reproduce this page, and the version the pipeline installs.

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 each test-prefixed method, and each further one 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. They are decorative and marked aria-hidden: every figure one of them draws is also in the table or the sentence beside it, so a screen reader gets the numbers rather than an image with no name. An img role carrying no accessible name is worse than no role at all, because it hides the labels inside the chart as well.