Skip to content

Plugin Directory: Tidy up Block Plugin Checker output and add tests#725

Closed
obenland wants to merge 2 commits into
WordPress:trunkfrom
obenland:update/block-plugin-checker-output
Closed

Plugin Directory: Tidy up Block Plugin Checker output and add tests#725
obenland wants to merge 2 commits into
WordPress:trunkfrom
obenland:update/block-plugin-checker-output

Conversation

@obenland

Copy link
Copy Markdown
Member

A cleanup pass over the Block Plugin Checker (the /developers/block-plugin-validator/ tool), plus test coverage.

Changes

  • Consistent output escaping. The checker builds result messages from values read out of the submitted plugin — the readme/header License, block names, namespaces, and file paths. Escape each of those where it's interpolated (esc_html() for text, esc_url() for the Trac/GitHub links), and add a small wp_kses() backstop in Block_Validator so only the markup the checks intentionally emit (<code>, <a>, …) survives rendering.
  • Readme parser consistency. The parser already runs sanitize_text() over name, short_description, and friends; apply it to the License header too (after the URL is split out, so the <https://…> autolink form still works).
  • get_browser_url() now returns an empty string instead of null when there's no repo (e.g. a ZIP upload), avoiding a PHP 8 deprecation from esc_url( null ).
  • Undefined-array-key guard in the results loop, which surfaced when a block.json issue is present with no other fatal errors.
  • Readme validator: one ignored_tags message now escapes its data like its sibling cases.
  • Local env: the plugin-directory after-start.sh page seeding is now idempotent (it was creating a fresh duplicate page set on every wp-env start).

Tests

Adds Block_Plugin_Checker_Test covering the individual checks (license, block tag, block name/namespace, block.json validity, PHP calls, single-parent) and message rendering, and extends Test_Readme_Parser for the license header. Full plugin-directory suite: 149 passing. New/changed files are clean under --standard=WordPress.

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings July 21, 2026 15:42

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Core Committers: Use this line as a base for the props when committing in SVN:

Props obenland.

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

obenland and others added 2 commits July 21, 2026 11:14
Escape checker result values (readme/header license, block names,
file paths) consistently at the point they are built into messages,
and add a kses backstop when the block validator renders them. Apply
the readme parser's existing sanitize_text() to the License header so
it matches the other headers.

Also make get_browser_url() return a string when there is no repo,
guard an undefined array key in the results loop, tidy an inconsistent
esc_html() call in the readme validator, and make the local page seed
idempotent.

Adds Block_Plugin_Checker_Test covering the individual checks and
message rendering.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UNnLdnE7etihGNvsWY1qGE
…y-up.

Follow-up to 78e1c8d.

Coding standards:
* Add the missing `@return` to `get_browser_url()`, whose contract changed
  from an implicit null to ''.
* Add `translators:` comments and order the placeholders on the strings
  this branch touched.
* Drop trailing whitespace from the lines this branch added.

Local env:
* `ensure_page()` now checks wp-cli's exit status and fails loudly instead
  of reporting success for an environment it never seeded. Assigning before
  piping into `tr` keeps the status from being masked by the pipeline.
* Reconcile title and parent, not just content, so a page left over from an
  earlier run is corrected rather than topped up.
* `--posts_per_page=1` stops a slug collision concatenating two IDs.
* Restore per-page progress output, on stderr so stdout stays the ID channel.
* Correct the rationale comment: `wp post create` suffixes the *new* post,
  leaving the canonical page with its original content.

Output:
* `bin/check-block.php` decodes entities and strips markup, so the CLI
  checker no longer prints "GPLv2 &amp; MIT" to a terminal.

Tests:
* Declare `@group block-validator` as `#[Group]`. PHPUnit 11 ignores a class
  doc-block once the class carries any attribute, so `--group block-validator`
  matched zero tests. Same one-line fix for the translation test.
* Cover `run_check_plugin_repo()` escaping across its rejection branches, the
  `get_browser_url()` empty-string contract, and the block.json `wp_kses()`
  allowlist, which was previously exercised with a markup-free fixture.
* Add a regression guard that escaping stays idempotent: esc_html() over an
  already-sanitized license must not produce `&amp;amp;`.
* Drop an overfit quote-count assertion and correct docblocks that described
  behavior the code does not have.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UNnLdnE7etihGNvsWY1qGE
@obenland
obenland force-pushed the update/block-plugin-checker-output branch from 09a9843 to f3c7624 Compare July 21, 2026 16:16
@bazza bazza closed this in e4acb16 Jul 21, 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.

2 participants