diff --git a/CHANGELOG.md b/CHANGELOG.md
index 550656e..4504d8c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
### 1.2.0
* requires at least PHP 8.1, CakePHP 5.0 and PHPUnit 10;
* provides its own `phpUri` library;
+* added and fixed typehints, removed deprecations;
* added tests for PHP 8.3.
## 1.1 branch
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index 2bb84c4..3845390 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -11,4 +11,6 @@
0
+
+ libs/phpuri\.php
diff --git a/src/Entity.php b/src/Entity.php
index c536410..9f3bf33 100644
--- a/src/Entity.php
+++ b/src/Entity.php
@@ -90,7 +90,7 @@ public function hasValue(string $property): bool
* @param mixed $default Default value if the property does not exist
* @return mixed Property value
*/
- public function get(string $property, $default = null)
+ public function get(string $property, mixed $default = null): mixed
{
return $this->has($property) ? $this->properties[$property] : $default;
}
@@ -121,8 +121,7 @@ public function offsetExists($offset): bool
* @param EntityPropertyName $offset The offset to get
* @return mixed
*/
- #[\ReturnTypeWillChange]
- public function offsetGet($offset)
+ public function offsetGet($offset): mixed
{
return $this->properties[$offset];
}
diff --git a/src/Event/LinkScannerCommandEventListener.php b/src/Event/LinkScannerCommandEventListener.php
index 246a990..a59847d 100644
--- a/src/Event/LinkScannerCommandEventListener.php
+++ b/src/Event/LinkScannerCommandEventListener.php
@@ -19,7 +19,7 @@
use Cake\Console\ConsoleIo;
use Cake\Event\Event;
use Cake\Http\Client\Response;
-use Cake\I18n\FrozenTime;
+use Cake\I18n\DateTime;
use LinkScanner\ResultScan;
use function Cake\I18n\__d;
@@ -167,8 +167,8 @@ public function scanCompleted(Event $event, int $startTime, int $endTime, Result
$this->io->hr();
}
- $endTime = new FrozenTime($endTime);
- $elapsedTime = $endTime->diffForHumans(new FrozenTime($startTime), true);
+ $endTime = new DateTime($endTime);
+ $elapsedTime = $endTime->diffForHumans(new DateTime($startTime), true);
$this->io->out(__d('link-scanner', 'Scan completed at {0}', $endTime->i18nFormat('yyyy-MM-dd HH:mm:ss')));
$this->io->out(__d('link-scanner', 'Elapsed time: {0}', $elapsedTime));
@@ -197,7 +197,7 @@ public function scanStarted(Event $event, int $startTime, string $fullBaseUrl):
$this->io->hr();
}
- $startTime = (new FrozenTime($startTime))->i18nFormat('yyyy-MM-dd HH:mm:ss');
+ $startTime = (new DateTime($startTime))->i18nFormat('yyyy-MM-dd HH:mm:ss');
$this->io->info(__d('link-scanner', 'Scan started for {0} at {1}', $fullBaseUrl, $startTime));
if (!$this->args->getOption('verbose')) {
diff --git a/src/ResultScan.php b/src/ResultScan.php
index 1251466..5d4992c 100644
--- a/src/ResultScan.php
+++ b/src/ResultScan.php
@@ -57,7 +57,7 @@ public function __construct(CollectionInterface|iterable $items = [])
* @param iterable $items Items
* @return \Cake\Collection\CollectionInterface
*/
- public function append($items): CollectionInterface
+ public function append(iterable $items): CollectionInterface
{
return new ResultScan(array_merge($this->buffered()->toArray(), $this->parseItems($items)));
}
diff --git a/src/ScanEntity.php b/src/ScanEntity.php
index 1d27631..87270ea 100644
--- a/src/ScanEntity.php
+++ b/src/ScanEntity.php
@@ -57,7 +57,7 @@ public function __construct(array $properties = [])
* @see \Cake\Http\Client\Response
* @thrown \BadMethodCallException
*/
- public function __call(string $name, $arguments)
+ public function __call(string $name, mixed $arguments): mixed
{
if (method_exists(Response::class, $name)) {
$Response = (new Response())
diff --git a/src/TestSuite/IntegrationTestTrait.php b/src/TestSuite/IntegrationTestTrait.php
index 8a32246..d35acb3 100644
--- a/src/TestSuite/IntegrationTestTrait.php
+++ b/src/TestSuite/IntegrationTestTrait.php
@@ -68,7 +68,7 @@ protected function getClientReturnsFromTests(): Client
* @param string|array|null $fullBaseUrl Full base url
* @return \LinkScanner\Utility\LinkScanner&\PHPUnit\Framework\MockObject\MockObject
*/
- protected function getLinkScannerClientReturnsFromTests($fullBaseUrl = null): LinkScanner
+ protected function getLinkScannerClientReturnsFromTests(string|array|null $fullBaseUrl = null): LinkScanner
{
$fullBaseUrl = $fullBaseUrl ?: Configure::read('App.fullBaseUrl', 'http://localhost');
$fullBaseUrl = is_string($fullBaseUrl) ? $fullBaseUrl : Router::url($fullBaseUrl, true);
diff --git a/src/Utility/BodyParser.php b/src/Utility/BodyParser.php
index 09d4230..80366b8 100644
--- a/src/Utility/BodyParser.php
+++ b/src/Utility/BodyParser.php
@@ -15,6 +15,7 @@
namespace LinkScanner\Utility;
use phpUri;
+use Psr\Http\Message\StreamInterface;
use Symfony\Component\DomCrawler\Crawler;
/**
@@ -69,7 +70,7 @@ class BodyParser
* @param string|\Psr\Http\Message\StreamInterface $body Body
* @param string $url Reference url. Used to determine the relative links
*/
- public function __construct($body, string $url)
+ public function __construct(StreamInterface|string $body, string $url)
{
$this->body = (string)$body;
$this->url = $url;
diff --git a/src/Utility/LinkScanner.php b/src/Utility/LinkScanner.php
index 3938451..5b4cb58 100644
--- a/src/Utility/LinkScanner.php
+++ b/src/Utility/LinkScanner.php
@@ -128,7 +128,7 @@ public function __construct(?Client $Client = null, ?ResultScan $ResultScan = nu
* @param string $name Property name
* @return mixed
*/
- public function __get(string $name)
+ public function __get(string $name): mixed
{
return $this->{$name};
}
@@ -334,7 +334,7 @@ public function serialize(): string
* @param string $data The string representation of the object
* @return void
*/
- public function unserialize($data): void
+ public function unserialize(string $data): void
{
//Resets the event list and the Client instance
$properties = unserialize($data);
@@ -396,9 +396,9 @@ public function import(string $filename)
try {
if (!is_readable($filename)) {
- throw new LogicException(__d('link-scanner', 'File or directory `'. $filename . '` is not readable'));
+ throw new LogicException(__d('link-scanner', 'File or directory `' . $filename . '` is not readable'));
}
- $instance = unserialize(file_get_contents($filename));
+ $instance = unserialize(file_get_contents($filename) ?: '');
} catch (Throwable $e) {
$message = preg_replace('/file_get_contents\([^)]+\):\s+/', '', $e->getMessage()) ?: '';
throw new LogicException(
diff --git a/tests/TestCase/Command/LinkScannerCommandTest.php b/tests/TestCase/Command/LinkScannerCommandTest.php
index 92b3a9f..4cb2e83 100644
--- a/tests/TestCase/Command/LinkScannerCommandTest.php
+++ b/tests/TestCase/Command/LinkScannerCommandTest.php
@@ -1,6 +1,4 @@
fullBaseUrl)));
- return substr($line, 0, strlen('Checking')) === 'Checking' && !preg_match($pattern, $line);
+ return str_starts_with($line, 'Checking') && !preg_match($pattern, $line);
};
$this->assertEmpty(array_filter($this->_out->messages(), $differentLines));
$this->assertOutputContains('Scanning of external links is not enabled');
diff --git a/tests/TestCase/Utility/LinkScannerTest.php b/tests/TestCase/Utility/LinkScannerTest.php
index 71b9c99..22f2697 100644
--- a/tests/TestCase/Utility/LinkScannerTest.php
+++ b/tests/TestCase/Utility/LinkScannerTest.php
@@ -221,7 +221,7 @@ public function testImport(): void
//With a no existing file
$filename = TMP . 'noExistingDir' . DS . 'result';
- $this->expectExceptionMessage('Failed to import results from file `' . $filename . '` with message `file or directory `'. $filename . '` is not readable`');
+ $this->expectExceptionMessage('Failed to import results from file `' . $filename . '` with message `file or directory `' . $filename . '` is not readable`');
$this->LinkScanner->import($filename);
}