From a909b3fdf0381dbbfd9f327ff6706be43bf35b62 Mon Sep 17 00:00:00 2001 From: Dovid Levine Date: Sat, 16 Aug 2025 13:35:44 +0300 Subject: [PATCH 1/3] dev: use `WP_Abilities_Registry::$instance` instead of adding a new `global` --- .../class-wp-abilities-registry.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/includes/abilities-api/class-wp-abilities-registry.php b/includes/abilities-api/class-wp-abilities-registry.php index 0e72925a..7e34eb63 100644 --- a/includes/abilities-api/class-wp-abilities-registry.php +++ b/includes/abilities-api/class-wp-abilities-registry.php @@ -18,6 +18,14 @@ * @access private */ final class WP_Abilities_Registry { + /** + * The singleton instance of the registry. + * + * @since 0.1.0 + * @var ?self + */ + private static ?self $instance = null; + /** * Holds the registered abilities. * @@ -248,11 +256,9 @@ public function get_registered( string $name ): ?WP_Ability { * @return \WP_Abilities_Registry The main registry instance. */ public static function get_instance(): self { - /** @var \WP_Abilities_Registry $wp_abilities */ - global $wp_abilities; + if ( null === self::$instance ) { + self::$instance = new self(); - if ( empty( $wp_abilities ) ) { - $wp_abilities = new self(); /** * Fires when preparing abilities registry. * @@ -263,10 +269,10 @@ public static function get_instance(): self { * * @param \WP_Abilities_Registry $instance Abilities registry object. */ - do_action( 'abilities_api_init', $wp_abilities ); + do_action( 'abilities_api_init', self::$instance ); } - return $wp_abilities; + return self::$instance; } /** From d401e8c306486b19ed6d6fd02dde5a45142158e9 Mon Sep 17 00:00:00 2001 From: Dovid Levine Date: Mon, 18 Aug 2025 23:27:25 +0300 Subject: [PATCH 2/3] fix: use PHP7.2 safe syntax --- includes/abilities-api/class-wp-abilities-registry.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abilities-api/class-wp-abilities-registry.php b/includes/abilities-api/class-wp-abilities-registry.php index 7e34eb63..1df712a1 100644 --- a/includes/abilities-api/class-wp-abilities-registry.php +++ b/includes/abilities-api/class-wp-abilities-registry.php @@ -24,7 +24,7 @@ final class WP_Abilities_Registry { * @since 0.1.0 * @var ?self */ - private static ?self $instance = null; + private static $instance = null; /** * Holds the registered abilities. From 737bd1d42eb677161c3d1a9c231e9186b3eed1a5 Mon Sep 17 00:00:00 2001 From: Dovid Levine Date: Mon, 18 Aug 2025 23:27:56 +0300 Subject: [PATCH 3/3] tests: use reflection to reset singleton --- .../unit/abilities-api/wpRegisterAbility.php | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/unit/abilities-api/wpRegisterAbility.php b/tests/unit/abilities-api/wpRegisterAbility.php index e3709a12..f1337aba 100644 --- a/tests/unit/abilities-api/wpRegisterAbility.php +++ b/tests/unit/abilities-api/wpRegisterAbility.php @@ -43,10 +43,10 @@ public function set_up(): void { 'description' => 'The result of adding the two numbers.', 'required' => true, ), - 'execute_callback' => function ( array $input ): int { + 'execute_callback' => static function ( array $input ): int { return $input['a'] + $input['b']; }, - 'permission_callback' => function (): bool { + 'permission_callback' => static function (): bool { return true; }, 'meta' => array( @@ -60,9 +60,11 @@ public function set_up(): void { */ public function tear_down(): void { foreach ( wp_get_abilities() as $ability ) { - if ( str_starts_with( $ability->get_name(), 'test/' ) ) { - wp_unregister_ability( $ability->get_name() ); + if ( ! str_starts_with( $ability->get_name(), 'test/' ) ) { + continue; } + + wp_unregister_ability( $ability->get_name() ); } parent::tear_down(); @@ -147,7 +149,7 @@ public function test_register_valid_ability(): void { public function test_register_ability_no_permissions(): void { do_action( 'abilities_api_init' ); - self::$test_ability_properties['permission_callback'] = function (): bool { + self::$test_ability_properties['permission_callback'] = static function (): bool { return false; }; $result = wp_register_ability( self::$test_ability_name, self::$test_ability_properties ); @@ -200,7 +202,7 @@ public function test_execute_ability_no_input_schema_match(): void { public function test_execute_ability_no_output_schema_match(): void { do_action( 'abilities_api_init' ); - self::$test_ability_properties['execute_callback'] = function (): bool { + self::$test_ability_properties['execute_callback'] = static function (): bool { return true; }; $result = wp_register_ability( self::$test_ability_name, self::$test_ability_properties ); @@ -243,7 +245,7 @@ public function test_permission_callback_receives_input(): void { do_action( 'abilities_api_init' ); $received_input = null; - self::$test_ability_properties['permission_callback'] = function ( array $input ) use ( &$received_input ): bool { + self::$test_ability_properties['permission_callback'] = static function ( array $input ) use ( &$received_input ): bool { $received_input = $input; // Allow only if 'a' is greater than 'b' return $input['a'] > $input['b']; @@ -310,25 +312,26 @@ public function test_get_existing_ability() { $name = self::$test_ability_name; $properties = self::$test_ability_properties; - $callback = function ( $instance ) use ( $name, $properties ) { + $callback = static function ( $instance ) use ( $name, $properties ) { wp_register_ability( $name, $properties ); }; add_action( 'abilities_api_init', $callback ); - // Temporarily set `$wp_abilities` to null to ensure `wp_get_ability()` triggers `abilities_api_init` action. - $old_wp_abilities = $wp_abilities; - $wp_abilities = null; + // Reset the Registry, to ensure it's empty before the test. + $registry_reflection = new ReflectionClass( WP_Abilities_Registry::class ); + $instance_prop = $registry_reflection->getProperty( 'instance' ); + $instance_prop->setAccessible( true ); + $instance_prop->setValue( null ); $result = wp_get_ability( $name ); - $wp_abilities = $old_wp_abilities; - remove_action( 'abilities_api_init', $callback ); $this->assertEquals( new WP_Ability( $name, $properties ), - $result + $result, + 'Ability does not share expected properties.' ); }