Skip to content

Added 'declare(strict_types=1)' and PHP 8.2 type declarations via Rector.#337

Merged
AlexSkrypnyk merged 7 commits intomasterfrom
feature/strict-types
Apr 17, 2026
Merged

Added 'declare(strict_types=1)' and PHP 8.2 type declarations via Rector.#337
AlexSkrypnyk merged 7 commits intomasterfrom
feature/strict-types

Conversation

@AlexSkrypnyk
Copy link
Copy Markdown
Collaborator

@AlexSkrypnyk AlexSkrypnyk commented Apr 17, 2026

Note: This PR is one part of the v3.x upgrade. See the
3.x epic #312
for the full scope and related work.

Part of #312

Summary

Introduces declare(strict_types=1) and PHP 8.2 parameter/return/property type declarations across all 57 files in the codebase (32 source files, 24 test files, plus rector.php). Rector is configured to mirror the Drupal Extension's setup, using php82 sets, typeDeclarations and naming prepared sets, and DeclareStrictTypesRector. Switched from the unmaintained palantirnet/drupal-rector ^0.20 to rector/rector ^2.0 directly - the same dependency Drupal Extension uses.

Changes

Tooling

  • composer.json: dropped palantirnet/drupal-rector ^0.20; added rector/rector ^2.0 directly. Matches Drupal Extension's setup.
  • rector.php: rewritten to mirror Drupal Extension's rector config. Key changes:
    • withPhpSets(php74: TRUE) -> withPhpSets(php82: TRUE)
    • Added typeDeclarations and naming to withPreparedSets
    • Added DeclareStrictTypesRector and YieldDataProviderRector rules
    • Added skips for rules that conflict with our codebase (e.g. ChangeSwitchToMatchRector, CompleteDynamicPropertiesRector, several Naming rules, ClassPropertyAssignToConstructorPromotionRector)
    • Added withImportNames(importNames: TRUE, importDocBlockNames: FALSE, importShortClasses: FALSE)
    • Added withFileExtensions(['php', 'inc'])

Source code (src/)

  • Added declare(strict_types=1); to every file (32 files).
  • Added parameter and return type declarations across interfaces and concrete classes (DriverInterface, CoreInterface, BaseDriver, BlackboxDriver, DrupalDriver, DrushDriver, AbstractCore, Drupal8, all field handlers).
  • Added property type declarations where rector could infer them.
  • Manually reverted rector's constructor property promotion in AbstractCore.php, Exception.php, and DrupalDriver.php (the promotion mangled existing docblocks); skipped that rule going forward.
  • Removed redundant @return mixed[] docblocks rector added when the signature already declares : array on {@inheritdoc} methods (PHPCS sniffs require a description otherwise).

Tests (tests/)

  • Added declare(strict_types=1); to every test file (24 files).
  • Added : void return types on setUp / tearDown / test methods.
  • Added : array return types on data providers.
  • Yield-style refactor on data providers where applicable.
  • Tightened type casts on test fixtures.

Summary by CodeRabbit

  • Refactor

    • Enhanced codebase with strict type declarations throughout for improved type safety
    • Modernized configuration for PHP 8.2+ compatibility
    • Updated test infrastructure with stronger typing and refactored data providers
  • Chores

    • Updated development dependencies to latest versions

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 17, 2026

Warning

Rate limit exceeded

@AlexSkrypnyk has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 42 minutes and 42 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 42 minutes and 42 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: be75f1e0-4217-456c-ad1f-83a2bb6f3dfc

📥 Commits

Reviewing files that changed from the base of the PR and between f255a0c and 2fb3a86.

📒 Files selected for processing (43)
  • composer.json
  • phpcs.xml
  • phpstan.neon
  • spec/Drupal/Driver/Cores/Drupal8Spec.php
  • src/Drupal/Driver/AuthenticationDriverInterface.php
  • src/Drupal/Driver/BaseDriver.php
  • src/Drupal/Driver/Cores/AbstractCore.php
  • src/Drupal/Driver/Cores/CoreAuthenticationInterface.php
  • src/Drupal/Driver/Cores/CoreInterface.php
  • src/Drupal/Driver/Cores/Drupal8.php
  • src/Drupal/Driver/DriverInterface.php
  • src/Drupal/Driver/DrupalDriver.php
  • src/Drupal/Driver/DrushDriver.php
  • src/Drupal/Driver/Exception/BootstrapException.php
  • src/Drupal/Driver/Exception/Exception.php
  • src/Drupal/Driver/Exception/UnsupportedDriverActionException.php
  • src/Drupal/Driver/Fields/Drupal8/AbstractHandler.php
  • src/Drupal/Driver/Fields/Drupal8/AddressHandler.php
  • src/Drupal/Driver/Fields/Drupal8/DatetimeHandler.php
  • src/Drupal/Driver/Fields/Drupal8/DefaultHandler.php
  • src/Drupal/Driver/Fields/Drupal8/EntityReferenceHandler.php
  • src/Drupal/Driver/Fields/Drupal8/FileHandler.php
  • src/Drupal/Driver/Fields/Drupal8/ListHandlerBase.php
  • src/Drupal/Driver/Fields/Drupal8/TextWithSummaryHandler.php
  • src/Drupal/Driver/Fields/FieldHandlerInterface.php
  • src/Drupal/Driver/SubDriverFinderInterface.php
  • tests/Drupal/Tests/Driver/BlackboxDriverTest.php
  • tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php
  • tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php
  • tests/Drupal/Tests/Driver/Drupal8Test.php
  • tests/Drupal/Tests/Driver/DrushDriverTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/AddressHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/DaterangeHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/DatetimeHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/EntityReferenceHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/FileHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/ImageHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/ListHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/SupportedImageHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/TaxonomyTermReferenceHandlerTest.php
  • tests/Drupal/Tests/Driver/LinkHandlerTest.php
  • tests/Drupal/Tests/Driver/NameHandlerTest.php
  • tests/Drupal/Tests/Driver/TimeHandlerTest.php
