diff --git a/app/Config/Routes.php b/app/Config/Routes.php index dbdb709701c76dfb5ee061e737b175cf713c78d3..f87b1d60bb59c34090f9218a96ed4b139aca10b1 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -46,6 +46,13 @@ $routes->group('(:podcastSlug)', function ($routes) { ]); }); +// Route for podcast audio file analytics (/stats/podcast_id/episode_id/podcast_folder/filename.mp3) +$routes->add('/stats/(:num)/(:num)/(:any)', 'Analytics::hit/$1/$2/$3'); + +// Show the Unknown UserAgents +$routes->add('/.well-known/unknown-useragents', 'UnknownUserAgents'); +$routes->add('/.well-known/unknown-useragents/(:num)', 'UnknownUserAgents/$1'); + /** * -------------------------------------------------------------------- * Additional Routing diff --git a/app/Controllers/Analytics.php b/app/Controllers/Analytics.php new file mode 100644 index 0000000000000000000000000000000000000000..76bf580bbdaabe6b3cf31c4279fcf4e41af7f163 --- /dev/null +++ b/app/Controllers/Analytics.php @@ -0,0 +1,113 @@ +<?php namespace App\Controllers; +/** + * Class Analytics + * Creates Analytics controller + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +use CodeIgniter\Controller; + +class Analytics extends Controller +{ + function __construct() + { + $session = \Config\Services::session(); + $session->start(); + $db = \Config\Database::connect(); + $country = 'N/A'; + + // Finds country: + if (!$session->has('country')) { + try { + $reader = new \GeoIp2\Database\Reader( + WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb' + ); + $geoip = $reader->country($_SERVER['REMOTE_ADDR']); + $country = $geoip->country->isoCode; + } catch (\Exception $e) { + // If things go wrong the show must go on and the user must be able to download the file + } + $session->set('country', $country); + } + + // Finds player: + if (!$session->has('player')) { + $playerName = '-unknown-'; + $error = ''; + + try { + $useragent = $_SERVER['HTTP_USER_AGENT']; + $jsonUserAgents = json_decode( + file_get_contents( + WRITEPATH . 'uploads/user-agents/src/user-agents.json' + ), + true + ); + + //Search for current HTTP_USER_AGENT in json file: + foreach ($jsonUserAgents as $player) { + foreach ($player['user_agents'] as $useragentsRegexp) { + //Does the HTTP_USER_AGENT match this regexp: + if (preg_match("#{$useragentsRegexp}#", $useragent)) { + if (isset($player['bot'])) { + //It’s a bot! + $playerName = '-bot-'; + } else { + //It isn’t a bot, we store device/os/app: + $playerName = + (isset($player['device']) + ? $player['device'] . '/' + : '') . + (isset($player['os']) + ? $player['os'] . '/' + : '') . + (isset($player['app']) + ? $player['app'] + : '?'); + } + //We found it! + break 2; + } + } + } + } catch (\Exception $e) { + // If things go wrong the show must go on and the user must be able to download the file + } + if ($playerName == '-unknown-') { + // Add to unknown list + try { + $procedureNameAUU = $db->prefixTable( + 'analytics_unknown_useragents' + ); + $db->query("CALL $procedureNameAUU(?)", [$useragent]); + } catch (\Exception $e) { + // If things go wrong the show must go on and the user must be able to download the file + } + } + $session->set('player', $playerName); + } + } + + // Add one hit to this episode: + public function hit($p_podcast_id, $p_episode_id, ...$filename) + { + $session = \Config\Services::session(); + $db = \Config\Database::connect(); + $procedureName = $db->prefixTable('analytics_podcasts'); + $p_country_code = $session->get('country'); + $p_player = $session->get('player'); + try { + $db->query("CALL $procedureName(?,?,?,?);", [ + $p_podcast_id, + $p_episode_id, + $p_country_code, + $p_player, + ]); + } catch (\Exception $e) { + // If things go wrong the show must go on and the user must be able to download the file + } + return redirect()->to(media_url(implode('/', $filename))); + } +} diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index 22c55eb72eeda6f82bc0d88592f88f274ed7eafa..834792c1b3fd7b2e34e039dbf87b5066efcae2e2 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -44,5 +44,56 @@ class BaseController extends Controller //-------------------------------------------------------------------- // E.g.: // $this->session = \Config\Services::session(); + + $session = \Config\Services::session(); + $session->start(); + + // Defines country + if (!$session->has('country')) { + try { + $reader = new \GeoIp2\Database\Reader( + WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb' + ); + $geoip = $reader->country($_SERVER['REMOTE_ADDR']); + $session->set('country', $geoip->country->isoCode); + } catch (\Exception $e) { + $session->set('country', 'N/A'); + } + } + // Defines browser + if (!$session->has('browser')) { + try { + $whichbrowser = new \WhichBrowser\Parser(getallheaders()); + $session->set('browser', $whichbrowser->browser->name); + } catch (\Exception $e) { + $session->set('browser', 'Other'); + } + } + + // Defines referrer + $newreferer = isset($_SERVER['HTTP_REFERER']) + ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) + : '- Direct -'; + $newreferer = + $newreferer == parse_url(current_url(false), PHP_URL_HOST) + ? '- Direct -' + : $newreferer; + if (!$session->has('referer') or $newreferer != '- Direct -') { + $session->set('referer', $newreferer); + } + } + + protected function stats($postcast_id) + { + $session = \Config\Services::session(); + $session->start(); + $db = \Config\Database::connect(); + $procedureName = $db->prefixTable('analytics_website'); + $db->query("call $procedureName(?,?,?,?)", [ + $postcast_id, + $session->get('country'), + $session->get('browser'), + $session->get('referer'), + ]); } } diff --git a/app/Controllers/Episodes.php b/app/Controllers/Episodes.php index df0d1cb1d97202b2cec41fa57abea7d6328dab24..90b1d5e766bcb037ac5b546ce84af54f33d40c54 100644 --- a/app/Controllers/Episodes.php +++ b/app/Controllers/Episodes.php @@ -125,6 +125,7 @@ class Episodes extends BaseController ->first(), 'episode' => $episode_model->where('slug', $episode_slug)->first(), ]; + self::stats($data['podcast']->id); return view('episodes/view.php', $data); } diff --git a/app/Controllers/Podcasts.php b/app/Controllers/Podcasts.php index e190eb28bce8aa6b900346708c4fe03bc1fc98d3..eb29154ec28852c51719404ff874d089d2e12ddc 100644 --- a/app/Controllers/Podcasts.php +++ b/app/Controllers/Podcasts.php @@ -96,6 +96,7 @@ class Podcasts extends BaseController ->where('podcast_id', $podcast->id) ->findAll(), ]; + self::stats($podcast->id); return view('podcasts/view', $data); } diff --git a/app/Controllers/UnknownUserAgents.php b/app/Controllers/UnknownUserAgents.php new file mode 100644 index 0000000000000000000000000000000000000000..220daf8650c528cf240f61dbba2a3d339066f6a4 --- /dev/null +++ b/app/Controllers/UnknownUserAgents.php @@ -0,0 +1,19 @@ +<?php namespace App\Controllers; +use CodeIgniter\Controller; + +class UnknownUserAgents extends Controller +{ + public function index($p_id = 0) + { + $model = new \App\Models\UnknownUserAgentsModel(); + + $data = [ + 'useragents' => $model->getUserAgents($p_id), + ]; + + $this->response->setContentType('application/json'); + $this->response->setStatusCode(\CodeIgniter\HTTP\Response::HTTP_OK); + + echo view('json/unknownuseragents', $data); + } +} diff --git a/app/Database/Migrations/2020-06-08-160000_add_platformlinks.php b/app/Database/Migrations/2020-06-08-160000_add_platform_links.php similarity index 100% rename from app/Database/Migrations/2020-06-08-160000_add_platformlinks.php rename to app/Database/Migrations/2020-06-08-160000_add_platform_links.php diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php new file mode 100644 index 0000000000000000000000000000000000000000..4c4217696a071c8e49f56fdb7ad35d374a32a62d --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php @@ -0,0 +1,75 @@ +<?php +/** + * Class AddAnalyticsEpisodesByCountry + * Creates analytics_episodes_by_country table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsEpisodesByCountry extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'episode_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The episode ID', + ], + 'country_code' => [ + 'type' => 'VARCHAR', + 'constraint' => 3, + 'comment' => 'ISO 3166-1 code.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey([ + 'podcast_id', + 'episode_id', + 'country_code', + 'date', + ]); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->addForeignKey('episode_id', 'episodes', 'id'); + $this->forge->createTable('analytics_episodes_by_country'); + } + + public function down() + { + $this->forge->dropTable('analytics_episodes_by_country'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php new file mode 100644 index 0000000000000000000000000000000000000000..89cead4509a51ea3cb89346f6d9ec89f0b9b5b43 --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php @@ -0,0 +1,75 @@ +<?php +/** + * Class AddAnalyticsEpisodesByPlayer + * Creates analytics_episodes_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\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsEpisodesByPlayer extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'episode_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The episode ID', + ], + 'player' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + 'comment' => 'Podcast player name.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey([ + 'podcast_id', + 'episode_id', + 'player', + 'date', + ]); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->addForeignKey('episode_id', 'episodes', 'id'); + $this->forge->createTable('analytics_episodes_by_player'); + } + + public function down() + { + $this->forge->dropTable('analytics_episodes_by_player'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php new file mode 100644 index 0000000000000000000000000000000000000000..72cc32b071a63a925857302d18c58396c5862d0c --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php @@ -0,0 +1,63 @@ +<?php +/** + * Class AddAnalyticsPodcastsByCountry + * Creates analytics_podcasts_by_country table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsPodcastsByCountry extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'country_code' => [ + 'type' => 'VARCHAR', + 'constraint' => 3, + 'comment' => 'ISO 3166-1 code.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey(['podcast_id', 'country_code', 'date']); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->createTable('analytics_podcasts_by_country'); + } + + public function down() + { + $this->forge->dropTable('analytics_podcasts_by_country'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php new file mode 100644 index 0000000000000000000000000000000000000000..5cbaca7518cc8fa2d4490872cbd42f967dc2cb6a --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php @@ -0,0 +1,63 @@ +<?php +/** + * Class AddAnalyticsPodcastsByPlayer + * Creates 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\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsPodcastsByPlayer extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'player' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + 'comment' => 'Podcast player name.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey(['podcast_id', 'player', 'date']); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->createTable('analytics_podcasts_by_player'); + } + + public function down() + { + $this->forge->dropTable('analytics_podcasts_by_player'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php new file mode 100644 index 0000000000000000000000000000000000000000..8960323c2366f8ff13057944be9337e04cd08188 --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php @@ -0,0 +1,53 @@ +<?php +/** + * Class AddAnalyticsUnknownUseragents + * Creates analytics_unknown_useragents table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsUnknownUseragents extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'useragent' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + 'unique' => true, + 'comment' => 'The unknown user-agent.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + // `created_at` and `updated_at` are created with SQL because Model class won’t be used for insertion (Stored Procedure will be used instead) + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->createTable('analytics_unknown_useragents'); + } + + public function down() + { + $this->forge->dropTable('analytics_unknown_useragents'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php new file mode 100644 index 0000000000000000000000000000000000000000..7c6763913ae830f5493b3fd26ac1d492f35eb83b --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php @@ -0,0 +1,63 @@ +<?php +/** + * Class AddAnalyticsWebsiteByBrowser + * Creates analytics_website_by_browser table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsWebsiteByBrowser extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'browser' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + 'comment' => 'The Web Browser.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey(['podcast_id', 'browser', 'date']); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->createTable('analytics_website_by_browser'); + } + + public function down() + { + $this->forge->dropTable('analytics_website_by_browser'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php new file mode 100644 index 0000000000000000000000000000000000000000..a531781ea1f34b5482af3d09222b41b9279436be --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php @@ -0,0 +1,63 @@ +<?php +/** + * Class AddAnalyticsWebsiteByCountry + * Creates analytics_website_by_country table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsWebsiteByCountry extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'country_code' => [ + 'type' => 'VARCHAR', + 'constraint' => 3, + 'comment' => 'ISO 3166-1 code.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey(['podcast_id', 'country_code', 'date']); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->createTable('analytics_website_by_country'); + } + + public function down() + { + $this->forge->dropTable('analytics_website_by_country'); + } +} diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php new file mode 100644 index 0000000000000000000000000000000000000000..4c5f27fcfc813c2631582dc27b022f7dbb0176e1 --- /dev/null +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php @@ -0,0 +1,63 @@ +<?php +/** + * Class AddAnalyticsWebsiteByReferer + * Creates analytics_website_by_referer table in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsWebsiteByReferer extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + 'comment' => 'The line ID', + ], + 'podcast_id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'comment' => 'The podcast ID', + ], + 'referer' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + 'comment' => 'Referer URL.', + ], + 'date' => [ + 'type' => 'date', + 'comment' => 'Line date.', + ], + 'hits' => [ + 'type' => 'INT', + 'constraint' => 10, + 'default' => 1, + 'comment' => 'Number of hits.', + ], + ]); + $this->forge->addKey('id', true); + $this->forge->addUniqueKey(['podcast_id', 'referer', 'date']); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + ); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + ); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->createTable('analytics_website_by_referer'); + } + + public function down() + { + $this->forge->dropTable('analytics_website_by_referer'); + } +} diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php new file mode 100644 index 0000000000000000000000000000000000000000..ab327728a5332cbf967eee7526efbfdd76a5263e --- /dev/null +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php @@ -0,0 +1,49 @@ +<?php +/** + * Class AddAnalyticsPodcastsStoredProcedure + * Creates analytics_podcasts stored procedure in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsPodcastsStoredProcedure extends Migration +{ + public function up() + { + // Creates Stored Procedure for data insertion + // Example: CALL analytics_podcasts(1,2,'FR','phone/android/Deezer'); + $procedureName = $this->db->prefixTable('analytics_podcasts'); + $episodesTableName = $this->db->prefixTable('analytics_episodes'); + $createQuery = <<<EOD +CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` BIGINT(20) UNSIGNED, IN `p_episode_id` BIGINT(20) UNSIGNED, IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, IN `p_player` VARCHAR(191) CHARSET utf8mb4) MODIFIES SQL DATA +DETERMINISTIC +SQL SECURITY INVOKER +COMMENT 'Add one hit in podcast logs tables.' +BEGIN +INSERT INTO `{$procedureName}_by_country`(`podcast_id`, `country_code`, `date`) +VALUES (p_podcast_id, p_country_code, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +INSERT INTO `{$procedureName}_by_player`(`podcast_id`, `player`, `date`) +VALUES (p_podcast_id, p_player, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +INSERT INTO `{$episodesTableName}_by_country`(`podcast_id`, `episode_id`, `country_code`, `date`) +VALUES (p_podcast_id, p_episode_id, p_country_code, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +INSERT INTO `{$episodesTableName}_by_player`(`podcast_id`, `episode_id`, `player`, `date`) +VALUES (p_podcast_id, p_episode_id, p_player, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +END +EOD; + $this->db->query($createQuery); + } + + public function down() + { + $procedureName = $this->db->prefixTable('analytics_podcasts'); + $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`"); + } +} diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php new file mode 100644 index 0000000000000000000000000000000000000000..683078b90e376c2a0712d2d5a303168e6e8e965f --- /dev/null +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php @@ -0,0 +1,37 @@ +<?php +/** + * Class AddAnalyticsUnknownUseragentsStoredProcedure + * Creates analytics_unknown_useragents stored procedure in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsUnknownUseragentsStoredProcedure extends Migration +{ + public function up() + { + // Creates Stored Procedure for data insertion + // Example: CALL analytics_unknown_useragents('Podcasts/1430.46 CFNetwork/1125.2 Darwin/19.4.0'); + $procedureName = $this->db->prefixTable('analytics_unknown_useragents'); + $createQuery = <<<EOD +CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4) MODIFIES SQL DATA +DETERMINISTIC +SQL SECURITY INVOKER +COMMENT 'Add an unknown useragent to table $procedureName.' +INSERT INTO `$procedureName`(`useragent`) +VALUES (p_useragent) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1 +EOD; + $this->db->query($createQuery); + } + + public function down() + { + $procedureName = $this->db->prefixTable('analytics_unknown_useragents'); + $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`"); + } +} diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php new file mode 100644 index 0000000000000000000000000000000000000000..e66739cd4998bbdd991c872d830c763e0662ce57 --- /dev/null +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php @@ -0,0 +1,45 @@ +<?php +/** + * Class AddAnalyticsWebsiteStoredProcedure + * Creates analytics_website stored procedure in database + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddAnalyticsWebsiteStoredProcedure extends Migration +{ + public function up() + { + // Creates Stored Procedure for data insertion + // Example: CALL analytics_website(1,'FR','Firefox'); + $procedureName = $this->db->prefixTable('analytics_website'); + $createQuery = <<<EOD +CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` BIGINT(20) UNSIGNED, IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_referer` VARCHAR(191) CHARSET utf8mb4) MODIFIES SQL DATA +DETERMINISTIC +SQL SECURITY INVOKER +COMMENT 'Add one hit in website logs tables.' +BEGIN +INSERT INTO {$procedureName}_by_country(`podcast_id`, `country_code`, `date`) +VALUES (p_podcast_id, p_country_code, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`) +VALUES (p_podcast_id, p_browser, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer`, `date`) +VALUES (p_podcast_id, p_referer, DATE(NOW())) +ON DUPLICATE KEY UPDATE `hits`=`hits`+1; +END +EOD; + $this->db->query($createQuery); + } + + public function down() + { + $procedureName = $this->db->prefixTable('analytics_website'); + $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`"); + } +} diff --git a/app/Entities/AnalyticsEpisodesByCountry.php b/app/Entities/AnalyticsEpisodesByCountry.php new file mode 100644 index 0000000000000000000000000000000000000000..b22542b293a090d4295ffed753ed68c73bee8b1b --- /dev/null +++ b/app/Entities/AnalyticsEpisodesByCountry.php @@ -0,0 +1,22 @@ +<?php +/** + * Class AnalyticsEpisodesByCountry + * Entity for AnalyticsEpisodesByCountry + * @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 AnalyticsEpisodesByCountry extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'episode_id' => 'integer', + 'country_code' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsEpisodesByPlayer.php b/app/Entities/AnalyticsEpisodesByPlayer.php new file mode 100644 index 0000000000000000000000000000000000000000..35a5518215ad26f9bee1f9e5c029185287e94f8e --- /dev/null +++ b/app/Entities/AnalyticsEpisodesByPlayer.php @@ -0,0 +1,22 @@ +<?php +/** + * Class AnalyticsEpisodesByPlayer + * Entity for AnalyticsEpisodesByPlayer + * @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 AnalyticsEpisodesByPlayer extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'episode_id' => 'integer', + 'player' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsPodcastsByCountry.php b/app/Entities/AnalyticsPodcastsByCountry.php new file mode 100644 index 0000000000000000000000000000000000000000..dcdfe0378808adb3163b54dbd4ec9852de081f0e --- /dev/null +++ b/app/Entities/AnalyticsPodcastsByCountry.php @@ -0,0 +1,21 @@ +<?php +/** + * Class AnalyticsPodcastsByCountry + * Entity for AnalyticsPodcastsByCountry + * @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 AnalyticsPodcastsByCountry extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'country_code' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsPodcastsByPlayer.php b/app/Entities/AnalyticsPodcastsByPlayer.php new file mode 100644 index 0000000000000000000000000000000000000000..4b2d52273c40a84a0e13a26a6c712da104836beb --- /dev/null +++ b/app/Entities/AnalyticsPodcastsByPlayer.php @@ -0,0 +1,21 @@ +<?php +/** + * Class AnalyticsPodcastsByPlayer + * Entity for AnalyticsPodcastsByPlayer + * @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 AnalyticsPodcastsByPlayer extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'player' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsUnknownUseragents.php b/app/Entities/AnalyticsUnknownUseragents.php new file mode 100644 index 0000000000000000000000000000000000000000..2aee6c1b1ca41cbfda261fd31d464d5e5f574fc6 --- /dev/null +++ b/app/Entities/AnalyticsUnknownUseragents.php @@ -0,0 +1,19 @@ +<?php +/** + * Class AnalyticsUnknownUseragents + * Entity for AnalyticsUnknownUseragents + * @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 AnalyticsUnknownUseragents extends Entity +{ + protected $casts = [ + 'useragent' => 'integer', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsWebsiteByBrowser.php b/app/Entities/AnalyticsWebsiteByBrowser.php new file mode 100644 index 0000000000000000000000000000000000000000..0ade4dcf34a7f5ce5f83b04ab98a83528f5a915c --- /dev/null +++ b/app/Entities/AnalyticsWebsiteByBrowser.php @@ -0,0 +1,21 @@ +<?php +/** + * Class AnalyticsWebsiteByBrowser + * Entity for AnalyticsWebsiteByBrowser + * @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 AnalyticsWebsiteByBrowser extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'browser' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsWebsiteByCountry.php b/app/Entities/AnalyticsWebsiteByCountry.php new file mode 100644 index 0000000000000000000000000000000000000000..996c61d09bfa1ef49c27b106398f99cf61d93f66 --- /dev/null +++ b/app/Entities/AnalyticsWebsiteByCountry.php @@ -0,0 +1,21 @@ +<?php +/** + * Class AnalyticsWebsiteByCountry + * Entity for AnalyticsWebsiteByCountry + * @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 AnalyticsWebsiteByCountry extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'country_code' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Entities/AnalyticsWebsiteByReferer.php b/app/Entities/AnalyticsWebsiteByReferer.php new file mode 100644 index 0000000000000000000000000000000000000000..0244076cfb1dcd468a19cb0716cb171bae1a145c --- /dev/null +++ b/app/Entities/AnalyticsWebsiteByReferer.php @@ -0,0 +1,21 @@ +<?php +/** + * Class class AnalyticsWebsiteByReferer + * Entity for AnalyticsWebsiteByReferer + * @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 AnalyticsWebsiteByReferer extends Entity +{ + protected $casts = [ + 'podcast_id' => 'integer', + 'referer' => 'string', + 'date' => 'datetime', + 'hits' => 'integer', + ]; +} diff --git a/app/Language/en/Countries.php b/app/Language/en/Countries.php index 1e91d66f60a5e3e08d825d64b8d772ac5b363646..9bd81808bc4328e0c972c86c1d5456f7e8b2491c 100644 --- a/app/Language/en/Countries.php +++ b/app/Language/en/Countries.php @@ -1,7 +1,6 @@ <? /** * ISO 3166 country codes - * @author Benjamin Bellamy <ben@podlibre.org> * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ diff --git a/app/Language/fr/Countries.php b/app/Language/fr/Countries.php index b9cd78e3b1ad9cf72ec52c5aaea405a484e3d376..8b25fff791fe09ea367bfb3160b04e6db00235e4 100644 --- a/app/Language/fr/Countries.php +++ b/app/Language/fr/Countries.php @@ -1,7 +1,6 @@ <? /** * ISO 3166 country codes - * @author Benjamin Bellamy <ben@podlibre.org> * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ diff --git a/app/Models/AnalyticsEpisodesByCountryModel.php b/app/Models/AnalyticsEpisodesByCountryModel.php new file mode 100644 index 0000000000000000000000000000000000000000..c43e3d348f41adfcb1d578ecacd6ce4bbce48221 --- /dev/null +++ b/app/Models/AnalyticsEpisodesByCountryModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsEpisodesByCountry + * Model for analytics_episodes_by_country 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 AnalyticsEpisodesByCountryModel extends Model +{ + protected $table = 'analytics_episodes_by_country'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsEpisodesByCountry'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsEpisodesByPlayerModel.php b/app/Models/AnalyticsEpisodesByPlayerModel.php new file mode 100644 index 0000000000000000000000000000000000000000..21670392f5e23f4ee10899e7706fc22c640aec09 --- /dev/null +++ b/app/Models/AnalyticsEpisodesByPlayerModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsEpisodesByPlayerModel + * Model for analytics_episodes_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 AnalyticsEpisodesByPlayerModel extends Model +{ + protected $table = 'analytics_episodes_by_player'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsEpisodesByPlayer'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsPodcastsByCountryModel.php b/app/Models/AnalyticsPodcastsByCountryModel.php new file mode 100644 index 0000000000000000000000000000000000000000..3fe8f0421b94e9b0aeccec05150a79261d8f2163 --- /dev/null +++ b/app/Models/AnalyticsPodcastsByCountryModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsPodcastsByCountryModel + * Model for analytics_episodes_by_country 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 AnalyticsPodcastsByCountryModel extends Model +{ + protected $table = 'analytics_episodes_by_country'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsPodcastsByCountry'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsPodcastsByPlayerModel.php b/app/Models/AnalyticsPodcastsByPlayerModel.php new file mode 100644 index 0000000000000000000000000000000000000000..cba3075374518dd766bbc0a0c8f6ed5f22202c1d --- /dev/null +++ b/app/Models/AnalyticsPodcastsByPlayerModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsPodcastsByPlayerModel + * 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 AnalyticsPodcastsByPlayerModel extends Model +{ + protected $table = 'analytics_podcasts_by_player'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsPodcastsByPlayer'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsUnknownUseragentsModel.php b/app/Models/AnalyticsUnknownUseragentsModel.php new file mode 100644 index 0000000000000000000000000000000000000000..97514735ad55b9b4a8876d7513e929e4f1539ffd --- /dev/null +++ b/app/Models/AnalyticsUnknownUseragentsModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsUnknownUseragentsModel + * Model for analytics_unknown_useragents 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 AnalyticsUnknownUseragentsModel extends Model +{ + protected $table = 'analytics_unknown_useragents'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsUnknownUseragents'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsWebsiteByBrowserModel.php b/app/Models/AnalyticsWebsiteByBrowserModel.php new file mode 100644 index 0000000000000000000000000000000000000000..e2ac29fb3f8dbae35da8311388cee65eea76eb40 --- /dev/null +++ b/app/Models/AnalyticsWebsiteByBrowserModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsWebsiteByBrowserModel + * Model for analytics_website_by_browser 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 AnalyticsWebsiteByBrowserModel extends Model +{ + protected $table = 'analytics_website_by_browser'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsWebsiteByBrowser'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsWebsiteByCountryModel.php b/app/Models/AnalyticsWebsiteByCountryModel.php new file mode 100644 index 0000000000000000000000000000000000000000..1c9a25f033a2fc8596f6b6ff0fc453f950cddf10 --- /dev/null +++ b/app/Models/AnalyticsWebsiteByCountryModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsWebsiteByCountryModel + * Model for analytics_website_by_country 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 AnalyticsWebsiteByCountryModel extends Model +{ + protected $table = 'analytics_website_by_country'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsWebsiteByCountry'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/AnalyticsWebsiteByRefererModel.php b/app/Models/AnalyticsWebsiteByRefererModel.php new file mode 100644 index 0000000000000000000000000000000000000000..488b0cc9c3740a1056d8a912ac2e2280eb084ff5 --- /dev/null +++ b/app/Models/AnalyticsWebsiteByRefererModel.php @@ -0,0 +1,24 @@ +<?php +/** + * Class AnalyticsWebsiteByRefererModel + * Model for analytics_website_by_referer 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 AnalyticsWebsiteByRefererModel extends Model +{ + protected $table = 'analytics_website_by_referer'; + protected $primaryKey = 'id'; + + protected $allowedFields = []; + + protected $returnType = 'App\Entities\AnalyticsWebsiteByReferer'; + protected $useSoftDeletes = false; + + protected $useTimestamps = false; +} diff --git a/app/Models/UnknownUserAgentsModel.php b/app/Models/UnknownUserAgentsModel.php new file mode 100644 index 0000000000000000000000000000000000000000..ba6e69ef10a807d32b2a2eda6909494a56e545dd --- /dev/null +++ b/app/Models/UnknownUserAgentsModel.php @@ -0,0 +1,23 @@ +<?php +/** + * Class UnknownUserAgentsModel + * Model for analytics_unknown_useragents 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 UnknownUserAgentsModel extends Model +{ + protected $table = 'analytics_unknown_useragents'; + + protected $allowedFields = []; + + public function getUserAgents($p_id = 0) + { + return $this->where('id>', $p_id)->findAll(); + } +} diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php index 6588932ce0b277a117e3b37fdc147c93a109873f..a91a3f6a6575e38a91c40efc8c19177dacdbbdc0 100644 --- a/app/Views/errors/cli/error_exception.php +++ b/app/Views/errors/cli/error_exception.php @@ -1,17 +1,19 @@ An uncaught Exception was encountered -Type: <?= get_class($exception), "\n"; ?> -Message: <?= $message, "\n"; ?> -Filename: <?= $exception->getFile(), "\n"; ?> -Line Number: <?= $exception->getLine(); ?> +Type: <?= get_class($exception), "\n" ?> +Message: <?= $message, "\n" ?> +Filename: <?= $exception->getFile(), "\n" ?> +Line Number: <?= $exception->getLine() ?> -<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true) : ?> +<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true): ?> Backtrace: - <?php foreach ($exception->getTrace() as $error) : ?> - <?php if (isset($error['file'])) : ?> - <?= trim('-' . $error['line'] . ' - ' . $error['file'] . '::' . $error['function']) . "\n" ?> - <?php endif ?> - <?php endforeach ?> + <?php foreach ($exception->getTrace() as $error): ?> + <?php if (isset($error['file'])): ?> + <?= trim( + '-' . $error['line'] . ' - ' . $error['file'] . '::' . $error['function'] + ) . "\n" ?> + <?php endif; ?> + <?php endforeach; ?> -<?php endif ?> \ No newline at end of file +<?php endif; ?> diff --git a/app/Views/errors/html/error_404.php b/app/Views/errors/html/error_404.php index 2bb33f87569f968d954ce8bfb09849c096f855dc..35017d337eb493aefc97eb28a318dfd280887a99 100644 --- a/app/Views/errors/html/error_404.php +++ b/app/Views/errors/html/error_404.php @@ -83,11 +83,11 @@ <h1>404 - File Not Found</h1> <p> - <?php if (!empty($message) && $message !== '(null)') : ?> + <?php if (!empty($message) && $message !== '(null)'): ?> <?= esc($message) ?> - <?php else : ?> + <?php else: ?> Sorry! Cannot seem to find the page you were looking for. - <?php endif ?> + <?php endif; ?> </p> </div> </body> diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php index dd6f6dafa2378461a14ea5ac55b0e26bda944e0e..7eb3736a5004ee4677f01280bf9a04c4ebfd5168 100644 --- a/app/Views/errors/html/error_exception.php +++ b/app/Views/errors/html/error_exception.php @@ -8,7 +8,11 @@ <title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title> <style type="text/css"> - <?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?> + <?= preg_replace( + '#[\r\n\t ]+#', + ' ', + file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css') + ) ?> </style> <script type="text/javascript"> @@ -21,10 +25,15 @@ <!-- Header --> <div class="header"> <div class="container"> - <h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1> + <h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'), + $exception->getCode() ? ' #' . $exception->getCode() : '' ?></h1> <p> <?= $exception->getMessage() ?> - <a href="https://www.google.com/search?q=<?= urlencode($title . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())) ?>" rel="noreferrer" target="_blank">search →</a> + <a href="https://www.google.com/search?q=<?= urlencode( + $title . + ' ' . + preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage()) + ) ?>" rel="noreferrer" target="_blank">search →</a> </p> </div> </div> @@ -33,9 +42,9 @@ <div class="container"> <p><b><?= static::cleanPath($file, $line) ?></b> at line <b><?= $line ?></b></p> - <?php if (is_file($file)) : ?> + <?php if (is_file($file)): ?> <div class="source"> - <?= static::highlightFile($file, $line, 15); ?> + <?= static::highlightFile($file, $line, 15) ?> </div> <?php endif; ?> </div> @@ -58,62 +67,81 @@ <div class="content" id="backtrace"> <ol class="trace"> - <?php foreach ($trace as $index => $row) : ?> + <?php foreach ($trace as $index => $row): ?> <li> <p> <!-- Trace info --> - <?php if (isset($row['file']) && is_file($row['file'])) : ?> - <?php - if (isset($row['function']) && in_array($row['function'], ['include', 'include_once', 'require', 'require_once'])) { - echo $row['function'] . ' ' . static::cleanPath($row['file']); - } else { - echo static::cleanPath($row['file']) . ' : ' . $row['line']; - } - ?> - <?php else : ?> + <?php if (isset($row['file']) && is_file($row['file'])): ?> + <?php if ( + isset($row['function']) && + in_array($row['function'], [ + 'include', + 'include_once', + 'require', + 'require_once', + ]) + ) { + echo $row['function'] . ' ' . static::cleanPath($row['file']); + } else { + echo static::cleanPath($row['file']) . ' : ' . $row['line']; + } ?> + <?php else: ?> {PHP internal code} <?php endif; ?> <!-- Class/Method --> - <?php if (isset($row['class'])) : ?> - — <?= $row['class'] . $row['type'] . $row['function'] ?> - <?php if (!empty($row['args'])) : ?> - <?php $args_id = $error_id . 'args' . $index ?> + <?php if (isset($row['class'])): ?> + — <?= $row['class'] . + $row['type'] . + $row['function'] ?> + <?php if (!empty($row['args'])): ?> + <?php $args_id = $error_id . 'args' . $index; ?> ( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> ) <div class="args" id="<?= $args_id ?>"> <table cellspacing="0"> <?php - $params = null; - // Reflection by name is not available for closure function - if (substr($row['function'], -1) !== '}') { - $mirror = isset($row['class']) ? new \ReflectionMethod($row['class'], $row['function']) : new \ReflectionFunction($row['function']); - $params = $mirror->getParameters(); - } - foreach ($row['args'] as $key => $value) : ?> + $params = null; + // Reflection by name is not available for closure function + if (substr($row['function'], -1) !== '}') { + $mirror = isset($row['class']) + ? new \ReflectionMethod($row['class'], $row['function']) + : new \ReflectionFunction($row['function']); + $params = $mirror->getParameters(); + } + foreach ($row['args'] as $key => $value): ?> <tr> - <td><code><?= htmlspecialchars(isset($params[$key]) ? '$' . $params[$key]->name : "#$key", ENT_SUBSTITUTE, 'UTF-8') ?></code></td> + <td><code><?= htmlspecialchars( + isset($params[$key]) ? '$' . $params[$key]->name : "#$key", + ENT_SUBSTITUTE, + 'UTF-8' + ) ?></code></td> <td> <pre><?= print_r($value, true) ?></pre> </td> </tr> - <?php endforeach ?> + <?php endforeach; + ?> </table> </div> - <?php else : ?> + <?php else: ?> () <?php endif; ?> <?php endif; ?> - <?php if (!isset($row['class']) && isset($row['function'])) : ?> + <?php if (!isset($row['class']) && isset($row['function'])): ?> — <?= $row['function'] ?>() <?php endif; ?> </p> <!-- Source? --> - <?php if (isset($row['file']) && is_file($row['file']) && isset($row['class'])) : ?> + <?php if ( + isset($row['file']) && + is_file($row['file']) && + isset($row['class']) + ): ?> <div class="source"> <?= static::highlightFile($row['file'], $row['line']) ?> </div> @@ -127,10 +155,10 @@ <!-- Server --> <div class="content" id="server"> - <?php foreach (['_SERVER', '_SESSION'] as $var) : ?> + <?php foreach (['_SERVER', '_SESSION'] as $var): ?> <?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) { - continue; - } ?> + continue; + } ?> <h3>$<?= $var ?></h3> @@ -142,13 +170,13 @@ </tr> </thead> <tbody> - <?php foreach ($GLOBALS[$var] as $key => $value) : ?> + <?php foreach ($GLOBALS[$var] as $key => $value): ?> <tr> <td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td> <td> - <?php if (is_string($value)) : ?> + <?php if (is_string($value)): ?> <?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?> - <?php else : ?> + <?php else: ?> <?= '<pre>' . print_r($value, true) ?> <?php endif; ?> </td> @@ -157,11 +185,11 @@ </tbody> </table> - <?php endforeach ?> + <?php endforeach; ?> <!-- Constants --> <?php $constants = get_defined_constants(true); ?> - <?php if (!empty($constants['user'])) : ?> + <?php if (!empty($constants['user'])): ?> <h3>Constants</h3> <table> @@ -172,13 +200,13 @@ </tr> </thead> <tbody> - <?php foreach ($constants['user'] as $key => $value) : ?> + <?php foreach ($constants['user'] as $key => $value): ?> <tr> <td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td> <td> - <?php if (!is_array($value) && !is_object($value)) : ?> + <?php if (!is_array($value) && !is_object($value)): ?> <?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?> - <?php else : ?> + <?php else: ?> <?= '<pre>' . print_r($value, true) ?> <?php endif; ?> </td> @@ -229,10 +257,10 @@ <?php $empty = true; ?> - <?php foreach (['_GET', '_POST', '_COOKIE'] as $var) : ?> + <?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?> <?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) { - continue; - } ?> + continue; + } ?> <?php $empty = false; ?> @@ -246,13 +274,13 @@ </tr> </thead> <tbody> - <?php foreach ($GLOBALS[$var] as $key => $value) : ?> + <?php foreach ($GLOBALS[$var] as $key => $value): ?> <tr> <td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td> <td> - <?php if (!is_array($value) && !is_object($value)) : ?> + <?php if (!is_array($value) && !is_object($value)): ?> <?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?> - <?php else : ?> + <?php else: ?> <?= '<pre>' . print_r($value, true) ?> <?php endif; ?> </td> @@ -261,9 +289,9 @@ </tbody> </table> - <?php endforeach ?> + <?php endforeach; ?> - <?php if ($empty) : ?> + <?php if ($empty): ?> <div class="alert"> No $_GET, $_POST, or $_COOKIE Information to show. @@ -272,7 +300,7 @@ <?php endif; ?> <?php $headers = $request->getHeaders(); ?> - <?php if (!empty($headers)) : ?> + <?php if (!empty($headers)): ?> <h3>Headers</h3> @@ -284,14 +312,14 @@ </tr> </thead> <tbody> - <?php foreach ($headers as $value) : ?> + <?php foreach ($headers as $value): ?> <?php if (empty($value)) { - continue; - } ?> + continue; + } ?> <?php if (!is_array($value)) { - $value = [$value]; - } ?> - <?php foreach ($value as $h) : ?> + $value = [$value]; + } ?> + <?php foreach ($value as $h): ?> <tr> <td><?= esc($h->getName(), 'html') ?></td> <td><?= esc($h->getValueLine(), 'html') ?></td> @@ -306,9 +334,9 @@ <!-- Response --> <?php - $response = \Config\Services::response(); - $response->setStatusCode(http_response_code()); - ?> + $response = \Config\Services::response(); + $response->setStatusCode(http_response_code()); + ?> <div class="content" id="response"> <table> <tr> @@ -318,8 +346,8 @@ </table> <?php $headers = $response->getHeaders(); ?> - <?php if (!empty($headers)) : ?> - <?php natsort($headers) ?> + <?php if (!empty($headers)): ?> + <?php natsort($headers); ?> <h3>Headers</h3> @@ -331,7 +359,7 @@ </tr> </thead> <tbody> - <?php foreach ($headers as $name => $value) : ?> + <?php foreach ($headers as $name => $value): ?> <tr> <td><?= esc($name, 'html') ?></td> <td><?= esc($response->getHeaderLine($name), 'html') ?></td> @@ -348,9 +376,13 @@ <?php $files = get_included_files(); ?> <ol> - <?php foreach ($files as $file) : ?> - <li><?= htmlspecialchars(static::cleanPath($file), ENT_SUBSTITUTE, 'UTF-8') ?></li> - <?php endforeach ?> + <?php foreach ($files as $file): ?> + <li><?= htmlspecialchars( + static::cleanPath($file), + ENT_SUBSTITUTE, + 'UTF-8' + ) ?></li> + <?php endforeach; ?> </ol> </div> diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php index f2cc36b4e5fd3f0056765af9d45b7bcd1c4c0dbe..983f519fa1e4df70363447bdce43a37de3912078 100644 --- a/app/Views/errors/html/production.php +++ b/app/Views/errors/html/production.php @@ -8,7 +8,11 @@ <title>Whoops!</title> <style type="text/css"> - <?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?> + <?= preg_replace( + '#[\r\n\t ]+#', + ' ', + file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css') + ) ?> </style> </head> diff --git a/app/Views/json/unknownuseragents.php b/app/Views/json/unknownuseragents.php new file mode 100644 index 0000000000000000000000000000000000000000..9014c0df08d1a2bc1f03a1b7da2a095d4ac7727d --- /dev/null +++ b/app/Views/json/unknownuseragents.php @@ -0,0 +1,5 @@ +<?php +if (!empty($useragents) && is_array($useragents)) { + echo json_encode($useragents); +} +?> diff --git a/composer.json b/composer.json index fd9651f445a47fcb32c44625d10114f1d5bf0555..15ed68bb9039bab5ed1a527f334638bb89d526ac 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,9 @@ "require": { "php": ">=7.2", "codeigniter4/framework": "^4", - "james-heinrich/getid3": "~2.0.0-dev" + "james-heinrich/getid3": "~2.0.0-dev", + "whichbrowser/parser": "^2.0", + "geoip2/geoip2": "~2.0" }, "require-dev": { "mikey179/vfsstream": "1.6.*", diff --git a/composer.lock b/composer.lock index 58dd0941ace14748da83878867f34ac06011b087..7f2dba26a4a1c04fea92704d3099cbd8785598b3 100644 --- a/composer.lock +++ b/composer.lock @@ -1,1970 +1,2049 @@ { - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "a524161e65f809ee6dcfd5f842f4031c", - "packages": [ - { - "name": "codeigniter4/framework", - "version": "v4.0.3", - "source": { - "type": "git", - "url": "https://github.com/codeigniter4/framework.git", - "reference": "edd88b18483e309bab1411651d846aace255ab36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/edd88b18483e309bab1411651d846aace255ab36", - "reference": "edd88b18483e309bab1411651d846aace255ab36", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "kint-php/kint": "^3.3", - "laminas/laminas-escaper": "^2.6", - "php": ">=7.2", - "psr/log": "^1.1" - }, - "require-dev": { - "codeigniter4/codeigniter4-standard": "^1.0", - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.3" - }, - "type": "project", - "autoload": { - "psr-4": { - "CodeIgniter\\": "system/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The CodeIgniter framework v4", - "homepage": "https://codeigniter.com", - "time": "2020-05-01T05:01:20+00:00" - }, + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "8db0ba517a2c2b9718293a386c05c746", + "packages": [ + { + "name": "codeigniter4/framework", + "version": "v4.0.3", + "source": { + "type": "git", + "url": "https://github.com/codeigniter4/framework.git", + "reference": "edd88b18483e309bab1411651d846aace255ab36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/edd88b18483e309bab1411651d846aace255ab36", + "reference": "edd88b18483e309bab1411651d846aace255ab36", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "kint-php/kint": "^3.3", + "laminas/laminas-escaper": "^2.6", + "php": ">=7.2", + "psr/log": "^1.1" + }, + "require-dev": { + "codeigniter4/codeigniter4-standard": "^1.0", + "mikey179/vfsstream": "1.6.*", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "project", + "autoload": { + "psr-4": { + "CodeIgniter\\": "system/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "description": "The CodeIgniter framework v4", + "homepage": "https://codeigniter.com", + "time": "2020-05-01T05:01:20+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.2.7", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ { - "name": "james-heinrich/getid3", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/JamesHeinrich/getID3.git", - "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/8cf765ec4c42ed732993a9aa60b638ee398df154", - "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "jakub-onderka/php-parallel-lint": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8|^5.0" - }, - "suggest": { - "ext-SimpleXML": "SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).", - "ext-com_dotnet": "COM extension is required when loading files larger than 2GB on Windows.", - "ext-ctype": "ctype extension is required when loading files larger than 2GB on 32-bit PHP (also on 64-bit PHP on Windows) or executing `getid3_lib::CopyTagsToComments`.", - "ext-dba": "DBA extension is required to use the DBA database as a cache storage.", - "ext-exif": "EXIF extension is required for graphic modules.", - "ext-iconv": "iconv extension is required to work with different character sets (when `ext-mbstring` is not available).", - "ext-json": "JSON extension is required to analyze Apple Quicktime videos.", - "ext-libxml": "libxml extension is required to analyze RIFF/WAV/BWF audio files.", - "ext-mbstring": "mbstring extension is required to work with different character sets.", - "ext-mysql": "MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).", - "ext-mysqli": "MySQLi extension is required to use the MySQL database as a cache storage.", - "ext-rar": "RAR extension is required for RAR archive module.", - "ext-sqlite3": "SQLite3 extension is required to use the SQLite3 database as a cache storage.", - "ext-xml": "XML extension is required for graphic modules to analyze the XML metadata.", - "ext-zlib": "Zlib extension is required for archive modules and compressed metadata." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JamesHeinrich\\GetID3\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-1.0-or-later", - "LGPL-3.0-only", - "MPL-2.0" - ], - "authors": [ - { - "name": "James Heinrich", - "email": "info@getid3.org", - "homepage": "https://github.com/JamesHeinrich", - "role": "Developer" - }, - { - "name": "Craig Duncan", - "email": "git@duncanc.co.uk", - "homepage": "https://github.com/duncan3dc", - "role": "Developer" - } - ], - "description": "Extract and write useful information to/from popular multimedia file formats", - "homepage": "https://www.getid3.org/", - "keywords": [ - "audio", - "codecs", - "id3", - "metadata", - "tags", - "video" - ], - "time": "2019-07-22T12:33:16+00:00" - }, + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": ["cabundle", "cacert", "certificate", "ssl", "tls"], + "funding": [ { - "name": "kint-php/kint", - "version": "3.3", - "source": { - "type": "git", - "url": "https://github.com/kint-php/kint.git", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "shasum": "" - }, - "require": { - "php": ">=5.3.6" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "phpunit/phpunit": "^4.0", - "seld/phar-utils": "^1.0", - "symfony/finder": "^2.0 || ^3.0 || ^4.0", - "vimeo/psalm": "^3.0" - }, - "suggest": { - "ext-ctype": "Simple data type tests", - "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", - "ext-mbstring": "Provides string encoding detection", - "kint-php/kint-js": "Provides a simplified dump to console.log()", - "kint-php/kint-twig": "Provides d() and s() functions in twig templates", - "symfony/polyfill-ctype": "Replacement for ext-ctype if missing", - "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", - "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing" - }, - "type": "library", - "autoload": { - "files": [ - "init.php" - ], - "psr-4": { - "Kint\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Vollebregt", - "homepage": "https://github.com/jnvsor" - }, - { - "name": "Rokas Å leinius", - "homepage": "https://github.com/raveren" - }, - { - "name": "Contributors", - "homepage": "https://github.com/kint-php/kint/graphs/contributors" - } - ], - "description": "Kint - debugging tool for PHP developers", - "homepage": "https://kint-php.github.io/kint/", - "keywords": [ - "debug", - "kint", - "php" - ], - "time": "2019-10-17T18:05:24+00:00" + "url": "https://packagist.com", + "type": "custom" }, { - "name": "laminas/laminas-escaper", - "version": "2.6.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" - }, - "replace": { - "zendframework/zend-escaper": "self.version" - }, - "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "homepage": "https://laminas.dev", - "keywords": [ - "escaper", - "laminas" - ], - "time": "2019-12-31T16:43:30+00:00" - }, + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-04-08T08:27:21+00:00" + }, + { + "name": "geoip2/geoip2", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/GeoIP2-php.git", + "reference": "419557cd21d9fe039721a83490701a58c8ce784a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/419557cd21d9fe039721a83490701a58c8ce784a", + "reference": "419557cd21d9fe039721a83490701a58c8ce784a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "maxmind-db/reader": "~1.5", + "maxmind/web-service-common": "~0.6", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.*", + "phpunit/phpunit": "5.*", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "GeoIp2\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["Apache-2.0"], + "authors": [ { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "fcd87520e4943d968557803919523772475e8ea3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3", - "reference": "fcd87520e4943d968557803919523772475e8ea3", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev", - "dev-develop": "1.1.x-dev" - }, - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-05-20T16:45:56+00:00" - }, + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind GeoIP2 PHP API", + "homepage": "https://github.com/maxmind/GeoIP2-php", + "keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"], + "time": "2019-12-12T18:48:39+00:00" + }, + { + "name": "james-heinrich/getid3", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/JamesHeinrich/getID3.git", + "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/8cf765ec4c42ed732993a9aa60b638ee398df154", + "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8|^5.0" + }, + "suggest": { + "ext-SimpleXML": "SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).", + "ext-com_dotnet": "COM extension is required when loading files larger than 2GB on Windows.", + "ext-ctype": "ctype extension is required when loading files larger than 2GB on 32-bit PHP (also on 64-bit PHP on Windows) or executing `getid3_lib::CopyTagsToComments`.", + "ext-dba": "DBA extension is required to use the DBA database as a cache storage.", + "ext-exif": "EXIF extension is required for graphic modules.", + "ext-iconv": "iconv extension is required to work with different character sets (when `ext-mbstring` is not available).", + "ext-json": "JSON extension is required to analyze Apple Quicktime videos.", + "ext-libxml": "libxml extension is required to analyze RIFF/WAV/BWF audio files.", + "ext-mbstring": "mbstring extension is required to work with different character sets.", + "ext-mysql": "MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).", + "ext-mysqli": "MySQLi extension is required to use the MySQL database as a cache storage.", + "ext-rar": "RAR extension is required for RAR archive module.", + "ext-sqlite3": "SQLite3 extension is required to use the SQLite3 database as a cache storage.", + "ext-xml": "XML extension is required for graphic modules to analyze the XML metadata.", + "ext-zlib": "Zlib extension is required for archive modules and compressed metadata." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JamesHeinrich\\GetID3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["GPL-1.0-or-later", "LGPL-3.0-only", "MPL-2.0"], + "authors": [ { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-05-29T17:27:14+00:00" + "name": "James Heinrich", + "email": "info@getid3.org", + "homepage": "https://github.com/JamesHeinrich", + "role": "Developer" }, { - "name": "mikey179/vfsstream", - "version": "v1.6.8", - "source": { - "type": "git", - "url": "https://github.com/bovigo/vfsStream.git", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "org\\bovigo\\vfs\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Frank Kleine", - "homepage": "http://frankkleine.de/", - "role": "Developer" - } - ], - "description": "Virtual file system to mock the real file system in unit tests.", - "homepage": "http://vfs.bovigo.org/", - "time": "2019-10-30T15:31:00+00:00" - }, + "name": "Craig Duncan", + "email": "git@duncanc.co.uk", + "homepage": "https://github.com/duncan3dc", + "role": "Developer" + } + ], + "description": "Extract and write useful information to/from popular multimedia file formats", + "homepage": "https://www.getid3.org/", + "keywords": ["audio", "codecs", "id3", "metadata", "tags", "video"], + "time": "2019-07-22T12:33:16+00:00" + }, + { + "name": "kint-php/kint", + "version": "3.3", + "source": { + "type": "git", + "url": "https://github.com/kint-php/kint.git", + "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", + "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", + "shasum": "" + }, + "require": { + "php": ">=5.3.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "phpunit/phpunit": "^4.0", + "seld/phar-utils": "^1.0", + "symfony/finder": "^2.0 || ^3.0 || ^4.0", + "vimeo/psalm": "^3.0" + }, + "suggest": { + "ext-ctype": "Simple data type tests", + "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", + "ext-mbstring": "Provides string encoding detection", + "kint-php/kint-js": "Provides a simplified dump to console.log()", + "kint-php/kint-twig": "Provides d() and s() functions in twig templates", + "symfony/polyfill-ctype": "Replacement for ext-ctype if missing", + "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", + "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing" + }, + "type": "library", + "autoload": { + "files": ["init.php"], + "psr-4": { + "Kint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ { - "name": "myclabs/deep-copy", - "version": "1.9.5", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2020-01-17T21:11:47+00:00" + "name": "Jonathan Vollebregt", + "homepage": "https://github.com/jnvsor" }, { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" + "name": "Rokas Å leinius", + "homepage": "https://github.com/raveren" }, { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" + "name": "Contributors", + "homepage": "https://github.com/kint-php/kint/graphs/contributors" + } + ], + "description": "Kint - debugging tool for PHP developers", + "homepage": "https://kint-php.github.io/kint/", + "keywords": ["debug", "kint", "php"], + "time": "2019-10-17T18:05:24+00:00" + }, + { + "name": "laminas/laminas-escaper", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-escaper.git", + "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70", + "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^5.6 || ^7.0" + }, + "replace": { + "zendframework/zend-escaper": "self.version" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~1.0.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev", + "dev-develop": "2.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", + "homepage": "https://laminas.dev", + "keywords": ["escaper", "laminas"], + "time": "2019-12-31T16:43:30+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "fcd87520e4943d968557803919523772475e8ea3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3", + "reference": "fcd87520e4943d968557803919523772475e8ea3", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev", + "dev-develop": "1.1.x-dev" }, + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": ["src/autoload.php"], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": ["ZendFramework", "autoloading", "laminas", "zf"], + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-05-20T16:45:56+00:00" + }, + { + "name": "maxmind-db/reader", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", + "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4", + "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "conflict": { + "ext-maxminddb": "<1.6.0,>=2.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.*", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpcov": "^3.0", + "phpunit/phpunit": "5.*", + "squizlabs/php_codesniffer": "3.*" + }, + "suggest": { + "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups" + }, + "type": "library", + "autoload": { + "psr-4": { + "MaxMind\\Db\\": "src/MaxMind/Db" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["Apache-2.0"], + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind DB Reader API", + "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", + "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"], + "time": "2019-12-19T22:59:03+00:00" + }, + { + "name": "maxmind/web-service-common", + "version": "v0.7.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/web-service-common-php.git", + "reference": "74c996c218ada5c639c8c2f076756e059f5552fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc", + "reference": "74c996c218ada5c639c8c2f076756e059f5552fc", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0.3", + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.*", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "MaxMind\\Exception\\": "src/Exception", + "MaxMind\\WebService\\": "src/WebService" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["Apache-2.0"], + "authors": [ + { + "name": "Gregory Oschwald", + "email": "goschwald@maxmind.com" + } + ], + "description": "Internal MaxMind Web Service API", + "homepage": "https://github.com/maxmind/web-service-common-php", + "time": "2020-05-06T14:07:26+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": ["cache", "psr", "psr-6"], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": ["log", "psr", "psr-3"], + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "whichbrowser/parser", + "version": "v2.0.42", + "source": { + "type": "git", + "url": "https://github.com/WhichBrowser/Parser-PHP.git", + "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/4899110cd2f87b01e04ced62dbb9dec541031dee", + "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/cache": "^1.0" + }, + "require-dev": { + "icomefromthenet/reverse-regex": "0.0.6.3", + "phpunit/php-code-coverage": "^2.2 || ^3.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "2.5.*", + "symfony/yaml": "~2.8 || ~3.4 || ~4.2 || ~5.0" + }, + "suggest": { + "cache/array-adapter": "Allows testing of the caching functionality" + }, + "type": "library", + "autoload": { + "psr-4": { + "WhichBrowser\\": ["src/", "tests/src/"] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Niels Leenheer", + "email": "niels@leenheer.nl", + "role": "Developer" + } + ], + "description": "Useragent sniffing library for PHP", + "homepage": "http://whichbrowser.net", + "keywords": ["browser", "sniffing", "ua", "useragent"], + "time": "2020-02-12T10:54:23+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": ["constructor", "instantiate"], + "funding": [ { - "name": "phpdocumentor/reflection-common", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-04-27T09:25:28+00:00" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "shasum": "" - }, - "require": { - "ext-filter": "^7.1", - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/type-resolver": "^1.0", - "webmozart/assert": "^1" - }, - "require-dev": { - "doctrine/instantiator": "^1", - "mockery/mockery": "^1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-02-22T12:28:44+00:00" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", - "shasum": "" - }, - "require": { - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-02-18T18:59:58+00:00" + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" + }, + { + "name": "mikey179/vfsstream", + "version": "v1.6.8", + "source": { + "type": "git", + "url": "https://github.com/bovigo/vfsStream.git", + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "org\\bovigo\\vfs\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Frank Kleine", + "homepage": "http://frankkleine.de/", + "role": "Developer" + } + ], + "description": "Virtual file system to mock the real file system in unit tests.", + "homepage": "http://vfs.bovigo.org/", + "time": "2019-10-30T15:31:00+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" }, + "files": ["src/DeepCopy/deep_copy.php"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "description": "Create deep copies (clones) of your objects", + "keywords": ["clone", "copy", "duplicate", "object", "object graph"], + "time": "2020-01-17T21:11:47+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ { - "name": "phpspec/prophecy", - "version": "v1.10.3", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2020-03-05T15:02:03+00:00" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "phpunit/php-code-coverage", - "version": "7.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2019-11-20T13:55:58+00:00" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-04-27T09:25:28+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "shasum": "" + }, + "require": { + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" + }, + "require-dev": { + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2019-09-17T06:23:10+00:00" + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2020-02-22T12:28:44+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", + "shasum": "" + }, + "require": { + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.2", + "mockery/mockery": "~1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2020-02-18T18:59:58+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" }, { - "name": "phpunit/phpunit", - "version": "8.5.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7", - "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.1", - "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", - "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/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-05-22T13:51:52+00:00" + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": ["Double", "Dummy", "fake", "mock", "spy", "stub"], + "time": "2020-03-05T15:02:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": ["coverage", "testing", "xunit"], + "time": "2019-11-20T13:55:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": ["filesystem", "iterator"], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": ["template"], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": ["timer"], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": ["tokenizer"], + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7", + "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "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", + "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/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "bin": ["phpunit"], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": ["phpunit", "testing", "xunit"], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-05-22T13:51:52+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" + "name": "Volker Dusch", + "email": "github@wallbash.com" }, { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" }, { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": ["comparator", "compare", "equality"], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" }, { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": ["diff", "udiff", "unidiff", "unified diff"], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": ["Xdebug", "environment", "hhvm"], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "sebastian/global-state", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "shasum": "" - }, - "require": { - "php": "^7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2019-02-01T05:30:01+00:00" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "name": "Volker Dusch", + "email": "github@wallbash.com" }, { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "name": "Adam Harvey", + "email": "aharvey@php.net" }, { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": ["export", "exporter"], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/global-state", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "shasum": "" + }, + "require": { + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": ["global state"], + "time": "2019-02-01T05:30:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "sebastian/type", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "time": "2019-07-02T08:10:15+00:00" + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/type", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "time": "2019-07-02T08:10:15+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", + "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" }, + "files": ["bootstrap.php"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:14:59+00:00" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": ["compatibility", "ctype", "polyfill", "portable"], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "theseer/tokenizer", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "webmozart/assert", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2020-04-18T12:12:48+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "james-heinrich/getid3": 20 + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-12T16:14:59+00:00" }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.2" + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["BSD-3-Clause"], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" }, - "platform-dev": [], - "plugin-api-version": "1.1.0" + { + "name": "webmozart/assert", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", + "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": ["assert", "check", "validate"], + "time": "2020-04-18T12:12:48+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "james-heinrich/getid3": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2" + }, + "platform-dev": [], + "plugin-api-version": "1.1.0" }