Browse Source

Merge branch '4.x' into 4.next

Mark Story 2 years ago
parent
commit
79f2696934

+ 1 - 0
.mailmap

@@ -15,6 +15,7 @@ Walther Lalk <emailme@waltherlalk.com> <waltherlalk@gmail.com>
 Walther Lalk <emailme@waltherlalk.com> <dakota@users.noreply.github.com>
 Walther Lalk <emailme@waltherlalk.com> <walther@uafrica.com>
 Mark Scherer <euromark@web.de>
+Mark Scherer <euromark@web.de> <dereuromark@web.de>
 Mark Scherer <euromark@web.de> <dereuromark@users.noreply.github.com>
 Mark Scherer <euromark@web.de> <mark.scherer@spryker.com>
 phpnut <phpnut@cakephp.org>

+ 40 - 0
phpstan-baseline.neon

@@ -86,6 +86,11 @@ parameters:
 			path: src/Database/Driver.php
 
 		-
+			message: "#^Class Cake\\\\Chronos\\\\Date not found\\.$#"
+			count: 1
+			path: src/Database/Expression/CaseStatementExpression.php
+
+		-
 			message: "#^Unsafe usage of new static\\(\\)\\.$#"
 			count: 8
 			path: src/Database/Expression/QueryExpression.php
@@ -96,6 +101,11 @@ parameters:
 			path: src/Database/Expression/TupleComparison.php
 
 		-
+			message: "#^Class Cake\\\\Chronos\\\\Date not found\\.$#"
+			count: 1
+			path: src/Database/Expression/WhenThenExpression.php
+
+		-
 			message: "#^Access to an undefined property Exception\\:\\:\\$queryString\\.$#"
 			count: 1
 			path: src/Database/Log/LoggingStatement.php
@@ -106,6 +116,11 @@ parameters:
 			path: src/Database/Statement/PDOStatement.php
 
 		-
+			message: "#^Parameter \\#1 \\$class of method Cake\\\\Database\\\\Type\\\\DateTimeType\\:\\:_setClassName\\(\\) expects class\\-string\\<DateTime\\>\\|class\\-string\\<DateTimeImmutable\\>, string given\\.$#"
+			count: 2
+			path: src/Database/Type/DateType.php
+
+		-
 			message: "#^Property PDOStatement\\:\\:\\$queryString \\(string\\) in isset\\(\\) is not nullable\\.$#"
 			count: 1
 			path: src/Database/Statement/PDOStatement.php
@@ -191,11 +206,36 @@ parameters:
 			path: src/I18n/Date.php
 
 		-
+			message: "#^Access to an undefined static property static\\(Cake\\\\I18n\\\\FrozenDate\\)\\:\\:\\$diffFormatter\\.$#"
+			count: 2
+			path: src/I18n/FrozenDate.php
+
+		-
+			message: "#^Cake\\\\I18n\\\\FrozenDate\\:\\:__construct\\(\\) calls parent\\:\\:__construct\\(\\) but Cake\\\\I18n\\\\FrozenDate does not extend any class\\.$#"
+			count: 1
+			path: src/I18n/FrozenDate.php
+
+		-
 			message: "#^Call to an undefined method Cake\\\\Chronos\\\\DifferenceFormatterInterface\\:\\:dateAgoInWords\\(\\)\\.$#"
 			count: 1
 			path: src/I18n/FrozenDate.php
 
 		-
+			message: "#^Call to an undefined static method static\\(Cake\\\\I18n\\\\FrozenDate\\)\\:\\:getTestNow\\(\\)\\.$#"
+			count: 1
+			path: src/I18n/FrozenDate.php
+
+		-
+			message: "#^Call to an undefined static method static\\(Cake\\\\I18n\\\\FrozenDate\\)\\:\\:hasTestNow\\(\\)\\.$#"
+			count: 1
+			path: src/I18n/FrozenDate.php
+
+		-
+			message: "#^Parameter \\#1 \\$date of method Cake\\\\I18n\\\\FrozenDate\\:\\:_formatObject\\(\\) expects DateTime\\|DateTimeImmutable, static\\(Cake\\\\I18n\\\\FrozenDate\\) given\\.$#"
+			count: 1
+			path: src/I18n/FrozenDate.php
+
+		-
 			message: "#^Unsafe usage of new static\\(\\)\\.$#"
 			count: 1
 			path: src/I18n/FrozenDate.php

