Upgrade project to PHP 8.3, add PHPStan, upgrade almost every dependency (#36)

* start updating to PHP 8.3

* taking off!

Co-authored-by: ErickSkrauch <erickskrauch@yandex.ru>
Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* dropped this

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* migrate to symfonymailer

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* this is so stupid 😭

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* ah, free, at last.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* oh, Gabriel.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* now dawns thy reckoning.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* and thy gore shall GLISTEN before the temples of man.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* creature of steel.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* my gratitude upon thee for my freedom.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* but the crimes thy kind has committed against humanity

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* Upgrade PHP-CS-Fixer and do fix the codebase

* First review round (maybe I have broken something)

* are NOT forgotten.

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>

* Enable parallel PHP-CS-Fixer runner

* PHPStan level 1

* PHPStan level 2

* PHPStan level 3

* PHPStan level 4

* PHPStan level 5

* Levels 6 and 7 takes too much effort. Generate a baseline and fix them eventually

* Resolve TODO's related to the php-mock

* Drastically reduce baseline size with the Rector

* More code modernization with help of the Rector

* Update GitLab CI

---------

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
Co-authored-by: ErickSkrauch <erickskrauch@yandex.ru>
This commit is contained in:
Octol1ttle
2024-12-02 15:10:55 +05:00
committed by GitHub
parent 625250b367
commit 57d492da8a
356 changed files with 10531 additions and 4761 deletions

View File

@@ -8,15 +8,11 @@ use GuzzleHttp\ClientInterface;
class Api {
private $baseUrl;
private ?\GuzzleHttp\ClientInterface $client = null;
/**
* @var ClientInterface
*/
private $client;
public function __construct(string $baseUrl) {
$this->baseUrl = $baseUrl;
public function __construct(
private readonly string $baseUrl,
) {
}
public function setClient(ClientInterface $client): void {

View File

@@ -26,10 +26,7 @@ class Component extends \yii\base\Component implements RendererInterface {
*/
public $basePath = '';
/**
* @var Api
*/
private $api;
private ?Api $api = null;
public function init(): void {
parent::init();
@@ -47,11 +44,8 @@ class Component extends \yii\base\Component implements RendererInterface {
}
/**
* @param string $templateName
* @param string $locale
* @param array $params
* @param array<string, mixed> $params
*
* @return string
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function render(string $templateName, string $locale, array $params = []): string {

View File

@@ -5,25 +5,11 @@ namespace common\components\EmailsRenderer\Request;
class TemplateRequest {
/**
* @var string
*/
private $name;
/**
* @var string
*/
private $locale;
/**
* @var array
*/
private $params;
public function __construct(string $name, string $locale, array $params) {
$this->name = $name;
$this->locale = $locale;
$this->params = $params;
public function __construct(
private readonly string $name,
private readonly string $locale,
private readonly array $params,
) {
}
public function getName(): string {

View File

@@ -12,15 +12,20 @@ use ReflectionClass;
class ElyDecorator implements DecoratorInterface {
private const LOGO = __DIR__ . '/resources/logo.svg';
private const string LOGO = __DIR__ . '/resources/logo.svg';
private const CORRECTION_MAP = [
private const array CORRECTION_MAP = [
ErrorCorrectionLevel::L => 7,
ErrorCorrectionLevel::M => 15,
ErrorCorrectionLevel::Q => 25,
ErrorCorrectionLevel::H => 30,
];
/**
* @throws \ImagickException
* @throws \ImagickPixelException
* @throws \ImagickPixelIteratorException
*/
public function preProcess(
QrCode $qrCode,
RendererInterface $renderer,
@@ -28,8 +33,8 @@ class ElyDecorator implements DecoratorInterface {
$outputHeight,
$leftPadding,
$topPadding,
$multiple
) {
$multiple,
): void {
if (!$renderer instanceof Svg) {
throw new InvalidArgumentException('$renderer must by instance of ' . Svg::class);
}
@@ -38,11 +43,11 @@ class ElyDecorator implements DecoratorInterface {
$sizeMultiplier = $correctionLevel + floor($correctionLevel / 3);
$count = $qrCode->getMatrix()->getWidth();
$countToRemoveX = floor($count * $sizeMultiplier / 100);
$countToRemoveY = floor($count * $sizeMultiplier / 100);
$countToRemoveX = (int)floor($count * $sizeMultiplier / 100);
$countToRemoveY = (int)floor($count * $sizeMultiplier / 100);
$startX = $leftPadding + round(($count - $countToRemoveX) / 2 * $multiple);
$startY = $topPadding + round(($count - $countToRemoveY) / 2 * $multiple);
$startX = (int)($leftPadding + round(($count - $countToRemoveX) / 2 * $multiple));
$startY = (int)($topPadding + round(($count - $countToRemoveY) / 2 * $multiple));
$width = $countToRemoveX * $multiple;
$height = $countToRemoveY * $multiple;
@@ -52,11 +57,12 @@ class ElyDecorator implements DecoratorInterface {
/** @var \SimpleXMLElement $svg */
$svg = $property->getValue($renderer);
/** @var \SimpleXMLElement $image */
$image = $svg->addChild('image');
$image->addAttribute('x', $startX);
$image->addAttribute('y', $startY);
$image->addAttribute('width', $width);
$image->addAttribute('height', $height);
$image->addAttribute('x', (string)$startX);
$image->addAttribute('y', (string)$startY);
$image->addAttribute('width', (string)$width);
$image->addAttribute('height', (string)$height);
$image->addAttribute('xlink:href', $this->encodeSvgToBase64(self::LOGO));
$logo = new Imagick();
@@ -89,8 +95,8 @@ class ElyDecorator implements DecoratorInterface {
for ($i = $x - $padding; $i <= $x + $padding; $i++) {
for ($j = $y - $padding; $j <= $y + $padding; $j++) {
$matrixX = floor($i / $multiple);
$matrixY = floor($j / $multiple);
$matrixX = (int)floor($i / $multiple);
$matrixY = (int)floor($j / $multiple);
$qrCode->getMatrix()->set($matrixX, $matrixY, 0);
}
}
@@ -104,7 +110,7 @@ class ElyDecorator implements DecoratorInterface {
$outputHeight,
$leftPadding,
$topPadding,
$multiple
$multiple,
) {
}

View File

@@ -3,18 +3,20 @@ declare(strict_types=1);
namespace common\components;
use mito\sentry\Component;
use nohnaimer\sentry\Component;
use Yii;
class Sentry extends Component {
public function init() {
public bool $enabled = true;
public function init(): void {
if (!$this->enabled) {
return;
}
if (is_array($this->client) && !isset($this->client['release'])) {
$this->client['release'] = Yii::$app->version;
if (is_array($this->clientOptions) && !isset($this->clientOptions['release'])) {
$this->clientOptions['release'] = Yii::$app->version;
}
parent::init();

View File

@@ -10,12 +10,9 @@ use Yii;
// TODO: convert to complete Chrly client library
class SkinsSystemApi {
private string $baseDomain;
private ?ClientInterface $client = null;
public function __construct(string $baseDomain) {
$this->baseDomain = $baseDomain;
public function __construct(private readonly string $baseDomain) {
}
/**

View File

@@ -9,22 +9,13 @@ use yii\base\Component;
class StatsD extends Component {
/**
* @var string
*/
public $host;
public string $host;
/**
* @var int
*/
public $port = 8125;
public int $port = 8125;
/**
* @var string
*/
public $namespace = '';
public string $namespace = '';
private $client;
private ?Client $client = null;
public function inc(string $key): void {
$this->getClient()->increment($key);

View File

@@ -5,7 +5,7 @@ namespace common\components;
class UserFriendlyRandomKey {
public static function make(int $length = 18) {
public static function make(int $length = 18): string {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$numChars = strlen($chars);
$key = '';

View File

@@ -8,8 +8,8 @@ namespace common\components;
*/
class UserPass {
public static function make($email, $pass) {
return md5($pass . md5(strtolower($email)));
public static function make($email, string $pass): string {
return md5($pass . md5(strtolower((string)$email)));
}
}