Changeset 61983
- Timestamp:
- 03/12/2026 07:54:50 AM (35 hours ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
src/wp-includes/class-wp-connector-registry.php (modified) (4 diffs)
-
src/wp-includes/connectors.php (modified) (8 diffs)
-
tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-connector-registry.php
r61943 r61983 17 17 * 18 18 * @phpstan-type Connector array{ 19 * name: string,20 * description: string,21 * logo_url?: string|null,22 * type: string,19 * name: non-empty-string, 20 * description: non-empty-string, 21 * logo_url?: non-empty-string, 22 * type: 'ai_provider', 23 23 * authentication: array{ 24 * method: string,25 * credentials_url?: string|null,26 * setting_name?: string24 * method: 'api_key'|'none', 25 * credentials_url?: non-empty-string, 26 * setting_name?: non-empty-string 27 27 * }, 28 28 * plugin?: array{ 29 * slug: string29 * slug: non-empty-string 30 30 * } 31 31 * } … … 63 63 * @type string $name Required. The connector's display name. 64 64 * @type string $description Optional. The connector's description. Default empty string. 65 * @type string |null $logo_url Optional. URL to the connector's logo image. Default null.65 * @type string $logo_url Optional. URL to the connector's logo image. 66 66 * @type string $type Required. The connector type. Currently, only 'ai_provider' is supported. 67 67 * @type array $authentication { 68 68 * Required. Authentication configuration. 69 69 * 70 * @type string $method Required. The authentication method: 'api_key' or 'none'.71 * @type string |null$credentials_url Optional. URL where users can obtain API credentials.70 * @type string $method Required. The authentication method: 'api_key' or 'none'. 71 * @type string $credentials_url Optional. URL where users can obtain API credentials. 72 72 * } 73 * @type array $plugin {73 * @type array $plugin { 74 74 * Optional. Plugin data for install/activate UI. 75 75 * … … 159 159 160 160 if ( 'api_key' === $args['authentication']['method'] ) { 161 $connector['authentication']['credentials_url'] = $args['authentication']['credentials_url'] ?? null; 162 $connector['authentication']['setting_name'] = "connectors_ai_{$id}_api_key"; 161 if ( ! empty( $args['authentication']['credentials_url'] ) && is_string( $args['authentication']['credentials_url'] ) ) { 162 $connector['authentication']['credentials_url'] = $args['authentication']['credentials_url']; 163 } 164 $connector['authentication']['setting_name'] = "connectors_ai_{$id}_api_key"; 163 165 } 164 166 … … 207 209 * @see wp_get_connectors() 208 210 * 209 * @return array<string, array> The array of registered connectors keyed by connector ID. 211 * @return array Connector settings keyed by connector ID. 212 * 210 213 * @phpstan-return array<string, Connector> 211 214 */ -
trunk/src/wp-includes/connectors.php
r61943 r61983 38 38 * 39 39 * @param string $id The connector identifier. 40 * @return array|null The registered connector data, or null if not registered. 40 * @return array|null { 41 * Connector data, or null if not registered. 42 * 43 * @type string $name The connector's display name. 44 * @type string $description The connector's description. 45 * @type string $logo_url Optional. URL to the connector's logo image. 46 * @type string $type The connector type. Currently, only 'ai_provider' is supported. 47 * @type array $authentication { 48 * Authentication configuration. When method is 'api_key', includes 49 * credentials_url and setting_name. When 'none', only method is present. 50 * 51 * @type string $method The authentication method: 'api_key' or 'none'. 52 * @type string $credentials_url Optional. URL where users can obtain API credentials. 53 * @type string $setting_name Optional. The setting name for the API key. 54 * } 55 * @type array $plugin { 56 * Optional. Plugin data for install/activate UI. 57 * 58 * @type string $slug The WordPress.org plugin slug. 59 * } 60 * } 61 * @phpstan-return ?array{ 62 * name: non-empty-string, 63 * description: non-empty-string, 64 * logo_url?: non-empty-string, 65 * type: 'ai_provider', 66 * authentication: array{ 67 * method: 'api_key'|'none', 68 * credentials_url?: non-empty-string, 69 * setting_name?: non-empty-string 70 * }, 71 * plugin?: array{ 72 * slug: non-empty-string 73 * } 74 * } 41 75 */ 42 76 function wp_get_connector( string $id ): ?array { … … 56 90 * @see WP_Connector_Registry::get_all_registered() 57 91 * 58 * @return array[] An array of registered connectors keyed by connector ID. 92 * @return array { 93 * Connector settings keyed by connector ID. 94 * 95 * @type array ...$0 { 96 * Data for a single connector. 97 * 98 * @type string $name The connector's display name. 99 * @type string $description The connector's description. 100 * @type string $logo_url Optional. URL to the connector's logo image. 101 * @type string $type The connector type. Currently, only 'ai_provider' is supported. 102 * @type array $authentication { 103 * Authentication configuration. When method is 'api_key', includes 104 * credentials_url and setting_name. When 'none', only method is present. 105 * 106 * @type string $method The authentication method: 'api_key' or 'none'. 107 * @type string $credentials_url Optional. URL where users can obtain API credentials. 108 * @type string $setting_name Optional. The setting name for the API key. 109 * } 110 * @type array $plugin { 111 * Optional. Plugin data for install/activate UI. 112 * 113 * @type string $slug The WordPress.org plugin slug. 114 * } 115 * } 116 * } 117 * @phpstan-return array<string, array{ 118 * name: non-empty-string, 119 * description: non-empty-string, 120 * logo_url?: non-empty-string, 121 * type: 'ai_provider', 122 * authentication: array{ 123 * method: 'api_key'|'none', 124 * credentials_url?: non-empty-string, 125 * setting_name?: non-empty-string 126 * }, 127 * plugin?: array{ 128 * slug: non-empty-string 129 * } 130 * }> 59 131 */ 60 132 function wp_get_connectors(): array { … … 326 398 327 399 /** 328 * Gets the registered connector settings.329 *330 * @since 7.0.0331 * @access private332 *333 * @return array {334 * Connector settings keyed by connector ID.335 *336 * @type array ...$0 {337 * Data for a single connector.338 *339 * @type string $name The connector's display name.340 * @type string $description The connector's description.341 * @type string $type The connector type. Currently, only 'ai_provider' is supported.342 * @type array $plugin Optional. Plugin data for install/activate UI.343 * @type string $slug The WordPress.org plugin slug.344 * }345 * @type array $authentication {346 * Authentication configuration. When method is 'api_key', includes347 * credentials_url and setting_name. When 'none', only method is present.348 *349 * @type string $method The authentication method: 'api_key' or 'none'.350 * @type string|null $credentials_url Optional. URL where users can obtain API credentials.351 * @type string $setting_name Optional. The setting name for the API key.352 * }353 * }354 * }355 */356 function _wp_connectors_get_connector_settings(): array {357 $connectors = wp_get_connectors();358 ksort( $connectors );359 return $connectors;360 }361 362 /**363 400 * Validates connector API keys in the REST response when explicitly requested. 364 401 * … … 397 434 } 398 435 399 foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {436 foreach ( wp_get_connectors() as $connector_id => $connector_data ) { 400 437 $auth = $connector_data['authentication']; 401 438 if ( 'ai_provider' !== $connector_data['type'] || 'api_key' !== $auth['method'] || empty( $auth['setting_name'] ) ) { … … 432 469 $ai_registry = AiClient::defaultRegistry(); 433 470 434 foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {471 foreach ( wp_get_connectors() as $connector_id => $connector_data ) { 435 472 $auth = $connector_data['authentication']; 436 473 if ( 'ai_provider' !== $connector_data['type'] || 'api_key' !== $auth['method'] || empty( $auth['setting_name'] ) ) { … … 486 523 try { 487 524 $ai_registry = AiClient::defaultRegistry(); 488 foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {525 foreach ( wp_get_connectors() as $connector_id => $connector_data ) { 489 526 if ( 'ai_provider' !== $connector_data['type'] ) { 490 527 continue; … … 522 559 * @access private 523 560 * 524 * @param array $data Existing script module data.525 * @return array Script module data with connectors added.561 * @param array<string, mixed> $data Existing script module data. 562 * @return array<string, mixed> Script module data with connectors added. 526 563 */ 527 564 function _wp_connectors_get_connector_script_module_data( array $data ): array { 528 565 $connectors = array(); 529 foreach ( _wp_connectors_get_connector_settings() as $connector_id => $connector_data ) {566 foreach ( wp_get_connectors() as $connector_id => $connector_data ) { 530 567 $auth = $connector_data['authentication']; 531 568 $auth_out = array( 'method' => $auth['method'] ); … … 549 586 $connectors[ $connector_id ] = $connector_out; 550 587 } 588 ksort( $connectors ); 551 589 $data['connectors'] = $connectors; 552 590 return $data; -
trunk/tests/phpunit/tests/connectors/wpConnectorsGetConnectorSettings.php
r61943 r61983 4 4 5 5 /** 6 * Tests for _wp_connectors_get_connector_settings().6 * Tests for wp_get_connectors(). 7 7 * 8 8 * @group connectors 9 * @covers :: _wp_connectors_get_connector_settings9 * @covers ::wp_get_connectors 10 10 */ 11 class Tests_Connectors_Wp ConnectorsGetConnectorSettings extends WP_UnitTestCase {11 class Tests_Connectors_WpGetConnectors extends WP_UnitTestCase { 12 12 13 13 use WP_AI_Client_Mock_Provider_Trait; … … 16 16 * Registers the mock provider once before any tests in this class run. 17 17 */ 18 public static function set_up_before_class() {18 public static function set_up_before_class(): void { 19 19 parent::set_up_before_class(); 20 20 self::register_mock_connectors_provider(); … … 24 24 * Unregisters the mock provider setting added by `init`. 25 25 */ 26 public static function tear_down_after_class() {26 public static function tear_down_after_class(): void { 27 27 self::unregister_mock_connector_setting(); 28 28 parent::tear_down_after_class(); … … 32 32 * @ticket 64730 33 33 */ 34 public function test_returns_expected_connector_keys() {35 $connectors = _wp_connectors_get_connector_settings();34 public function test_returns_expected_connector_keys(): void { 35 $connectors = wp_get_connectors(); 36 36 37 37 $this->assertArrayHasKey( 'google', $connectors ); … … 45 45 * @ticket 64730 46 46 */ 47 public function test_each_connector_has_required_fields() {48 $connectors = _wp_connectors_get_connector_settings();47 public function test_each_connector_has_required_fields(): void { 48 $connectors = wp_get_connectors(); 49 49 50 50 $this->assertNotEmpty( $connectors, 'Connector settings should not be empty.' ); … … 68 68 * @ticket 64730 69 69 */ 70 public function test_api_key_connectors_have_setting_name_and_credentials_url() {71 $connectors = _wp_connectors_get_connector_settings();70 public function test_api_key_connectors_have_setting_name_and_credentials_url(): void { 71 $connectors = wp_get_connectors(); 72 72 $api_key_count = 0; 73 73 … … 82 82 $this->assertSame( 83 83 "connectors_ai_{$connector_id}_api_key", 84 $connector_data['authentication']['setting_name'] ,84 $connector_data['authentication']['setting_name'] ?? null, 85 85 "Connector '{$connector_id}' setting_name does not match expected format." 86 86 ); 87 $this->assertArrayHasKey( 'credentials_url', $connector_data['authentication'], "Connector '{$connector_id}' authentication is missing 'credentials_url'." );88 87 } 89 88 … … 94 93 * @ticket 64730 95 94 */ 96 public function test_featured_provider_names_match_expected() {97 $connectors = _wp_connectors_get_connector_settings();95 public function test_featured_provider_names_match_expected(): void { 96 $connectors = wp_get_connectors(); 98 97 99 98 $this->assertSame( 'Google', $connectors['google']['name'] ); … … 105 104 * @ticket 64730 106 105 */ 107 public function test_includes_registered_provider_from_registry() {108 $connectors = _wp_connectors_get_connector_settings();106 public function test_includes_registered_provider_from_registry(): void { 107 $connectors = wp_get_connectors(); 109 108 $mock = $connectors['mock_connectors_test']; 110 109 … … 113 112 $this->assertSame( 'ai_provider', $mock['type'] ); 114 113 $this->assertSame( 'api_key', $mock['authentication']['method'] ); 115 $this->assertNull( $mock['authentication']['credentials_url'] ); 116 $this->assertSame( 'connectors_ai_mock_connectors_test_api_key', $mock['authentication']['setting_name'] ); 117 } 118 119 /** 120 * @ticket 64730 121 */ 122 public function test_connectors_are_sorted_alphabetically() { 123 $connectors = _wp_connectors_get_connector_settings(); 124 $keys = array_keys( $connectors ); 125 $sorted = $keys; 126 sort( $sorted ); 127 128 $this->assertSame( $sorted, $keys, 'Connectors should be sorted alphabetically by ID.' ); 114 $this->assertNull( $mock['authentication']['credentials_url'] ?? null ); 115 $this->assertSame( 'connectors_ai_mock_connectors_test_api_key', $mock['authentication']['setting_name'] ?? null ); 129 116 } 130 117 }
Note: See TracChangeset
for help on using the changeset viewer.