+ 2 - 0
phpstan.neon.dist

@@ -15,6 +15,8 @@ parameters:
 			- abort
 		Cake\Command\BaseCommand:
 			- abort
+	excludePaths:
+		- src/I18n/FrozenDate
 
 services:
 	-

+ 88 - 2
psalm-baseline.xml

@@ -52,6 +52,12 @@
       <code>$exceptions[$i - 1]</code>
     </InvalidArrayOffset>
   </file>
+  <file src="src/I18n/Date.php">
+    <DeprecatedClass occurrences="2">
+      <code>MutableDate</code>
+      <code>parent::__construct($time, $tz)</code>
+    </DeprecatedClass>
+  </file>
   <file src="src/I18n/DateFormatTrait.php">
     <RedundantCondition>
       <code>$time !== false</code>
@@ -59,8 +65,88 @@
   </file>
   <file src="src/ORM/SaveOptionsBuilder.php">
     <MissingTemplateParam>
-      <code>SaveOptionsBuilder</code>
-    </MissingTemplateParam>
+    <DeprecatedClass occurrences="5">
+      <code>$time-&gt;setTimezone($timezone)</code>
+      <code>Time::UNIX_TIMESTAMP_FORMAT</code>
+      <code>static|null</code>
+      <code>static|null</code>
+      <code>static|null</code>
+    </DeprecatedClass>
+    <MissingParamType occurrences="1">
+      <code>$format</code>
+    </MissingParamType>
+  </file>
+  <file src="src/I18n/Time.php">
+    <DeprecatedClass occurrences="2">
+      <code>MutableDateTime</code>
+      <code>parent::__construct($time, $tz)</code>
+    </DeprecatedClass>
+  </file>
+  <file src="src/I18n/functions.php">
+    <InternalMethod occurrences="8">
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+      <code>translate</code>
+    </InternalMethod>
+  </file>
+  <file src="src/Log/Engine/ArrayLog.php">
+    <DeprecatedMethod occurrences="1">
+      <code>_format</code>
+    </DeprecatedMethod>
+  </file>
+  <file src="src/Log/Engine/ConsoleLog.php">
+    <DeprecatedMethod occurrences="1">
+      <code>_format</code>
+    </DeprecatedMethod>
+  </file>
+  <file src="src/Log/Engine/FileLog.php">
+    <DeprecatedMethod occurrences="1">
+      <code>_format</code>
+    </DeprecatedMethod>
+  </file>
+  <file src="src/Log/Engine/SyslogLog.php">
+    <DeprecatedMethod occurrences="1">
+      <code>_format</code>
+    </DeprecatedMethod>
+  </file>
+  <file src="src/Mailer/Mailer.php">
+    <DeprecatedProperty occurrences="1">
+      <code>$this-&gt;modelClass</code>
+    </DeprecatedProperty>
+    <DeprecatedTrait occurrences="1">
+      <code>ModelAwareTrait</code>
+    </DeprecatedTrait>
+  </file>
+  <file src="src/Mailer/Transport/SmtpTransport.php">
+    <LessSpecificReturnStatement occurrences="1">
+      <code>$this-&gt;_content</code>
+    </LessSpecificReturnStatement>
+    <MoreSpecificReturnType occurrences="1">
+      <code>array{headers: string, message: string}</code>
+    </MoreSpecificReturnType>
+  </file>
+  <file src="src/ORM/Locator/LocatorAwareTrait.php">
+    <DeprecatedClass occurrences="1">
+      <code>$this</code>
+    </DeprecatedClass>
+  </file>
+  <file src="src/ORM/Locator/TableLocator.php">
+    <NonInvariantDocblockPropertyType occurrences="1">
+      <code>$instances</code>
+    </NonInvariantDocblockPropertyType>
+  </file>
+  <file src="src/ORM/Query.php">
+    <ArgumentTypeCoercion occurrences="1">
+      <code>$this-&gt;_repository</code>
+    </ArgumentTypeCoercion>
+  </file>
+  <file src="src/ORM/Table.php">
+    <DeprecatedClass occurrences="6">
   </file>
   <file src="src/Shell/Helper/TableHelper.php">
     <InvalidCast>

