From a4fdb23541c35d5448da802fa49148996919ba9a Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Tue, 30 Jan 2024 12:42:11 -0800 Subject: [PATCH] Support PHP 8.2 (#4085) --- .circleci/config.yml | 7 +- composer.json | 12 +-- modules/common/src/DataResource.php | 4 +- modules/common/src/Events/Event.php | 27 ++++- .../src/Plugin/DkanApiDocsPluginManager.php | 5 +- modules/common/src/Storage/SelectFactory.php | 2 +- .../Kernel/Storage/JobStoreFactoryTest.php | 3 +- .../tests/src/Unit/Mocks/FileSystem.php | 2 +- .../Controller/AbstractQueryController.php | 4 +- .../Plugin/DkanApiDocs/DatastoreApiDocs.php | 15 ++- .../datastore/src/Service/ImportService.php | 2 +- .../src/SqlEndpoint/WebServiceApi.php | 11 ++- .../datastore/src/Storage/QueryFactory.php | 4 +- .../datastore/src/Storage/TableSummary.php | 25 ++++- .../QueueWorker/LocalizeQueueWorkerTest.php | 2 +- .../Kernel/Service/Info/ImportInfoTest.php | 2 +- .../Kernel/Service/ResourceLocalizerTest.php | 2 +- .../Plugin/QueueWorker/TestMemStorage.php | 5 +- .../dkan_js_frontend/dkan_js_frontend.module | 8 +- modules/frontend/src/Page.php | 22 ++++- .../frontend/src/Routing/RouteProvider.php | 36 ++++++- modules/harvest/src/Commands/Helper.php | 2 +- .../src/Plugin/DkanApiDocs/HarvestApiDocs.php | 4 +- modules/harvest/src/Storage/IdGenerator.php | 2 +- .../src/Element/UploadOrLink.php | 4 +- .../Field/FieldWidget/JsonFormWidget.php | 2 +- modules/json_form_widget/src/StringHelper.php | 6 +- modules/json_form_widget/src/ValueHandler.php | 2 +- modules/json_form_widget/src/WidgetRouter.php | 4 +- modules/metastore/metastore.module | 2 +- .../Action/HideCurrentRevisionAction.php | 22 +++++ .../src/ComplexData/Dataset.php | 2 +- .../src/Controller/SearchController.php | 16 ++- .../DkanApiDocs/MetastoreSearchApiDocs.php | 9 +- .../modules/metastore_search/src/Search.php | 5 +- .../MetastoreRevisionController.php | 19 +++- modules/metastore/src/DatasetApiDocs.php | 2 +- .../metastore/src/MetastoreApiResponse.php | 9 +- modules/metastore/src/MetastoreService.php | 2 +- .../QueueWorker/OrphanReferenceProcessor.php | 10 +- .../QueueWorker/OrphanResourceRemover.php | 2 +- .../src/Reference/ReferenceLookup.php | 14 +++ modules/metastore/src/Storage/DataFactory.php | 2 +- .../src/Functional/Storage/NodeDataTest.php | 3 + .../tests/src/Unit/Storage/DataTest.php | 2 +- phpunit.xml | 4 +- rector.php | 99 +++++++++++++++++++ 47 files changed, 372 insertions(+), 78 deletions(-) create mode 100644 rector.php diff --git a/.circleci/config.yml b/.circleci/config.yml index b51da123e8..8e339feb3f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,7 +187,7 @@ jobs: parameters: php_version: description: 'PHP major.minor for DDev to use.' - default: '8.1' + default: '8.2' type: string dkan_recommended_branch: description: 'Branch of getdkan/recommended-project to use.' @@ -248,6 +248,11 @@ workflows: parameters: dkan_recommended_branch: [ '10.1.x-dev'] php_version: [ '8.1' ] + - phpunit: + matrix: + parameters: + dkan_recommended_branch: [ '10.1.x-dev'] + php_version: [ '8.2' ] - phpunit: matrix: parameters: diff --git a/composer.json b/composer.json index 010046d513..40f1006ff2 100644 --- a/composer.json +++ b/composer.json @@ -13,12 +13,12 @@ "ext-json": "*", "ezyang/htmlpurifier" : "^4.11", "fmizzell/maquina": "^1.1.1", - "getdkan/contracts": "^1.0.0", - "getdkan/csv-parser": "^1.3.0", - "getdkan/file-fetcher" : "^5.0.2", - "getdkan/harvest": "^1.0.0", + "getdkan/contracts": "^1.1.2", + "getdkan/csv-parser": "^1.3.1", + "getdkan/file-fetcher" : "^5.0.3", + "getdkan/harvest": "^1.0.3", "getdkan/procrastinator": "^5.0.0", - "getdkan/rooted-json-data": "^0.1", + "getdkan/rooted-json-data": "^0.2.1", "guzzlehttp/guzzle" : "^6.5.8 || ^7.4.5", "ilbee/csv-response": "^1.1.1", "justinrainbow/json-schema": "^5.2", @@ -32,7 +32,7 @@ "symfony/polyfill-php80": "^1.27" }, "require-dev": { - "getdkan/mock-chain": "^1.3.0", + "getdkan/mock-chain": "^1.3.6", "weitzman/drupal-test-traits": "^2.0.1", "phpunit/phpunit": "^8.5.14 || ^9" }, diff --git a/modules/common/src/DataResource.php b/modules/common/src/DataResource.php index 4924433073..cb0036ff0a 100644 --- a/modules/common/src/DataResource.php +++ b/modules/common/src/DataResource.php @@ -282,9 +282,7 @@ public function getTableName() { } /** - * Inherited. - * - * @inheritdoc + * {@inheritDoc} */ #[\ReturnTypeWillChange] public function jsonSerialize() { diff --git a/modules/common/src/Events/Event.php b/modules/common/src/Events/Event.php index e3218f92ec..4962e6b195 100644 --- a/modules/common/src/Events/Event.php +++ b/modules/common/src/Events/Event.php @@ -2,14 +2,37 @@ namespace Drupal\common\Events; -use Drupal\Component\EventDispatcher\Event as SymfonyEvent; +use Drupal\Component\EventDispatcher\Event as DrupalEvent; /** * Custom DKAN extension of the Drupal Event class. * * @package Drupal\common\Events */ -class Event extends SymfonyEvent { +class Event extends DrupalEvent { + + /** + * Validation callback. + * + * @var \Closure|mixed|null + */ + private $validator; + + /** + * Data. + * + * How this is used depends on the event we're responding to. + * + * @var mixed + */ + private $data; + + /** + * Exception. + * + * @var \Exception|null + */ + private ?\Exception $exception; /** * Constructor. diff --git a/modules/common/src/Plugin/DkanApiDocsPluginManager.php b/modules/common/src/Plugin/DkanApiDocsPluginManager.php index 6a06d98eea..b591afd6e2 100644 --- a/modules/common/src/Plugin/DkanApiDocsPluginManager.php +++ b/modules/common/src/Plugin/DkanApiDocsPluginManager.php @@ -2,6 +2,7 @@ namespace Drupal\common\Plugin; +use Drupal\common\Annotation\DkanApiDocs; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Plugin\DefaultPluginManager; @@ -26,10 +27,10 @@ class DkanApiDocsPluginManager extends DefaultPluginManager { */ public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) { $subdir = 'Plugin/DkanApiDocs'; - $plugin_interface = 'Drupal\common\Plugin\DkanApiDocsInterface'; + $plugin_interface = DkanApiDocsInterface::class; // The name of the annotation class that contains the plugin definition. - $plugin_definition_annotation_name = 'Drupal\common\Annotation\DkanApiDocs'; + $plugin_definition_annotation_name = DkanApiDocs::class; parent::__construct($subdir, $namespaces, $module_handler, $plugin_interface, $plugin_definition_annotation_name); diff --git a/modules/common/src/Storage/SelectFactory.php b/modules/common/src/Storage/SelectFactory.php index ee45b33a72..b041c96d11 100644 --- a/modules/common/src/Storage/SelectFactory.php +++ b/modules/common/src/Storage/SelectFactory.php @@ -284,7 +284,7 @@ private function addCondition($statementObj, $condition) { $this->addMatchCondition($statementObj, $condition); return; } - $field = (isset($condition->collection) ? $condition->collection : $this->alias) + $field = ($condition->collection ?? $this->alias) . '.' . $condition->property; $statementObj->condition($field, $condition->value, strtoupper($condition->operator)); diff --git a/modules/common/tests/src/Kernel/Storage/JobStoreFactoryTest.php b/modules/common/tests/src/Kernel/Storage/JobStoreFactoryTest.php index 3a7bb1b620..2c7995661c 100644 --- a/modules/common/tests/src/Kernel/Storage/JobStoreFactoryTest.php +++ b/modules/common/tests/src/Kernel/Storage/JobStoreFactoryTest.php @@ -16,8 +16,9 @@ * @group dkan * @group common * @group kernel + * @group legacy * - * @see @see \Drupal\Tests\common\Kernel\Storage\AbstractJobStoreFactoryTest + * @see \Drupal\Tests\common\Kernel\Storage\AbstractJobStoreFactoryTest */ class JobStoreFactoryTest extends KernelTestBase { diff --git a/modules/common/tests/src/Unit/Mocks/FileSystem.php b/modules/common/tests/src/Unit/Mocks/FileSystem.php index c9f9697b75..bc8bf975a6 100644 --- a/modules/common/tests/src/Unit/Mocks/FileSystem.php +++ b/modules/common/tests/src/Unit/Mocks/FileSystem.php @@ -12,7 +12,7 @@ /** * */ -class FileSystem extends DrupalFileSystem { +class FileSystem extends DrupalFilesystem { /** * diff --git a/modules/datastore/src/Controller/AbstractQueryController.php b/modules/datastore/src/Controller/AbstractQueryController.php index 6d69359486..1cd00f466b 100644 --- a/modules/datastore/src/Controller/AbstractQueryController.php +++ b/modules/datastore/src/Controller/AbstractQueryController.php @@ -91,7 +91,7 @@ public static function create(ContainerInterface $container) { * @param \Symfony\Component\HttpFoundation\Request $request * The request object. * - * @return Ilbee\CSVResponse\CSVResponse|Symfony\Component\HttpFoundation\JsonResponse + * @return \Ilbee\CSVResponse\CSVResponse|\Symfony\Component\HttpFoundation\JsonResponse * The json or CSV response. */ public function query(Request $request) { @@ -292,7 +292,7 @@ protected function getRowsLimit(): int { * Normalized and type-casted JSON string. */ public static function getPayloadJson(Request $request, $schema = NULL) { - $schema = $schema ?? file_get_contents(__DIR__ . "/../../docs/query.json"); + $schema ??= file_get_contents(__DIR__ . "/../../docs/query.json"); $payloadJson = static::getJson($request); $payloadJson = static::fixTypes($payloadJson, $schema); return $payloadJson; diff --git a/modules/datastore/src/Plugin/DkanApiDocs/DatastoreApiDocs.php b/modules/datastore/src/Plugin/DkanApiDocs/DatastoreApiDocs.php index a6bb7f0ff4..2c2962e9b8 100644 --- a/modules/datastore/src/Plugin/DkanApiDocs/DatastoreApiDocs.php +++ b/modules/datastore/src/Plugin/DkanApiDocs/DatastoreApiDocs.php @@ -23,10 +23,17 @@ class DatastoreApiDocs extends DkanApiDocsBase { /** * The DKAN metastore service. * - * @var Drupal\metastore\Service + * @var \Drupal\metastore\Service */ private $metastore; + /** + * Import info service. + * + * @var \Drupal\datastore\Service\Info\ImportInfo + */ + private ImportInfo $importInfo; + /** * Constructs a \Drupal\Component\Plugin\PluginBase object. * @@ -42,7 +49,7 @@ class DatastoreApiDocs extends DkanApiDocsBase { * The module handler service. * @param \Drupal\metastore\MetastoreService $metastore * The module handler service. - * @param Drupal\datastore\Service\Info\ImportInfo $importInfo + * @param \Drupal\datastore\Service\Info\ImportInfo $importInfo * Import info datastoer service. */ public function __construct( @@ -62,7 +69,7 @@ public function __construct( /** * Container injection. * - * @param \Drupal\common\Plugin\ContainerInterface $container + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * The service container. * @param array $configuration * A configuration array containing information about the plugin instance. @@ -100,7 +107,7 @@ public function spec() { // Reformat definitions. foreach ($querySchema["definitions"] as $key => $def) { $schemaName = "datastoreQuery" . ucfirst($key); - $def["title"] = "Datastore Query: " . (isset($def["title"]) ? $def["title"] : $key); + $def["title"] = "Datastore Query: " . ($def["title"] ?? $key); $spec["components"]["schemas"][$schemaName] = $def; } unset($querySchema["definitions"]); diff --git a/modules/datastore/src/Service/ImportService.php b/modules/datastore/src/Service/ImportService.php index 8f6778737d..267a0f55df 100644 --- a/modules/datastore/src/Service/ImportService.php +++ b/modules/datastore/src/Service/ImportService.php @@ -74,7 +74,7 @@ class ImportService { * * @see self::getImporter() */ - private ?ImportJob $importJob; + private ?ImportJob $importJob = NULL; /** * Create a resource service instance. diff --git a/modules/datastore/src/SqlEndpoint/WebServiceApi.php b/modules/datastore/src/SqlEndpoint/WebServiceApi.php index 01df9a94c1..9118a24cc5 100644 --- a/modules/datastore/src/SqlEndpoint/WebServiceApi.php +++ b/modules/datastore/src/SqlEndpoint/WebServiceApi.php @@ -22,7 +22,7 @@ class WebServiceApi implements ContainerInjectionInterface { /** * DKAN SQL Endpoint service. * - * @var \Drupal\datastore\SqlEndpoint + * @var \Drupal\datastore\SqlEndpoint\DatastoreSqlEndpointService */ private $service; @@ -36,10 +36,17 @@ class WebServiceApi implements ContainerInjectionInterface { /** * API request data. * - * @var Symfony\Component\HttpFoundation\RequestStack + * @var \Symfony\Component\HttpFoundation\RequestStack */ private $requestStack; + /** + * Metastore API response service. + * + * @var \Drupal\metastore\MetastoreApiResponse + */ + private MetastoreApiResponse $metastoreApiResponse; + /** * {@inheritdoc} */ diff --git a/modules/datastore/src/Storage/QueryFactory.php b/modules/datastore/src/Storage/QueryFactory.php index acd5aa66e2..9dc325e9ae 100644 --- a/modules/datastore/src/Storage/QueryFactory.php +++ b/modules/datastore/src/Storage/QueryFactory.php @@ -222,7 +222,7 @@ private function populateQuerySorts(Query $query) { return; } foreach ($this->datastoreQuery->{"$.sorts"} as $sort) { - $query->sorts[] = (object) $this->resourceRename($sort); + $query->sorts[] = (object) self::resourceRename($sort); } } @@ -257,7 +257,7 @@ private function populateQueryCondition($condition) { $primaryAlias = $this->datastoreQuery->{"$.resources[0].alias"}; if (isset($condition["property"])) { $return = (object) [ - "collection" => isset($condition["resource"]) ? $condition["resource"] : $primaryAlias, + "collection" => $condition["resource"] ?? $primaryAlias, "property" => $condition["property"], "value" => $this->propertyConvert($condition["value"]), ]; diff --git a/modules/datastore/src/Storage/TableSummary.php b/modules/datastore/src/Storage/TableSummary.php index 227753027f..ee3b85028f 100644 --- a/modules/datastore/src/Storage/TableSummary.php +++ b/modules/datastore/src/Storage/TableSummary.php @@ -37,15 +37,34 @@ class TableSummary implements \JsonSerializable { */ public $numOfRows; + /** + * Full text indexes. + * + * @var array|null + */ + private ?array $fulltextIndexes; + /** * Constructor. + * + * @param int $numOfColumns + * Number of columns. + * @param array $columns + * Summary columns. + * @param array|null $indexes + * Summary indexes. + * @param array|null $fulltext_indexes + * Full text indexes. + * @param int $numOfRows + * Number of rows. */ public function __construct( int $numOfColumns, array $columns, ?array $indexes, ?array $fulltext_indexes, - int $numOfRows) { + int $numOfRows + ) { $this->numOfColumns = $numOfColumns; $this->columns = $columns; $this->indexes = $indexes; @@ -54,9 +73,9 @@ public function __construct( } /** - * Inherited. + * Specify data which should be serialized to JSON. * - * {@inheritdoc} + * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { diff --git a/modules/datastore/tests/src/Kernel/Plugin/QueueWorker/LocalizeQueueWorkerTest.php b/modules/datastore/tests/src/Kernel/Plugin/QueueWorker/LocalizeQueueWorkerTest.php index 326601c776..d8f20efea7 100644 --- a/modules/datastore/tests/src/Kernel/Plugin/QueueWorker/LocalizeQueueWorkerTest.php +++ b/modules/datastore/tests/src/Kernel/Plugin/QueueWorker/LocalizeQueueWorkerTest.php @@ -22,7 +22,7 @@ */ class LocalizeQueueWorkerTest extends KernelTestBase { - const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; + protected const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; /** * {@inheritdoc} diff --git a/modules/datastore/tests/src/Kernel/Service/Info/ImportInfoTest.php b/modules/datastore/tests/src/Kernel/Service/Info/ImportInfoTest.php index 3da9d4f905..d4ffadb86b 100644 --- a/modules/datastore/tests/src/Kernel/Service/Info/ImportInfoTest.php +++ b/modules/datastore/tests/src/Kernel/Service/Info/ImportInfoTest.php @@ -31,7 +31,7 @@ class ImportInfoTest extends KernelTestBase { */ const HOST = 'http://example.com'; - const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; + protected const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; public function testFileSize() { $source_resource = new DataResource( diff --git a/modules/datastore/tests/src/Kernel/Service/ResourceLocalizerTest.php b/modules/datastore/tests/src/Kernel/Service/ResourceLocalizerTest.php index 68c609ce6f..9c1d148b11 100644 --- a/modules/datastore/tests/src/Kernel/Service/ResourceLocalizerTest.php +++ b/modules/datastore/tests/src/Kernel/Service/ResourceLocalizerTest.php @@ -33,7 +33,7 @@ class ResourceLocalizerTest extends KernelTestBase { */ const HOST = 'http://example.com'; - const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; + protected const SOURCE_URL = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; public function testNoResourceFound() { $service = $this->container->get('dkan.datastore.service.resource_localizer'); diff --git a/modules/datastore/tests/src/Unit/Plugin/QueueWorker/TestMemStorage.php b/modules/datastore/tests/src/Unit/Plugin/QueueWorker/TestMemStorage.php index a6e65c0d47..36b1f48665 100644 --- a/modules/datastore/tests/src/Unit/Plugin/QueueWorker/TestMemStorage.php +++ b/modules/datastore/tests/src/Unit/Plugin/QueueWorker/TestMemStorage.php @@ -23,10 +23,7 @@ public function primaryKey() { } public function retrieve(string $id) { - if (isset($this->storage[$id])) { - return $this->storage[$id]; - } - return null; + return $this->storage[$id] ?? null; } public function retrieveAll(): array diff --git a/modules/dkan_js_frontend/dkan_js_frontend.module b/modules/dkan_js_frontend/dkan_js_frontend.module index 81483bee1b..1e062c7bbb 100644 --- a/modules/dkan_js_frontend/dkan_js_frontend.module +++ b/modules/dkan_js_frontend/dkan_js_frontend.module @@ -34,15 +34,15 @@ function dkan_js_frontend_library_info_build() { foreach(glob(\Drupal::root() . $js_path . '*.js') as $full_path) { $basename = basename($full_path); $libraries['dkan_js_frontend']['js'][$js_path . $basename] = [ - "minified" => isset($minified) ? $minified : false, - "preprocess" => isset($preprocess) ? $preprocess : true, + "minified" => $minified ?? false, + "preprocess" => $preprocess ?? true, ]; } foreach(glob(\Drupal::root() . $css_path . '*.css') as $full_path) { $basename = basename($full_path); $libraries['dkan_js_frontend']['css']['theme'][$css_path . $basename] = [ - "minified" => isset($minified) ? $minified : false, - "preprocess" => isset($preprocess) ? $preprocess : true, + "minified" => $minified ?? false, + "preprocess" => $preprocess ?? true, ]; } $libraries['dkan_js_frontend']['dependencies'] = [ diff --git a/modules/frontend/src/Page.php b/modules/frontend/src/Page.php index 5016bebe26..b9b6ca3bab 100644 --- a/modules/frontend/src/Page.php +++ b/modules/frontend/src/Page.php @@ -20,14 +20,32 @@ class Page { /** * Node storage service. * - * @var string + * @var \Drupal\node\NodeStorageInterface */ private $nodeStorage; + /** + * Build folder configuration. + * + * @var string + */ + private $buildFolder; + + /** + * Frontend path configuration. + * + * @var string + */ + private $frontendPath; + /** * Constructor. */ - public function __construct(string $appRoot, NodeStorageInterface $nodeStorage, ConfigFactoryInterface $configFactory) { + public function __construct( + string $appRoot, + NodeStorageInterface $nodeStorage, + ConfigFactoryInterface $configFactory + ) { $this->appRoot = $appRoot; $this->nodeStorage = $nodeStorage; $this->buildFolder = $configFactory->get('frontend.config')->get('build_folder'); diff --git a/modules/frontend/src/Routing/RouteProvider.php b/modules/frontend/src/Routing/RouteProvider.php index 1c96dec33e..7b52fa6d58 100644 --- a/modules/frontend/src/Routing/RouteProvider.php +++ b/modules/frontend/src/Routing/RouteProvider.php @@ -19,10 +19,42 @@ class RouteProvider { */ private $appRoot; + /** + * Query factory service. + * + * @var \Drupal\Core\Entity\Query\QueryFactoryInterface + */ + private QueryFactoryInterface $entityQuery; + + /** + * Build folder config. + * + * @var string + */ + private $buildFolder; + + /** + * Frontend path config. + * + * @var string + */ + private $frontendPath; + + /** + * Routes config. + * + * @var array + */ + private $routes; + /** * Constructor. */ - public function __construct(string $appRoot, QueryFactoryInterface $entityQuery, ConfigFactoryInterface $configFactory) { + public function __construct( + string $appRoot, + QueryFactoryInterface $entityQuery, + ConfigFactoryInterface $configFactory + ) { $this->appRoot = $appRoot; $this->entityQuery = $entityQuery; $this->buildFolder = $configFactory->get('frontend.config')->get('build_folder'); @@ -136,7 +168,7 @@ private function addStaticPages(RouteCollection $routes) { * Private. All routes return root JS file. */ private function addIndexPage(RouteCollection $routes) { - $config_routes = $this->routes; + $config_routes = $this->routes ?? []; foreach ($config_routes as $config_route) { $possible_page = explode(",", $config_route); $routes->add($possible_page[0], $this->routeHelper($possible_page[1], "home")); diff --git a/modules/harvest/src/Commands/Helper.php b/modules/harvest/src/Commands/Helper.php index 9b8819d7aa..a6cd15f1b9 100644 --- a/modules/harvest/src/Commands/Helper.php +++ b/modules/harvest/src/Commands/Helper.php @@ -71,7 +71,7 @@ private function renderHarvestRunsInfo(array $runInfos) { $table->setHeaders(['run_id', 'processed', 'created', 'updated', 'errors']); foreach ($runInfos as $runInfo) { - list($run_id, $result) = $runInfo; + [$run_id, $result] = $runInfo; $row = array_merge( [$run_id], diff --git a/modules/harvest/src/Plugin/DkanApiDocs/HarvestApiDocs.php b/modules/harvest/src/Plugin/DkanApiDocs/HarvestApiDocs.php index 45079af534..de2981610a 100644 --- a/modules/harvest/src/Plugin/DkanApiDocs/HarvestApiDocs.php +++ b/modules/harvest/src/Plugin/DkanApiDocs/HarvestApiDocs.php @@ -90,8 +90,8 @@ public function spec() { $spec = $this->getDoc('harvest'); $ids = $this->harvest->getAllHarvestIds(); - $spec["components"]["parameters"]["harvestPlanId"]["example"] = isset($ids[0]) ? $ids[0] : "h1"; - $spec["components"]["parameters"]["harvestPlanIdQuery"]["example"] = isset($ids[0]) ? $ids[0] : "h1"; + $spec["components"]["parameters"]["harvestPlanId"]["example"] = $ids[0] ?? "h1"; + $spec["components"]["parameters"]["harvestPlanIdQuery"]["example"] = $ids[0] ?? "h1"; return $spec; } diff --git a/modules/harvest/src/Storage/IdGenerator.php b/modules/harvest/src/Storage/IdGenerator.php index 41e84eed87..3d661b35aa 100644 --- a/modules/harvest/src/Storage/IdGenerator.php +++ b/modules/harvest/src/Storage/IdGenerator.php @@ -29,7 +29,7 @@ public function __construct($json) { * Public. */ public function generate() { - return isset($this->data->identifier) ? $this->data->identifier : NULL; + return $this->data->identifier ?? NULL; } } diff --git a/modules/json_form_widget/src/Element/UploadOrLink.php b/modules/json_form_widget/src/Element/UploadOrLink.php index d1f2318f1b..b95b646c4d 100644 --- a/modules/json_form_widget/src/Element/UploadOrLink.php +++ b/modules/json_form_widget/src/Element/UploadOrLink.php @@ -68,7 +68,7 @@ public static function processManagedFile(&$element, FormStateInterface $form_st $file_url_type = static::getUrlType($element); $element = static::unsetFilesWhenRemoving($form_state->getTriggeringElement(), $element); - $file_url_remote = isset($element['#value']['file_url_remote']) ? $element['#value']['file_url_remote'] : $element['#uri']; + $file_url_remote = $element['#value']['file_url_remote'] ?? $element['#uri']; $file_url_remote_is_valid = isset($file_url_remote) && UrlHelper::isValid($file_url_remote, TRUE); $is_remote = $file_url_remote_is_valid && $file_url_type == static::TYPE_REMOTE; if ($is_remote) { @@ -238,7 +238,7 @@ protected static function getDefaultUri($element, FormStateInterface $form_state return $uri; } - return isset($element['#uri']) ? $element['#uri'] : NULL; + return $element['#uri'] ?? NULL; } /** diff --git a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php index 8e55047482..6e8ae9824d 100644 --- a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php +++ b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php @@ -159,7 +159,7 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo $field_state = static::getWidgetState($form['#parents'], $field_name, $form_state); foreach ($items as $delta => $item) { - $field_state['original_deltas'][$delta] = isset($item->_original_delta) ? $item->_original_delta : $delta; + $field_state['original_deltas'][$delta] = $item->_original_delta ?? $delta; unset($item->_original_delta, $item->_weight); } static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state); diff --git a/modules/json_form_widget/src/StringHelper.php b/modules/json_form_widget/src/StringHelper.php index de3fa34161..67c72359f4 100644 --- a/modules/json_form_widget/src/StringHelper.php +++ b/modules/json_form_widget/src/StringHelper.php @@ -65,13 +65,13 @@ public function handleStringElement($definition, $data, $object_schema = FALSE) $element = [ '#type' => $this->getElementType($property), ]; - $element['#title'] = isset($property->title) ? $property->title : ''; - $element['#description'] = isset($property->description) ? $property->description : ''; + $element['#title'] = $property->title ?? ''; + $element['#description'] = $property->description ?? ''; $element['#description_display'] = 'before'; $element['#default_value'] = $this->getDefaultValue($data, $property); // Check if the field is required. - $element_schema = $object_schema ? $object_schema : $this->builder->getSchema(); + $element_schema = $object_schema ?: $this->builder->getSchema(); $element['#required'] = $this->checkIfRequired($field_name, $element_schema); // Add options if element type is select. diff --git a/modules/json_form_widget/src/ValueHandler.php b/modules/json_form_widget/src/ValueHandler.php index e4e310dc0d..419f8b3525 100644 --- a/modules/json_form_widget/src/ValueHandler.php +++ b/modules/json_form_widget/src/ValueHandler.php @@ -49,7 +49,7 @@ public function handleStringValues($formValues, $property) { } // Handle select_or_other_select. if (isset($formValues[$property]['select'])) { - return isset($formValues[$property][0]) ? $formValues[$property][0] : NULL; + return $formValues[$property][0] ?? NULL; } return !empty($formValues[$property]) && is_string($formValues[$property]) ? $this->cleanSelectId($formValues[$property]) : FALSE; } diff --git a/modules/json_form_widget/src/WidgetRouter.php b/modules/json_form_widget/src/WidgetRouter.php index 31e0f0b6c9..0193018400 100644 --- a/modules/json_form_widget/src/WidgetRouter.php +++ b/modules/json_form_widget/src/WidgetRouter.php @@ -177,7 +177,7 @@ public function getDropdownElement($element, $spec, $titleProperty = FALSE) { $element['#options'] = $this->getDropdownOptions($spec->source, $titleProperty); if ($element['#type'] === 'select_or_other_select') { $element = $this->handleSelectOtherDefaultValue($element, $element['#options']); - $element['#input_type'] = isset($spec->other_type) ? $spec->other_type : 'textfield'; + $element['#input_type'] = $spec->other_type ?? 'textfield'; } $element['#other_option'] = isset($element['#other_option']) ?? FALSE; @@ -362,7 +362,7 @@ public function handleDkanUuidElement($spec, array $element) { */ public function handleDateElement($spec, array $element) { $element['#type'] = 'date'; - $format = isset($spec->format) ? $spec->format : 'Y-m-d'; + $format = $spec->format ?? 'Y-m-d'; if (isset($element['#default_value'])) { $date = new DrupalDateTime($element['#default_value']); $element['#default_value'] = $date->format($format); diff --git a/modules/metastore/metastore.module b/modules/metastore/metastore.module index 1859e33964..f3bdfba35e 100644 --- a/modules/metastore/metastore.module +++ b/modules/metastore/metastore.module @@ -119,7 +119,7 @@ function metastore_form_alter(&$form, FormStateInterface $form_state, $form_id) } // TODO: use an actual schema id. $object = \Drupal::service('dkan.metastore.valid_metadata')->get($json); - $object = \Drupal\metastore\MetastoreService::removeReferences($object); + $object = MetastoreService::removeReferences($object); $form[$fieldName]['widget'][0]['value']['#default_value'] = json_encode($object); } } diff --git a/modules/metastore/modules/metastore_admin/src/Plugin/Action/HideCurrentRevisionAction.php b/modules/metastore/modules/metastore_admin/src/Plugin/Action/HideCurrentRevisionAction.php index 79ec171576..1bbd85245a 100644 --- a/modules/metastore/modules/metastore_admin/src/Plugin/Action/HideCurrentRevisionAction.php +++ b/modules/metastore/modules/metastore_admin/src/Plugin/Action/HideCurrentRevisionAction.php @@ -5,6 +5,7 @@ use Drupal\Component\Datetime\TimeInterface; use Drupal\Core\Action\ActionBase; use Drupal\Core\Entity\RevisionLogInterface; +use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; @@ -33,6 +34,27 @@ class HideCurrentRevisionAction extends ActionBase implements ContainerFactoryPl */ private $entity = NULL; + /** + * Account. + * + * @var \Drupal\Core\Session\AccountInterface + */ + private AccountInterface $currentUser; + + /** + * Time service. + * + * @var \Drupal\Component\Datetime\TimeInterface + */ + private TimeInterface $timeInterface; + + /** + * Logger channel. + * + * @var \Drupal\Core\Logger\LoggerChannelInterface + */ + private LoggerChannelInterface $logger; + /** * Constructor. * diff --git a/modules/metastore/modules/metastore_search/src/ComplexData/Dataset.php b/modules/metastore/modules/metastore_search/src/ComplexData/Dataset.php index 0015e878e2..3b22436a61 100644 --- a/modules/metastore/modules/metastore_search/src/ComplexData/Dataset.php +++ b/modules/metastore/modules/metastore_search/src/ComplexData/Dataset.php @@ -165,7 +165,7 @@ private function getArrayValues($property_name) { && isset($this->data->{$matches[1]}) && is_array($this->data->{$matches[1]})) { foreach ($this->data->{$matches[1]} as $dist) { - $values[] = isset($dist->{$matches[2]}) ? $dist->{$matches[2]} : []; + $values[] = $dist->{$matches[2]} ?? []; } } elseif (isset($this->data->{$property_name})) { diff --git a/modules/metastore/modules/metastore_search/src/Controller/SearchController.php b/modules/metastore/modules/metastore_search/src/Controller/SearchController.php index d891166493..23bbd1df80 100644 --- a/modules/metastore/modules/metastore_search/src/Controller/SearchController.php +++ b/modules/metastore/modules/metastore_search/src/Controller/SearchController.php @@ -31,6 +31,20 @@ class SearchController implements ContainerInjectionInterface { */ private $requestStack; + /** + * Metastore API response service. + * + * @var \Drupal\metastore\MetastoreApiResponse + */ + private MetastoreApiResponse $metastoreApiResponse; + + /** + * Schema retriever service. + * + * @var \Drupal\metastore\SchemaRetriever + */ + private SchemaRetriever $schemaRetriever; + /** * SearchController constructor. * @@ -141,7 +155,7 @@ private function getParams(Request $request) { $params = $request->query->all(); foreach ($defaults as $param => $default) { - $params[$param] = isset($params[$param]) ? $params[$param] : $default; + $params[$param] ??= $default; } if (!is_numeric($params['page-size']) || !is_numeric($params['page'])) { diff --git a/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php b/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php index 9f39a44ca5..98cb2880ea 100644 --- a/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php +++ b/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php @@ -20,6 +20,13 @@ */ class MetastoreSearchApiDocs extends DkanApiDocsBase { + /** + * Metastore search service. + * + * @var \Drupal\metastore_search\Search + */ + private Search $metastoreSearch; + /** * Constructs a \Drupal\Component\Plugin\PluginBase object. * @@ -51,7 +58,7 @@ public function __construct( /** * Container injection. * - * @param \Drupal\common\Plugin\ContainerInterface $container + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * The service container. * @param array $configuration * A configuration array containing information about the plugin instance. diff --git a/modules/metastore/modules/metastore_search/src/Search.php b/modules/metastore/modules/metastore_search/src/Search.php index 3c4e61668d..ea7fe2c50e 100644 --- a/modules/metastore/modules/metastore_search/src/Search.php +++ b/modules/metastore/modules/metastore_search/src/Search.php @@ -212,10 +212,7 @@ private function setSearchIndex(string $id) { * If available, return the search index. */ public function getSearchIndex() { - if (isset($this->index)) { - return $this->index; - } - return NULL; + return $this->index ?? NULL; } } diff --git a/modules/metastore/src/Controller/MetastoreRevisionController.php b/modules/metastore/src/Controller/MetastoreRevisionController.php index 3fb84786ec..cc06ae47ab 100644 --- a/modules/metastore/src/Controller/MetastoreRevisionController.php +++ b/modules/metastore/src/Controller/MetastoreRevisionController.php @@ -41,6 +41,20 @@ class MetastoreRevisionController implements ContainerInjectionInterface { */ private $docs; + /** + * Metastore API response service. + * + * @var \Drupal\metastore\MetastoreApiResponse + */ + private MetastoreApiResponse $apiResponse; + + /** + * Storage factory service. + * + * @var \Contracts\FactoryInterface + */ + private ContractsFactoryInterface $storageFactory; + /** * Inherited. * @@ -56,7 +70,10 @@ public static function create(ContainerInterface $container) { /** * Constructor. */ - public function __construct(MetastoreApiResponse $apiResponse, ContractsFactoryInterface $storageFactory) { + public function __construct( + MetastoreApiResponse $apiResponse, + ContractsFactoryInterface $storageFactory + ) { $this->apiResponse = $apiResponse; $this->storageFactory = $storageFactory; } diff --git a/modules/metastore/src/DatasetApiDocs.php b/modules/metastore/src/DatasetApiDocs.php index 44d509c48c..e31bf3f7be 100644 --- a/modules/metastore/src/DatasetApiDocs.php +++ b/modules/metastore/src/DatasetApiDocs.php @@ -292,7 +292,7 @@ private function getSqlPathsAndOperations($pathsAndOperations) { * Private. */ private function modifySqlEndpoint($operations, $distribution) { - $distKey = isset($distribution['data']['title']) ? $distribution['data']['title'] : $distribution['identifier']; + $distKey = $distribution['data']['title'] ?? $distribution['identifier']; unset($operations['get']['parameters'][0]['example']); $operations['get']['parameters'][0]['examples'][$distKey] = [ "summary" => "Query distribution {$distribution['identifier']}", diff --git a/modules/metastore/src/MetastoreApiResponse.php b/modules/metastore/src/MetastoreApiResponse.php index db03ca9856..eb0d321025 100644 --- a/modules/metastore/src/MetastoreApiResponse.php +++ b/modules/metastore/src/MetastoreApiResponse.php @@ -12,11 +12,18 @@ */ class MetastoreApiResponse { + /** + * Metastore item factory service. + * + * @var \Drupal\metastore\Factory\MetastoreItemFactoryInterface + */ + private MetastoreItemFactoryInterface $metastoreItemFactory; + /** * Constructor. * * @param \Drupal\metastore\Factory\MetastoreItemFactoryInterface $metastoreItemFactory - * Metastore Item factory service. + * Metastore item factory service. */ public function __construct(MetastoreItemFactoryInterface $metastoreItemFactory) { $this->metastoreItemFactory = $metastoreItemFactory; diff --git a/modules/metastore/src/MetastoreService.php b/modules/metastore/src/MetastoreService.php index 030f5671e8..849d2dde1e 100644 --- a/modules/metastore/src/MetastoreService.php +++ b/modules/metastore/src/MetastoreService.php @@ -431,7 +431,7 @@ public function delete($schema_id, $identifier) { public function getCatalog() { $catalog = $this->getSchema('catalog'); $catalog->dataset = array_map(function ($object) { - $modified_object = $this->removeReferences($object); + $modified_object = static::removeReferences($object); return (object) $modified_object->get('$'); }, $this->getAll('dataset')); diff --git a/modules/metastore/src/Plugin/QueueWorker/OrphanReferenceProcessor.php b/modules/metastore/src/Plugin/QueueWorker/OrphanReferenceProcessor.php index a7192657f3..51a3476933 100644 --- a/modules/metastore/src/Plugin/QueueWorker/OrphanReferenceProcessor.php +++ b/modules/metastore/src/Plugin/QueueWorker/OrphanReferenceProcessor.php @@ -36,6 +36,13 @@ class OrphanReferenceProcessor extends QueueWorkerBase implements ContainerFacto */ protected $nodeStorage; + /** + * Reference lookup service. + * + * @var \Drupal\metastore\ReferenceLookupInterface + */ + private ReferenceLookupInterface $referenceLookup; + /** * Constructs a new class instance. * @@ -55,7 +62,8 @@ public function __construct( $plugin_id, $plugin_definition, NodeStorageInterface $nodeStorage, - ReferenceLookupInterface $referenceLookup) { + ReferenceLookupInterface $referenceLookup + ) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->referenceLookup = $referenceLookup; $this->nodeStorage = $nodeStorage; diff --git a/modules/metastore/src/Plugin/QueueWorker/OrphanResourceRemover.php b/modules/metastore/src/Plugin/QueueWorker/OrphanResourceRemover.php index 27aff4fce2..33ac924251 100644 --- a/modules/metastore/src/Plugin/QueueWorker/OrphanResourceRemover.php +++ b/modules/metastore/src/Plugin/QueueWorker/OrphanResourceRemover.php @@ -68,7 +68,7 @@ public static function create(ContainerInterface $container, array $configuratio * {@inheritdoc} */ public function processItem($data) { - list($id, $perspective, $version) = $data; + [$id, $perspective, $version] = $data; // Use the metastore resourceMapper to remove the source entry. $resource = $this->resourceMapper->get($id, $perspective, $version); diff --git a/modules/metastore/src/Reference/ReferenceLookup.php b/modules/metastore/src/Reference/ReferenceLookup.php index 8aad7991ed..df5c52ce3c 100644 --- a/modules/metastore/src/Reference/ReferenceLookup.php +++ b/modules/metastore/src/Reference/ReferenceLookup.php @@ -33,6 +33,20 @@ class ReferenceLookup implements ReferenceLookupInterface { */ protected $metastoreItemFactory; + /** + * Cache tags invalidator service. + * + * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface + */ + private CacheTagsInvalidatorInterface $invalidator; + + /** + * Module handler service. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + private ModuleHandlerInterface $moduleHandler; + /** * Module Handler service. * diff --git a/modules/metastore/src/Storage/DataFactory.php b/modules/metastore/src/Storage/DataFactory.php index cd712adc3c..e7fb337f59 100644 --- a/modules/metastore/src/Storage/DataFactory.php +++ b/modules/metastore/src/Storage/DataFactory.php @@ -75,7 +75,7 @@ private function getEntityTypeBySchema(string $schema_id) : string { $mapping = [ 'dataset' => 'node', ]; - return isset($mapping[$schema_id]) ? $mapping[$schema_id] : 'node'; + return $mapping[$schema_id] ?? 'node'; } /** diff --git a/modules/metastore/tests/src/Functional/Storage/NodeDataTest.php b/modules/metastore/tests/src/Functional/Storage/NodeDataTest.php index 8787b6d719..4016a4b874 100644 --- a/modules/metastore/tests/src/Functional/Storage/NodeDataTest.php +++ b/modules/metastore/tests/src/Functional/Storage/NodeDataTest.php @@ -4,6 +4,7 @@ use Drupal\metastore\Exception\MissingObjectException; use Drupal\metastore\MetastoreService; +use Drupal\metastore\ValidMetadataFactory; use Drupal\Tests\common\Traits\CleanUp; use Drupal\Tests\metastore\Unit\MetastoreServiceTest; use RootedData\RootedJsonData; @@ -20,6 +21,8 @@ class NodeDataTest extends ExistingSiteBase { private const S3_PREFIX = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit'; + private ValidMetadataFactory $validMetadataFactory; + public function setUp(): void { parent::setUp(); $this->removeHarvests(); diff --git a/modules/metastore/tests/src/Unit/Storage/DataTest.php b/modules/metastore/tests/src/Unit/Storage/DataTest.php index 13d786a921..c2f685d846 100644 --- a/modules/metastore/tests/src/Unit/Storage/DataTest.php +++ b/modules/metastore/tests/src/Unit/Storage/DataTest.php @@ -149,7 +149,7 @@ public function testRetrieveRangeUuids(): void { $nodes[$i] = new class { private $uuid; public function uuid() { - return isset($this->uuid) ? $this->uuid : $this->uuid = uniqid(); + return $this->uuid ?? ($this->uuid = uniqid()); } }; $uuids[$i] = $nodes[$i]->uuid(); diff --git a/phpunit.xml b/phpunit.xml index e1e33203b3..37a226bd18 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,8 +4,6 @@ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" bootstrap="/var/www/html/vendor/weitzman/drupal-test-traits/src/bootstrap.php" colors="true" - stopOnFailure="false" - stopOnError="false" verbose="true"> @@ -13,12 +11,12 @@ rector.php + tests modules/common/tests modules/datastore/tests modules/dkan_js_frontend/tests modules/metastore/tests modules/sample_content - ./ ./ diff --git a/rector.php b/rector.php new file mode 100644 index 0000000000..3b0409e5ed --- /dev/null +++ b/rector.php @@ -0,0 +1,99 @@ +paths([ + __DIR__, + ]); + + // Our base version of PHP. + $rectorConfig->phpVersion(PhpVersion::PHP_74); + + $rectorConfig->sets([ + Drupal9SetList::DRUPAL_94, + LevelSetList::UP_TO_PHP_74, + ]); + + $rectorConfig->skip([ + '*/upgrade_status/tests/modules/*', + // Keep getMockBuilder() for now. + GetMockBuilderGetMockToCreateMockRector::class, + DrupalGetMockRector::class, + GetMockRector::class, + // Don't throw errors on JSON parse problems. Yet. + // @todo Throw errors and deal with them appropriately. + JsonThrowOnErrorRector::class, + // We like our tags. Unfortunately some other rules obliterate them anyway. + RemoveUselessParamTagRector::class, + RemoveUselessVarTagRector::class, + RemoveUselessReturnTagRector::class, + AddDoesNotPerformAssertionToNonAssertingTestRector::class, + ClosureToArrowFunctionRector::class, + // Don't automate ::class because we need some string literals that look + // like class names. + // @see \Drupal\common\Util\JobStoreUtil + // @see \Drupal\common\EventDispatcherTrait + StringClassNameToClassConstantRector::class, + RemoveExtraParametersRector::class, + PublicConstantVisibilityRector::class, + ]); + + $drupalFinder = new DrupalFinder(); + $drupalFinder->locateRoot(__DIR__); + $drupalRoot = $drupalFinder->getDrupalRoot(); + + $rectorConfig->autoloadPaths([ + $drupalRoot . '/core', + $drupalRoot . '/modules', + $drupalRoot . '/profiles', + $drupalRoot . '/themes', + ]); + $rectorConfig->skip(['*/upgrade_status/tests/modules/*']); + $rectorConfig->fileExtensions([ + 'php', 'module', 'theme', 'install', 'profile', 'inc', 'engine', + ]); + $rectorConfig->importNames(TRUE, FALSE); + $rectorConfig->importShortClasses(FALSE); +};