Loading core/recipes/example/composer.jsondeleted 100644 → 0 +0 −9 Original line number Diff line number Diff line { "name": "drupal_recipe/example", "description": "An example Drupal recipe description", "type": "drupal-recipe", "require": { "drupal/core": "^10.0.x-dev" }, "license": "GPL-2.0-or-later" } core/recipes/example/recipe.yml +24 −34 Original line number Diff line number Diff line # The type key is similar to the package key in module.info.yml. It # can be used by the UI to group Drupal recipes. Additionally, # the type 'Site' means that the Drupal recipe will be listed in # the installer. type: 'Content type' # The name of the recipe. name: 'Example' # The description of the recipe. description: 'Provides an example recipe.' # The type key is similar to the package key in module.info.yml. It can be used # to group Drupal recipes. type: 'Content type' install: # An array of modules or themes to install, if they are not already. # The system will detect if it is a theme or a module. During the # install only simple configuration from the new modules is created. # This allows the Drupal recipe control over the configuration. # An array of modules or themes to install if they are not already. The system # will detect if it is a theme or a module. During the install only simple # configuration from the new modules is created. This allows the Drupal recipe # control over the configuration. - node - text config: # A Drupal recipe can have a config directory. All configuration # is this directory will be imported after the modules have been # installed. # Additionally, the Drupal recipe can install configuration entities # provided by the modules it configures. This allows them to not have # to maintain or copy this configuration. Note the examples below are # fictitious. # A Drupal recipe can have a config directory. All configuration is this # directory will be imported after the modules have been installed. # Additionally, the Drupal recipe can install configuration entities provided # by the modules it configures. This allows them to not have to maintain or # copy this configuration. import: node: - node.type.article # Import all configuration that is provided by the text module and any text: - text.settings # Import all configuration that is provided by the node module and any # optional configuration that depends on the text module that is provided by # modules already installed. text: '*' node: '*' # Configuration actions may be defined. The structure here should be # entity_type.ID.action. Below the user role entity type with an ID of # editor is having the permissions added. The permissions key will be # mapped to the \Drupal\user\Entity\Role::grantPermission() method. actions: user.role.editor: createIfNotExists: label: 'Editor' grantPermissions: - 'delete any article content' - 'edit any article content' content: {} # A Drupal recipe can have a content directory. All content in this # directory will be created after the configuration is installed. text.settings: simpleConfigUpdate: default_summary_length: 700 # A Drupal recipe can have a content directory. All content in this directory # will be created after the configuration is installed. core/tests/Drupal/KernelTests/Core/Recipe/RecipeTest.php +13 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ use Drupal\Core\Recipe\Recipe; use Drupal\Core\Recipe\RecipeFileException; use Drupal\Core\Recipe\RecipePreExistingConfigException; use Drupal\Core\Recipe\RecipeRunner; use Drupal\KernelTests\KernelTestBase; /** Loading Loading @@ -67,4 +68,16 @@ public function testPreExistingMatchingConfiguration(): void { $this->assertSame('core/tests/fixtures/recipes/install_node_with_config/config', $recipe->config->recipeConfigDirectory); } public function testExampleRecipe(): void { // The example recipe imports all the configurations from the node module // including optional configurations associated with the search and view // modules. So we have to install them before applying the example recipe. $this->container->get('module_installer')->install(['search', 'views']); // Apply the example recipe. $recipe = Recipe::createFromDirectory('core/recipes/example'); RecipeRunner::processRecipe($recipe); // Verify if the 'default_summary_length' value is updated. $this->assertSame($this->config('text.settings')->get('default_summary_length'), 700); } } Loading
core/recipes/example/composer.jsondeleted 100644 → 0 +0 −9 Original line number Diff line number Diff line { "name": "drupal_recipe/example", "description": "An example Drupal recipe description", "type": "drupal-recipe", "require": { "drupal/core": "^10.0.x-dev" }, "license": "GPL-2.0-or-later" }
core/recipes/example/recipe.yml +24 −34 Original line number Diff line number Diff line # The type key is similar to the package key in module.info.yml. It # can be used by the UI to group Drupal recipes. Additionally, # the type 'Site' means that the Drupal recipe will be listed in # the installer. type: 'Content type' # The name of the recipe. name: 'Example' # The description of the recipe. description: 'Provides an example recipe.' # The type key is similar to the package key in module.info.yml. It can be used # to group Drupal recipes. type: 'Content type' install: # An array of modules or themes to install, if they are not already. # The system will detect if it is a theme or a module. During the # install only simple configuration from the new modules is created. # This allows the Drupal recipe control over the configuration. # An array of modules or themes to install if they are not already. The system # will detect if it is a theme or a module. During the install only simple # configuration from the new modules is created. This allows the Drupal recipe # control over the configuration. - node - text config: # A Drupal recipe can have a config directory. All configuration # is this directory will be imported after the modules have been # installed. # Additionally, the Drupal recipe can install configuration entities # provided by the modules it configures. This allows them to not have # to maintain or copy this configuration. Note the examples below are # fictitious. # A Drupal recipe can have a config directory. All configuration is this # directory will be imported after the modules have been installed. # Additionally, the Drupal recipe can install configuration entities provided # by the modules it configures. This allows them to not have to maintain or # copy this configuration. import: node: - node.type.article # Import all configuration that is provided by the text module and any text: - text.settings # Import all configuration that is provided by the node module and any # optional configuration that depends on the text module that is provided by # modules already installed. text: '*' node: '*' # Configuration actions may be defined. The structure here should be # entity_type.ID.action. Below the user role entity type with an ID of # editor is having the permissions added. The permissions key will be # mapped to the \Drupal\user\Entity\Role::grantPermission() method. actions: user.role.editor: createIfNotExists: label: 'Editor' grantPermissions: - 'delete any article content' - 'edit any article content' content: {} # A Drupal recipe can have a content directory. All content in this # directory will be created after the configuration is installed. text.settings: simpleConfigUpdate: default_summary_length: 700 # A Drupal recipe can have a content directory. All content in this directory # will be created after the configuration is installed.
core/tests/Drupal/KernelTests/Core/Recipe/RecipeTest.php +13 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ use Drupal\Core\Recipe\Recipe; use Drupal\Core\Recipe\RecipeFileException; use Drupal\Core\Recipe\RecipePreExistingConfigException; use Drupal\Core\Recipe\RecipeRunner; use Drupal\KernelTests\KernelTestBase; /** Loading Loading @@ -67,4 +68,16 @@ public function testPreExistingMatchingConfiguration(): void { $this->assertSame('core/tests/fixtures/recipes/install_node_with_config/config', $recipe->config->recipeConfigDirectory); } public function testExampleRecipe(): void { // The example recipe imports all the configurations from the node module // including optional configurations associated with the search and view // modules. So we have to install them before applying the example recipe. $this->container->get('module_installer')->install(['search', 'views']); // Apply the example recipe. $recipe = Recipe::createFromDirectory('core/recipes/example'); RecipeRunner::processRecipe($recipe); // Verify if the 'default_summary_length' value is updated. $this->assertSame($this->config('text.settings')->get('default_summary_length'), 700); } }