Skip to content

Commit 9f6bdce

Browse files
committed
fix: expose provider preparation errors
AI assistance: gpt-5.6-sol via OpenCode added bounded provider readiness diagnostics and tests. Chris Huber remains responsible for every line.
1 parent a527aa2 commit 9f6bdce

2 files changed

Lines changed: 4 additions & 1 deletion

File tree

lib/fixture-matrix/steps/recipe-builder.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ function providerReadinessSteps(fixture, plan) {
499499
const encodedBlocks = Buffer.from(JSON.stringify(requirements.required_block_types), 'utf8').toString('base64');
500500
const encodedClasses = Buffer.from(JSON.stringify(requirements.required_classes), 'utf8').toString('base64');
501501
const encodedCallbacks = Buffer.from(JSON.stringify(requirements.preparation_callbacks), 'utf8').toString('base64');
502-
const code = `$required_blocks = json_decode(base64_decode('${encodedBlocks}'), true); $required_classes = json_decode(base64_decode('${encodedClasses}'), true); $preparation_callbacks = json_decode(base64_decode('${encodedCallbacks}'), true); $preparation_errors = array(); foreach ($preparation_callbacks as $callback) { if (!is_array($callback) || 2 !== count($callback) || !is_string($callback[0]) || !is_string($callback[1]) || !is_callable($callback)) { array_push($preparation_errors, 'invalid_callback'); continue; } $prepared = call_user_func($callback); if ((function_exists('is_wp_error') && is_wp_error($prepared)) || false === $prepared) { array_push($preparation_errors, implode('::', $callback)); } } $blocks = WP_Block_Type_Registry::get_instance(); $missing_blocks = array(); foreach ($required_blocks as $name) { if (!$blocks->is_registered($name)) { array_push($missing_blocks, $name); } } $missing_classes = array(); foreach ($required_classes as $name) { if (!class_exists($name)) { array_push($missing_classes, $name); } } $ready = empty($preparation_errors) && empty($missing_blocks) && empty($missing_classes); WP_CLI::line(wp_json_encode(array('schema'=>'static-site-importer/provider-readiness/v1','ready'=>$ready,'preparation_errors'=>$preparation_errors,'missing_block_types'=>$missing_blocks,'missing_classes'=>$missing_classes,'required_block_types'=>$required_blocks,'required_classes'=>$required_classes))); if (!$ready) { WP_CLI::error('Required provider requirements are not available.'); }`;
502+
const code = `$required_blocks = json_decode(base64_decode('${encodedBlocks}'), true); $required_classes = json_decode(base64_decode('${encodedClasses}'), true); $preparation_callbacks = json_decode(base64_decode('${encodedCallbacks}'), true); $preparation_errors = array(); foreach ($preparation_callbacks as $callback) { if (!is_array($callback) || 2 !== count($callback) || !is_string($callback[0]) || !is_string($callback[1]) || !is_callable($callback)) { array_push($preparation_errors, array('callback'=>'invalid_callback','result'=>'invalid')); continue; } $callback_name = implode('::', $callback); $prepared = call_user_func($callback); if (function_exists('is_wp_error') && is_wp_error($prepared)) { $error_data = $prepared->get_error_data(); $bounded_data = array(); if (is_array($error_data)) { if (isset($error_data['missing']) && is_array($error_data['missing'])) { $bounded_data['missing'] = array_slice(array_values($error_data['missing']), 0, 20); } if (isset($error_data['details']) && is_array($error_data['details'])) { $bounded_data['details'] = array_slice($error_data['details'], 0, 20, true); } } array_push($preparation_errors, array('callback'=>$callback_name,'result'=>'wp_error','code'=>(string) $prepared->get_error_code(),'data'=>$bounded_data)); } elseif (false === $prepared) { array_push($preparation_errors, array('callback'=>$callback_name,'result'=>'false')); } } $blocks = WP_Block_Type_Registry::get_instance(); $missing_blocks = array(); foreach ($required_blocks as $name) { if (!$blocks->is_registered($name)) { array_push($missing_blocks, $name); } } $missing_classes = array(); foreach ($required_classes as $name) { if (!class_exists($name)) { array_push($missing_classes, $name); } } $ready = empty($preparation_errors) && empty($missing_blocks) && empty($missing_classes); WP_CLI::line(wp_json_encode(array('schema'=>'static-site-importer/provider-readiness/v1','ready'=>$ready,'preparation_errors'=>$preparation_errors,'missing_block_types'=>$missing_blocks,'missing_classes'=>$missing_classes,'required_block_types'=>$required_blocks,'required_classes'=>$required_classes))); if (!$ready) { WP_CLI::error('Required provider requirements are not available.'); }`;
503503
const transportSafeCode = `eval(base64_decode('${Buffer.from(code, 'utf8').toString('base64')}'));`;
504504
return [{ command: 'wordpress.wp-cli', args: [`command=eval ${shellToken(transportSafeCode)}`], metadata: fixtureStepMetadata(fixture, 'provider-readiness') }];
505505
}

tools/fixture-matrix.test.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,9 @@ test('emits provider readiness only for fixture plans that declare requirements'
833833
const transportedCode = Buffer.from(decoded.stdout.match(/base64_decode\('([^']+)'\)/)?.[1] || '', 'base64').toString('utf8');
834834
assert.match(transportedCode, /array_push\(\$missing_blocks, \$name\)/);
835835
assert.doesNotMatch(transportedCode, /\$missing_blocks\[\]/);
836+
assert.match(transportedCode, /get_error_code\(\)/);
837+
assert.match(transportedCode, /'result'=>'wp_error'/);
838+
assert.match(transportedCode, /array_slice\(array_values\(\$error_data\['missing'\]\), 0, 20\)/);
836839
const encodedRequirements = [...transportedCode.matchAll(/base64_decode\('([^']+)'\)/g)].map((match) => match[1]);
837840
assert.deepEqual(JSON.parse(Buffer.from(encodedRequirements[0], 'base64').toString('utf8')), ['jetpack/contact-form', 'jetpack/field-email']);
838841
assert.deepEqual(JSON.parse(Buffer.from(encodedRequirements[2], 'base64').toString('utf8')), [['Static_Site_Importer_Form_Seeder', 'prepare_jetpack_forms_runtime']]);

0 commit comments

Comments
 (0)