Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion inc/Abilities/CodeTaskAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ public function __construct() {
return;
}

add_action( 'wp_abilities_api_init', array( $this, 'register' ) );
if ( function_exists( 'doing_action' ) && ( doing_action( 'wp_abilities_api_init' ) || did_action( 'wp_abilities_api_init' ) ) ) {
$this->register();
} else {
add_action( 'wp_abilities_api_init', array( $this, 'register' ) );
}
self::$registered = true;
}

Expand Down
4 changes: 2 additions & 2 deletions inc/Abilities/GitHubAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -1324,9 +1324,9 @@ private function registerAbilities(): void {
);
};

if ( doing_action( 'wp_abilities_api_init' ) ) {
if ( doing_action( 'wp_abilities_api_init' ) || did_action( 'wp_abilities_api_init' ) ) {
$register_callback();
} elseif ( ! did_action( 'wp_abilities_api_init' ) ) {
} else {
add_action( 'wp_abilities_api_init', $register_callback );
}
}
Expand Down
4 changes: 2 additions & 2 deletions inc/Abilities/GitSyncAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -303,9 +303,9 @@ private function registerAbilities(): void {
);
};

if ( doing_action( 'wp_abilities_api_init' ) ) {
if ( doing_action( 'wp_abilities_api_init' ) || did_action( 'wp_abilities_api_init' ) ) {
$register_callback();
} elseif ( ! did_action( 'wp_abilities_api_init' ) ) {
} else {
add_action( 'wp_abilities_api_init', $register_callback );
}
}
Expand Down
2 changes: 1 addition & 1 deletion inc/Abilities/WordPressRuntimeAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ private function registerAbilities(): void {
);
};

if ( function_exists( 'doing_action' ) && doing_action( 'wp_abilities_api_init' ) ) {
if ( function_exists( 'doing_action' ) && ( doing_action( 'wp_abilities_api_init' ) || did_action( 'wp_abilities_api_init' ) ) ) {
$register_callback();
return;
}
Expand Down
4 changes: 2 additions & 2 deletions inc/Abilities/WorkspaceAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -2159,9 +2159,9 @@ private function registerAbilities(): void {
}
};

if ( doing_action( 'wp_abilities_api_init' ) ) {
if ( doing_action( 'wp_abilities_api_init' ) || did_action( 'wp_abilities_api_init' ) ) {
$register_callback();
} elseif ( ! did_action( 'wp_abilities_api_init' ) ) {
} else {
add_action( 'wp_abilities_api_init', $register_callback );
}
}
Expand Down
82 changes: 82 additions & 0 deletions tests/smoke-late-ability-registration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php
/**
* Smoke test for ability classes instantiated after wp_abilities_api_init.
*
* Run: php tests/smoke-late-ability-registration.php
*/

declare( strict_types=1 );

namespace DataMachine\Abilities {
class PermissionHelper {
public static function can_manage(): bool {
return true;
}
}
}

namespace DataMachineCode\Workspace {
class Workspace {
public const ARTIFACT_CLEANUP_DEFAULT_LIMIT = 100;
}
}

namespace {
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', sys_get_temp_dir() . '/data-machine-code-late-ability-registration/' );
}

if ( ! class_exists( 'WP_Ability' ) ) {
class WP_Ability {}
}

$GLOBALS['datamachine_code_registered_abilities'] = array();
$GLOBALS['datamachine_code_added_actions'] = array();

function wp_register_ability( string $name, array $definition ): void {
$GLOBALS['datamachine_code_registered_abilities'][ $name ] = $definition;
}

function doing_action( string $hook ): bool {
return false;
}

function did_action( string $hook ): int {
return 'wp_abilities_api_init' === $hook ? 1 : 0;
}

function add_action( string $hook, callable $callback, int $priority = 10 ): void {
$GLOBALS['datamachine_code_added_actions'][] = compact( 'hook', 'callback', 'priority' );
}

require __DIR__ . '/../inc/Abilities/WorkspaceAbilities.php';
require __DIR__ . '/../inc/Abilities/CodeTaskAbilities.php';

new \DataMachineCode\Abilities\WorkspaceAbilities();
new \DataMachineCode\Abilities\CodeTaskAbilities();

$failures = array();
$assert = static function ( string $label, bool $condition ) use ( &$failures ): void {
if ( $condition ) {
echo " ok {$label}\n";
return;
}

$failures[] = $label;
echo " fail {$label}\n";
};

echo "Data Machine Code late ability registration - smoke\n";

$assert( 'workspace-show registers after wp_abilities_api_init fired', isset( $GLOBALS['datamachine_code_registered_abilities']['datamachine/workspace-show'] ) );
$assert( 'workspace-worktree-add registers after wp_abilities_api_init fired', isset( $GLOBALS['datamachine_code_registered_abilities']['datamachine/workspace-worktree-add'] ) );
$assert( 'create-code-task registers after wp_abilities_api_init fired', isset( $GLOBALS['datamachine_code_registered_abilities']['datamachine/create-code-task'] ) );
$assert( 'late constructors do not add inert wp_abilities_api_init callbacks', array() === $GLOBALS['datamachine_code_added_actions'] );

if ( ! empty( $failures ) ) {
echo "\nFAIL: " . count( $failures ) . " assertion(s) failed\n";
exit( 1 );
}

echo "\nOK\n";
}
Loading