From f0c143a2bbb7a05de392fc646977a5dfee6df1a1 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Fri, 25 Aug 2023 15:23:53 -0400 Subject: [PATCH 01/16] [not verified] Enable block registration by specifying block.json path --- projects/packages/blocks/src/class-blocks.php | 66 ++++++++++++++++++- .../jetpack/class.jetpack-gutenberg.php | 9 +++ .../shared/register-jetpack-block.js | 18 +++-- 3 files changed, 85 insertions(+), 8 deletions(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index 9286bd4ebc36d..fda96f55dda61 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -27,7 +27,7 @@ class Blocks { * * @since 1.1.0 * - * @param string $slug Slug of the block. + * @param string $slug Slug of the block or absolute path to the directory containing the block.json file. * @param array $args { * Arguments that are passed into register_block_type. * See register_block_type for full list of arguments. @@ -40,6 +40,22 @@ class Blocks { * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public static function jetpack_register_block( $slug, $args = array() ) { + $block_type = null; + + // If the path to block.json is passed, find the slug in the file then create a block type + // object to register the block. + // Note: passing the path directly to register_block_type seems to loose the interactivity of + // the block once in the editor once it's out of focus. + if ( '/' === substr( $slug, 0, 1 ) ) { + $metadata = self::get_block_metadata_from_file( $slug ); + $name = self::get_block_name_from_metadata( $metadata ); + + if ( ! empty( $name ) ) { + $slug = $name; + $block_type = new \WP_Block_Type( $slug, array_merge( $metadata, $args ) ); + } + } + if ( 0 !== strpos( $slug, 'jetpack/' ) && ! strpos( $slug, '/' ) ) { _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); $slug = 'jetpack/' . $slug; @@ -99,7 +115,53 @@ function () use ( $feature_name, $method_name ) { } } - return register_block_type( $slug, $args ); + return register_block_type( isset( $block_type ) ? $block_type : $slug, $args ); + } + + /** + * Read block metadata from a block.json file. + * + * @param string $filename The path to the block.json file or its directory. + * + * @return array The block metadata. + */ + public static function get_block_metadata_from_file( $filename ) { + $metadata = array(); + $needle = '/block.json'; + $filename = $needle === substr( $filename, -strlen( $needle ) ) ? $filename : $filename . $needle; + + if ( file_exists( $filename ) ) { + try { + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + $metadata = json_decode( file_get_contents( $filename ), true ); + } catch ( Exception $e ) { + $metadata = array(); + } + } + + return $metadata; + } + + /** + * Get the block name from the its metadata. + * + * @param array $metadata The block metadata. + * + * @return string The block name. + */ + public static function get_block_name_from_metadata( $metadata ) { + return ! isset( $metadata['name'] ) || empty( $metadata['name'] ) ? '' : $metadata['name']; + } + + /** + * Get the block feature name (i.e. the name without the `jetpack` prefix) from its metadata. + * + * @param array $metadata The block metadata. + * + * @return string The block feature name. + */ + public static function get_block_feature_from_metadata( $metadata ) { + return str_replace( 'jetpack/', '', self::get_block_name_from_metadata( $metadata ) ); } /** diff --git a/projects/plugins/jetpack/class.jetpack-gutenberg.php b/projects/plugins/jetpack/class.jetpack-gutenberg.php index 77686715abc48..86850545c2826 100644 --- a/projects/plugins/jetpack/class.jetpack-gutenberg.php +++ b/projects/plugins/jetpack/class.jetpack-gutenberg.php @@ -478,6 +478,15 @@ public static function load_assets_as_required( $type, $script_dependencies = ar return; } + // Retrieve the feature from block.json if its path is passed. + if ( '/' === substr( $type, 0, 1 ) ) { + $feature = Blocks::get_block_feature_from_metadata( Blocks::get_block_metadata_from_file( $type ) ); + + if ( ! empty( $feature ) ) { + $type = $feature; + } + } + $type = sanitize_title_with_dashes( $type ); self::load_styles_as_required( $type ); self::load_scripts_as_required( $type, $script_dependencies ); diff --git a/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js b/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js index b37c4576a9404..557020a995da3 100644 --- a/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js +++ b/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js @@ -6,6 +6,8 @@ import { import { registerBlockType } from '@wordpress/blocks'; import { addFilter } from '@wordpress/hooks'; +const JETPACK_PREFIX = 'jetpack/'; + /** * Registers a gutenberg block if the availability requirements are met. * @@ -16,28 +18,32 @@ import { addFilter } from '@wordpress/hooks'; * @returns {object|boolean} Either false if the block is not available, or the results of `registerBlockType` */ export default function registerJetpackBlock( name, settings, childBlocks = [], prefix = true ) { - const { available, details, unavailableReason } = getJetpackExtensionAvailability( name ); + const isNamePrefixed = name.startsWith( JETPACK_PREFIX ); + const rawName = isNamePrefixed ? name.slice( JETPACK_PREFIX.length ) : name; + + const { available, details, unavailableReason } = getJetpackExtensionAvailability( rawName ); const requiredPlan = requiresPaidPlan( unavailableReason, details ); - const jpPrefix = prefix ? 'jetpack/' : ''; + const jpPrefix = prefix || isNamePrefixed ? JETPACK_PREFIX : ''; if ( ! available && ! requiredPlan ) { if ( 'production' !== process.env.NODE_ENV ) { // eslint-disable-next-line no-console console.warn( - `Block ${ name } couldn't be registered because it is unavailable (${ unavailableReason }).` + `Block ${ rawName } couldn't be registered because it is unavailable (${ unavailableReason }).` ); } return false; } - const result = registerBlockType( jpPrefix + name, settings ); + const prefixedName = jpPrefix + rawName; + const result = registerBlockType( prefixedName, settings ); if ( requiredPlan ) { addFilter( 'editor.BlockListBlock', - `${ jpPrefix + name }-with-has-warning-is-interactive-class-names`, - withHasWarningIsInteractiveClassNames( jpPrefix + name ) + `${ prefixedName }-with-has-warning-is-interactive-class-names`, + withHasWarningIsInteractiveClassNames( prefixedName ) ); } From c169bcc8c681369e63904cc641f22ea67334ad66 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Fri, 25 Aug 2023 15:25:27 -0400 Subject: [PATCH 02/16] [not verified] changelog --- .../blocks/changelog/add-enable-block-registration-by-path | 4 ++++ .../jetpack/changelog/add-enable-block-registration-by-path | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 projects/packages/blocks/changelog/add-enable-block-registration-by-path create mode 100644 projects/plugins/jetpack/changelog/add-enable-block-registration-by-path diff --git a/projects/packages/blocks/changelog/add-enable-block-registration-by-path b/projects/packages/blocks/changelog/add-enable-block-registration-by-path new file mode 100644 index 0000000000000..1e16ea25413aa --- /dev/null +++ b/projects/packages/blocks/changelog/add-enable-block-registration-by-path @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Enable block registration by specifying block.json path diff --git a/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path b/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path new file mode 100644 index 0000000000000..875501b79b681 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Enable block registration by specifying block.json path From 5388bd0029e1756b95b5963eaf421951694455e4 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Fri, 25 Aug 2023 15:31:16 -0400 Subject: [PATCH 03/16] [not verified] Update doc --- projects/plugins/jetpack/class.jetpack-gutenberg.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/plugins/jetpack/class.jetpack-gutenberg.php b/projects/plugins/jetpack/class.jetpack-gutenberg.php index 86850545c2826..3e8038921152a 100644 --- a/projects/plugins/jetpack/class.jetpack-gutenberg.php +++ b/projects/plugins/jetpack/class.jetpack-gutenberg.php @@ -466,7 +466,7 @@ public static function should_load() { /** * Only enqueue block assets when needed. * - * @param string $type Slug of the block. + * @param string $type Slug of the block or absolute path to the directory containing the block.json file. * @param array $script_dependencies Script dependencies. Will be merged with automatically * detected script dependencies from the webpack build. * From efbc6173c1a27ab0277f5f8d7859b9e95e5d1cda Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Fri, 25 Aug 2023 16:03:04 -0400 Subject: [PATCH 04/16] [not verified] Prevent duplication of beta suffix in blocks name --- projects/plugins/jetpack/extensions/editor.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/projects/plugins/jetpack/extensions/editor.js b/projects/plugins/jetpack/extensions/editor.js index 2a676c9a69bf2..d9dc3d6223023 100644 --- a/projects/plugins/jetpack/extensions/editor.js +++ b/projects/plugins/jetpack/extensions/editor.js @@ -78,10 +78,16 @@ function setBetaBlockTitle( settings, name ) { return settings; } + const { title, keywords } = settings; + const titleSuffix = '(beta)'; + const betaKeyword = 'beta'; + return { ...settings, - title: `${ settings.title } (beta)`, - kewords: [ ...settings.keywords, 'beta' ], + title: title.toLowerCase().endsWith( titleSuffix ) + ? title + : `${ settings.title } ${ titleSuffix }`, + kewords: keywords.includes( betaKeyword ) ? keywords : [ ...keywords, betaKeyword ], }; } From bec83c4ed2e0a3d175fad3e82c40971e37c7e82e Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Mon, 28 Aug 2023 14:03:37 -0400 Subject: [PATCH 05/16] [not verified] Fix package versions --- projects/packages/blocks/composer.json | 2 +- .../changelog/add-enable-block-registration-by-path#2 | 5 +++++ projects/plugins/jetpack/composer.lock | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/add-enable-block-registration-by-path#2 diff --git a/projects/packages/blocks/composer.json b/projects/packages/blocks/composer.json index e7767982eefd1..cdd02e3e09c1d 100644 --- a/projects/packages/blocks/composer.json +++ b/projects/packages/blocks/composer.json @@ -46,7 +46,7 @@ "link-template": "https://github.com/Automattic/jetpack-blocks/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "1.4.x-dev" + "dev-trunk": "1.5.x-dev" } }, "config": { diff --git a/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path#2 b/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path#2 new file mode 100644 index 0000000000000..a1c1831fa1ef7 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-enable-block-registration-by-path#2 @@ -0,0 +1,5 @@ +Significance: patch +Type: other +Comment: Updated composer.lock. + + diff --git a/projects/plugins/jetpack/composer.lock b/projects/plugins/jetpack/composer.lock index 4559346ba9562..d184883edafda 100644 --- a/projects/plugins/jetpack/composer.lock +++ b/projects/plugins/jetpack/composer.lock @@ -526,7 +526,7 @@ "dist": { "type": "path", "url": "../../packages/blocks", - "reference": "21025b86c1837680dae628cb68c66299dcfaa8d6" + "reference": "aa5b7af0bd7d9ae4b54ed9c4664ddc6927ce0c7d" }, "require-dev": { "automattic/jetpack-changelogger": "@dev", @@ -545,7 +545,7 @@ "link-template": "https://github.com/Automattic/jetpack-blocks/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "1.4.x-dev" + "dev-trunk": "1.5.x-dev" } }, "autoload": { From f50cb04e706675626f32c93ad356ec026b475859 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 16:50:20 -0400 Subject: [PATCH 06/16] [not verified] Update doc of registerJetpackBlock --- .../jetpack/extensions/shared/register-jetpack-block.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js b/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js index 557020a995da3..1912002a7b39f 100644 --- a/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js +++ b/projects/plugins/jetpack/extensions/shared/register-jetpack-block.js @@ -11,7 +11,9 @@ const JETPACK_PREFIX = 'jetpack/'; /** * Registers a gutenberg block if the availability requirements are met. * - * @param {string} name - The block's name. + * @param {string} name - The block's name. Jetpack blocks must be registered with a name prefixed + * with `jetpack/`. This function accepts an unprefixed name too, though (it'd handle both + * `business-hours` and `jetpack/business-hours` similarly, for instance). * @param {object} settings - The block's settings. * @param {object} childBlocks - The block's child blocks. * @param {boolean} prefix - Should this block be prefixed with `jetpack/`? From bb2fa49f4c9d3d6b1607c23fdd625b01513ed726 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 16:56:36 -0400 Subject: [PATCH 07/16] [not verified] Avoid ternary operation in jetpack_register_block --- projects/packages/blocks/src/class-blocks.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index fda96f55dda61..a08e76f206ab0 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -40,7 +40,7 @@ class Blocks { * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public static function jetpack_register_block( $slug, $args = array() ) { - $block_type = null; + $block_type = $slug; // If the path to block.json is passed, find the slug in the file then create a block type // object to register the block. @@ -115,7 +115,7 @@ function () use ( $feature_name, $method_name ) { } } - return register_block_type( isset( $block_type ) ? $block_type : $slug, $args ); + return register_block_type( $block_type, $args ); } /** From 594010a7df0d5a285411dbf15da1a9ae6bf2fdb3 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 17:00:51 -0400 Subject: [PATCH 08/16] [not verified] Rely on wp_json_file_decode in get_block_metadata_from_file --- projects/packages/blocks/src/class-blocks.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index a08e76f206ab0..c8520f8cf7fa3 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -132,8 +132,7 @@ public static function get_block_metadata_from_file( $filename ) { if ( file_exists( $filename ) ) { try { - // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents - $metadata = json_decode( file_get_contents( $filename ), true ); + $metadata = wp_json_file_decode( $filename, true ); } catch ( Exception $e ) { $metadata = array(); } From fdf0bc62506a7665a2529df335e7a4fedcdb8c04 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 17:20:58 -0400 Subject: [PATCH 09/16] [not verified] Fix failing test --- projects/packages/blocks/src/class-blocks.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index c8520f8cf7fa3..a04b5468f6a34 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -40,6 +40,11 @@ class Blocks { * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public static function jetpack_register_block( $slug, $args = array() ) { + if ( 0 !== strpos( $slug, 'jetpack/' ) && ! strpos( $slug, '/' ) ) { + _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); + $slug = 'jetpack/' . $slug; + } + $block_type = $slug; // If the path to block.json is passed, find the slug in the file then create a block type @@ -56,11 +61,6 @@ public static function jetpack_register_block( $slug, $args = array() ) { } } - if ( 0 !== strpos( $slug, 'jetpack/' ) && ! strpos( $slug, '/' ) ) { - _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); - $slug = 'jetpack/' . $slug; - } - if ( isset( $args['version_requirements'] ) && ! self::is_gutenberg_version_available( $args['version_requirements'], $slug ) From 43bc0cd0ca57e3fb3f2a852ec2360992371eaee9 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 17:30:01 -0400 Subject: [PATCH 10/16] [not verified] Fix wrong options passed to wp_json_file_decode --- projects/packages/blocks/src/class-blocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index a04b5468f6a34..029e1d8caa403 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -132,7 +132,7 @@ public static function get_block_metadata_from_file( $filename ) { if ( file_exists( $filename ) ) { try { - $metadata = wp_json_file_decode( $filename, true ); + $metadata = wp_json_file_decode( $filename, array( 'associative' => true ) ); } catch ( Exception $e ) { $metadata = array(); } From aecf913f3bcbf4c5fa242e57fc90baaf6566f65a Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 17:51:14 -0400 Subject: [PATCH 11/16] [not verified] Add tests for blocks helpers functions --- projects/packages/blocks/src/class-blocks.php | 2 +- .../blocks/tests/php/fixtures/block.json | 14 ++++ .../packages/blocks/tests/php/test-blocks.php | 79 +++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 projects/packages/blocks/tests/php/fixtures/block.json diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index 029e1d8caa403..fc3d3eb754b76 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -128,7 +128,7 @@ function () use ( $feature_name, $method_name ) { public static function get_block_metadata_from_file( $filename ) { $metadata = array(); $needle = '/block.json'; - $filename = $needle === substr( $filename, -strlen( $needle ) ) ? $filename : $filename . $needle; + $filename = $needle === substr( $filename, -strlen( $needle ) ) ? $filename : realpath( $filename . $needle ); if ( file_exists( $filename ) ) { try { diff --git a/projects/packages/blocks/tests/php/fixtures/block.json b/projects/packages/blocks/tests/php/fixtures/block.json new file mode 100644 index 0000000000000..84ca1e7c2dc91 --- /dev/null +++ b/projects/packages/blocks/tests/php/fixtures/block.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "jetpack/test-block", + "title": "Test Block", + "description": "", + "keywords": [], + "version": "", + "textdomain": "jetpack", + "category": "", + "icon": "", + "supports": {}, + "editorScript": "" +} diff --git a/projects/packages/blocks/tests/php/test-blocks.php b/projects/packages/blocks/tests/php/test-blocks.php index c84c00678aabd..74d6dae0e6f1a 100644 --- a/projects/packages/blocks/tests/php/test-blocks.php +++ b/projects/packages/blocks/tests/php/test-blocks.php @@ -330,4 +330,83 @@ public function test_jetpack_register_block_with_existing_editor_style() { remove_filter( 'jetpack_is_standalone_block', '__return_false' ); } } + + /** + * Test reading metadata from a block.json file by specifying its path. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file + */ + public function test_get_block_metadata_from_file() { + $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/block.json' ); + + $this->assertIsArray( $result ); + $this->assertNotEmpty( $result ); + } + + /** + * Test reading metadata from a block.json file by specifying its folder. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file + */ + public function test_get_block_metadata_from_folder() { + $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/' ); + + $this->assertIsArray( $result ); + $this->assertNotEmpty( $result ); + } + + /** + * Test reading metadata from a file that doesn't exist. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file + */ + public function test_get_block_metadata_from_wrong_file() { + $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/ghost-folder/block.json' ); + + $this->assertIsArray( $result ); + $this->assertEmpty( $result ); + } + + /** + * Test reading the name of a block from its metadata. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_name_from_metadata + */ + public function test_get_block_name_from_metadata() { + $name = 'jetpack/test-block'; + $result = Blocks::get_block_name_from_metadata( array() ); + + $this->assertSame( '', $result ); + + $result = Blocks::get_block_name_from_metadata( array( 'name' => $name ) ); + + $this->assertEquals( $result, $name ); + } + + /** + * Test reading the feature name of a block from its metadata. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_name_from_metadata + */ + public function test_get_block_feature_from_metadata() { + $feature = 'test-block'; + $name = 'jetpack/' . $feature; + $result = Blocks::get_block_feature_from_metadata( array() ); + + $this->assertSame( '', $result ); + + $result = Blocks::get_block_feature_from_metadata( array( 'name' => $name ) ); + + $this->assertEquals( $result, $feature ); + } } From 8eba989a7aaba2a994052b8d6f41928108974559 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 29 Aug 2023 18:07:48 -0400 Subject: [PATCH 12/16] [not verified] Add test for registering block by its metadata file --- projects/packages/blocks/src/class-blocks.php | 2 +- projects/packages/blocks/tests/php/test-blocks.php | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index fc3d3eb754b76..05944d57816f8 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -40,7 +40,7 @@ class Blocks { * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public static function jetpack_register_block( $slug, $args = array() ) { - if ( 0 !== strpos( $slug, 'jetpack/' ) && ! strpos( $slug, '/' ) ) { + if ( 0 !== strpos( $slug, 'jetpack/' ) && 0 !== strpos( $slug, '/' ) ) { _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); $slug = 'jetpack/' . $slug; } diff --git a/projects/packages/blocks/tests/php/test-blocks.php b/projects/packages/blocks/tests/php/test-blocks.php index 74d6dae0e6f1a..e91f5639622a1 100644 --- a/projects/packages/blocks/tests/php/test-blocks.php +++ b/projects/packages/blocks/tests/php/test-blocks.php @@ -331,6 +331,19 @@ public function test_jetpack_register_block_with_existing_editor_style() { } } + /** + * Test registering a block by specifying the path to its metadata file. + * + * @since 1.4.23 + * + * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file + */ + public function test_jetpack_register_block_from_metadata_file() { + $result = Blocks::jetpack_register_block( __DIR__ . '/fixtures/block.json' ); + + $this->assertInstanceOf( 'WP_Block_Type', $result ); + } + /** * Test reading metadata from a block.json file by specifying its path. * From e6c9c7d7752105618aee3c32e43518daaa6ffbf8 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 5 Sep 2023 13:54:13 -0400 Subject: [PATCH 13/16] [not verified] Replace assertIsArray for backward compatibility --- projects/packages/blocks/tests/php/test-blocks.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/projects/packages/blocks/tests/php/test-blocks.php b/projects/packages/blocks/tests/php/test-blocks.php index e91f5639622a1..e0e6649fe8404 100644 --- a/projects/packages/blocks/tests/php/test-blocks.php +++ b/projects/packages/blocks/tests/php/test-blocks.php @@ -354,7 +354,8 @@ public function test_jetpack_register_block_from_metadata_file() { public function test_get_block_metadata_from_file() { $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/block.json' ); - $this->assertIsArray( $result ); + // phpcs:ignore MediaWiki.PHPUnit.SpecificAssertions.assertIsArray -- assertIsArray not supported by all PHP versions we support. + $this->assertTrue( is_array( $result ) ); $this->assertNotEmpty( $result ); } @@ -368,7 +369,8 @@ public function test_get_block_metadata_from_file() { public function test_get_block_metadata_from_folder() { $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/' ); - $this->assertIsArray( $result ); + // phpcs:ignore MediaWiki.PHPUnit.SpecificAssertions.assertIsArray -- assertIsArray not supported by all PHP versions we support. + $this->assertTrue( is_array( $result ) ); $this->assertNotEmpty( $result ); } @@ -382,7 +384,8 @@ public function test_get_block_metadata_from_folder() { public function test_get_block_metadata_from_wrong_file() { $result = Blocks::get_block_metadata_from_file( __DIR__ . '/fixtures/ghost-folder/block.json' ); - $this->assertIsArray( $result ); + // phpcs:ignore MediaWiki.PHPUnit.SpecificAssertions.assertIsArray -- assertIsArray not supported by all PHP versions we support. + $this->assertTrue( is_array( $result ) ); $this->assertEmpty( $result ); } From dca6f6900ad2605d0d65b07c9c9c4895272f10e4 Mon Sep 17 00:00:00 2001 From: Kevin Zoschke Date: Tue, 5 Sep 2023 14:51:43 -0400 Subject: [PATCH 14/16] Fix failing test --- projects/packages/blocks/src/class-blocks.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index 05944d57816f8..0aced70cc07ed 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -40,7 +40,9 @@ class Blocks { * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public static function jetpack_register_block( $slug, $args = array() ) { - if ( 0 !== strpos( $slug, 'jetpack/' ) && 0 !== strpos( $slug, '/' ) ) { + // Slug doesn't start with `jetpack/`, isn't an absolute path, or doesn't contain a slash + // (synonym of a namespace) at all. + if ( 0 !== strpos( $slug, 'jetpack/' ) && 0 !== strpos( $slug, '/' ) && ! strpos( $slug, '/' ) ) { _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); $slug = 'jetpack/' . $slug; } From 8fb1828aaac69bf7802317b6fb9ee19a736150f8 Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Wed, 6 Sep 2023 15:23:40 +0200 Subject: [PATCH 15/16] Update @since value See https://github.com/Automattic/jetpack/pull/32697/files#r1317024818 --- projects/packages/blocks/tests/php/test-blocks.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/projects/packages/blocks/tests/php/test-blocks.php b/projects/packages/blocks/tests/php/test-blocks.php index e0e6649fe8404..be4455f7c5c0d 100644 --- a/projects/packages/blocks/tests/php/test-blocks.php +++ b/projects/packages/blocks/tests/php/test-blocks.php @@ -334,7 +334,7 @@ public function test_jetpack_register_block_with_existing_editor_style() { /** * Test registering a block by specifying the path to its metadata file. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file */ @@ -347,7 +347,7 @@ public function test_jetpack_register_block_from_metadata_file() { /** * Test reading metadata from a block.json file by specifying its path. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file */ @@ -362,7 +362,7 @@ public function test_get_block_metadata_from_file() { /** * Test reading metadata from a block.json file by specifying its folder. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file */ @@ -377,7 +377,7 @@ public function test_get_block_metadata_from_folder() { /** * Test reading metadata from a file that doesn't exist. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_metadata_from_file */ @@ -392,7 +392,7 @@ public function test_get_block_metadata_from_wrong_file() { /** * Test reading the name of a block from its metadata. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_name_from_metadata */ @@ -410,7 +410,7 @@ public function test_get_block_name_from_metadata() { /** * Test reading the feature name of a block from its metadata. * - * @since 1.4.23 + * @since $$next-version$$ * * @covers Automattic\Jetpack\Blocks::get_block_name_from_metadata */ From e7c4f98a53d973e4e2c0347c36715d378c772fe0 Mon Sep 17 00:00:00 2001 From: Kev Date: Wed, 6 Sep 2023 09:55:14 -0400 Subject: [PATCH 16/16] Use Exception root namespace Co-authored-by: Jeremy Herve --- projects/packages/blocks/src/class-blocks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/packages/blocks/src/class-blocks.php b/projects/packages/blocks/src/class-blocks.php index 0aced70cc07ed..ca7ba94133908 100644 --- a/projects/packages/blocks/src/class-blocks.php +++ b/projects/packages/blocks/src/class-blocks.php @@ -135,7 +135,7 @@ public static function get_block_metadata_from_file( $filename ) { if ( file_exists( $filename ) ) { try { $metadata = wp_json_file_decode( $filename, array( 'associative' => true ) ); - } catch ( Exception $e ) { + } catch ( \Exception $e ) { $metadata = array(); } }