From 0bb0fbc16fdda1f963dfcb3e02d7d0d5d0bcea7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 02:53:59 +0000 Subject: [PATCH 1/3] Update wp-cli/wp-cli-tests requirement from ^4 to ^5 Updates the requirements on [wp-cli/wp-cli-tests](https://github.com/wp-cli/wp-cli-tests) to permit the latest version. - [Release notes](https://github.com/wp-cli/wp-cli-tests/releases) - [Commits](https://github.com/wp-cli/wp-cli-tests/compare/v4.0.0...v5.0.0) --- updated-dependencies: - dependency-name: wp-cli/wp-cli-tests dependency-version: 5.0.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e9d4435a..76cecff8 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "wp-cli/wp-cli": "^2.12" }, "require-dev": { - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "config": { "process-timeout": 7200, From f172197a144b10fa39e76319c73529c56d2b2c82 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 4 Jul 2025 10:53:58 +0200 Subject: [PATCH 2/3] Update Composer config --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 76cecff8..00792969 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,8 @@ "sort-packages": true, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true, - "johnpbloch/wordpress-core-installer": true + "johnpbloch/wordpress-core-installer": true, + "phpstan/extension-installer": true }, "lock": false }, @@ -59,12 +60,14 @@ "behat-rerun": "rerun-behat-tests", "lint": "run-linter-tests", "phpcs": "run-phpcs-tests", + "phpstan": "run-phpstan-tests", "phpunit": "run-php-unit-tests", "phpcbf": "run-phpcbf-cleanup", "prepare-tests": "install-package-tests", "test": [ "@lint", "@phpcs", + "@phpstan", "@phpunit", "@behat" ] From 01f359bae2f8247cd643d53d4b869921ee69e5ec Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 4 Jul 2025 10:55:54 +0200 Subject: [PATCH 3/3] PHPStan level 9 --- phpstan.neon.dist | 13 +++++++++++++ src/Capabilities_Command.php | 2 +- src/Role_Command.php | 26 ++++++++++++++++---------- 3 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 phpstan.neon.dist diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 00000000..ca9e0ea4 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,13 @@ +parameters: + level: 9 + paths: + - src + - role-command.php + scanDirectories: + - vendor/wp-cli/wp-cli/php + scanFiles: + - vendor/php-stubs/wordpress-stubs/wordpress-stubs.php + treatPhpDocTypesAsCertain: false + ignoreErrors: + - identifier: missingType.parameter + - identifier: missingType.return diff --git a/src/Capabilities_Command.php b/src/Capabilities_Command.php index e27a0cb1..97db2033 100644 --- a/src/Capabilities_Command.php +++ b/src/Capabilities_Command.php @@ -26,7 +26,7 @@ class Capabilities_Command extends WP_CLI_Command { /** * List of available fields. * - * @var array + * @var array */ private $fields = [ 'name' ]; diff --git a/src/Role_Command.php b/src/Role_Command.php index 0fe78d58..a029d2a3 100644 --- a/src/Role_Command.php +++ b/src/Role_Command.php @@ -42,14 +42,14 @@ class Role_Command extends WP_CLI_Command { /** * List of available fields. * - * @var array + * @var array */ private $fields = [ 'name', 'role' ]; /** * Default roles as provided by WordPress Core. * - * @var array + * @var array */ private $roles = [ 'administrator', 'editor', 'author', 'contributor', 'subscriber' ]; @@ -347,13 +347,17 @@ public function reset( $args, $assoc_args ) { remove_role( $role ); } + /** + * @var array $preserve + */ + // Put back all default roles and capabilities. populate_roles(); // Restore the preserved roles. foreach ( $preserve as $k => $roleobj ) { // Re-remove after populating. - if ( is_a( $roleobj, 'WP_Role' ) ) { + if ( $roleobj instanceof \WP_Role ) { remove_role( $roleobj->name ); add_role( $roleobj->name, ucwords( $roleobj->name ), $roleobj->capabilities ); } else { @@ -373,13 +377,15 @@ public function reset( $args, $assoc_args ) { if ( $after[ $role_key ] != $before[ $role_key ] ) { ++$num_reset; $before_capabilities = isset( $before[ $role_key ] ) ? $before[ $role_key ]->capabilities : []; - $restored_cap = array_diff_key( $after[ $role_key ]->capabilities, $before_capabilities ); - $removed_cap = array_diff_key( $before_capabilities, $after[ $role_key ]->capabilities ); - $restored_cap_count = count( $restored_cap ); - $removed_cap_count = count( $removed_cap ); - $restored_text = ( 1 === $restored_cap_count ) ? '%d capability' : '%d capabilities'; - $removed_text = ( 1 === $removed_cap_count ) ? '%d capability' : '%d capabilities'; - $message = "Restored {$restored_text} to and removed {$removed_text} from '%s' role."; + // @phpstan-ignore property.nonObject + $restored_cap = array_diff_key( $after[ $role_key ]->capabilities, $before_capabilities ); + // @phpstan-ignore property.nonObject + $removed_cap = array_diff_key( $before_capabilities, $after[ $role_key ]->capabilities ); + $restored_cap_count = count( $restored_cap ); + $removed_cap_count = count( $removed_cap ); + $restored_text = ( 1 === $restored_cap_count ) ? '%d capability' : '%d capabilities'; + $removed_text = ( 1 === $removed_cap_count ) ? '%d capability' : '%d capabilities'; + $message = "Restored {$restored_text} to and removed {$removed_text} from '%s' role."; WP_CLI::log( sprintf( $message, $restored_cap_count, $removed_cap_count, $role_key ) ); } else { WP_CLI::log( "No changes necessary for '{$role_key}' role." );