Skip to content

Make the class-loader cache build-time and add a loader debug page#35

Open
darylldoyle wants to merge 2 commits into
developfrom
fix/issue-30-autoloader-cache-refresh
Open

Make the class-loader cache build-time and add a loader debug page#35
darylldoyle wants to merge 2 commits into
developfrom
fix/issue-30-autoloader-cache-refresh

Conversation

@darylldoyle

@darylldoyle darylldoyle commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

Summary

Reworks the class-loader cache so it is generated at build time and only ever read at
runtime, and adds a hidden admin page for inspecting loader caches on a running site.

Closes #30.

Screenshots

Loader debug page — admin.php?page=tenup-framework-loaders:

CleanShot 2026-06-29 at 09 58 57

⚠️ Breaking change (targets a major release)

The runtime no longer generates the cache automatically. On 1.x the first
production/staging request wrote the cache and later requests read it forever — the
stale-cache bug behind #30. Now the framework reads a pre-built cache if present and
discovers live otherwise; it never writes. Caching becomes opt-in via a build step.

Existing installs that upgrade without adding the build step keep working but run
uncached. See the new Upgrade Guide.

Removed: should_use_cache(), the production/staging gating, and VIP_GO_APP_ENVIRONMENT
handling. TENUP_FRAMEWORK_DISABLE_CLASS_CACHE now means "ignore any shipped cache and
discover live." Cache filename bumped to class-loader-cache-v2.php so 1.x caches are
ignored after upgrade.

What's included

Build-time cache

  • ReadOnlyFileDiscoverCacheDriver — read-only Spatie driver (no-op writes, no mkdir).
  • ModuleInitialization::generate_cache() plus bin/tenup-framework-generate-class-cache
    (runs without bootstrapping WordPress) and a composer generate-class-cache alias.

Loader debug page

  • Hidden, admin-only page at admin.php?page=tenup-framework-loaders (manage_options).
  • Aggregates every loader cache across all framework copies via the
    tenup_framework_debug_loaders filter (works across php-scoped / multi-version copies).
  • Per loader: a colour-coded status badge, owner, cache path/detail, legacy-file warnings,
    a collapsible list of loaded classes (with resolved files), and an on-demand
    live-vs-cache staleness check.
  • Recording and the page are gated behind is_admin(), so the front end loads none of it.
    Read-only; disable via tenup_framework_enable_loader_debug / TENUP_FRAMEWORK_DISABLE_LOADER_DEBUG.

Docs

  • New: Build-and-Deployment.md (CLI + GitHub Actions/GitLab CI/CircleCI examples + per-package
    model), Debugging.md, Upgrade-Guide.md.
  • Rewrote the cache sections of Autoloading.md and Modules-and-Initialization.md.

Testing

  • composer lint (PHPCS 10up), composer static (PHPStan level 10), and composer test
    (37 tests) all pass.
  • Coverage includes the read-only driver, generate/read paths, admin vs front-end dispatch,
    the debug registry/page, and the staleness diff.

Class-loader cache (breaking — targets a major release):
- Runtime is now read-only. ModuleInitialization reads a pre-built cache if
  present and discovers live otherwise; it never writes the cache, removing the
  stale-cache failure mode from #30.
- Caching is opt-in, produced at build time via a shipped
  `vendor/bin/tenup-framework-generate-class-cache` command (no WordPress
  required) and a `composer generate-class-cache` alias in this repo.
- Removed should_use_cache(), the production/staging gating, and
  VIP_GO_APP_ENVIRONMENT handling. TENUP_FRAMEWORK_DISABLE_CLASS_CACHE now forces
  live discovery. Cache filename bumped to class-loader-cache-v2.php so caches
  written by 1.x are ignored after upgrade rather than served stale.

Loader debug page:
- Hidden, admin-only page (admin.php?page=tenup-framework-loaders, manage_options)
  aggregating every loader cache across all framework copies via the
  tenup_framework_debug_loaders filter, with an on-demand live-vs-cache staleness
  check. Recording and the page are gated behind is_admin() so the front end pays
  nothing. Read-only; disable via the tenup_framework_enable_loader_debug filter
  or the TENUP_FRAMEWORK_DISABLE_LOADER_DEBUG constant.

Docs and tests:
- New docs: Build-and-Deployment, Debugging, Upgrade-Guide. Rewrote the cache
  sections of Autoloading and Modules-and-Initialization.
- Tests cover the read-only driver, generate/read paths, admin vs front-end
  dispatch, the debug registry/page, and the staleness diff. phpcs, phpstan
  (level 10) and phpunit all green.

Refs #30
- Card per loader with a colour-coded status badge (in use / uncached /
  disabled / present-but-unused) and an explanatory notice.
- Move the loaded class list into a collapsible <details> accordion so a long
  list no longer makes the page huge.
- Surface uncached as a noticeable amber state (valid default, not an error);
  reserve red for genuine problems (present-but-unused, stale, legacy files).
- Self-contained scoped styles using the WP admin palette.
@darylldoyle darylldoyle marked this pull request as ready for review June 29, 2026 08:59
@darylldoyle darylldoyle added this to the 2.0.0 milestone Jun 29, 2026
@darylldoyle darylldoyle self-assigned this Jun 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Autoloader cache not refreshing

1 participant