diff --git a/app/Controllers/Feed.php b/app/Controllers/Feed.php index 5b74f70a867c6714f7fa885215f0df0765935dc4..77bfcbfe9a19cf3e140d787e3b21bbc6b37c8ac0 100644 --- a/app/Controllers/Feed.php +++ b/app/Controllers/Feed.php @@ -23,22 +23,24 @@ class Feed extends Controller throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); } - $service = null; + $serviceSlug = ''; try { $service = \Opawg\UserAgentsPhp\UserAgentsRSS::find( $_SERVER['HTTP_USER_AGENT'] ); + if ($service) { + $serviceSlug = $service['slug']; + } } catch (\Exception $e) { // If things go wrong the show must go on and the user must be able to download the file log_message('critical', $e); } $cacheName = - "podcast{$podcast->id}_feed" . - ($service ? "_{$service['slug']}" : ''); + "podcast{$podcast->id}_feed" . ($service ? "_{$serviceSlug}" : ''); if (!($found = cache($cacheName))) { - $found = get_rss_feed($podcast, $service ? $service['name'] : ''); + $found = get_rss_feed($podcast, $serviceSlug); // The page cache is set to expire after next episode publication or a decade by default so it is deleted manually upon podcast update $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( diff --git a/app/Database/Seeds/FakePodcastsAnalyticsSeeder.php b/app/Database/Seeds/FakePodcastsAnalyticsSeeder.php index 1fc04d7542102442de1c4ea6366a1840e1a32423..4af1128bc66ad9b432ffd33a5a088b2f92e63553 100644 --- a/app/Database/Seeds/FakePodcastsAnalyticsSeeder.php +++ b/app/Database/Seeds/FakePodcastsAnalyticsSeeder.php @@ -78,7 +78,7 @@ class FakePodcastsAnalyticsSeeder extends Seeder $service = $jsonRSSUserAgents[ rand(1, count($jsonRSSUserAgents) - 1) - ]['name']; + ]['slug']; $app = isset($player['app']) ? $player['app'] : ''; $device = isset($player['device']) ? $player['device'] diff --git a/app/Entities/AnalyticsPodcastsByCountry.php b/app/Entities/AnalyticsPodcastsByCountry.php index 229e383a47eda672c3951186b864979558d2a1fd..d8b80de465187f8de80ef96674323f7c134dff36 100644 --- a/app/Entities/AnalyticsPodcastsByCountry.php +++ b/app/Entities/AnalyticsPodcastsByCountry.php @@ -14,6 +14,11 @@ use CodeIgniter\Entity; class AnalyticsPodcastsByCountry extends Entity { + /** + * @var string + */ + protected $labels; + protected $casts = [ 'podcast_id' => 'integer', 'country_code' => 'string', diff --git a/app/Entities/AnalyticsPodcastsByService.php b/app/Entities/AnalyticsPodcastsByService.php new file mode 100644 index 0000000000000000000000000000000000000000..d34d57ac5c6bf2728f4a2a21fd87772620d4ac7b --- /dev/null +++ b/app/Entities/AnalyticsPodcastsByService.php @@ -0,0 +1,38 @@ +<?php + +/** + * Class AnalyticsPodcastsByService + * Entity for AnalyticsPodcastsByService + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Entities; + +use CodeIgniter\Entity; + +class AnalyticsPodcastsByService extends Entity +{ + /** + * @var string + */ + protected $labels; + + protected $casts = [ + 'podcast_id' => 'integer', + 'app' => '?string', + 'device' => '?string', + 'os' => '?string', + 'is_bot' => 'boolean', + 'date' => 'datetime', + 'hits' => 'integer', + ]; + + public function getLabels() + { + return \Opawg\UserAgentsPhp\UserAgentsRSS::getName( + $this->attributes['labels'] + ) ?? $this->attributes['labels']; + } +} diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 8b9f9adc06d9d28ceb91d23d9b67404aee960148..88baff7196466fab4a31c290677d93f5054279e8 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -17,7 +17,7 @@ use Config\Mimes; * @param string $service The name of the service that fetches the RSS feed for future reference when the audio file is eventually downloaded * @return string rss feed as xml */ -function get_rss_feed($podcast, $serviceName = '') +function get_rss_feed($podcast, $serviceSlug = '') { $episodes = $podcast->episodes; @@ -185,7 +185,7 @@ function get_rss_feed($podcast, $serviceName = '') $enclosure->addAttribute( 'url', $episode->enclosure_url . - (empty($serviceName) ? '' : '?_from=' . urlencode($serviceName)) + (empty($serviceSlug) ? '' : '?_from=' . urlencode($serviceSlug)) ); $enclosure->addAttribute('length', $episode->enclosure_filesize); $enclosure->addAttribute('type', $episode->enclosure_mimetype); diff --git a/app/Models/AnalyticsPodcastByPlayerModel.php b/app/Models/AnalyticsPodcastByPlayerModel.php index 0652c8fbd49af66594b8b7d26c2fbb80500d5b30..39359b8ccd7ec53e46e5182dfb4373b8ac46051f 100644 --- a/app/Models/AnalyticsPodcastByPlayerModel.php +++ b/app/Models/AnalyticsPodcastByPlayerModel.php @@ -23,41 +23,6 @@ class AnalyticsPodcastByPlayerModel extends Model protected $useTimestamps = false; - /** - * Gets service data for a podcast - * - * @param int $podcastId - * - * @return array - */ - public function getDataByServiceWeekly(int $podcastId): array - { - if ( - !($found = cache( - "{$podcastId}_analytics_podcasts_by_player_by_service_weekly" - )) - ) { - $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`service` as `labels`') - ->selectSum('`hits`', '`values`') - ->where([ - '`podcast_id`' => $podcastId, - '`service` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneWeekAgo, - ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') - ->findAll(); - cache()->save( - "{$podcastId}_analytics_podcasts_by_player_by_service_weekly", - $found, - 600 - ); - } - return $found; - } - /** * Gets player data for a podcast * diff --git a/app/Models/AnalyticsPodcastByServiceModel.php b/app/Models/AnalyticsPodcastByServiceModel.php new file mode 100644 index 0000000000000000000000000000000000000000..d65531a0539737691041a04bc415b03f26988c1d --- /dev/null +++ b/app/Models/AnalyticsPodcastByServiceModel.php @@ -0,0 +1,60 @@ +<?php + +/** + * Class AnalyticsPodcastByServiceModel + * Model for analytics_podcasts_by_player table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Models; + +use CodeIgniter\Model; + +class AnalyticsPodcastByServiceModel extends Model +{ + protected $table = 'analytics_podcasts_by_player'; + + protected $allowedFields = []; + + protected $returnType = \App\Entities\AnalyticsPodcastsByService::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; + + /** + * Gets service data for a podcast + * + * @param int $podcastId + * + * @return array + */ + public function getDataByServiceWeekly(int $podcastId): array + { + if ( + !($found = cache( + "{$podcastId}_analytics_podcasts_by_service_weekly" + )) + ) { + $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); + $found = $this->select('`service` as `labels`') + ->selectSum('`hits`', '`values`') + ->where([ + '`podcast_id`' => $podcastId, + '`service` !=' => '', + '`is_bot`' => 0, + '`date` >' => $oneWeekAgo, + ]) + ->groupBy('`labels`') + ->orderBy('`values`', 'DESC') + ->findAll(); + cache()->save( + "{$podcastId}_analytics_podcasts_by_service_weekly", + $found, + 600 + ); + } + return $found; + } +} diff --git a/app/Views/admin/podcast/analytics/players.php b/app/Views/admin/podcast/analytics/players.php index b48ae316c7b4df950b4b64667ec7eb7da3e58a66..667918a1784166281dc23ba15ca4065120464fe7 100644 --- a/app/Views/admin/podcast/analytics/players.php +++ b/app/Views/admin/podcast/analytics/players.php @@ -26,7 +26,7 @@ <div class="chart-pie" id="by-service-weekly-pie" data-chart-type="pie-chart" data-chart-url="<?= route_to( 'analytics-data', $podcast->id, - 'PodcastByPlayer', + 'PodcastByService', 'ByServiceWeekly' ) ?>"></div> </div> diff --git a/composer.json b/composer.json index 199509916c7ce73dd3d59a083204aff5e04ef378..903d61955938438a1e4719032f08a477f3c02f64 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,8 @@ "league/commonmark": "^1.5", "vlucas/phpdotenv": "^5.2", "league/html-to-markdown": "^4.10", - "opawg/user-agents-php": "*", - "podlibre/ipcat": "*" + "opawg/user-agents-php": "^1.0", + "podlibre/ipcat": "^1.0" }, "require-dev": { "mikey179/vfsstream": "1.6.*", diff --git a/composer.lock b/composer.lock index b893284509e3b460de07bdd4f3607bdef515d3e5..d8c81dfc4f69a97b9284be4cc0e01ce947462386 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "58e59ff661eaa3553d3f9f9f88b9d274", + "content-hash": "28acb40506572ff4a0b98ad097a14763", "packages": [ { "name": "codeigniter4/codeigniter4", @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/CodeIgniter4.git", - "reference": "58993fbbab54a2523be25e8230337b855f465a7a" + "reference": "b184bb577376f7d31026ebf93c092f768f5fba38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/58993fbbab54a2523be25e8230337b855f465a7a", - "reference": "58993fbbab54a2523be25e8230337b855f465a7a", + "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/b184bb577376f7d31026ebf93c092f768f5fba38", + "reference": "b184bb577376f7d31026ebf93c092f768f5fba38", "shasum": "" }, "require": { @@ -32,14 +32,15 @@ }, "require-dev": { "codeigniter4/codeigniter4-standard": "^1.0", - "fzaninotto/faker": "^1.9@dev", - "mikey179/vfsstream": "1.6.*", + "fakerphp/faker": "^1.9", + "mikey179/vfsstream": "^1.6", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rector/rector": "^0.8", "squizlabs/php_codesniffer": "^3.3" }, + "default-branch": true, "type": "project", "autoload": { "psr-4": { @@ -74,7 +75,7 @@ "slack": "https://codeigniterchat.slack.com", "issues": "https://github.com/codeigniter4/CodeIgniter4/issues" }, - "time": "2020-10-21T16:26:19+00:00" + "time": "2020-11-28T07:23:01+00:00" }, { "name": "composer/ca-bundle", @@ -130,6 +131,11 @@ "ssl", "tls" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.2.8" + }, "funding": [ { "url": "https://packagist.com", @@ -197,6 +203,10 @@ "geolocation", "maxmind" ], + "support": { + "issues": "https://github.com/maxmind/GeoIP2-php/issues", + "source": "https://github.com/maxmind/GeoIP2-php/tree/v2.11.0" + }, "time": "2020-10-01T18:48:34+00:00" }, { @@ -249,6 +259,10 @@ "Result-Type", "result" ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -340,6 +354,10 @@ "tags", "video" ], + "support": { + "issues": "https://github.com/JamesHeinrich/getID3/issues", + "source": "https://github.com/JamesHeinrich/getID3/tree/2.0" + }, "time": "2020-07-21T08:15:44+00:00" }, { @@ -410,40 +428,44 @@ "kint", "php" ], + "support": { + "issues": "https://github.com/kint-php/kint/issues", + "source": "https://github.com/kint-php/kint/tree/master" + }, "time": "2019-10-17T18:05:24+00:00" }, { "name": "laminas/laminas-escaper", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70" + "reference": "5e04bc5ae5990b17159d79d331055e2c645e5cc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/5e04bc5ae5990b17159d79d331055e2c645e5cc5", + "reference": "5e04bc5ae5990b17159d79d331055e2c645e5cc5", "shasum": "" }, "require": { "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" + "php": "^7.3 || ~8.0.0" }, "replace": { - "zendframework/zend-escaper": "self.version" + "zendframework/zend-escaper": "^2.6.1" }, "require-dev": { "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + "phpunit/phpunit": "^9.3", + "psalm/plugin-phpunit": "^0.12.2", + "vimeo/psalm": "^3.16" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } + "suggest": { + "ext-iconv": "*", + "ext-mbstring": "*" }, + "type": "library", "autoload": { "psr-4": { "Laminas\\Escaper\\": "src/" @@ -459,7 +481,21 @@ "escaper", "laminas" ], - "time": "2019-12-31T16:43:30+00:00" + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-escaper/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-escaper/issues", + "rss": "https://github.com/laminas/laminas-escaper/releases.atom", + "source": "https://github.com/laminas/laminas-escaper" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-11-17T21:26:43+00:00" }, { "name": "laminas/laminas-zendframework-bridge", @@ -507,6 +543,12 @@ "laminas", "zf" ], + "support": { + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" + }, "funding": [ { "url": "https://funding.communitybridge.org/projects/laminas-project", @@ -517,16 +559,16 @@ }, { "name": "league/commonmark", - "version": "1.5.6", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "a56e91e0fa1f6d0049153a9c34f63488f6b7ce61" + "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/a56e91e0fa1f6d0049153a9c34f63488f6b7ce61", - "reference": "a56e91e0fa1f6d0049153a9c34f63488f6b7ce61", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/11df9b36fd4f1d2b727a73bf14931d81373b9a54", + "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54", "shasum": "" }, "require": { @@ -582,6 +624,12 @@ "md", "parser" ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, "funding": [ { "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", @@ -608,7 +656,7 @@ "type": "tidelift" } ], - "time": "2020-10-17T21:33:03+00:00" + "time": "2020-10-31T13:49:32+00:00" }, { "name": "league/html-to-markdown", @@ -672,6 +720,10 @@ "html", "markdown" ], + "support": { + "issues": "https://github.com/thephpleague/html-to-markdown/issues", + "source": "https://github.com/thephpleague/html-to-markdown/tree/4.10.0" + }, "funding": [ { "url": "https://www.colinodell.com/sponsor", @@ -750,20 +802,24 @@ "geolocation", "maxmind" ], + "support": { + "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", + "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.8.0" + }, "time": "2020-10-01T17:30:21+00:00" }, { "name": "maxmind/web-service-common", - "version": "v0.8.0", + "version": "v0.8.1", "source": { "type": "git", "url": "https://github.com/maxmind/web-service-common-php.git", - "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7" + "reference": "32f274051c543fc865e5a84d3a2c703913641ea8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/ba67d9532cfaf499bd71774b8170d05df4f75fb7", - "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7", + "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/32f274051c543fc865e5a84d3a2c703913641ea8", + "reference": "32f274051c543fc865e5a84d3a2c703913641ea8", "shasum": "" }, "require": { @@ -796,7 +852,11 @@ ], "description": "Internal MaxMind Web Service API", "homepage": "https://github.com/maxmind/web-service-common-php", - "time": "2020-10-01T15:28:36+00:00" + "support": { + "issues": "https://github.com/maxmind/web-service-common-php/issues", + "source": "https://github.com/maxmind/web-service-common-php/tree/v0.8.1" + }, + "time": "2020-11-02T17:00:53+00:00" }, { "name": "myth/auth", @@ -804,12 +864,12 @@ "source": { "type": "git", "url": "https://github.com/lonnieezell/myth-auth.git", - "reference": "fe9739e1a410d9a30292faee9e8b6369667241e8" + "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/fe9739e1a410d9a30292faee9e8b6369667241e8", - "reference": "fe9739e1a410d9a30292faee9e8b6369667241e8", + "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/26787ff2610089810c2b8e532f426cde1e83ae5e", + "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e", "shasum": "" }, "require": { @@ -824,6 +884,7 @@ "phpunit/phpunit": "^8.5", "squizlabs/php_codesniffer": "^3.5" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -849,6 +910,10 @@ "authorization", "codeigniter" ], + "support": { + "issues": "https://github.com/lonnieezell/myth-auth/issues", + "source": "https://github.com/lonnieezell/myth-auth/tree/develop" + }, "funding": [ { "url": "https://github.com/lonnieezell", @@ -859,20 +924,20 @@ "type": "patreon" } ], - "time": "2020-10-22T03:25:47+00:00" + "time": "2020-11-16T15:37:16+00:00" }, { "name": "opawg/user-agents-php", - "version": "dev-main", + "version": "v1.0", "source": { "type": "git", "url": "https://github.com/opawg/user-agents-php.git", - "reference": "3b71eeed2c3216f1c1c361c62d4d3a7002be0481" + "reference": "e22c7be05f475b44d0e6ecd76acf1617a2efef85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opawg/user-agents-php/zipball/3b71eeed2c3216f1c1c361c62d4d3a7002be0481", - "reference": "3b71eeed2c3216f1c1c361c62d4d3a7002be0481", + "url": "https://api.github.com/repos/opawg/user-agents-php/zipball/e22c7be05f475b44d0e6ecd76acf1617a2efef85", + "reference": "e22c7be05f475b44d0e6ecd76acf1617a2efef85", "shasum": "" }, "type": "library", @@ -894,7 +959,10 @@ ], "description": "PHP implementation for opawg/user-agents.", "homepage": "https://github.com/opawg/user-agents-php", - "time": "2020-10-20T23:22:20+00:00" + "support": { + "source": "https://github.com/opawg/user-agents-php/tree/v1.0" + }, + "time": "2020-11-28T10:54:05+00:00" }, { "name": "phpoption/phpoption", @@ -949,6 +1017,10 @@ "php", "type" ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -963,7 +1035,7 @@ }, { "name": "podlibre/ipcat", - "version": "dev-master", + "version": "v1.0", "source": { "type": "git", "url": "https://github.com/podlibre/ipcat.git", @@ -994,6 +1066,9 @@ ], "description": "Categorization of IP Addresses forked from https://github.com/client9/ipcat", "homepage": "https://github.com/podlibre/ipcat", + "support": { + "source": "https://github.com/podlibre/ipcat/tree/v1.0" + }, "time": "2020-10-05T17:15:07+00:00" }, { @@ -1040,6 +1115,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -1087,24 +1165,27 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, "time": "2020-03-23T09:12:05+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.18.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -1112,7 +1193,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1149,6 +1230,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1163,24 +1247,24 @@ "type": "tidelift" } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.18.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", - "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -1188,7 +1272,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1226,6 +1310,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1240,29 +1327,29 @@ "type": "tidelift" } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.18.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", - "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", "shasum": "" }, "require": { - "php": ">=7.0.8" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-main": "1.20-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1306,6 +1393,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1320,7 +1410,7 @@ "type": "tidelift" } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { "name": "vlucas/phpdotenv", @@ -1386,6 +1476,10 @@ "env", "environment" ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.2.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -1455,42 +1549,41 @@ "ua", "useragent" ], + "support": { + "issues": "https://github.com/WhichBrowser/Parser-PHP/issues", + "source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.0.42" + }, "time": "2020-02-12T10:54:23+00:00" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -1504,7 +1597,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -1513,6 +1606,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -1527,7 +1624,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T17:27:14+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "mikey179/vfsstream", @@ -1573,20 +1670,25 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", + "support": { + "issues": "https://github.com/bovigo/vfsStream/issues", + "source": "https://github.com/bovigo/vfsStream/tree/master", + "wiki": "https://github.com/bovigo/vfsStream/wiki" + }, "time": "2019-10-30T15:31:00+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.1", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "shasum": "" }, "require": { @@ -1621,13 +1723,17 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], - "time": "2020-06-29T13:22:24+00:00" + "time": "2020-11-13T09:40:50+00:00" }, { "name": "phar-io/manifest", @@ -1682,6 +1788,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2018-07-08T19:23:20+00:00" }, { @@ -1729,6 +1839,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, "time": "2018-07-08T19:19:57+00:00" }, { @@ -1778,6 +1892,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -1830,6 +1948,10 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -1875,6 +1997,10 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, "time": "2020-09-17T18:55:26+00:00" }, { @@ -1938,20 +2064,24 @@ "spy", "stub" ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.12.1" + }, "time": "2020-09-29T09:10:42+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "7.0.10", + "version": "7.0.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/52f55786aa2e52c26cd9e2db20aff2981e0f7399", + "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399", "shasum": "" }, "require": { @@ -2001,7 +2131,17 @@ "testing", "xunit" ], - "time": "2019-11-20T13:55:58+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.12" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-27T06:08:35+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2051,6 +2191,10 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.2" + }, "time": "2018-09-13T20:33:42+00:00" }, { @@ -2092,6 +2236,10 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, "time": "2015-06-21T13:50:34+00:00" }, { @@ -2141,6 +2289,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, "time": "2019-06-07T04:22:29+00:00" }, { @@ -2190,44 +2342,48 @@ "keywords": [ "tokenizer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.1" + }, "abandoned": true, "time": "2019-09-17T06:23:10+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.8", + "version": "8.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" + "reference": "3123601e3b29339b20129acc3f989cfec3274566" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3123601e3b29339b20129acc3f989cfec3274566", + "reference": "3123601e3b29339b20129acc3f989cfec3274566", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2.0", + "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.1", + "myclabs/deep-copy": "^1.10.0", "phar-io/manifest": "^1.0.3", "phar-io/version": "^2.0.1", "php": "^7.2", - "phpspec/prophecy": "^1.8.1", - "phpunit/php-code-coverage": "^7.0.7", + "phpspec/prophecy": "^1.10.3", + "phpunit/php-code-coverage": "^7.0.12", "phpunit/php-file-iterator": "^2.0.2", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.1.2", "sebastian/comparator": "^3.0.2", "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.2", - "sebastian/exporter": "^3.1.1", + "sebastian/environment": "^4.2.3", + "sebastian/exporter": "^3.1.2", "sebastian/global-state": "^3.0.0", "sebastian/object-enumerator": "^3.0.3", "sebastian/resource-operations": "^2.0.1", @@ -2274,6 +2430,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.11" + }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -2284,7 +2444,7 @@ "type": "github" } ], - "time": "2020-06-22T07:06:58+00:00" + "time": "2020-11-27T12:46:45+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -2329,6 +2489,10 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master" + }, "time": "2017-03-04T06:30:41+00:00" }, { @@ -2393,6 +2557,10 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/master" + }, "time": "2018-07-12T15:12:46+00:00" }, { @@ -2449,6 +2617,10 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/master" + }, "time": "2019-02-04T06:01:07+00:00" }, { @@ -2502,6 +2674,10 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.3" + }, "time": "2019-11-20T08:46:58+00:00" }, { @@ -2569,6 +2745,10 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/master" + }, "time": "2019-09-14T09:02:43+00:00" }, { @@ -2623,6 +2803,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/master" + }, "time": "2019-02-01T05:30:01+00:00" }, { @@ -2670,6 +2854,10 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" + }, "time": "2017-08-03T12:35:26+00:00" }, { @@ -2715,6 +2903,10 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/master" + }, "time": "2017-03-29T09:07:27+00:00" }, { @@ -2768,6 +2960,10 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + }, "time": "2017-03-03T06:23:57+00:00" }, { @@ -2810,6 +3006,10 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" + }, "time": "2018-10-04T04:07:39+00:00" }, { @@ -2856,6 +3056,10 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/master" + }, "time": "2019-07-02T08:10:15+00:00" }, { @@ -2899,20 +3103,24 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.6", + "version": "3.5.8", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "e97627871a7eab2f70e59166072a6b767d5834e0" + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e97627871a7eab2f70e59166072a6b767d5834e0", - "reference": "e97627871a7eab2f70e59166072a6b767d5834e0", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", "shasum": "" }, "require": { @@ -2950,7 +3158,12 @@ "phpcs", "standards" ], - "time": "2020-08-10T04:50:15+00:00" + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2020-10-23T02:01:07+00:00" }, { "name": "theseer/tokenizer", @@ -2990,6 +3203,10 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, "funding": [ { "url": "https://github.com/theseer", @@ -3045,6 +3262,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozart/assert/issues", + "source": "https://github.com/webmozart/assert/tree/master" + }, "time": "2020-07-08T17:02:28+00:00" } ], @@ -3061,5 +3282,5 @@ "php": ">=7.2" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.0.0" }