+ 2 - 2
src/Core/StaticConfigTrait.php

@@ -68,7 +68,7 @@ trait StaticConfigTrait
      * ```
      *
      * @param array<string, mixed>|string $key The name of the configuration, or an array of multiple configs.
-     * @param object|array<string, mixed>|null $config An array of name => configuration data for adapter.
+     * @param mixed $config Configuration value. Generally an array of name => configuration data for adapter.
      * @throws \BadMethodCallException When trying to modify an existing config.
      * @throws \LogicException When trying to store an invalid structured config array.
      * @return void
@@ -95,7 +95,7 @@ trait StaticConfigTrait
             $config = ['className' => $config];
         }
 
-        if (isset($config['url'])) {
+        if (is_array($config) && isset($config['url'])) {
             $parsed = static::parseDsn($config['url']);
             unset($config['url']);
             $config = $parsed + $config;

+ 0 - 7
src/Database/Schema/TableSchema.php

@@ -476,13 +476,6 @@ class TableSchema implements TableSchemaInterface, SqlGeneratorInterface
                 $this->_table
             ));
         }
-        if (empty($attrs['columns'])) {
-            throw new DatabaseException(sprintf(
-                'Index "%s" in table "%s" must have at least one column.',
-                $name,
-                $this->_table
-            ));
-        }
         $attrs['columns'] = (array)$attrs['columns'];
         foreach ($attrs['columns'] as $field) {
             if (empty($this->_columns[$field])) {

+ 4 - 4
src/Filesystem/Folder.php

@@ -776,8 +776,8 @@ class Folder
      *
      * ### Options
      *
-     * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of pwd().
-     * - `mode` The mode to copy the files/directories with as integer, e.g. 0775.
+     * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of `pwd()`.
+     * - `mode` The mode to copy the files/directories with as integer, e.g. `0770`.
      * - `skip` Files/directories to skip.
      * - `scheme` Folder::MERGE, Folder::OVERWRITE, Folder::SKIP
      * - `recursive` Whether to copy recursively or not (default: true - recursive)
@@ -877,8 +877,8 @@ class Folder
      *
      * ### Options
      *
-     * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of pwd().
-     * - `mode` The mode to copy the files/directories with as integer, e.g. 0775.
+     * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of `pwd()`.
+     * - `mode` The mode to copy the files/directories with as integer, e.g. `0770`.
      * - `skip` Files/directories to skip.
      * - `scheme` Folder::MERGE, Folder::OVERWRITE, Folder::SKIP
      * - `recursive` Whether to copy recursively or not (default: true - recursive)

+ 1 - 1
src/I18n/RelativeTimeFormatter.php

@@ -323,7 +323,7 @@ class RelativeTimeFormatter implements DifferenceFormatterInterface
     {
         $options = $this->_options($options, FrozenDate::class);
         if ($options['timezone']) {
-            $date = $date->timezone($options['timezone']);
+            $date = $date->setTimezone($options['timezone']);
         }
 
         $now = $options['from']->format('U');

+ 14 - 3
src/Shell/Helper/ProgressHelper.php

@@ -36,6 +36,17 @@ use RuntimeException;
 class ProgressHelper extends Helper
 {
     /**
+     * Default value for progress bar total value.
+     * Percent completion is derived from progress/total
+     */
+    protected const DEFAULT_TOTAL = 100;
+
+    /**
+     * Default value for progress bar width
+     */
+    protected const DEFAULT_WIDTH = 80;
+
+    /**
      * The current progress.
      *
      * @var float|int
@@ -47,14 +58,14 @@ class ProgressHelper extends Helper
      *
      * @var int
      */
-    protected $_total = 0;
+    protected $_total = self::DEFAULT_TOTAL;
 
     /**
      * The width of the bar.
      *
      * @var int
      */
-    protected $_width = 0;
+    protected $_width = self::DEFAULT_WIDTH;
 
     /**
      * Output a progress bar.
@@ -102,7 +113,7 @@ class ProgressHelper extends Helper
      */
     public function init(array $args = [])
     {
-        $args += ['total' => 100, 'width' => 80];
+        $args += ['total' => self::DEFAULT_TOTAL, 'width' => self::DEFAULT_WIDTH];
         $this->_progress = 0;
         $this->_width = $args['width'];
         $this->_total = $args['total'];

+ 1 - 3
src/View/Helper/PaginatorHelper.php

@@ -893,11 +893,9 @@ class PaginatorHelper extends Helper
             ]);
         }
 
-        $url = $options['url'];
-        $url['?']['page'] = $params['page'];
         $out .= $templater->format('current', [
             'text' => $this->Number->format($params['page']),
-            'url' => $this->generateUrl($url, $options['model']),
+            'url' => $this->generateUrl(['page' => $params['page']], $options['model'], $options['url']),
         ]);
 
         $start = $params['page'] + 1;

+ 36 - 0
tests/TestCase/Database/Schema/MysqlSchemaTest.php

@@ -519,6 +519,42 @@ SQL;
         $this->assertEquals(['config_id'], $constraint['columns']);
     }
 
+    public function testDescribeTableFunctionalIndex(): void
+    {
+        $connection = ConnectionManager::get('test');
+        $connection->execute('DROP TABLE IF EXISTS functional_index');
+        $table = <<<SQL
+CREATE TABLE functional_index (
+    id INT AUTO_INCREMENT PRIMARY KEY,
+    properties JSON,
+    child_ids VARCHAR(400) GENERATED ALWAYS AS (
+        properties->>'$.children[*].id'
+    ) VIRTUAL
+);
+SQL;
+        $index = <<<SQL
+CREATE INDEX child_ids_idx ON functional_index ((CAST(child_ids AS UNSIGNED ARRAY)));
+SQL;
+        try {
+            $connection->execute($table);
+            $connection->execute($index);
+        } catch (Exception $e) {
+            $this->markTestSkipped('Could not create table with functional index');
+        }
+        $schema = new SchemaCollection($connection);
+        $result = $schema->describe('functional_index');
+        $connection->execute('DROP TABLE IF EXISTS functional_index');
+
+        $column = $result->getColumn('child_ids');
+        $this->assertNotEmpty($column, 'Virtual property column should be reflected');
+        $this->assertEquals('string', $column['type']);
+
+        $index = $result->getIndex('child_ids_idx');
+        $this->assertNotEmpty($index);
+        $this->assertEquals('index', $index['type']);
+        $this->assertEquals([], $index['columns']);
+    }
+
     /**
      * Test describing a table creates options
      */

+ 0 - 3
tests/TestCase/Database/Schema/TableSchemaTest.php

@@ -405,9 +405,6 @@ class TableSchemaTest extends TestCase
             [[]],
             // Invalid type
             [['columns' => 'author_id', 'type' => 'derp']],
-            // No columns
-            [['columns' => ''], 'type' => TableSchema::INDEX_INDEX],
-            [['columns' => [], 'type' => TableSchema::INDEX_INDEX]],
             // Missing column
             [['columns' => ['not_there'], 'type' => TableSchema::INDEX_INDEX]],
         ];

+ 11 - 0
tests/TestCase/Shell/Helper/ProgressHelperTest.php

@@ -65,6 +65,17 @@ class ProgressHelperTest extends TestCase
         $this->assertSame($helper, $this->helper, 'Should be chainable');
     }
 
+    public function testIncrementWithoutInit(): void
+    {
+        $this->helper->increment(10);
+        $this->helper->draw();
+        $expected = [
+            '',
+            '======>                                                                      10%',
+        ];
+        $this->assertEquals($expected, $this->stub->messages());
+    }
+
     /**
      * Test that a callback is required.
      */

+ 14 - 10
tests/TestCase/View/Helper/PaginatorHelperTest.php

@@ -2135,9 +2135,13 @@ class PaginatorHelperTest extends TestCase
             ],
         ]));
 
+        $this->Paginator->setTemplates([
+            'current' => '<li class="active"><a href="{{url}}">{{text}}</a></li>',
+        ]);
+
         $result = $this->Paginator->numbers(['modulus' => 10]);
         $expected = [
-            ['li' => ['class' => 'active']], '<a href=""', '1', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
         ];
@@ -2145,7 +2149,7 @@ class PaginatorHelperTest extends TestCase
 
         $result = $this->Paginator->numbers(['modulus' => 3]);
         $expected = [
-            ['li' => ['class' => 'active']], '<a href=""', '1', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
         ];
@@ -2168,7 +2172,7 @@ class PaginatorHelperTest extends TestCase
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4894']], '4,894', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '4,895', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=4895']], '4,895', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4896']], '4,896', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4897']], '4,897', '/a', '/li',
         ];
@@ -2182,7 +2186,7 @@ class PaginatorHelperTest extends TestCase
         $expected = [
             ['li' => []], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '3', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4']], '4', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4896']], '4,896', '/a', '/li',
@@ -2194,7 +2198,7 @@ class PaginatorHelperTest extends TestCase
         $expected = [
             ['li' => []], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '3', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4']], '4', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=5']], '5', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=6']], '6', '/a', '/li',
@@ -2220,7 +2224,7 @@ class PaginatorHelperTest extends TestCase
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4891']], '4,891', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4892']], '4,892', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '4,893', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=4893']], '4,893', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4894']], '4,894', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4895']], '4,895', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4896']], '4,896', '/a', '/li',
@@ -2241,7 +2245,7 @@ class PaginatorHelperTest extends TestCase
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=56']], '56', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=57']], '57', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '58', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=58']], '58', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=59']], '59', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=60']], '60', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
@@ -2262,7 +2266,7 @@ class PaginatorHelperTest extends TestCase
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4']], '4', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '5', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=5']], '5', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=6']], '6', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=7']], '7', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
@@ -2281,7 +2285,7 @@ class PaginatorHelperTest extends TestCase
         $expected = [
             ['li' => []], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '3', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4']], '4', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4896']], '4,896', '/a', '/li',
@@ -2296,7 +2300,7 @@ class PaginatorHelperTest extends TestCase
         $expected = [
             ['li' => []], ['a' => ['href' => '/']], '1', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=2']], '2', '/a', '/li',
-            ['li' => ['class' => 'active']], '<a href=""', '3', '/a', '/li',
+            ['li' => ['class' => 'active']], ['a' => ['href' => '/?page=3']], '3', '/a', '/li',
             ['li' => ['class' => 'ellipsis']], '&hellip;', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4896']], '4,896', '/a', '/li',
             ['li' => []], ['a' => ['href' => '/?page=4897']], '4,897', '/a', '/li',

+ 22 - 0
tests/phpstan-baseline.neon

@@ -0,0 +1,22 @@
+parameters:
+	ignoreErrors:
+		-
+			message: "#^Call to static method now\\(\\) on an unknown class Cake\\\\Chronos\\\\Date\\.$#"
+			count: 8
+			path: TestCase/Database/Expression/CaseStatementExpressionTest.php
+
+		-
+			message: "#^Cannot call abstract static method Cake\\\\Chronos\\\\ChronosInterface\\:\\:now\\(\\)\\.$#"
+			count: 5
+			path: TestCase/Database/Expression/CaseStatementExpressionTest.php
+
+		-
+			message: "#^Static method Cake\\\\Chronos\\\\ChronosInterface\\:\\:now\\(\\) invoked with 0 parameters, 1 required\\.$#"
+			count: 5
+			path: TestCase/Database/Expression/CaseStatementExpressionTest.php
+
+		-
+			message: "#^Instantiated class Cake\\\\Chronos\\\\Date not found\\.$#"
+			count: 15
+			path: TestCase/Database/Type/DateTypeTest.php
+

+ 3 - 0
tests/phpstan.neon

@@ -1,3 +1,6 @@
+includes:
+	- phpstan-baseline.neon
+
 parameters:
 	level: 1
 	treatPhpDocTypesAsCertain: false