📝 Walkthrough

Walkthrough

The pull request systematically adds PHP 8+ strict typing declarations and return types across the codebase. Updates include enabling declare(strict_types=1) in source and test files, adding method return types, updating Rector from v0.20 (drupal-rector) to v2.0, and targeting PHP 8.2 instead of 7.4.

Changes

Cohort / File(s) Summary
Configuration & Dependencies
composer.json, rector.php
Replaced palantirnet/drupal-rector with rector/rector v2.0. Updated Rector configuration to target PHP 8.2, enabled typeDeclarations and naming sets, added explicit Rector rules, expanded skip list, and configured file extensions and import handling.
Driver Core Interfaces
src/Drupal/Driver/AuthenticationDriverInterface.php, src/Drupal/Driver/DriverInterface.php, src/Drupal/Driver/Cores/CoreAuthenticationInterface.php, src/Drupal/Driver/Cores/CoreInterface.php, src/Drupal/Driver/Fields/FieldHandlerInterface.php, src/Drupal/Driver/SubDriverFinderInterface.php
Added declare(strict_types=1) to all interface files. No signature changes to interface methods.
Core Implementations
src/Drupal/Driver/Cores/AbstractCore.php, src/Drupal/Driver/Cores/Drupal8.php
Added declare(strict_types=1). Updated AbstractCore property $random to use nullable type ?Random. Added return type declarations to all Drupal8 public methods (: void, : array, : bool, `: \stdClass
Driver Base Classes
src/Drupal/Driver/BaseDriver.php, src/Drupal/Driver/BlackboxDriver.php
Added declare(strict_types=1). Updated BaseDriver::errorString() with parameter and return types. Changed BlackboxDriver::isBootstrapped() return type to : bool.
Main Driver Implementations
src/Drupal/Driver/DrupalDriver.php, src/Drupal/Driver/DrushDriver.php
Added declare(strict_types=1). Added comprehensive return type declarations to all public methods. Updated property types (private bool $bootstrapped). Strengthened authentication checks using instanceof CoreAuthenticationInterface. Replaced deprecated function calls (get_class()::class, strpos()str_contains()). Added scalar type hints to parameters and updated internal helper methods.
Exception Classes
src/Drupal/Driver/Exception/Exception.php, src/Drupal/Driver/Exception/BootstrapException.php, src/Drupal/Driver/Exception/UnsupportedDriverActionException.php
Added declare(strict_types=1) to all exception files. Updated Exception::$driver property to private readonly ?DriverInterface $driver. Changed UnsupportedDriverActionException to use ::class instead of get_class().
Field Handler Classes
src/Drupal/Driver/Fields/Drupal8/*.php
Added declare(strict_types=1) to all 17 field handler files. Updated handler methods (e.g., expand()) with return type : array. Added scalar type casts where needed (e.g., (string) before pathinfo()). Updated filter closures with explicit return types.
Driver Tests
tests/Drupal/Tests/Driver/BlackboxDriverTest.php, tests/Drupal/Tests/Driver/Drupal8Test.php, tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php, tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php, tests/Drupal/Tests/Driver/DrushDriverTest.php, tests/Drupal/Tests/Driver/Exception/UnsupportedDriverActionExceptionTest.php
Added declare(strict_types=1) to all test files. Updated test method signatures to include : void return types. Changed data providers from array returns to \Iterator with yield statements. Removed ReflectionMethod::setAccessible(TRUE) calls. Added parameter type hints to test methods.
Field Handler Tests
tests/Drupal/Tests/Driver/Fields/Drupal8/*Test.php, tests/Drupal/Tests/Driver/LinkHandlerTest.php, tests/Drupal/Tests/Driver/NameHandlerTest.php, tests/Drupal/Tests/Driver/TimeHandlerTest.php
Added declare(strict_types=1) to 12 test files. Updated test methods with : void return types and scalar parameter types. Converted data providers from arrays to generators using yield. Updated helper methods with concrete return types. Removed ReflectionProperty::setAccessible(TRUE) calls.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 Strict types now flow through every file with care,
Return declarations declared everywhere,
From eight-dot-two we hop with modern grace,
Type safety puts bugs firmly in their place!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately summarizes the main change: adding declare(strict_types=1) and PHP 8.2 type declarations via Rector.
Docstring Coverage ✅ Passed Docstring coverage is 98.25% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/strict-types

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 17, 2026

Code coverage (threshold: 35%)



Code Coverage Report Summary:
  Classes: 54.17% (13/24)
  Methods: 31.84% (57/179)
  Lines:   40.14% (297/740)

Per-class coverage
Drupal\Driver\BaseDriver                                      96.77%
Drupal\Driver\BlackboxDriver                                 100.00%
Drupal\Driver\Cores\AbstractCore                              23.81%
Drupal\Driver\Cores\Drupal8                                   11.02%
Drupal\Driver\DrupalDriver                                     0.00%
Drupal\Driver\DrushDriver                                     22.76%
Drupal\Driver\Exception\BootstrapException                   100.00%
Drupal\Driver\Exception\Exception                            100.00%
Drupal\Driver\Exception\UnsupportedDriverActionException     100.00%
Drupal\Driver\Fields\Drupal8\AbstractHandler                   0.00%
Drupal\Driver\Fields\Drupal8\AddressHandler                  100.00%
Drupal\Driver\Fields\Drupal8\DaterangeHandler                100.00%
Drupal\Driver\Fields\Drupal8\DatetimeHandler                  46.67%
Drupal\Driver\Fields\Drupal8\DefaultHandler                  100.00%
Drupal\Driver\Fields\Drupal8\EmbridgeAssetItemHandler          0.00%
Drupal\Driver\Fields\Drupal8\EntityReferenceHandler           79.31%
Drupal\Driver\Fields\Drupal8\FileHandler                      94.44%
Drupal\Driver\Fields\Drupal8\ImageHandler                     92.86%
Drupal\Driver\Fields\Drupal8\LinkHandler                     100.00%
Drupal\Driver\Fields\Drupal8\ListFloatHandler                  0.00%
Drupal\Driver\Fields\Drupal8\ListHandlerBase                 100.00%
Drupal\Driver\Fields\Drupal8\ListIntegerHandler                0.00%
Drupal\Driver\Fields\Drupal8\ListStringHandler                 0.00%
Drupal\Driver\Fields\Drupal8\NameHandler                     100.00%
Drupal\Driver\Fields\Drupal8\OgStandardReferenceHandler        0.00%
Drupal\Driver\Fields\Drupal8\SupportedImageHandler            95.83%
Drupal\Driver\Fields\Drupal8\TaxonomyTermReferenceHandler    100.00%
Drupal\Driver\Fields\Drupal8\TextWithSummaryHandler          100.00%
Drupal\Driver\Fields\Drupal8\TimeHandler                     100.00%

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/Drupal/Driver/Exception/Exception.php (1)

36-44: ⚠️ Potential issue | 🟡 Minor

Docblock return type is inconsistent with the nullable property.

$this->driver is now typed as ?DriverInterface and defaults to NULL when the constructor is called without a driver, so getDriver() can return null. The @return \Drupal\Driver\DriverInterface docblock should reflect that (and adding a real : ?DriverInterface return type here would match the strict-typing goals of this PR).

📝 Suggested doc/return type alignment
   /**
    * Returns exception driver.
    *
-   * `@return` \Drupal\Driver\DriverInterface
+   * `@return` \Drupal\Driver\DriverInterface|null
    *   The driver where the exception occurred.
    */
-  public function getDriver() {
+  public function getDriver(): ?DriverInterface {
     return $this->driver;
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Exception/Exception.php` around lines 36 - 44, Update the
getDriver() signature and docblock to match the nullable $driver property:
change the docblock `@return` to `@return` \Drupal\Driver\DriverInterface|null and
add a nullable return type to the method (public function getDriver():
?\Drupal\Driver\DriverInterface) so the method and docs correctly reflect that
$this->driver may be null; reference the getDriver() method and the $driver
property in the Exception class when making the change.
src/Drupal/Driver/Fields/Drupal8/FileHandler.php (1)

19-23: ⚠️ Potential issue | 🟡 Minor

Verify file_get_contents() under strict_types=1 with non-string $file_path.

Line 19 now casts $file_path to string for pathinfo(), but line 20 (file_get_contents($file_path)) and line 23 (sprintf('... %s ...', $file_path)) still pass the raw $file_path. If callers ever pass a non-string (e.g. integer target_id from an entity reference), file_get_contents() will raise a TypeError under strict types. Consider casting once and reusing:

Proposed change
-      $file_path = is_array($value) ? $value['target_id'] ?? $value[0] : $value;
-      $file_extension = pathinfo((string) $file_path, PATHINFO_EXTENSION);
-      $data = file_get_contents($file_path);
+      $file_path = (string) (is_array($value) ? $value['target_id'] ?? $value[0] : $value);
+      $file_extension = pathinfo($file_path, PATHINFO_EXTENSION);
+      $data = file_get_contents($file_path);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Fields/Drupal8/FileHandler.php` around lines 19 - 23, The
code in FileHandler.php uses pathinfo((string) $file_path) but leaves
file_get_contents($file_path) and sprintf(... $file_path) using the original
variable, which can cause TypeError under strict_types if callers pass
non-strings; fix by casting $file_path to string once up front (e.g., $file_path
= (string) $file_path) and then use that casted variable for pathinfo,
file_get_contents and sprintf so all calls use a guaranteed string; update
references to $file_path within the method where pathinfo, file_get_contents and
the exception sprintf are used.
src/Drupal/Driver/Fields/Drupal8/DatetimeHandler.php (1)

40-46: ⚠️ Potential issue | 🟡 Minor

Docblock/return-type inconsistent with actual behavior.

formatDateValue() can return NULL (line 45) but the docblock declares @return string and — unlike most methods touched by this PR — no explicit return type was added. Under strict_types=1, this will bite if a future caller assigns the result to a string-typed sink. Consider tightening to : ?string and updating the docblock, or normalizing the empty case to return ''.

♻️ Proposed fix
-   * `@return` string
+   * `@return` string|null
    *   The formatted date string.
    */
-  protected function formatDateValue($value, \DateTimeZone $site_timezone, \DateTimeZone $storage_timezone) {
+  protected function formatDateValue($value, \DateTimeZone $site_timezone, \DateTimeZone $storage_timezone): ?string {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Fields/Drupal8/DatetimeHandler.php` around lines 40 - 46,
The docblock and signature for formatDateValue are inconsistent with its
behavior (it returns NULL); update formatDateValue to have a nullable return
type and matching docblock or normalize null/empty to an empty
string—specifically, change the method signature to return ?string and update
the `@return` in the docblock to "@return string|null", or alternatively ensure
the early-return branch returns '' instead of NULL and keep `@return` string;
update any callers/tests if needed to match the chosen approach.
♻️ Duplicate comments (1)
tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php (1)

52-132: ⚠️ Potential issue | 🟡 Minor

Data providers likely need public static for PHPUnit 10+.

dataProviderIsBaseField, dataProviderIsField, and dataProviderGetEntityFieldTypes are instance methods. If the repo uses PHPUnit ≥10, non-static data providers are deprecated (removed in 11). Since BlackboxDriverTest::dataProviderUnsupportedActionsThrow in this same PR is already public static, aligning these maintains consistency.

Apply the same conversion to all three providers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php` around lines 52 - 132,
Update the three data provider methods to be static so PHPUnit 10+ accepts them:
change the signatures of dataProviderIsBaseField(), dataProviderIsField(), and
dataProviderGetEntityFieldTypes() to public static function ... : \Iterator;
keep their yields and return types unchanged and leave the `@dataProvider`
annotations in testIsBaseField, testIsField, and testGetEntityFieldTypes as-is.
🧹 Nitpick comments (14)
tests/Drupal/Tests/Driver/Drupal8Test.php (1)

22-24: Property type hint would be more consistent with PR direction.

The PR summary mentions adding property type declarations across the codebase. $originalRequestTime is declared as @var int but without a type hint, and it's assigned NULL in setUp() (line 31). Consider protected ?int $originalRequestTime = NULL; to match both the actual runtime values and the PR's typing goals; the @var docblock would then be redundant.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Drupal8Test.php` around lines 22 - 24, The property
$originalRequestTime in class Drupal8Test is documented as `@var` int but is
assigned NULL in setUp(), so change its declaration to a nullable typed property
to match runtime values and the PR typing goal: replace the untyped protected
$originalRequestTime with protected ?int $originalRequestTime = NULL and remove
the redundant `@var` docblock; ensure any references in setUp() and tests still
work with the nullable int type.
src/Drupal/Driver/Fields/Drupal8/FileHandler.php (1)

15-15: Consider propagating : array return type to FieldHandlerInterface::expand().

FileHandler::expand() (and sibling handlers) now declares : array, but FieldHandlerInterface::expand() still lacks a return type. While covariance makes this legal, tightening the interface would make the contract consistent across all implementations and prevent drift in future handlers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Fields/Drupal8/FileHandler.php` at line 15, The interface
method FieldHandlerInterface::expand() lacks the stricter return type even
though implementations like FileHandler::expand() declare ": array"; update the
FieldHandlerInterface::expand() signature to include the ": array" return type
so all implementations conform to the interface (and adjust any other handler
implementations or usages if needed to satisfy the new signature), then run
static/type checks to ensure no breaks.
src/Drupal/Driver/BlackboxDriver.php (1)

15-15: Consider adding : bool to DriverInterface::isBootstrapped().

Adding the return type only on the implementation leaves the interface contract loose. Since all concrete drivers return bool, declaring : bool on DriverInterface::isBootstrapped() (and on sibling methods where applicable) would better express the contract and help static analysis. Covariant return types make this a safe, source-compatible change for existing implementations.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/BlackboxDriver.php` at line 15, Add the explicit return
type on the interface: update DriverInterface::isBootstrapped() to declare ":
bool" so the interface matches implementations like
BlackboxDriver::isBootstrapped(); likewise add ": bool" to any sibling methods
in DriverInterface that concrete drivers already return bool for (so
implementations remain source-compatible and static analysis is accurate).
src/Drupal/Driver/Cores/AbstractCore.php (1)

32-44: Consider making $random non-nullable.

The constructor always assigns a non-null Random (lines 40–43 instantiate a default when the argument is NULL), and subclasses such as Drupal8 dereference $this->random->name(...) without null checks. Declaring protected Random $random; more accurately reflects the invariant and avoids misleading ? at the type site and any future null-safety churn.

♻️ Proposed tweak
-  protected ?Random $random;
+  protected Random $random;

Note: Rector's TypedPropertyFromAssignsRector / PropertyTypeDeclarationRector typically infer nullability from declared defaults; since there's no default here the nullable inference is conservative rather than necessary.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Cores/AbstractCore.php` around lines 32 - 44, The property
$random is always initialized in AbstractCore::__construct and is dereferenced
elsewhere (e.g., Drupal8->...->name), so change the property declaration from
protected ?Random $random; to protected Random $random; to reflect the
invariant; keep the constructor parameter as ?Random $random = NULL (or accept
Random|null) and retain the fallback new Random() assignment in __construct so
the non-nullable property is always initialized; scan usages of
AbstractCore::$random (e.g., Drupal8) to ensure no null checks are required
after this change.
tests/Drupal/Tests/Driver/Fields/Drupal8/DaterangeHandlerTest.php (1)

73-95: Minor: loadDatetimeModuleInterface() lacks a return type.

For consistency with the PR's type-declaration pass (and the strict-types header), consider adding : bool — all return statements already return TRUE/FALSE.

♻️ Proposed tweak
-  protected function loadDatetimeModuleInterface() {
+  protected function loadDatetimeModuleInterface(): bool {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Fields/Drupal8/DaterangeHandlerTest.php` around
lines 73 - 95, The method loadDatetimeModuleInterface currently returns only
TRUE/FALSE but lacks a declared return type; update its signature to declare a
boolean return type (add ": bool") on the loadDatetimeModuleInterface method and
ensure the implementation (uses of DateTimeItemInterface and InstalledVersions)
remains unchanged so all existing return TRUE/FALSE statements satisfy the new
type.
src/Drupal/Driver/Fields/Drupal8/EntityReferenceHandler.php (1)

15-15: Optional: consider adding : array on FieldHandlerInterface::expand() for consistency.

Adding a covariant : array return on the implementation is valid PHP, but the interface and some siblings (DefaultHandler, TextWithSummaryHandler, DatetimeHandler) still omit the return type. Declaring it on the interface would enforce the contract uniformly across all handlers. Not a blocker — can be deferred.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Fields/Drupal8/EntityReferenceHandler.php` at line 15, Add
a covariant return type on the FieldHandlerInterface::expand() signature
(declare it as returning : array) so all implementations (including
EntityReferenceHandler::expand(), DefaultHandler::expand(),
TextWithSummaryHandler::expand(), DatetimeHandler::expand(), etc.) must return
an array; update the interface method signature only (not the implementations)
to include ": array" to enforce the contract across all handlers.
tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php (2)

94-105: Consistency: add : void to the two reflection invoker helpers.

setPermissions() and the test methods in this file were all updated to : void, but these two helpers weren't. They don't return a value — aligning them keeps the file consistent with the repo-wide typing pass.

♻️ Proposed fix
-  protected function callConvertPermissions(Drupal8 $core, array &$permissions) {
+  protected function callConvertPermissions(Drupal8 $core, array &$permissions): void {
     $method = new \ReflectionMethod($core, 'convertPermissions');
     $method->invokeArgs($core, [&$permissions]);
   }
@@
-  protected function callCheckPermissions(Drupal8 $core, array &$permissions) {
+  protected function callCheckPermissions(Drupal8 $core, array &$permissions): void {
     $method = new \ReflectionMethod($core, 'checkPermissions');
     $method->invokeArgs($core, [&$permissions]);
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php` around lines 94 - 105,
Add explicit return type annotations ": void" to the two helper methods
callConvertPermissions and callCheckPermissions; these methods currently declare
"protected function callConvertPermissions(Drupal8 $core, array &$permissions)"
and "protected function callCheckPermissions(Drupal8 $core, array
&$permissions)" and should be changed to "protected function
callConvertPermissions(Drupal8 $core, array &$permissions): void" and "protected
function callCheckPermissions(Drupal8 $core, array &$permissions): void"
respectively—nothing else in the body needs to change (they use ReflectionMethod
and invokeArgs).

