diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index c14f1bbf..ea6f4a4a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -4,7 +4,7 @@ # ⚠️ NOT optimized for production # should be used only for development purposes #--------------------------------------------------- -FROM php:8.1-fpm +FROM php:8.2-fpm LABEL maintainer="Yassine Doghri " diff --git a/app/Config/App.php b/app/Config/App.php index d251a468..3b603d80 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -83,7 +83,7 @@ class App extends BaseConfig * DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! * */ - public string $permittedURIChars = 'a-z 0-9~%.:_\-'; + public string $permittedURIChars = 'a-z 0-9~%.:_\-@'; /** * -------------------------------------------------------------------------- diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index b2bb33f1..29878b13 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -62,7 +62,6 @@ class Autoload extends AutoloadConfig /** * ------------------------------------------------------------------- - * Class Map * ------------------------------------------------------------------- * The class map provides a map of class names and their exact * location on the drive. Classes loaded in this manner will have diff --git a/app/Config/Cors.php b/app/Config/Cors.php index 2b4edf6b..59ec5a71 100644 --- a/app/Config/Cors.php +++ b/app/Config/Cors.php @@ -1,5 +1,7 @@ $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -157,9 +155,7 @@ class EpisodeController extends BaseController // The page cache is set to a decade so it is deleted manually upon podcast update return view('episode/activity', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -218,9 +214,7 @@ class EpisodeController extends BaseController // The page cache is set to a decade so it is deleted manually upon podcast update return view('episode/chapters', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -284,9 +278,7 @@ class EpisodeController extends BaseController // The page cache is set to a decade so it is deleted manually upon podcast update return view('episode/transcript', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -339,9 +331,7 @@ class EpisodeController extends BaseController // The page cache is set to a decade so it is deleted manually upon podcast update return view('embed', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -420,11 +410,9 @@ class EpisodeController extends BaseController * get comments: aggregated replies from posts referring to the episode */ $episodeComments = model(PostModel::class) - ->whereIn('in_reply_to_id', function (BaseBuilder $builder): BaseBuilder { - return $builder->select('id') - ->from('fediverse_posts') - ->where('episode_id', $this->episode->id); - }) + ->whereIn('in_reply_to_id', fn (BaseBuilder $builder): BaseBuilder => $builder->select('id') + ->from('fediverse_posts') + ->where('episode_id', $this->episode->id)) ->where('`published_at` <= UTC_TIMESTAMP()', null, false) ->orderBy('published_at', 'ASC'); diff --git a/app/Controllers/FeedController.php b/app/Controllers/FeedController.php index ea4ebeea..058c3b6f 100644 --- a/app/Controllers/FeedController.php +++ b/app/Controllers/FeedController.php @@ -79,13 +79,7 @@ class FeedController extends Controller ); cache() - ->save( - $cacheName, - $found, - $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - ); + ->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE); } return $this->response->setXML($found); diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php index 9784a076..f586248c 100644 --- a/app/Controllers/PodcastController.php +++ b/app/Controllers/PodcastController.php @@ -96,9 +96,7 @@ class PodcastController extends BaseController ); return view('podcast/activity', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -148,9 +146,7 @@ class PodcastController extends BaseController ); return view('podcast/about', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } @@ -270,9 +266,7 @@ class PodcastController extends BaseController $this->podcast->id, ); return view('podcast/episodes', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache_name' => $cacheName, ]); } diff --git a/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php b/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php index 88958b37..8860a5fe 100644 --- a/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php +++ b/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php @@ -1,5 +1,7 @@ city($fakeIp); - $countryCode = $city->country->isoCode === null - ? 'N/A' - : $city->country->isoCode; + $countryCode = $city->country->isoCode ?? 'N/A'; $regionCode = $city->subdivisions === [] ? 'N/A' @@ -128,20 +124,20 @@ class FakePodcastsAnalyticsSeeder extends Seeder //Bad luck, bad IP, nothing to do. } - $hits = rand(0, (int) $probability2); + $hits = random_int(0, (int) $probability2); $analyticsPodcasts[] = [ 'podcast_id' => $podcast->id, 'date' => date('Y-m-d', $date), - 'duration' => rand(60, 3600), - 'bandwidth' => rand(1000000, 10000000), + 'duration' => random_int(60, 3600), + 'bandwidth' => random_int(1000000, 10000000), 'hits' => $hits, 'unique_listeners' => $hits, ]; $analyticsPodcastsByHour[] = [ 'podcast_id' => $podcast->id, 'date' => date('Y-m-d', $date), - 'hour' => rand(0, 23), + 'hour' => random_int(0, 23), 'hits' => $hits, ]; $analyticsPodcastsByCountry[] = [ diff --git a/app/Database/Seeds/FakeWebsiteAnalyticsSeeder.php b/app/Database/Seeds/FakeWebsiteAnalyticsSeeder.php index b45ad176..9c855d02 100644 --- a/app/Database/Seeds/FakeWebsiteAnalyticsSeeder.php +++ b/app/Database/Seeds/FakeWebsiteAnalyticsSeeder.php @@ -216,23 +216,23 @@ class FakeWebsiteAnalyticsSeeder extends Seeder for ( $lineNumber = 0; - $lineNumber < rand(1, $probability1); + $lineNumber < random_int(1, $probability1); ++$lineNumber ) { $probability2 = (int) floor(exp(6 - $age / 20)) + 10; $domain = - $this->domains[rand(0, count($this->domains) - 1)]; + $this->domains[random_int(0, count($this->domains) - 1)]; $keyword = $this->keywords[ - rand(0, count($this->keywords) - 1) + random_int(0, count($this->keywords) - 1) ]; $browser = $this->browsers[ - rand(0, count($this->browsers) - 1) + random_int(0, count($this->browsers) - 1) ]; - $hits = rand(0, $probability2); + $hits = random_int(0, $probability2); $websiteByBrowser[] = [ 'podcast_id' => $podcast->id, diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index f730d2af..1df0cf49 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -483,7 +483,7 @@ class Episode extends Entity public function setGuid(?string $guid = null): static { - $this->attributes['guid'] = $guid === null ? $this->getLink() : $guid; + $this->attributes['guid'] = $guid ?? $this->getLink(); return $this; } diff --git a/app/Helpers/id3_helper.php b/app/Helpers/id3_helper.php index afa7b8a0..8d126a1f 100644 --- a/app/Helpers/id3_helper.php +++ b/app/Helpers/id3_helper.php @@ -42,24 +42,16 @@ if (! function_exists('write_audio_file_tags')) { // populate data array $TagData = [ - 'title' => [esc($episode->title)], - 'artist' => [ - $episode->podcast->publisher === null - ? esc($episode->podcast->owner_name) - : $episode->podcast->publisher, - ], + 'title' => [esc($episode->title)], + 'artist' => [$episode->podcast->publisher ?? esc($episode->podcast->owner_name)], 'album' => [esc($episode->podcast->title)], 'year' => [$episode->published_at instanceof Time ? $episode->published_at->format('Y') : ''], 'genre' => ['Podcast'], 'comment' => [$episode->description], 'track_number' => [(string) $episode->number], 'copyright_message' => [$episode->podcast->copyright], - 'publisher' => [ - $episode->podcast->publisher === null - ? esc($episode->podcast->owner_name) - : $episode->podcast->publisher, - ], - 'encoded_by' => ['Castopod'], + 'publisher' => [$episode->podcast->publisher ?? esc($episode->podcast->owner_name)], + 'encoded_by' => ['Castopod'], // TODO: find a way to add the remaining tags for podcasts as the library doesn't seem to allow it // 'website' => [$podcast_url], diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index 57cbefdf..f19ca5a6 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -164,7 +164,7 @@ if (! function_exists('parse_size')) { $size = (float) preg_replace('~[^0-9\.]~', '', $size); // Remove the non-numeric characters from the size. if ($unit !== '') { // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by. - return round($size * pow(1024, (float) stripos('bkmgtpezy', $unit[0]))); + return round($size * 1024 ** ((float) stripos('bkmgtpezy', $unit[0]))); } return round($size); @@ -183,7 +183,7 @@ if (! function_exists('format_bytes')) { $pow = floor(($bytes ? log($bytes) : 0) / log($is_binary ? 1024 : 1000)); $pow = min($pow, count($units) - 1); - $bytes /= pow($is_binary ? 1024 : 1000, $pow); + $bytes /= ($is_binary ? 1024 : 1000) ** $pow; return round($bytes, $precision) . $units[$pow]; } diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index dcfe4b2e..90f9ee71 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -260,12 +260,7 @@ if (! function_exists('get_rss_feed')) { $itunesNamespace, ); - $channel->addChild( - 'author', - $podcast->publisher ? $podcast->publisher : $podcast->owner_name, - $itunesNamespace, - false - ); + $channel->addChild('author', $podcast->publisher ?: $podcast->owner_name, $itunesNamespace, false); $channel->addChild('link', $podcast->link); $owner = $channel->addChild('owner', null, $itunesNamespace); @@ -354,7 +349,7 @@ if (! function_exists('get_rss_feed')) { $item->addChild('episodeType', $episode->type, $itunesNamespace); // If episode is of type trailer, add podcast:trailer tag on channel level - if ($episode->type == 'trailer') { + if ($episode->type === 'trailer') { $trailer = $channel->addChild('trailer', $episode->title, $podcastNamespace); $trailer->addAttribute('pubdate', $episode->published_at->format(DATE_RFC2822)); $trailer->addAttribute( diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php index 87121fa2..dc1cc8c1 100644 --- a/app/Libraries/Router.php +++ b/app/Libraries/Router.php @@ -48,7 +48,7 @@ class Router extends CodeIgniterRouter $matchedKey = $routeKey; // Are we dealing with a locale? - if (strpos($routeKey, '{locale}') !== false) { + if (str_contains($routeKey, '{locale}')) { $routeKey = str_replace('{locale}', '[^/]+', $routeKey); } @@ -73,7 +73,7 @@ class Router extends CodeIgniterRouter // Store our locale so CodeIgniter object can // assign it to the Request. - if (strpos($matchedKey, '{locale}') !== false) { + if (str_contains($matchedKey, '{locale}')) { preg_match( '#^' . str_replace('{locale}', '(?[^/]+)', $matchedKey) . '$#u', $uri, @@ -183,13 +183,13 @@ class Router extends CodeIgniterRouter [$controller] = explode('::', (string) $handler); // Checks `/` in controller name - if (strpos($controller, '/') !== false) { + if (str_contains($controller, '/')) { throw RouterException::forInvalidControllerName($handler); } - if (strpos((string) $handler, '$') !== false && strpos($routeKey, '(') !== false) { + if (str_contains((string) $handler, '$') && str_contains($routeKey, '(')) { // Checks dynamic controller - if (strpos($controller, '$') !== false) { + if (str_contains($controller, '$')) { throw RouterException::forDynamicController($handler); } diff --git a/app/Libraries/ViewComponents/Decorator.php b/app/Libraries/ViewComponents/Decorator.php index 4a4f2d7c..4701052f 100644 --- a/app/Libraries/ViewComponents/Decorator.php +++ b/app/Libraries/ViewComponents/Decorator.php @@ -7,8 +7,6 @@ namespace ViewComponents; use CodeIgniter\View\ViewDecoratorInterface; /** - * Class Decorator - * * Enables rendering of View Components into the views. * * Borrowed and adapted from https://github.com/lonnieezell/Bonfire2/ diff --git a/app/Libraries/ViewThemes/Theme.php b/app/Libraries/ViewThemes/Theme.php index 30020dcb..51d69ffe 100644 --- a/app/Libraries/ViewThemes/Theme.php +++ b/app/Libraries/ViewThemes/Theme.php @@ -19,7 +19,7 @@ class Theme protected static $defaultTheme = 'app'; /** - * @var string + * @var ?string */ protected static $currentTheme; @@ -71,9 +71,7 @@ class Theme */ public static function current(): string { - return static::$currentTheme !== null - ? static::$currentTheme - : static::$defaultTheme; + return static::$currentTheme ?? static::$defaultTheme; } /** diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index 90238f3e..0a644cdc 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -272,13 +272,7 @@ class EpisodeModel extends UuidModel $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode($podcastId); cache() - ->save( - $cacheName, - $found, - $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - ); + ->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE); } return $found; diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index a7c845e7..eb8bd205 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -259,13 +259,7 @@ class PodcastModel extends Model $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode($podcastId); cache() - ->save( - $cacheName, - $found, - $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - ); + ->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE); } return $found; @@ -295,13 +289,7 @@ class PodcastModel extends Model $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode($podcastId); cache() - ->save( - $cacheName, - $found, - $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - ); + ->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE); } return $found; @@ -335,11 +323,7 @@ class PodcastModel extends Model $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode($podcastId); cache() - ->save( - $cacheName, - $defaultQuery, - $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode : DECADE - ); + ->save($cacheName, $defaultQuery, $secondsToNextUnpublishedEpisode ?: DECADE); } return $defaultQuery; diff --git a/app/Views/Components/Alert.php b/app/Views/Components/Alert.php index 462133c6..59f9827f 100644 --- a/app/Views/Components/Alert.php +++ b/app/Views/Components/Alert.php @@ -42,7 +42,7 @@ class Alert extends Component $this->variant = 'default'; } - $glyph = icon(($this->glyph === null ? $variants[$this->variant]['glyph'] : $this->glyph), 'flex-shrink-0 mr-2 text-lg'); + $glyph = icon(($this->glyph ?? $variants[$this->variant]['glyph']), 'flex-shrink-0 mr-2 text-lg'); $title = $this->title === null ? '' : '
' . $this->title . '
'; $class = 'inline-flex w-full p-2 text-sm border rounded ' . $variants[$this->variant]['class'] . ' ' . $this->class; diff --git a/builds b/builds index f1d74a0e..e7884e0b 100644 --- a/builds +++ b/builds @@ -1,6 +1,8 @@ #!/usr/bin/env php =8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5601,7 +5600,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command-line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.6" + "source": "https://github.com/symfony/console/tree/v7.0.6" }, "funding": [ { @@ -5617,28 +5616,28 @@ "type": "tidelift" } ], - "time": "2024-03-29T19:07:53+00:00" + "time": "2024-04-01T11:04:53+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e", + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -5647,13 +5646,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5677,7 +5676,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3" }, "funding": [ { @@ -5693,7 +5692,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5771,20 +5770,20 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.6", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3" + "reference": "408105dff4c104454100730bdfd1a9cdd993f04d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/9919b5509ada52cc7f66f9a35c86a4a29955c9d3", - "reference": "9919b5509ada52cc7f66f9a35c86a4a29955c9d3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d", + "reference": "408105dff4c104454100730bdfd1a9cdd993f04d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, @@ -5810,7 +5809,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.6" + "source": "https://github.com/symfony/filesystem/tree/v7.0.6" }, "funding": [ { @@ -5826,27 +5825,27 @@ "type": "tidelift" } ], - "time": "2024-03-21T19:36:20+00:00" + "time": "2024-03-21T19:37:36+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5870,7 +5869,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v7.0.0" }, "funding": [ { @@ -5886,24 +5885,24 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2023-10-31T17:59:56+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.4.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e" + "reference": "700ff4096e346f54cb628ea650767c8130f1001f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f", + "reference": "700ff4096e346f54cb628ea650767c8130f1001f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -5929,7 +5928,7 @@ "homepage": "https://symfony.com", "keywords": ["config", "configuration", "options"], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.0.0" }, "funding": [ { @@ -5945,7 +5944,7 @@ "type": "tidelift" } ], - "time": "2023-08-08T10:16:24+00:00" + "time": "2023-08-08T10:20:21+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6163,20 +6162,20 @@ }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v7.0.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9", + "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -6200,7 +6199,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v7.0.4" }, "funding": [ { @@ -6216,7 +6215,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-02-22T20:27:20+00:00" }, { "name": "symfony/service-contracts", @@ -6298,20 +6297,20 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.3", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112", + "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -6336,7 +6335,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" + "source": "https://github.com/symfony/stopwatch/tree/v7.0.3" }, "funding": [ { @@ -6352,24 +6351,24 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:35:58+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "symfony/string", - "version": "v6.4.4", + "version": "v7.0.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -6379,11 +6378,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6409,7 +6408,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.4" + "source": "https://github.com/symfony/string/tree/v7.0.4" }, "funding": [ { @@ -6425,41 +6424,38 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:16:41+00:00" + "time": "2024-02-01T13:17:36+00:00" }, { "name": "symplify/coding-standard", - "version": "12.0.7", + "version": "12.1.4", "source": { "type": "git", "url": "https://github.com/symplify/coding-standard.git", - "reference": "199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c" + "reference": "1a591e18c64e7367b243729a43a70c2e92025468" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/coding-standard/zipball/199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c", - "reference": "199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c", + "url": "https://api.github.com/repos/symplify/coding-standard/zipball/1a591e18c64e7367b243729a43a70c2e92025468", + "reference": "1a591e18c64e7367b243729a43a70c2e92025468", "shasum": "" }, "require": { - "friendsofphp/php-cs-fixer": "^3.40", + "friendsofphp/php-cs-fixer": "^3.49", "nette/utils": "^3.2", - "php": ">=8.1", + "php": ">=8.2", "symplify/rule-doc-generator-contracts": "^11.1" }, "require-dev": { "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.10.26", - "phpunit/phpunit": "^10.2", - "rector/rector": "^0.17.7", - "squizlabs/php_codesniffer": "^3.7.2", - "symplify/easy-ci": "^11.3", - "symplify/easy-coding-standard": "^12.0.11", - "symplify/phpstan-extensions": "^11.2", + "phpstan/phpstan": "^1.10.58", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "squizlabs/php_codesniffer": "^3.8.1", + "symplify/easy-coding-standard": "^12.1", + "symplify/phpstan-extensions": "^11.4", "symplify/rule-doc-generator": "^12.0", "tomasvotruba/class-leak": "^0.2", - "tomasvotruba/type-coverage": "^0.2", - "tomasvotruba/unused-public": "^0.3", "tracy/tracy": "^2.10" }, "type": "library", @@ -6473,7 +6469,7 @@ "description": "Set of Symplify rules for PHP_CodeSniffer and PHP CS Fixer.", "support": { "issues": "https://github.com/symplify/coding-standard/issues", - "source": "https://github.com/symplify/coding-standard/tree/12.0.7" + "source": "https://github.com/symplify/coding-standard/tree/12.1.4" }, "funding": [ { @@ -6485,29 +6481,29 @@ "type": "github" } ], - "time": "2023-12-07T09:18:34+00:00" + "time": "2024-02-23T13:07:31+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.1.1", + "version": "12.1.14", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "d082c6f90e83ae85f7e63b03ea06780dcf765834" + "reference": "e3c4a241ee36704f7cf920d5931f39693e64afd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/d082c6f90e83ae85f7e63b03ea06780dcf765834", - "reference": "d082c6f90e83ae85f7e63b03ea06780dcf765834", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/e3c4a241ee36704f7cf920d5931f39693e64afd5", + "reference": "e3c4a241ee36704f7cf920d5931f39693e64afd5", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "friendsofphp/php-cs-fixer": "<3.0", - "phpcsstandards/php_codesniffer": "<3.6", - "symplify/coding-standard": "<11.3" + "friendsofphp/php-cs-fixer": "<3.46", + "phpcsstandards/php_codesniffer": "<3.8", + "symplify/coding-standard": "<12.1" }, "bin": ["bin/ecs"], "type": "library", @@ -6520,7 +6516,7 @@ "keywords": ["Code style", "automation", "fixer", "static analysis"], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.1.1" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.1.14" }, "funding": [ { @@ -6532,7 +6528,7 @@ "type": "github" } ], - "time": "2024-01-05T13:20:55+00:00" + "time": "2024-02-23T13:10:40+00:00" }, { "name": "symplify/rule-doc-generator-contracts", diff --git a/ecs.php b/ecs.php index c35f2987..87351225 100644 --- a/ecs.php +++ b/ecs.php @@ -10,26 +10,20 @@ use Symplify\CodingStandard\Fixer\LineLength\LineLengthFixer; use Symplify\CodingStandard\Fixer\Naming\StandardizeHereNowDocKeywordFixer; use Symplify\CodingStandard\Fixer\Spacing\MethodChainingNewlineFixer; use Symplify\EasyCodingStandard\Config\ECSConfig; -use Symplify\EasyCodingStandard\ValueObject\Set\SetList; -return static function (ECSConfig $ecsConfig): void { - // alternative to CLI arguments, easier to maintain and extend - $ecsConfig->paths([ +return ECSConfig::configure() + ->withPaths([ __DIR__ . '/app', __DIR__ . '/modules', __DIR__ . '/themes', __DIR__ . '/tests', __DIR__ . '/public', __DIR__ . '/builds', - __DIR__ . '/ecs.php', - __DIR__ . '/preload.php', - __DIR__ . '/rector.php', __DIR__ . '/spark', - ]); - - $ecsConfig->sets([SetList::CLEAN_CODE, SetList::COMMON, SetList::SYMPLIFY, SetList::PSR_12]); - - $ecsConfig->skip([ + ]) + ->withRootFiles() + ->withPreparedSets(cleanCode: true, common: true, symplify: true, strict: true, psr12: true) + ->withSkip([ // skip specific generated files __DIR__ . '/modules/Admin/Language/*/PersonsTaxonomy.php', @@ -40,11 +34,7 @@ return static function (ECSConfig $ecsConfig): void { __DIR__ . '/app/Helpers/components_helper.php', ], - LineLengthFixer::class => [ - __DIR__ . '/app/Views/*', - __DIR__ . '/modules/**/Views/*', - __DIR__ . '/themes/*', - ], + LineLengthFixer::class => [__DIR__ . '/app/Views/*', __DIR__ . '/modules/**/Views/*', __DIR__ . '/themes/*'], IndentationTypeFixer::class => [ __DIR__ . '/app/Views/*', @@ -65,11 +55,9 @@ return static function (ECSConfig $ecsConfig): void { BinaryOperatorSpacesFixer::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/**/Language/*'], AssignmentInConditionSniff::class, - ]); - - $ecsConfig->ruleWithConfiguration(BinaryOperatorSpacesFixer::class, [ + ]) + ->withConfiguredRule(BinaryOperatorSpacesFixer::class, [ 'operators' => [ '=>' => 'align_single_space_minimal', ], ]); -}; diff --git a/modules/Admin/Controllers/BaseController.php b/modules/Admin/Controllers/BaseController.php index eb54a767..29f5b3ff 100644 --- a/modules/Admin/Controllers/BaseController.php +++ b/modules/Admin/Controllers/BaseController.php @@ -12,8 +12,6 @@ use Psr\Log\LoggerInterface; use ViewThemes\Theme; /** - * Class BaseController - * * BaseController provides a convenient place for loading components and performing functions that are needed by all * your controllers. Extend this class in any new controllers: class Home extends BaseController * diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 6f9ae615..acd742fc 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -326,12 +326,8 @@ class EpisodeController extends BaseController $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null; - $this->episode->number = $this->request->getPost('episode_number') - ? $this->request->getPost('episode_number') - : null; - $this->episode->season_number = $this->request->getPost('season_number') - ? $this->request->getPost('season_number') - : null; + $this->episode->number = $this->request->getPost('episode_number') ?: null; + $this->episode->season_number = $this->request->getPost('season_number') ?: null; $this->episode->type = $this->request->getPost('type'); $this->episode->is_blocked = $this->request->getPost('block') === 'yes'; $this->episode->custom_rss_string = $this->request->getPost('custom_rss'); diff --git a/modules/Admin/Controllers/PageController.php b/modules/Admin/Controllers/PageController.php index f589f64c..f23bf242 100644 --- a/modules/Admin/Controllers/PageController.php +++ b/modules/Admin/Controllers/PageController.php @@ -17,7 +17,7 @@ use CodeIgniter\HTTP\RedirectResponse; class PageController extends BaseController { - protected ?Page $page; + protected ?Page $page = null; public function _remap(string $method, string ...$params): mixed { diff --git a/modules/Admin/Controllers/PersonController.php b/modules/Admin/Controllers/PersonController.php index 5cb66b06..85b466c8 100644 --- a/modules/Admin/Controllers/PersonController.php +++ b/modules/Admin/Controllers/PersonController.php @@ -18,7 +18,7 @@ use Modules\Media\Models\MediaModel; class PersonController extends BaseController { - protected ?Person $person; + protected ?Person $person = null; public function _remap(string $method, string ...$params): mixed { diff --git a/modules/Analytics/AnalyticsTrait.php b/modules/Analytics/AnalyticsTrait.php index 6e02e721..53aa13ef 100644 --- a/modules/Analytics/AnalyticsTrait.php +++ b/modules/Analytics/AnalyticsTrait.php @@ -30,9 +30,7 @@ trait AnalyticsTrait $referer = $session->get('referer'); $domain = - parse_url((string) $referer, PHP_URL_HOST) === null - ? '- Direct -' - : parse_url((string) $referer, PHP_URL_HOST); + parse_url((string) $referer, PHP_URL_HOST) ?? '- Direct -'; parse_str((string) parse_url((string) $referer, PHP_URL_QUERY), $queries); $keywords = $queries['q'] ?? null; diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php index f8a925cf..04ed7eb6 100644 --- a/modules/Analytics/Config/Routes.php +++ b/modules/Analytics/Config/Routes.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use CodeIgniter\Router\RouteCollection; use Modules\Analytics\Config\Analytics; /** diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index da7b2e04..48625117 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -85,14 +85,10 @@ if (! function_exists('set_user_session_location')) { $city = $cityReader->city(client_ip()); $location = [ - 'countryCode' => $city->country->isoCode === null - ? 'N/A' - : $city->country->isoCode, - 'regionCode' => $city->subdivisions[0]->isoCode === null - ? 'N/A' - : $city->subdivisions[0]->isoCode, - 'latitude' => round($city->location->latitude, 3), - 'longitude' => round($city->location->longitude, 3), + 'countryCode' => $city->country->isoCode ?? 'N/A', + 'regionCode' => $city->subdivisions[0]->isoCode ?? 'N/A', + 'latitude' => round($city->location->latitude, 3), + 'longitude' => round($city->location->longitude, 3), ]; // If things go wrong the show must go on and the user must be able to download the file } catch (Exception) { @@ -179,9 +175,7 @@ if (! function_exists('set_user_session_referer')) { { $session = Services::session(); - $newreferer = isset($_SERVER['HTTP_REFERER']) - ? $_SERVER['HTTP_REFERER'] - : '- Direct -'; + $newreferer = $_SERVER['HTTP_REFERER'] ?? '- Direct -'; $newreferer = parse_url((string) $newreferer, PHP_URL_HOST) === parse_url(current_url(false), PHP_URL_HOST) @@ -250,9 +244,7 @@ if (! function_exists('podcast_hit')) { } //We get the HTTP header field `Range`: - $httpRange = isset($_SERVER['HTTP_RANGE']) - ? $_SERVER['HTTP_RANGE'] - : null; + $httpRange = $_SERVER['HTTP_RANGE'] ?? null; $salt = config(Analytics::class) ->salt; diff --git a/modules/Api/Rest/V1/Controllers/EpisodeController.php b/modules/Api/Rest/V1/Controllers/EpisodeController.php index f90e809d..f09737e8 100644 --- a/modules/Api/Rest/V1/Controllers/EpisodeController.php +++ b/modules/Api/Rest/V1/Controllers/EpisodeController.php @@ -65,7 +65,7 @@ class EpisodeController extends Controller return $this->failNotFound('Episode not found'); } - return $this->respond($this->mapEpisode($episode)); + return $this->respond(static::mapEpisode($episode)); } protected static function mapEpisode(Episode $episode): Episode diff --git a/modules/Api/Rest/V1/Filters/ApiFilter.php b/modules/Api/Rest/V1/Filters/ApiFilter.php index 9ee8fa5f..837acba5 100644 --- a/modules/Api/Rest/V1/Filters/ApiFilter.php +++ b/modules/Api/Rest/V1/Filters/ApiFilter.php @@ -36,7 +36,7 @@ class ApiFilter implements FilterInterface } $authHeader = $request->getHeaderLine('Authorization'); - if (substr($authHeader, 0, 6) !== 'Basic ') { + if (! str_starts_with($authHeader, 'Basic ')) { $response->setStatusCode(401); return $response; @@ -44,7 +44,7 @@ class ApiFilter implements FilterInterface $auth_token = base64_decode(substr($authHeader, 6), true); - list($username, $password) = explode(':', (string) $auth_token); + [$username, $password] = explode(':', (string) $auth_token); if (! ($username === $restApiConfig->basicAuthUsername && $password === $restApiConfig->basicAuthPassword)) { $response->setStatusCode(401); diff --git a/modules/Auth/Controllers/ActionController.php b/modules/Auth/Controllers/ActionController.php index e9db4ab3..5dfbaf5b 100644 --- a/modules/Auth/Controllers/ActionController.php +++ b/modules/Auth/Controllers/ActionController.php @@ -11,8 +11,6 @@ use Psr\Log\LoggerInterface; use ViewThemes\Theme; /** - * Class ActionController - * * A generic controller to handle Authentication Actions. */ class ActionController extends ShieldActionController diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php index 84005c0b..77c5162c 100644 --- a/modules/Auth/Controllers/ContributorController.php +++ b/modules/Auth/Controllers/ContributorController.php @@ -22,7 +22,7 @@ class ContributorController extends BaseController { protected Podcast $podcast; - protected ?User $contributor; + protected ?User $contributor = null; public function _remap(string $method, string ...$params): mixed { diff --git a/modules/Auth/Controllers/InteractController.php b/modules/Auth/Controllers/InteractController.php index d3a387b7..b760b9d7 100644 --- a/modules/Auth/Controllers/InteractController.php +++ b/modules/Auth/Controllers/InteractController.php @@ -8,8 +8,6 @@ use CodeIgniter\Controller; use CodeIgniter\HTTP\RedirectResponse; /** - * Class ActionController - * * A generic controller to handle Authentication Actions. */ class InteractController extends Controller diff --git a/modules/Auth/Controllers/RegisterController.php b/modules/Auth/Controllers/RegisterController.php index b54c0d9c..6db353de 100644 --- a/modules/Auth/Controllers/RegisterController.php +++ b/modules/Auth/Controllers/RegisterController.php @@ -11,8 +11,6 @@ use Psr\Log\LoggerInterface; use ViewThemes\Theme; /** - * Class RegisterController - * * Handles displaying registration form, and handling actual registration flow. */ class RegisterController extends ShieldRegisterController diff --git a/modules/Auth/Controllers/UserController.php b/modules/Auth/Controllers/UserController.php index 055b4936..729f1d0a 100644 --- a/modules/Auth/Controllers/UserController.php +++ b/modules/Auth/Controllers/UserController.php @@ -22,7 +22,7 @@ use Modules\Auth\Models\UserModel; class UserController extends BaseController { - protected ?User $user; + protected ?User $user = null; public function _remap(string $method, string ...$params): mixed { diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php index f664f687..b4765c87 100644 --- a/modules/Auth/Helpers/auth_helper.php +++ b/modules/Auth/Helpers/auth_helper.php @@ -102,9 +102,10 @@ if (! function_exists('add_podcast_group')) { if (! function_exists('get_instance_group')) { function get_instance_group(User $user): ?string { - $instanceGroups = array_filter($user->getGroups() ?? [], static function ($group): bool { - return ! str_starts_with($group, 'podcast#'); - }); + $instanceGroups = array_filter( + $user->getGroups() ?? [], + static fn ($group): bool => ! str_starts_with((string) $group, 'podcast#') + ); if ($instanceGroups === []) { return null; @@ -138,9 +139,10 @@ if (! function_exists('set_instance_group')) { if (! function_exists('get_podcast_group')) { function get_podcast_group(User $user, int $podcastId, bool $removePrefix = true): ?string { - $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group) use ($podcastId): bool { - return str_starts_with($group, "podcast#{$podcastId}-"); - }); + $podcastGroups = array_filter( + $user->getGroups() ?? [], + static fn ($group): bool => str_starts_with((string) $group, "podcast#{$podcastId}-") + ); if ($podcastGroups === []) { return null; @@ -180,9 +182,10 @@ if (! function_exists('get_podcast_groups')) { */ function get_user_podcast_ids(User $user): array { - $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group): bool { - return str_starts_with($group, 'podcast#'); - }); + $podcastGroups = array_filter( + $user->getGroups() ?? [], + static fn ($group): bool => str_starts_with((string) $group, 'podcast#') + ); $userPodcastIds = []; // extract all podcast ids from groups diff --git a/modules/Fediverse/Core/AbstractObject.php b/modules/Fediverse/Core/AbstractObject.php index 122b1186..cfe7ff53 100644 --- a/modules/Fediverse/Core/AbstractObject.php +++ b/modules/Fediverse/Core/AbstractObject.php @@ -42,9 +42,7 @@ abstract class AbstractObject } // removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values - return array_filter($array, static function ($value): bool { - return $value !== null && $value !== false && $value !== ''; - }); + return array_filter($array, static fn ($value): bool => $value !== null && $value !== false && $value !== ''); } public function toJSON(): string diff --git a/modules/Fediverse/Helpers/fediverse_helper.php b/modules/Fediverse/Helpers/fediverse_helper.php index 8f1f505c..195149e4 100644 --- a/modules/Fediverse/Helpers/fediverse_helper.php +++ b/modules/Fediverse/Helpers/fediverse_helper.php @@ -175,12 +175,10 @@ if (! function_exists('create_preview_card_from_url')) { // Check that, at least, the url and title are set $newPreviewCard = new PreviewCard([ - 'url' => $mediaUrl, - 'title' => $media['title'] ?? '', - 'description' => $media['description'] ?? '', - 'type' => isset($typeMapping[$media['type']]) - ? $typeMapping[$media['type']] - : 'link', + 'url' => $mediaUrl, + 'title' => $media['title'] ?? '', + 'description' => $media['description'] ?? '', + 'type' => $typeMapping[$media['type']] ?? 'link', 'author_name' => $media['author_name'] ?? null, 'author_url' => $media['author_url'] ?? null, 'provider_name' => $media['provider_name'] ?? '', diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index 08ab85d0..ac409844 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -134,7 +134,7 @@ class PostModel extends UuidModel $secondsToNextUnpublishedPost = $this->getSecondsToNextUnpublishedPosts($actorId); cache() - ->save($cacheName, $found, $secondsToNextUnpublishedPost ? $secondsToNextUnpublishedPost : DECADE); + ->save($cacheName, $found, $secondsToNextUnpublishedPost ?: DECADE); } return $found; diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index fa52f73d..0991d11d 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -160,9 +160,7 @@ class InstallController extends Controller if (! $this->validate($rules)) { return redirect() - ->to( - (host_url() === null ? config(App::class) ->baseURL : host_url()) . config(Install::class)->gateway - ) + ->to((host_url() ?? config(App::class) ->baseURL) . config(Install::class)->gateway) ->withInput() ->with('errors', $this->validator->getErrors()); } diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php index f0e9a351..68d77048 100644 --- a/modules/Media/Entities/Transcript.php +++ b/modules/Media/Entities/Transcript.php @@ -85,16 +85,12 @@ class Transcript extends BaseMedia } $transcript_format = $this->file->getExtension(); - switch ($transcript_format) { - case 'vtt': - $transcriptJson = $transcriptParser->loadString($transcriptContent) - ->parseVtt(); - break; - case 'srt': - default: - $transcriptJson = $transcriptParser->loadString($transcriptContent) - ->parseSrt(); - } + $transcriptJson = match ($transcript_format) { + 'vtt' => $transcriptParser->loadString($transcriptContent) + ->parseVtt(), + default => $transcriptParser->loadString($transcriptContent) + ->parseSrt(), + }; $tempFilePath = WRITEPATH . 'uploads/' . $this->file->getRandomName(); file_put_contents($tempFilePath, $transcriptJson); diff --git a/modules/MediaClipper/VideoClipper.php b/modules/MediaClipper/VideoClipper.php index ea55c0c6..86248a65 100644 --- a/modules/MediaClipper/VideoClipper.php +++ b/modules/MediaClipper/VideoClipper.php @@ -543,9 +543,9 @@ class VideoClipper # find unique color do { - $r = rand(0, 255); - $g = rand(0, 255); - $b = rand(0, 255); + $r = random_int(0, 255); + $g = random_int(0, 255); + $b = random_int(0, 255); } while (imagecolorexact($src, $r, $g, $b) < 0); $ns = $s * $q; diff --git a/modules/Platforms/Models/PlatformModel.php b/modules/Platforms/Models/PlatformModel.php index 668a77f2..c71e6c8f 100644 --- a/modules/Platforms/Models/PlatformModel.php +++ b/modules/Platforms/Models/PlatformModel.php @@ -66,7 +66,7 @@ class PlatformModel extends Model } foreach ($platformsData as $slug => $platform) { - if (! in_array($slug, $knownSlugs)) { + if (! in_array($slug, $knownSlugs, true)) { $found[] = new Platform([ 'podcast_id' => $podcastId, 'slug' => $slug, diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index a71334f6..4e2cbe58 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -52,9 +52,9 @@ class PodcastImport extends BaseCommand $importQueue = get_import_tasks(); - $currentImport = current(array_filter($importQueue, static function ($task): bool { - return $task->status === TaskStatus::Running; - })); + $currentImport = current( + array_filter($importQueue, static fn ($task): bool => $task->status === TaskStatus::Running) + ); if ($currentImport instanceof PodcastImportTask) { $currentImport->syncWithProcess(); @@ -68,9 +68,7 @@ class PodcastImport extends BaseCommand } // Get the next queued import - $queuedImports = array_filter($importQueue, static function ($task): bool { - return $task->status === TaskStatus::Queued; - }); + $queuedImports = array_filter($importQueue, static fn ($task): bool => $task->status === TaskStatus::Queued); $nextImport = end($queuedImports); if (! $nextImport instanceof PodcastImportTask) { @@ -527,9 +525,7 @@ class PodcastImport extends BaseCommand ->get() ->getResultArray(); - return array_map(static function (array $element) { - return $element['guid']; - }, $result); + return array_map(static fn (array $element) => $element['guid'], $result); } /** diff --git a/modules/PodcastImport/Helpers/podcast_import_helper.php b/modules/PodcastImport/Helpers/podcast_import_helper.php index cb62928a..29c3acbb 100644 --- a/modules/PodcastImport/Helpers/podcast_import_helper.php +++ b/modules/PodcastImport/Helpers/podcast_import_helper.php @@ -26,11 +26,10 @@ if (! function_exists('get_import_tasks')) { } if ($podcastHandle !== null) { - $podcastImportsQueue = array_filter($podcastImportsQueue, static function ($importTask) use ( - $podcastHandle - ): bool { - return $importTask->handle === $podcastHandle; - }); + $podcastImportsQueue = array_filter( + $podcastImportsQueue, + static fn ($importTask): bool => $importTask->handle === $podcastHandle + ); } usort($podcastImportsQueue, static function (PodcastImportTask $a, PodcastImportTask $b): int { diff --git a/rector.php b/rector.php index 61e827dc..ee49c79a 100644 --- a/rector.php +++ b/rector.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Rector\CodeQuality\Rector\ClassMethod\ExplicitReturnNullRector; use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector; use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; @@ -12,31 +13,22 @@ use Rector\EarlyReturn\Rector\If_\ChangeAndIfToEarlyReturnRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector; use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector; -use Rector\Set\ValueObject\SetList; use Rector\ValueObject\PhpVersion; -return static function (RectorConfig $rectorConfig): void { - $rectorConfig->paths([__DIR__ . '/app', __DIR__ . '/modules', __DIR__ . '/tests', __DIR__ . '/public']); - - // do you need to include constants, class aliases or custom autoloader? files listed will be executed - $rectorConfig->bootstrapFiles([__DIR__ . '/vendor/codeigniter4/framework/system/Test/bootstrap.php']); - - // Define what rule sets will be applied - $rectorConfig->sets([ - SetList::PHP_81, - SetList::TYPE_DECLARATION, - SetList::CODE_QUALITY, - SetList::CODING_STYLE, - SetList::EARLY_RETURN, - SetList::DEAD_CODE, - ]); - - // auto import fully qualified class names - $rectorConfig->importNames(); - - $rectorConfig->phpVersion(PhpVersion::PHP_81); - - $rectorConfig->skip([ +return RectorConfig::configure() + ->withPaths([__DIR__ . '/app', __DIR__ . '/modules', __DIR__ . '/tests', __DIR__ . '/public']) + ->withBootstrapFiles([__DIR__ . '/vendor/codeigniter4/framework/system/Test/bootstrap.php']) + ->withPhpVersion(PhpVersion::PHP_81) + ->withPhpSets(php81: true) + ->withPreparedSets( + typeDeclarations: true, + codeQuality: true, + codingStyle: true, + earlyReturn: true, + deadCode: true, + ) + ->withImportNames(true, true, true, true) + ->withSkip([ // .mp3 files were somehow processed by rector, so skip all media files __DIR__ . '/public/media/*', @@ -50,6 +42,7 @@ return static function (RectorConfig $rectorConfig): void { EncapsedStringsToSprintfRector::class, RemoveExtraParametersRector::class, UnwrapFutureCompatibleIfPhpVersionRector::class, + ExplicitReturnNullRector::class, // skip rule in specific directory StringClassNameToClassConstantRector::class => [ @@ -65,9 +58,5 @@ return static function (RectorConfig $rectorConfig): void { ], ChangeAndIfToEarlyReturnRector::class => [__DIR__ . '/modules/Install/Controllers/InstallController.php'], - ]); - - // Path to phpstan with extensions, that PHPStan in Rector uses to determine types - $rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon'); - $rectorConfig->phpstanConfigs(['vendor/codeigniter/phpstan-codeigniter/extension.neon']); -}; + ]) + ->withPHPStanConfigs([__DIR__ . '/phpstan.neon', 'vendor/codeigniter/phpstan-codeigniter/extension.neon']); diff --git a/spark b/spark index 86ac644f..1bb9ba67 100644 --- a/spark +++ b/spark @@ -1,6 +1,8 @@ #!/usr/bin/env php