From 5557a1a3bff715c1c7ad2f56bcd915989768d330 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 14:20:21 +0300 Subject: [PATCH 1/9] update psalm --- .github/workflows/static.yml | 4 +++- composer.json | 2 +- psalm.xml | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 96b26790..aea590ea 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -10,6 +10,8 @@ on: - 'phpunit.xml.dist' push: + branches: + - master paths-ignore: - 'docs/**' - 'README.md' @@ -28,4 +30,4 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.0', '8.1'] + ['8.0', '8.1', '8.2', '8.3'] diff --git a/composer.json b/composer.json index a7a83089..29fd9e52 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ "rector/rector": "^1.0.0", "roave/infection-static-analysis-plugin": "^1.18", "spatie/phpunit-watcher": "^1.23", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30|^5.24" }, "provide": { "psr/log-implementation": "1.0.0" diff --git a/psalm.xml b/psalm.xml index 2f9469cb..95805489 100644 --- a/psalm.xml +++ b/psalm.xml @@ -13,5 +13,8 @@ + + + From 9703f77461d8e0b708d5ce70c31446f3be5ac10b Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 14:59:16 +0300 Subject: [PATCH 2/9] Refactoring: replace `Logger::validateLevel()` to `Logger::assert*` --- CHANGELOG.md | 3 +++ src/Logger.php | 40 +++++++++++++++++++++++++++++++++++++++- src/Message.php | 3 ++- src/Target.php | 3 ++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a6bc6d8..9b3ffa87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ ## 2.0.1 under development - Bug #84: Change the type of the `$level` parameter in the `Message` constructor to `string` (@dood-) +- New #104: Add new static methods `Logger::assertLevelIsValid()`, `Logger::assertLevelIsString()` and + `Logger::assertLevelIsSupported()` (@vjik) +- Chg #104: Deprecate method `Logger::validateLevel()` (@vjik) ## 2.0.0 May 22, 2022 diff --git a/src/Logger.php b/src/Logger.php index fdd1424b..c6e87234 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -116,6 +116,8 @@ public function __construct(array $targets = []) * @throws \Psr\Log\InvalidArgumentException for invalid log message level. * * @return string The text display of the level. + * + * @deprecated since 2.1, to be removed in 3.0. Use {@see LogLevel::assertLevelIsValid()} instead. */ public static function validateLevel(mixed $level): string { @@ -146,12 +148,13 @@ public function getTargets(): array } /** - * @param string $level * @psalm-param LogMessageContext $context * @psalm-suppress MoreSpecificImplementedParamType */ public function log(mixed $level, string|Stringable $message, array $context = []): void { + self::assertLevelIsString($level); + $context['time'] ??= microtime(true); $context['trace'] ??= $this->collectTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); $context['memory'] ??= memory_get_usage(); @@ -230,6 +233,41 @@ public function setExcludedTracePaths(array $excludedTracePaths): self return $this; } + public static function assertLevelIsValid(mixed $level): void + { + self::assertLevelIsString($level); + self::assertLevelIsSupported($level); + } + + /** + * @psalm-assert string $level + */ + public static function assertLevelIsString(mixed $level): void + { + if (is_string($level)) { + return; + } + + throw new \Psr\Log\InvalidArgumentException( + sprintf('The log message level must be a string, %s provided.', gettype($level)) + ); + } + + public static function assertLevelIsSupported(string $level): void + { + if (in_array($level, self::LEVELS, true)) { + return; + } + + throw new \Psr\Log\InvalidArgumentException( + sprintf( + 'Invalid log message level "%s" provided. The following values are supported: "%s".', + $level, + implode('", "', self::LEVELS) + ) + ); + } + /** * Sets a target to {@see Logger::$targets}. * diff --git a/src/Message.php b/src/Message.php index d1e49bd3..910f6833 100644 --- a/src/Message.php +++ b/src/Message.php @@ -68,7 +68,8 @@ final class Message */ public function __construct(string $level, string|Stringable $message, array $context = []) { - $this->level = Logger::validateLevel($level); + Logger::assertLevelIsSupported($level); + $this->level = $level; $this->message = $this->parse($message, $context); $this->context = $context; } diff --git a/src/Target.php b/src/Target.php index 1f7c402e..792caffc 100644 --- a/src/Target.php +++ b/src/Target.php @@ -160,7 +160,8 @@ public function setExcept(array $except): self public function setLevels(array $levels): self { foreach ($levels as $key => $level) { - $levels[$key] = Logger::validateLevel($level); + Logger::assertLevelIsValid($level); + $levels[$key] = $level; } $this->levels = $levels; From de53bb8a6ea6dcd60802944569a0f7727c77b452 Mon Sep 17 00:00:00 2001 From: vjik Date: Thu, 6 Jun 2024 12:01:42 +0000 Subject: [PATCH 3/9] Apply Rector changes (CI) --- src/Logger.php | 2 -- src/Message.php | 1 - src/Message/Formatter.php | 1 - tests/TargetTest.php | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/Logger.php b/src/Logger.php index c6e87234..f669381d 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -111,12 +111,10 @@ public function __construct(array $targets = []) /** * Returns the text display of the specified level. * - * @param mixed $level The message level, e.g. {@see LogLevel::ERROR}, {@see LogLevel::WARNING}. * * @throws \Psr\Log\InvalidArgumentException for invalid log message level. * * @return string The text display of the level. - * * @deprecated since 2.1, to be removed in 3.0. Use {@see LogLevel::assertLevelIsValid()} instead. */ public static function validateLevel(mixed $level): string diff --git a/src/Message.php b/src/Message.php index 910f6833..3ff4eacd 100644 --- a/src/Message.php +++ b/src/Message.php @@ -100,7 +100,6 @@ public function message(): string * If no name is specified, the entire context is returned. * * @param string|null $name The context parameter name. - * @param mixed $default If the context parameter does not exist, the `$default` will be returned. * * @return mixed The context parameter value. * @psalm-return LogMessageContext|mixed diff --git a/src/Message/Formatter.php b/src/Message/Formatter.php index a3d41fe8..e1cf6762 100644 --- a/src/Message/Formatter.php +++ b/src/Message/Formatter.php @@ -250,7 +250,6 @@ private function getTrace(Message $message): string /** * Converts a value to a string. * - * @param mixed $value The value to convert * * @return string Converted string. */ diff --git a/tests/TargetTest.php b/tests/TargetTest.php index 13eae6a4..50dfa3fa 100644 --- a/tests/TargetTest.php +++ b/tests/TargetTest.php @@ -132,8 +132,6 @@ public function invalidCallableEnabledProvider(): array /** * @dataProvider invalidCallableEnabledProvider - * - * @param mixed $value */ public function testIsEnabledThrowExceptionForCallableReturnNotBoolean(callable $value): void { From be3db05cfedb8dea3bc140760add628f55fdcc3c Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Thu, 6 Jun 2024 12:01:50 +0000 Subject: [PATCH 4/9] Apply fixes from StyleCI --- src/Logger.php | 1 - src/Message/Formatter.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Logger.php b/src/Logger.php index f669381d..489b4d9e 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -111,7 +111,6 @@ public function __construct(array $targets = []) /** * Returns the text display of the specified level. * - * * @throws \Psr\Log\InvalidArgumentException for invalid log message level. * * @return string The text display of the level. diff --git a/src/Message/Formatter.php b/src/Message/Formatter.php index e1cf6762..fdcd91b7 100644 --- a/src/Message/Formatter.php +++ b/src/Message/Formatter.php @@ -250,7 +250,6 @@ private function getTrace(Message $message): string /** * Converts a value to a string. * - * * @return string Converted string. */ private function convertToString(mixed $value): string From 6c05e5acd447704038b15c3053277dfbb1f0e211 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 15:04:33 +0300 Subject: [PATCH 5/9] Fix rector --- composer.json | 2 +- src/Logger.php | 2 ++ src/Message.php | 1 + src/Message/Formatter.php | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 29fd9e52..dd451b99 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "require-dev": { "maglnet/composer-require-checker": "^4.4", "phpunit/phpunit": "^9.5", - "rector/rector": "^1.0.0", + "rector/rector": "^1.0.*", "roave/infection-static-analysis-plugin": "^1.18", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.30|^5.24" diff --git a/src/Logger.php b/src/Logger.php index 489b4d9e..7747e6f1 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -111,6 +111,8 @@ public function __construct(array $targets = []) /** * Returns the text display of the specified level. * + * @param mixed $level The message level, e.g. {@see LogLevel::ERROR}, {@see LogLevel::WARNING}. + * * @throws \Psr\Log\InvalidArgumentException for invalid log message level. * * @return string The text display of the level. diff --git a/src/Message.php b/src/Message.php index 3ff4eacd..910f6833 100644 --- a/src/Message.php +++ b/src/Message.php @@ -100,6 +100,7 @@ public function message(): string * If no name is specified, the entire context is returned. * * @param string|null $name The context parameter name. + * @param mixed $default If the context parameter does not exist, the `$default` will be returned. * * @return mixed The context parameter value. * @psalm-return LogMessageContext|mixed diff --git a/src/Message/Formatter.php b/src/Message/Formatter.php index fdcd91b7..e7979c62 100644 --- a/src/Message/Formatter.php +++ b/src/Message/Formatter.php @@ -250,6 +250,8 @@ private function getTrace(Message $message): string /** * Converts a value to a string. * + * @param mixed $value The value to convert. + * * @return string Converted string. */ private function convertToString(mixed $value): string From 4e3fe17c697e5473909f45e7c13e69a4142a946b Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 15:05:40 +0300 Subject: [PATCH 6/9] Fix rector version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index dd451b99..d5a35a83 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "require-dev": { "maglnet/composer-require-checker": "^4.4", "phpunit/phpunit": "^9.5", - "rector/rector": "^1.0.*", + "rector/rector": "1.0.*", "roave/infection-static-analysis-plugin": "^1.18", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.30|^5.24" From 3c07ec2cd699b0057358db87bd0efec6782b979c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 15:09:31 +0300 Subject: [PATCH 7/9] phpdoc --- src/Logger.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Logger.php b/src/Logger.php index 7747e6f1..cbc385c7 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -148,7 +148,7 @@ public function getTargets(): array /** * @psalm-param LogMessageContext $context - * @psalm-suppress MoreSpecificImplementedParamType + * @psalm-suppress MoreSpecificImplementedParamType,MixedArgumentTypeCoercion */ public function log(mixed $level, string|Stringable $message, array $context = []): void { @@ -232,6 +232,13 @@ public function setExcludedTracePaths(array $excludedTracePaths): self return $this; } + /** + * Asserts that the log message level is valid. + * + * @param mixed $level The message level. + * + * @throws \Psr\Log\InvalidArgumentException When the log message level is not a string or is not supported. + */ public static function assertLevelIsValid(mixed $level): void { self::assertLevelIsString($level); @@ -239,6 +246,12 @@ public static function assertLevelIsValid(mixed $level): void } /** + * Asserts that the log message level is a string. + * + * @param mixed $level The message level. + * + * @throws \Psr\Log\InvalidArgumentException When the log message level is not a string. + * * @psalm-assert string $level */ public static function assertLevelIsString(mixed $level): void @@ -252,6 +265,13 @@ public static function assertLevelIsString(mixed $level): void ); } + /** + * Asserts that the log message level is supported. + * + * @param string $level The message level. + * + * @throws \Psr\Log\InvalidArgumentException When the log message level is not supported. + */ public static function assertLevelIsSupported(string $level): void { if (in_array($level, self::LEVELS, true)) { From a702345cc0fa179a7ec24e25968d2607a58018ef Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 15:11:27 +0300 Subject: [PATCH 8/9] fix psalm --- psalm.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/psalm.xml b/psalm.xml index 95805489..b2cc7e41 100644 --- a/psalm.xml +++ b/psalm.xml @@ -15,6 +15,7 @@ + From acacee4d757bf91819b8985a11330b631b60ce20 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 6 Jun 2024 15:13:24 +0300 Subject: [PATCH 9/9] fix psalm --- .github/workflows/static.yml | 10 +++++++++- psalm-8.3.xml | 21 +++++++++++++++++++++ psalm.xml | 1 - 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 psalm-8.3.xml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index aea590ea..4241f1ff 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -30,4 +30,12 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.0', '8.1', '8.2', '8.3'] + ['8.0', '8.1', '8.2'] + psalm83: + uses: yiisoft/actions/.github/workflows/psalm.yml@master + with: + psalm-config: 'psalm-8.3.xml' + os: >- + ['ubuntu-latest'] + php: >- + ['8.3'] diff --git a/psalm-8.3.xml b/psalm-8.3.xml new file mode 100644 index 00000000..b2cc7e41 --- /dev/null +++ b/psalm-8.3.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/psalm.xml b/psalm.xml index b2cc7e41..95805489 100644 --- a/psalm.xml +++ b/psalm.xml @@ -15,7 +15,6 @@ -