110-123: Minor: anonymous-class $label is untyped, so __toString(): string can fatal under strict types.

With declare(strict_types=1);, if a non-string ever reaches $this->label, the __toString(): string return will throw a TypeError. Current callers pass strings, so this is just a defensive hardening.

♻️ Proposed fix
-  protected function stringable($label): object {
+  protected function stringable(string $label): object {
     return new class($label) {
-
-      public function __construct(private $label) {}
+
+      public function __construct(private string $label) {}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php` around lines 110 - 123,
The anonymous class used by stringable() accepts an untyped $label which can
cause a TypeError in strict mode when __toString(): string returns it; update
the signature and constructor to enforce a string: change stringable($label) to
stringable(string $label): object and change the anonymous class constructor to
accept private string $label so the stored value is always a string for
__toString().
tests/Drupal/Tests/Driver/Fields/Drupal8/ListHandlerTest.php (1)

87-87: Consistency: add types to createHandler() helper.

Other reworked test helpers in this PR (LinkHandlerTest::createHandler(): LinkHandler, NameHandlerTest::createHandler(): NameHandler, ImageHandlerTest::createHandler(): ImageHandler, SupportedImageHandlerTest::createHandler(): SupportedImageHandler) all got concrete return types. Consider mirroring that here for consistency.

♻️ Proposed fix
-  protected function createHandler($class_name, array $allowed_values) {
+  protected function createHandler(string $class_name, array $allowed_values): object {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Drupal/Tests/Driver/Fields/Drupal8/ListHandlerTest.php` at line 87,
Update the helper signature to add concrete types: change protected function
createHandler($class_name, array $allowed_values) to include a string type for
$class_name and a ListHandler return type (e.g. protected function
createHandler(string $class_name, array $allowed_values): ListHandler). Ensure
the ListHandler symbol is imported or fully-qualified to match the other test
helpers.
src/Drupal/Driver/Cores/Drupal8.php (2)

439-447: Tighten return type from object to EntityFieldManagerInterface.

object is unnecessarily loose — \Drupal::service('entity_field.manager') returns an EntityFieldManagerInterface, and createMock(EntityFieldManagerInterface::class) in the tests also produces an instance of that interface, so a narrower return type doesn’t break the test double.

♻️ Proposed change
-  protected function getEntityFieldManager(): object {
-    return \Drupal::service('entity_field.manager');
+  protected function getEntityFieldManager(): \Drupal\Core\Entity\EntityFieldManagerInterface {
+    return \Drupal::service('entity_field.manager');
   }

And correspondingly in tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php:

-    protected function getEntityFieldManager(): object {
+    protected function getEntityFieldManager(): \Drupal\Core\Entity\EntityFieldManagerInterface {
       return $this->entityFieldManager;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Cores/Drupal8.php` around lines 439 - 447, The
getEntityFieldManager() return type is too broad; change the method signature in
class Drupal8 from protected function getEntityFieldManager(): object to
protected function getEntityFieldManager():
\Drupal\Core\Entity\EntityFieldManagerInterface (or import and use
EntityFieldManagerInterface) and keep the body returning
\Drupal::service('entity_field.manager'); this tightens the contract to the
actual service type and matches tests that
createMock(EntityFieldManagerInterface::class).

595-601: Lambda’s strict array param assumes well-formed state.

With strict_types=1, if system.test_mail_collector ever contains a non-array entry (e.g., stale data, foreign writers), array_filter will raise a TypeError on the first such item. In practice Drupal’s test mail collector stores associative arrays, so this is unlikely — just noting the new failure mode versus the previously untyped closure. Consider a light guard if robustness matters:

🛡️ Optional guard
-    $mail = array_values(array_filter($mail, fn(array $mail_item): bool => $mail_item['send'] == TRUE));
+    $mail = array_values(array_filter(
+      $mail,
+      fn($mail_item): bool => is_array($mail_item) && !empty($mail_item['send'])
+    ));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/Cores/Drupal8.php` around lines 595 - 601, The inline arrow
function in getMail (the array_filter call using fn(array $mail_item): bool =>
$mail_item['send'] == TRUE) will throw under strict_types if state contains
non-array entries; change the predicate to defensively handle non-arrays (e.g.,
use a closure that first checks is_array($mail_item) and
isset($mail_item['send']) and then returns (bool)$mail_item['send']) so
array_filter only keeps well-formed, send==TRUE items; update the array_filter
call in getMail accordingly.
src/Drupal/Driver/DrupalDriver.php (1)

61-68: Consider typing $uri as string for consistency with $drupal_root.

$drupal_root is now string but $uri remains untyped. Adding string $uri would make the constructor signature uniform. All callers in the codebase pass string values (e.g., 'http://d8.devl'), and this change poses no compatibility risk since DriverInterface does not declare a constructor signature.

♻️ Proposed change
-  public function __construct(string $drupal_root, $uri) {
+  public function __construct(string $drupal_root, string $uri) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/DrupalDriver.php` around lines 61 - 68, The constructor in
class DrupalDriver (__construct) currently types $drupal_root as string but
leaves $uri untyped; update the constructor signature to type-hint $uri as
string (i.e., change $uri to string $uri) so both parameters are consistent, and
update any related docblock or usages in DrupalDriver if present to reflect the
new type (no other code changes needed because callers already pass strings).
src/Drupal/Driver/DrushDriver.php (2)

47-47: Property should be non-nullable Random, not ?Random.

The constructor (lines 101-104) guarantees $this->random is always assigned a Random instance (falling back to new Random() when the argument is null). Declaring the property as ?Random while getRandom(): Random returns it non-nullable creates a type mismatch that static analyzers (PHPStan/Psalm) will flag, and misrepresents the invariant.

♻️ Proposed fix
-  private readonly ?Random $random;
+  private readonly Random $random;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/DrushDriver.php` at line 47, Property $random is
incorrectly declared nullable while the constructor always assigns a Random and
getRandom(): Random returns non-nullable; change the property declaration in
class DrushDriver from "private readonly ?Random $random" to "private readonly
Random $random" (and update any docblocks if present) so the type matches the
constructor and getRandom() invariant; check constructor assignment in
__construct(...) remains the fallback "new Random()" path to guarantee non-null.

320-328: Stale docblock: @return object no longer matches : mixed.

json_decode() can return an object, array, scalar, or null, and the signature now reflects that with : mixed. The @return object line (and description "The decoded JSON object") is misleading — callers such as callBehatCommand() also advertise @return object but now return mixed. Consider updating the docblocks to @return mixed (or narrowing both to @return \stdClass|null if that is the actual intended contract).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Drupal/Driver/DrushDriver.php` around lines 320 - 328, Update the stale
docblock on decodeJsonObject to match the actual return type: change the `@return`
annotation from "object" to "mixed" (or to a narrower type like "\stdClass|null"
if you intend to only return objects/null) and update the description text from
"The decoded JSON object" to reflect that json_decode may return object, array,
scalar, or null; also audit sibling methods like callBehatCommand() that still
say "@return object" and align their docblocks to the same type contract.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/Drupal/Tests/Driver/DrushDriverTest.php`:
- Around line 76-123: Change the two data provider methods to be static: update
the signatures of dataProviderParseUserId() and dataProviderIsLegacyDrush() to
public static function dataProviderParseUserId(): \Iterator and public static
function dataProviderIsLegacyDrush(): \Iterator respectively, keeping their
bodies and return types intact so PHPUnit 10/11 will accept them as static data
providers.

---

Outside diff comments:
In `@src/Drupal/Driver/Exception/Exception.php`:
- Around line 36-44: Update the getDriver() signature and docblock to match the
nullable $driver property: change the docblock `@return` to `@return`
\Drupal\Driver\DriverInterface|null and add a nullable return type to the method
(public function getDriver(): ?\Drupal\Driver\DriverInterface) so the method and
docs correctly reflect that $this->driver may be null; reference the getDriver()
method and the $driver property in the Exception class when making the change.

In `@src/Drupal/Driver/Fields/Drupal8/DatetimeHandler.php`:
- Around line 40-46: The docblock and signature for formatDateValue are
inconsistent with its behavior (it returns NULL); update formatDateValue to have
a nullable return type and matching docblock or normalize null/empty to an empty
string—specifically, change the method signature to return ?string and update
the `@return` in the docblock to "@return string|null", or alternatively ensure
the early-return branch returns '' instead of NULL and keep `@return` string;
update any callers/tests if needed to match the chosen approach.

In `@src/Drupal/Driver/Fields/Drupal8/FileHandler.php`:
- Around line 19-23: The code in FileHandler.php uses pathinfo((string)
$file_path) but leaves file_get_contents($file_path) and sprintf(... $file_path)
using the original variable, which can cause TypeError under strict_types if
callers pass non-strings; fix by casting $file_path to string once up front
(e.g., $file_path = (string) $file_path) and then use that casted variable for
pathinfo, file_get_contents and sprintf so all calls use a guaranteed string;
update references to $file_path within the method where pathinfo,
file_get_contents and the exception sprintf are used.

---

Duplicate comments:
In `@tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php`:
- Around line 52-132: Update the three data provider methods to be static so
PHPUnit 10+ accepts them: change the signatures of dataProviderIsBaseField(),
dataProviderIsField(), and dataProviderGetEntityFieldTypes() to public static
function ... : \Iterator; keep their yields and return types unchanged and leave
the `@dataProvider` annotations in testIsBaseField, testIsField, and
testGetEntityFieldTypes as-is.

---

Nitpick comments:
In `@src/Drupal/Driver/BlackboxDriver.php`:
- Line 15: Add the explicit return type on the interface: update
DriverInterface::isBootstrapped() to declare ": bool" so the interface matches
implementations like BlackboxDriver::isBootstrapped(); likewise add ": bool" to
any sibling methods in DriverInterface that concrete drivers already return bool
for (so implementations remain source-compatible and static analysis is
accurate).

In `@src/Drupal/Driver/Cores/AbstractCore.php`:
- Around line 32-44: The property $random is always initialized in
AbstractCore::__construct and is dereferenced elsewhere (e.g.,
Drupal8->...->name), so change the property declaration from protected ?Random
$random; to protected Random $random; to reflect the invariant; keep the
constructor parameter as ?Random $random = NULL (or accept Random|null) and
retain the fallback new Random() assignment in __construct so the non-nullable
property is always initialized; scan usages of AbstractCore::$random (e.g.,
Drupal8) to ensure no null checks are required after this change.

In `@src/Drupal/Driver/Cores/Drupal8.php`:
- Around line 439-447: The getEntityFieldManager() return type is too broad;
change the method signature in class Drupal8 from protected function
getEntityFieldManager(): object to protected function getEntityFieldManager():
\Drupal\Core\Entity\EntityFieldManagerInterface (or import and use
EntityFieldManagerInterface) and keep the body returning
\Drupal::service('entity_field.manager'); this tightens the contract to the
actual service type and matches tests that
createMock(EntityFieldManagerInterface::class).
- Around line 595-601: The inline arrow function in getMail (the array_filter
call using fn(array $mail_item): bool => $mail_item['send'] == TRUE) will throw
under strict_types if state contains non-array entries; change the predicate to
defensively handle non-arrays (e.g., use a closure that first checks
is_array($mail_item) and isset($mail_item['send']) and then returns
(bool)$mail_item['send']) so array_filter only keeps well-formed, send==TRUE
items; update the array_filter call in getMail accordingly.

In `@src/Drupal/Driver/DrupalDriver.php`:
- Around line 61-68: The constructor in class DrupalDriver (__construct)
currently types $drupal_root as string but leaves $uri untyped; update the
constructor signature to type-hint $uri as string (i.e., change $uri to string
$uri) so both parameters are consistent, and update any related docblock or
usages in DrupalDriver if present to reflect the new type (no other code changes
needed because callers already pass strings).

In `@src/Drupal/Driver/DrushDriver.php`:
- Line 47: Property $random is incorrectly declared nullable while the
constructor always assigns a Random and getRandom(): Random returns
non-nullable; change the property declaration in class DrushDriver from "private
readonly ?Random $random" to "private readonly Random $random" (and update any
docblocks if present) so the type matches the constructor and getRandom()
invariant; check constructor assignment in __construct(...) remains the fallback
"new Random()" path to guarantee non-null.
- Around line 320-328: Update the stale docblock on decodeJsonObject to match
the actual return type: change the `@return` annotation from "object" to "mixed"
(or to a narrower type like "\stdClass|null" if you intend to only return
objects/null) and update the description text from "The decoded JSON object" to
reflect that json_decode may return object, array, scalar, or null; also audit
sibling methods like callBehatCommand() that still say "@return object" and
align their docblocks to the same type contract.

In `@src/Drupal/Driver/Fields/Drupal8/EntityReferenceHandler.php`:
- Line 15: Add a covariant return type on the FieldHandlerInterface::expand()
signature (declare it as returning : array) so all implementations (including
EntityReferenceHandler::expand(), DefaultHandler::expand(),
TextWithSummaryHandler::expand(), DatetimeHandler::expand(), etc.) must return
an array; update the interface method signature only (not the implementations)
to include ": array" to enforce the contract across all handlers.

In `@src/Drupal/Driver/Fields/Drupal8/FileHandler.php`:
- Line 15: The interface method FieldHandlerInterface::expand() lacks the
stricter return type even though implementations like FileHandler::expand()
declare ": array"; update the FieldHandlerInterface::expand() signature to
include the ": array" return type so all implementations conform to the
interface (and adjust any other handler implementations or usages if needed to
satisfy the new signature), then run static/type checks to ensure no breaks.

In `@tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php`:
- Around line 94-105: Add explicit return type annotations ": void" to the two
helper methods callConvertPermissions and callCheckPermissions; these methods
currently declare "protected function callConvertPermissions(Drupal8 $core,
array &$permissions)" and "protected function callCheckPermissions(Drupal8
$core, array &$permissions)" and should be changed to "protected function
callConvertPermissions(Drupal8 $core, array &$permissions): void" and "protected
function callCheckPermissions(Drupal8 $core, array &$permissions): void"
respectively—nothing else in the body needs to change (they use ReflectionMethod
and invokeArgs).
- Around line 110-123: The anonymous class used by stringable() accepts an
untyped $label which can cause a TypeError in strict mode when __toString():
string returns it; update the signature and constructor to enforce a string:
change stringable($label) to stringable(string $label): object and change the
anonymous class constructor to accept private string $label so the stored value
is always a string for __toString().

In `@tests/Drupal/Tests/Driver/Drupal8Test.php`:
- Around line 22-24: The property $originalRequestTime in class Drupal8Test is
documented as `@var` int but is assigned NULL in setUp(), so change its
declaration to a nullable typed property to match runtime values and the PR
typing goal: replace the untyped protected $originalRequestTime with protected
?int $originalRequestTime = NULL and remove the redundant `@var` docblock; ensure
any references in setUp() and tests still work with the nullable int type.

In `@tests/Drupal/Tests/Driver/Fields/Drupal8/DaterangeHandlerTest.php`:
- Around line 73-95: The method loadDatetimeModuleInterface currently returns
only TRUE/FALSE but lacks a declared return type; update its signature to
declare a boolean return type (add ": bool") on the loadDatetimeModuleInterface
method and ensure the implementation (uses of DateTimeItemInterface and
InstalledVersions) remains unchanged so all existing return TRUE/FALSE
statements satisfy the new type.

In `@tests/Drupal/Tests/Driver/Fields/Drupal8/ListHandlerTest.php`:
- Line 87: Update the helper signature to add concrete types: change protected
function createHandler($class_name, array $allowed_values) to include a string
type for $class_name and a ListHandler return type (e.g. protected function
createHandler(string $class_name, array $allowed_values): ListHandler). Ensure
the ListHandler symbol is imported or fully-qualified to match the other test
helpers.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f83a0869-16a8-48d6-94dd-5068e6b856a0

📥 Commits

Reviewing files that changed from the base of the PR and between 48dccba and f255a0c.

📒 Files selected for processing (57)
  • composer.json
  • rector.php
  • src/Drupal/Driver/AuthenticationDriverInterface.php
  • src/Drupal/Driver/BaseDriver.php
  • src/Drupal/Driver/BlackboxDriver.php
  • src/Drupal/Driver/Cores/AbstractCore.php
  • src/Drupal/Driver/Cores/CoreAuthenticationInterface.php
  • src/Drupal/Driver/Cores/CoreInterface.php
  • src/Drupal/Driver/Cores/Drupal8.php
  • src/Drupal/Driver/DriverInterface.php
  • src/Drupal/Driver/DrupalDriver.php
  • src/Drupal/Driver/DrushDriver.php
  • src/Drupal/Driver/Exception/BootstrapException.php
  • src/Drupal/Driver/Exception/Exception.php
  • src/Drupal/Driver/Exception/UnsupportedDriverActionException.php
  • src/Drupal/Driver/Fields/Drupal8/AbstractHandler.php
  • src/Drupal/Driver/Fields/Drupal8/AddressHandler.php
  • src/Drupal/Driver/Fields/Drupal8/DaterangeHandler.php
  • src/Drupal/Driver/Fields/Drupal8/DatetimeHandler.php
  • src/Drupal/Driver/Fields/Drupal8/DefaultHandler.php
  • src/Drupal/Driver/Fields/Drupal8/EmbridgeAssetItemHandler.php
  • src/Drupal/Driver/Fields/Drupal8/EntityReferenceHandler.php
  • src/Drupal/Driver/Fields/Drupal8/FileHandler.php
  • src/Drupal/Driver/Fields/Drupal8/ImageHandler.php
  • src/Drupal/Driver/Fields/Drupal8/LinkHandler.php
  • src/Drupal/Driver/Fields/Drupal8/ListFloatHandler.php
  • src/Drupal/Driver/Fields/Drupal8/ListHandlerBase.php
  • src/Drupal/Driver/Fields/Drupal8/ListIntegerHandler.php
  • src/Drupal/Driver/Fields/Drupal8/ListStringHandler.php
  • src/Drupal/Driver/Fields/Drupal8/NameHandler.php
  • src/Drupal/Driver/Fields/Drupal8/OgStandardReferenceHandler.php
  • src/Drupal/Driver/Fields/Drupal8/SupportedImageHandler.php
  • src/Drupal/Driver/Fields/Drupal8/TaxonomyTermReferenceHandler.php
  • src/Drupal/Driver/Fields/Drupal8/TextWithSummaryHandler.php
  • src/Drupal/Driver/Fields/Drupal8/TimeHandler.php
  • src/Drupal/Driver/Fields/FieldHandlerInterface.php
  • src/Drupal/Driver/SubDriverFinderInterface.php
  • tests/Drupal/Tests/Driver/BlackboxDriverTest.php
  • tests/Drupal/Tests/Driver/Drupal8FieldMethodsTest.php
  • tests/Drupal/Tests/Driver/Drupal8PermissionsTest.php
  • tests/Drupal/Tests/Driver/Drupal8Test.php
  • tests/Drupal/Tests/Driver/DrushDriverTest.php
  • tests/Drupal/Tests/Driver/Exception/UnsupportedDriverActionExceptionTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/AddressHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/DaterangeHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/DatetimeHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/DefaultHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/EntityReferenceHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/FileHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/ImageHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/ListHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/SupportedImageHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/TaxonomyTermReferenceHandlerTest.php
  • tests/Drupal/Tests/Driver/Fields/Drupal8/TextWithSummaryHandlerTest.php
  • tests/Drupal/Tests/Driver/LinkHandlerTest.php
  • tests/Drupal/Tests/Driver/NameHandlerTest.php
  • tests/Drupal/Tests/Driver/TimeHandlerTest.php

Comment thread tests/Drupal/Tests/Driver/DrushDriverTest.php Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant