Directory

Merge class-wp-theme-json-schema-test tests from core · WordPress/gutenberg@a1c948a · GitHub
Skip to content

Commit

Permalink
Merge class-wp-theme-json-schema-test tests from core
Browse files Browse the repository at this point in the history
  • Loading branch information
ajlende committed Jan 30, 2024
1 parent 776f363 commit a1c948a
Show file tree
Hide file tree
Showing 4 changed files with 339 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/class-wp-theme-json-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,7 @@ public function __construct( $theme_json = array(), $origin = 'theme' ) {
$origin = 'theme';
}

$this->theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );
$this->theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json );
$registry = WP_Block_Type_Registry::get_instance();
$valid_block_names = array_keys( $registry->get_all_registered() );
$valid_element_names = array_keys( static::ELEMENTS );
Expand Down Expand Up @@ -3001,7 +3001,7 @@ protected static function filter_slugs( $node, $slugs ) {
public static function remove_insecure_properties( $theme_json ) {
$sanitized = array();

$theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );
$theme_json = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json );

$valid_block_names = array_keys( static::get_blocks_metadata() );
$valid_element_names = array_keys( static::ELEMENTS );
Expand Down
154 changes: 154 additions & 0 deletions lib/class-wp-theme-json-schema-gutenberg.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php
/**
* WP_Theme_JSON_Schema_Gutenberg class
*
* @package Gutenberg
* @since 5.9.0
*/

if ( class_exists( 'WP_Theme_JSON_Schema_Gutenberg' ) ) {
return;
}

/**
* Class that migrates a given theme.json structure to the latest schema.
*
* This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
* This is a low-level API that may need to do breaking changes. Please,
* use get_global_settings, get_global_styles, and get_global_stylesheet instead.
*
* @since 5.9.0
* @access private
*/
#[AllowDynamicProperties]
class WP_Theme_JSON_Schema_Gutenberg {

/**
* Maps old properties to their new location within the schema's settings.
* This will be applied at both the defaults and individual block levels.
*/
const V1_TO_V2_RENAMED_PATHS = array(
'border.customRadius' => 'border.radius',
'spacing.customMargin' => 'spacing.margin',
'spacing.customPadding' => 'spacing.padding',
'typography.customLineHeight' => 'typography.lineHeight',
);

/**
* Function that migrates a given theme.json structure to the last version.
*
* @since 5.9.0
*
* @param array $theme_json The structure to migrate.
*
* @return array The structure in the last version.
*/
public static function migrate( $theme_json ) {
if ( ! isset( $theme_json['version'] ) ) {
$theme_json = array(
'version' => WP_Theme_JSON::LATEST_SCHEMA,
);
}

if ( 1 === $theme_json['version'] ) {
$theme_json = self::migrate_v1_to_v2( $theme_json );
}

return $theme_json;
}

/**
* Removes the custom prefixes for a few properties
* that were part of v1:
*
* 'border.customRadius' => 'border.radius',
* 'spacing.customMargin' => 'spacing.margin',
* 'spacing.customPadding' => 'spacing.padding',
* 'typography.customLineHeight' => 'typography.lineHeight',
*
* @since 5.9.0
*
* @param array $old Data to migrate.
*
* @return array Data without the custom prefixes.
*/
private static function migrate_v1_to_v2( $old ) {
// Copy everything.
$new = $old;

// Overwrite the things that changed.
if ( isset( $old['settings'] ) ) {
$new['settings'] = self::rename_paths( $old['settings'], self::V1_TO_V2_RENAMED_PATHS );
}

// Set the new version.
$new['version'] = 2;

return $new;
}

/**
* Processes the settings subtree.
*
* @since 5.9.0
*
* @param array $settings Array to process.
* @param array $paths_to_rename Paths to rename.
*
* @return array The settings in the new format.
*/
private static function rename_paths( $settings, $paths_to_rename ) {
$new_settings = $settings;

// Process any renamed/moved paths within default settings.
self::rename_settings( $new_settings, $paths_to_rename );

// Process individual block settings.
if ( isset( $new_settings['blocks'] ) && is_array( $new_settings['blocks'] ) ) {
foreach ( $new_settings['blocks'] as &$block_settings ) {
self::rename_settings( $block_settings, $paths_to_rename );
}
}

return $new_settings;
}

/**
* Processes a settings array, renaming or moving properties.
*
* @since 5.9.0
*
* @param array $settings Reference to settings either defaults or an individual block's.
* @param array $paths_to_rename Paths to rename.
*/
private static function rename_settings( &$settings, $paths_to_rename ) {
foreach ( $paths_to_rename as $original => $renamed ) {
$original_path = explode( '.', $original );
$renamed_path = explode( '.', $renamed );
$current_value = _wp_array_get( $settings, $original_path, null );

if ( null !== $current_value ) {
_wp_array_set( $settings, $renamed_path, $current_value );
self::unset_setting_by_path( $settings, $original_path );
}
}
}

/**
* Removes a property from within the provided settings by its path.
*
* @since 5.9.0
*
* @param array $settings Reference to the current settings array.
* @param array $path Path to the property to be removed.
*/
private static function unset_setting_by_path( &$settings, $path ) {
$tmp_settings = &$settings;

Check warning on line 146 in lib/class-wp-theme-json-schema-gutenberg.php

View workflow job for this annotation

GitHub Actions / PHP coding standards

Unused variable $tmp_settings.
$last_key = array_pop( $path );
foreach ( $path as $key ) {
$tmp_settings = &$tmp_settings[ $key ];
}

unset( $tmp_settings[ $last_key ] );
}
}
1 change: 1 addition & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require __DIR__ . '/class-wp-theme-json-data-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-resolver-gutenberg.php';
require __DIR__ . '/class-wp-theme-json-schema-gutenberg.php';
require __DIR__ . '/class-wp-duotone-gutenberg.php';
require __DIR__ . '/blocks.php';
require __DIR__ . '/block-editor-settings.php';
Expand Down
182 changes: 182 additions & 0 deletions phpunit/class-wp-theme-json-schema-test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
<?php

