diff --git a/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php b/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php new file mode 100644 index 0000000..6c2829d --- /dev/null +++ b/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php @@ -0,0 +1,8 @@ +info['core_incompatible'])) { throw new MissingDependencyException("Unable to install modules: module '$module' is incompatible with this version of Drupal core."); } + if ($module_data[$module]->info['status'] === ExtensionStatus::OBSOLETE) { + throw new ObsoleteExtensionException("Unable to install modules: module '$module' is obsolete."); + } } if ($enable_dependencies) { $module_list = $module_list ? array_combine($module_list, $module_list) : []; diff --git a/core/modules/entity_reference/entity_reference.info.yml b/core/modules/entity_reference/entity_reference.info.yml index 717ef21..cb3fdfe 100644 --- a/core/modules/entity_reference/entity_reference.info.yml +++ b/core/modules/entity_reference/entity_reference.info.yml @@ -1,6 +1,7 @@ name: 'Entity Reference' type: module -description: 'Deprecated. All the functionality has been moved to Core.' +description: 'Obsolete. All the functionality has been moved to Core.' +status: obsolete package: Field types version: VERSION hidden: true diff --git a/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFileUploadTest.php b/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFileUploadTest.php index 80ad399..68d0464 100644 --- a/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFileUploadTest.php +++ b/core/modules/field/tests/src/Functional/EntityReference/EntityReferenceFileUploadTest.php @@ -17,7 +17,7 @@ class EntityReferenceFileUploadTest extends BrowserTestBase { use TestFileCreationTrait; - protected static $modules = ['entity_reference', 'node', 'file']; + protected static $modules = ['node', 'file']; /** * {@inheritdoc} diff --git a/core/modules/field_layout/field_layout.info.yml b/core/modules/field_layout/field_layout.info.yml index f4b676f..ae1386a 100644 --- a/core/modules/field_layout/field_layout.info.yml +++ b/core/modules/field_layout/field_layout.info.yml @@ -2,6 +2,7 @@ name: 'Field Layout' type: module description: 'Allows users to configure the display and form display by arranging fields in several columns.' package: Core (Experimental) +status: experimental version: VERSION dependencies: - drupal:layout_discovery diff --git a/core/modules/help/src/Controller/HelpController.php b/core/modules/help/src/Controller/HelpController.php index 2c925a6..fcce940 100644 --- a/core/modules/help/src/Controller/HelpController.php +++ b/core/modules/help/src/Controller/HelpController.php @@ -4,6 +4,7 @@ use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Controller\ControllerBase; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\help\HelpSectionManager; @@ -132,7 +133,7 @@ public function helpPage($name) { $build['#title'] = $module_name; $info = $this->moduleExtensionList->getExtensionInfo($name); - if ($info['package'] === 'Core (Experimental)') { + if ($info['status'] === ExtensionStatus::EXPERIMENTAL) { $this->messenger()->addWarning($this->t('This module is experimental. Experimental modules are provided for testing purposes only. Use at your own risk.', [':url' => 'https://www.drupal.org/core/experimental'])); } diff --git a/core/modules/help_topics/help_topics.info.yml b/core/modules/help_topics/help_topics.info.yml index 819aef1..d7dd205 100644 --- a/core/modules/help_topics/help_topics.info.yml +++ b/core/modules/help_topics/help_topics.info.yml @@ -2,6 +2,7 @@ name: Help Topics type: module description: 'Displays help topics provided by themes and modules.' package: Core (Experimental) +status: experimental version: VERSION dependencies: - drupal:help diff --git a/core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php b/core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php index a442319..a6d3ae1 100644 --- a/core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php +++ b/core/modules/help_topics/tests/src/Functional/HelpTopicsSyntaxTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\help_topics\Functional; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Tests\BrowserTestBase; use Drupal\help_topics\HelpTopicDiscovery; use PHPUnit\Framework\ExpectationFailedException; @@ -278,7 +279,11 @@ protected function listDirectories($type) { // Find the extensions of this type, even if they are not installed, but // excluding test ones. $lister = \Drupal::service('extension.list.' . $type); - foreach (array_keys($lister->getAllAvailableInfo()) as $name) { + foreach ($lister->getAllAvailableInfo() as $name => $info) { + // Skip obsolete modules. + if (isset($info['status']) && $info['status'] === ExtensionStatus::OBSOLETE) { + continue; + } $path = $lister->getPath($name); // You can tell test modules because they are in package 'Testing', but // test themes are only known by being found in test directories. So... diff --git a/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php b/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php index 1a306bb..2a5f668 100644 --- a/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php +++ b/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\jsonapi\Functional; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Tests\BrowserTestBase; /** @@ -38,7 +39,7 @@ protected function setUp(): void { && empty($module->info['hidden']) && $module->status == FALSE && $module->info['package'] !== 'Testing' - && $module->info['package'] !== 'Core (Experimental)'; + && $module->info['status'] !== ExtensionStatus::EXPERIMENTAL; }); $this->container->get('module_installer')->install(array_keys($stable_core_modules)); diff --git a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml index 7f7b59e..622c198 100644 --- a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml +++ b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml @@ -2,6 +2,7 @@ name: 'Migrate Drupal Multilingual' type: module description: 'Provides a requirement for multilingual migrations.' package: 'Core (Experimental)' +status: experimental version: VERSION dependencies: - drupal:migrate_drupal diff --git a/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php b/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php index d84edf3..c130b2f 100644 --- a/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php +++ b/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\rest\Functional\EntityResource; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Tests\BrowserTestBase; /** @@ -42,7 +43,7 @@ protected function setUp(): void { empty($module->info['hidden']) && $module->status == FALSE && $module->info['package'] !== 'Testing' && - $module->info['package'] !== 'Core (Experimental)'; + $module->info['status'] !== ExtensionStatus::EXPERIMENTAL; }); $this->container->get('module_installer')->install(array_keys($stable_core_modules)); diff --git a/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php b/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php index fd45196..f7e1580 100644 --- a/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php +++ b/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php @@ -136,8 +136,8 @@ public function testSearchText() { */ public function testSearchTagsBubbling() { - // Install field UI and entity reference modules. - $this->container->get('module_installer')->install(['field_ui', 'entity_reference']); + // Install field UI module. + $this->container->get('module_installer')->install(['field_ui']); $this->resetAll(); // Creates a new content type that will have an entity reference. diff --git a/core/modules/simpletest/simpletest.info.yml b/core/modules/simpletest/simpletest.info.yml index 6cb3548..9cbdc55 100644 --- a/core/modules/simpletest/simpletest.info.yml +++ b/core/modules/simpletest/simpletest.info.yml @@ -1,6 +1,7 @@ name: Testing type: module -description: 'Deprecated. SimpleTest has been removed from core.' +description: 'Obsolete. SimpleTest has been removed from core.' +status: obsolete package: Core version: VERSION hidden: true diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php index 66e0fbc..5468923 100644 --- a/core/modules/system/src/Form/ModulesListForm.php +++ b/core/modules/system/src/Form/ModulesListForm.php @@ -6,6 +6,7 @@ use Drupal\Core\Config\UnmetDependenciesException; use Drupal\Core\Access\AccessManagerInterface; use Drupal\Core\Extension\Extension; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Extension\InfoParserException; use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\Extension\ModuleHandlerInterface; @@ -404,7 +405,7 @@ protected function buildModuleList(FormStateInterface $form_state) { elseif (($checkbox = $form_state->getValue(['modules', $name], FALSE)) && $checkbox['enable']) { $modules['install'][$name] = $data[$name]->info['name']; // Identify experimental modules. - if ($data[$name]->info['package'] == 'Core (Experimental)') { + if ($data[$name]->info['status'] === ExtensionStatus::EXPERIMENTAL) { $modules['experimental'][$name] = $data[$name]->info['name']; } } @@ -418,7 +419,7 @@ protected function buildModuleList(FormStateInterface $form_state) { $modules['install'][$dependency] = $data[$dependency]->info['name']; // Identify experimental modules. - if ($data[$dependency]->info['package'] == 'Core (Experimental)') { + if ($data[$dependency]->info['status'] === ExtensionStatus::EXPERIMENTAL) { $modules['experimental'][$dependency] = $data[$dependency]->info['name']; } } diff --git a/core/modules/system/system.install b/core/modules/system/system.install index e4cb7ce..9e1fdeb 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -15,6 +15,7 @@ use Drupal\Core\DrupalKernel; use Drupal\Core\Entity\Sql\SqlContentEntityStorage; use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Site\Settings; use Drupal\Core\StreamWrapper\PrivateStream; @@ -65,7 +66,7 @@ function system_requirements($phase) { $enabled_modules = \Drupal::moduleHandler()->getModuleList(); foreach ($enabled_modules as $module => $data) { $info = \Drupal::service('extension.list.module')->getExtensionInfo($module); - if (isset($info['package']) && $info['package'] === 'Core (Experimental)') { + if (isset($info['status']) && $info['status'] === ExtensionStatus::EXPERIMENTAL) { $experimental_modules[$module] = $info['name']; } } diff --git a/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml b/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml index 7d94791..2b625dc 100644 --- a/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml +++ b/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml @@ -2,4 +2,5 @@ name: 'Experimental Requirements Test' type: module description: 'Module in the experimental package to test hook_requirements() with an experimental module.' package: Core (Experimental) +status: experimental version: VERSION diff --git a/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml b/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml index c00a800..80c97d7 100644 --- a/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml +++ b/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml @@ -2,4 +2,5 @@ name: 'Experimental Test' type: module description: 'Module in the experimental package to test experimental functionality.' package: Core (Experimental) +status: experimental version: 8.y.x-unstable diff --git a/core/modules/system/tests/modules/system_status_obsolete_test/system_status_obsolete_test.info.yml b/core/modules/system/tests/modules/system_status_obsolete_test/system_status_obsolete_test.info.yml new file mode 100644 index 0000000..e053435 --- /dev/null +++ b/core/modules/system/tests/modules/system_status_obsolete_test/system_status_obsolete_test.info.yml @@ -0,0 +1,6 @@ +name: 'System obsolete status test' +type: module +description: 'Support module for testing an obsolete module extension.' +package: Testing +version: VERSION +status: obsolete diff --git a/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php b/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php index 5c41c29..4762fb6 100644 --- a/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php +++ b/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\system\Functional\Module; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Logger\RfcLogLevel; use Drupal\workspaces\Entity\Workspace; @@ -103,12 +104,12 @@ public function testInstallUninstall() { // Install the module. $edit = []; - $package = $module->info['package']; + $status = $module->info['status']; $edit['modules[' . $name . '][enable]'] = TRUE; $this->drupalPostForm('admin/modules', $edit, 'Install'); // Handle experimental modules, which require a confirmation screen. - if ($package == 'Core (Experimental)') { + if ($status === ExtensionStatus::EXPERIMENTAL) { $this->assertText('Are you sure you wish to enable experimental modules?'); if (count($modules_to_install) > 1) { // When there are experimental modules, needed dependencies do not @@ -211,7 +212,7 @@ public function testInstallUninstall() { foreach ($all_modules as $name => $module) { $edit['modules[' . $name . '][enable]'] = TRUE; // Track whether there is at least one experimental module. - if ($module->info['package'] == 'Core (Experimental)') { + if ($module->info['status'] === ExtensionStatus::EXPERIMENTAL) { $experimental = TRUE; } } diff --git a/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php b/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php index a4bea10..ba2d962 100644 --- a/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php +++ b/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php @@ -45,7 +45,6 @@ class EntityReferenceSelectionReferenceableTest extends KernelTestBase { 'system', 'user', 'field', - 'entity_reference', 'node', 'entity_test', ]; diff --git a/core/modules/workspaces/workspaces.info.yml b/core/modules/workspaces/workspaces.info.yml index 11ac79a..3ec4b25 100644 --- a/core/modules/workspaces/workspaces.info.yml +++ b/core/modules/workspaces/workspaces.info.yml @@ -3,6 +3,7 @@ type: module description: 'Allows users to stage content or preview a full site by using multiple workspaces on a single site.' version: VERSION package: Core (Experimental) +status: experimental configure: entity.workspace.collection dependencies: - drupal:user diff --git a/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml b/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml index 9c97b0a..75c6e07 100644 --- a/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml +++ b/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml @@ -3,6 +3,7 @@ description: Imports the content for the Umami demo. type: module version: VERSION package: 'Core (Experimental)' +status: experimental hidden: true dependencies: - drupal:field diff --git a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php index b8b4c61..6480c4f 100644 --- a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php +++ b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php @@ -6,6 +6,7 @@ use Drupal\Core\Config\FileStorage; use Drupal\Core\Config\InstallStorage; use Drupal\Core\Config\StorageInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\AssertConfigTrait; use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait; use Drupal\KernelTests\KernelTestBase; @@ -124,7 +125,7 @@ protected function doTestsOnConfigStorage(StorageInterface $default_config_stora } else { $info = $this->container->get('extension.list.module')->getExtensionInfo($module); - if (!isset($info['package']) || $info['package'] !== 'Core (Experimental)') { + if (!isset($info['status']) || $info['status'] !== ExtensionStatus::EXPERIMENTAL) { $this->fail("$config_name provided by $module does not exist after installing all dependencies"); } } diff --git a/core/tests/Drupal/KernelTests/Core/Extension/ModuleInstallerTest.php b/core/tests/Drupal/KernelTests/Core/Extension/ModuleInstallerTest.php index ed00b6b..27b84af 100644 --- a/core/tests/Drupal/KernelTests/Core/Extension/ModuleInstallerTest.php +++ b/core/tests/Drupal/KernelTests/Core/Extension/ModuleInstallerTest.php @@ -4,6 +4,7 @@ use Drupal\Core\Database\Database; use Drupal\Core\Extension\MissingDependencyException; +use Drupal\Core\Extension\Exception\ObsoleteExtensionException; use Drupal\KernelTests\KernelTestBase; use Symfony\Component\Routing\Exception\RouteNotFoundException; @@ -134,4 +135,15 @@ public function testDependencyInvalidCoreInstallNoDependencies() { $this->assertTrue($this->container->get('module_installer')->install(['system_incompatible_core_version_dependencies_test'], FALSE)); } + /** + * Tests trying to install an obsolete module. + * + * @covers ::install + */ + public function testObsoleteInstall() { + $this->expectException(ObsoleteExtensionException::class); + $this->expectExceptionMessage("Unable to install modules: module 'system_status_obsolete_test' is obsolete."); + $this->container->get('module_installer')->install(['system_status_obsolete_test']); + } + } diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php index 073e0f4..3b4f5d9 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\KernelTestBase; /** @@ -64,7 +65,7 @@ protected function setUp(): void { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php index 22fc651..ca5477f 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Theme\Registry; use Drupal\KernelTests\KernelTestBase; @@ -63,7 +64,7 @@ protected function installAllModules() { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php index e291cbe..80502d9 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\KernelTestBase; /** @@ -64,7 +65,7 @@ protected function setUp(): void { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php index 6534baa..f404d3b 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Theme\Registry; use Drupal\KernelTests\KernelTestBase; @@ -61,7 +62,7 @@ protected function installAllModules() { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/Tests/Core/Extension/InfoParserUnitTest.php b/core/tests/Drupal/Tests/Core/Extension/InfoParserUnitTest.php index 96652b7..f60a892 100644 --- a/core/tests/Drupal/Tests/Core/Extension/InfoParserUnitTest.php +++ b/core/tests/Drupal/Tests/Core/Extension/InfoParserUnitTest.php @@ -691,4 +691,110 @@ public function testCore8xNoCoreVersionRequirement() { } } + /** + * Tests an info file with valid status values. + * + * @covers ::parse + * + * @dataProvider providerValidStatus + */ + public function testValidStatus($status, $expected) { + $info = << [ + $filename => $info, + ], + ]); + $info_values = $this->infoParser->parse(vfsStream::url("modules/fixtures/$filename")); + $this->assertSame($expected, $info_values['status']); + } + + /** + * Data provider for testValidStatus(). + */ + public function providerValidStatus() { + return [ + 'empty' => [ + '', + 'normal', + ], + 'experimental' => [ + 'experimental', + 'experimental', + ], + 'normal' => [ + 'normal', + 'normal', + ], + 'deprecated' => [ + 'deprecated', + 'deprecated', + ], + 'obsolete' => [ + 'obsolete', + 'obsolete', + ], + ]; + } + + /** + * Tests an info file with invalid status values. + * + * @covers ::parse + * + * @dataProvider providerInvalidStatus + */ + public function testInvalidStatus($status, $exception_message) { + $info = << [ + $filename => $info, + ], + ]); + $this->expectException('\Drupal\Core\Extension\InfoParserException'); + $this->expectExceptionMessage($exception_message); + $info_values = $this->infoParser->parse(vfsStream::url("modules/fixtures/$filename")); + $this->assertEmpty($info_values); + } + + /** + * Data provider for testInvalidStatus(). + */ + public function providerInvalidStatus() { + return [ + 'bogus' => [ + 'bogus', + "'status: bogus' is not valid", + ], + 'two words' => [ + 'deprecated obsolete', + "'status: deprecated obsolete' is not valid", + ], + 'wrong case' => [ + 'Experimental', + "'status: Experimental' is not valid", + ], + ]; + } + }