/**
* Test WP_Theme_JSON_Schema_Gutenberg class.
*
* @package Gutenberg
*
* @since 5.9.0
*/
class WP_Theme_JSON_Schema_Gutenberg_Test extends WP_UnitTestCase {
public function test_migrate_v1_to_latest() {
$theme_json_v1 = array(
'version' => 1,
'settings' => array(
'color' => array(
'palette' => array(
array(
'name' => 'Pale Pink',
'slug' => 'pale-pink',
'color' => '#f78da7',
),
array(
'name' => 'Vivid Red',
'slug' => 'vivid-red',
'color' => '#cf2e2e',
),
),
'custom' => false,
'link' => true,
),
'border' => array(
'color' => false,
'customRadius' => false,
'style' => false,
'width' => false,
),
'typography' => array(
'fontStyle' => false,
'fontWeight' => false,
'letterSpacing' => false,
'textDecoration' => false,
'textTransform' => false,
),
'blocks' => array(
'core/group' => array(
'border' => array(
'color' => true,
'customRadius' => true,
'style' => true,
'width' => true,
),
'typography' => array(
'fontStyle' => true,
'fontWeight' => true,
'letterSpacing' => true,
'textDecoration' => true,
'textTransform' => true,
),
),
),
),
'styles' => array(
'color' => array(
'background' => 'purple',
),
'blocks' => array(
'core/group' => array(
'color' => array(
'background' => 'red',
),
'spacing' => array(
'padding' => array(
'top' => '10px',
),
),
'elements' => array(
'link' => array(
'color' => array(
'text' => 'yellow',
),
),
),
),
),
'elements' => array(
'link' => array(
'color' => array(
'text' => 'red',
),
),
),
),
);

$actual = WP_Theme_JSON_Schema_Gutenberg::migrate( $theme_json_v1 );

$expected = array(
'version' => WP_Theme_JSON_Gutenberg::LATEST_SCHEMA,
'settings' => array(
'color' => array(
'palette' => array(
array(
'name' => 'Pale Pink',
'slug' => 'pale-pink',
'color' => '#f78da7',
),
array(
'name' => 'Vivid Red',
'slug' => 'vivid-red',
'color' => '#cf2e2e',
),
),
'custom' => false,
'link' => true,
),
'border' => array(
'color' => false,
'radius' => false,
'style' => false,
'width' => false,
),
'typography' => array(
'fontStyle' => false,
'fontWeight' => false,
'letterSpacing' => false,
'textDecoration' => false,
'textTransform' => false,
),
'blocks' => array(
'core/group' => array(
'border' => array(
'color' => true,
'radius' => true,
'style' => true,
'width' => true,
),
'typography' => array(
'fontStyle' => true,
'fontWeight' => true,
'letterSpacing' => true,
'textDecoration' => true,
'textTransform' => true,
),
),
),
),
'styles' => array(
'color' => array(
'background' => 'purple',
),
'blocks' => array(
'core/group' => array(
'color' => array(
'background' => 'red',
),
'spacing' => array(
'padding' => array(
'top' => '10px',
),
),
'elements' => array(
'link' => array(
'color' => array(
'text' => 'yellow',
),
),
),
),
),
'elements' => array(
'link' => array(
'color' => array(
'text' => 'red',
),
),
),
),
);

$this->assertEqualSetsWithIndex( $expected, $actual );
}
}

0 comments on commit a1c948a

Please sign in to comment.