diff --git a/app/Console/Commands/Version.php b/app/Console/Commands/Version.php index 37da9033..9902478b 100644 --- a/app/Console/Commands/Version.php +++ b/app/Console/Commands/Version.php @@ -3,6 +3,7 @@ namespace App\Console\Commands; use App\Console\Command; +use App\Services\VersionService; use Symfony\Component\Yaml\Yaml; /** @@ -12,23 +13,12 @@ class Version extends Command { protected $signature = 'phpvms:version {--write} {--base-only}'; - /** - * Create the version number that gets written out - * - * @param mixed $cfg - * - * @return bool|string - */ - protected function createVersionNumber($cfg) + private $versionSvc; + + public function __construct(VersionService $versionSvc) { - exec($cfg['git']['git-local'], $version); - $version = substr($version[0], 0, $cfg['build']['length']); - - // prefix with the date in YYMMDD format - $date = date('ymd'); - $version = $date.'-'.$version; - - return $version; + parent::__construct(); + $this->versionSvc = $versionSvc; } /** @@ -38,27 +28,17 @@ class Version extends Command */ public function handle() { - $version_file = config_path('version.yml'); - $cfg = Yaml::parse(file_get_contents($version_file)); - - // Get the current build id - $build_number = $this->createVersionNumber($cfg); - $cfg['build']['number'] = $build_number; - - $c = $cfg['current']; - $version = "v{$c['major']}.{$c['minor']}.{$c['patch']}-{$build_number}"; - + // Write the updated build number out to the file if ($this->option('write')) { + $version_file = config_path('version.yml'); + $cfg = Yaml::parse(file_get_contents($version_file)); + $build_number = $this->versionSvc->getBuildId($cfg); + $cfg['build']['number'] = $build_number; + file_put_contents($version_file, Yaml::dump($cfg, 4, 2)); } - // Only show the major.minor.patch version - if ($this->option('base-only')) { - $version = 'v'.$cfg['current']['major'].'.' - .$cfg['current']['minor'].'.' - .$cfg['current']['patch']; - } - + $version = $this->versionSvc->getCurrentVersion(!$this->option('base-only')); echo $version."\n"; } } diff --git a/app/Cron/Nightly/NewVersionCheck.php b/app/Cron/Nightly/NewVersionCheck.php new file mode 100644 index 00000000..fb0b205f --- /dev/null +++ b/app/Cron/Nightly/NewVersionCheck.php @@ -0,0 +1,33 @@ +versionSvc = $versionSvc; + } + + /** + * Set any users to being on leave after X days + * + * @param CronNightly $event + */ + public function handle(CronNightly $event): void + { + $this->versionSvc->isNewVersionAvailable(); + } +} diff --git a/app/Database/seeds/settings.yml b/app/Database/seeds/settings.yml index 69304ff3..679d334e 100644 --- a/app/Database/seeds/settings.yml +++ b/app/Database/seeds/settings.yml @@ -12,6 +12,13 @@ options: '' type: text description: 'Email where notices, etc are sent' +- key: general.check_prerelease_version + name: 'Pre-release versions in version check' + group: general + value: false + options: '' + type: boolean + description: 'Include beta and other pre-release versions when checking for a new version' - key: units.distance name: 'Distance Units' group: units diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 52da4884..493c7c55 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; -use App\Facades\Utils; +use App\Repositories\KvpRepository; use App\Repositories\NewsRepository; use App\Repositories\PirepRepository; use App\Repositories\UserRepository; @@ -16,6 +16,7 @@ use vierbergenlars\SemVer\version as semver; class DashboardController extends Controller { + private $kvpRepo; private $newsRepo; private $pirepRepo; private $userRepo; @@ -23,15 +24,18 @@ class DashboardController extends Controller /** * DashboardController constructor. * + * @param KvpRepository $kvpRepo * @param NewsRepository $newsRepo * @param PirepRepository $pirepRepo * @param UserRepository $userRepo */ public function __construct( + KvpRepository $kvpRepo, NewsRepository $newsRepo, PirepRepository $pirepRepo, UserRepository $userRepo ) { + $this->kvpRepo = $kvpRepo; $this->newsRepo = $newsRepo; $this->pirepRepo = $pirepRepo; $this->userRepo = $userRepo; @@ -47,10 +51,8 @@ class DashboardController extends Controller protected function checkNewVersion() { try { - $current_version = new semver(Version::compact()); - $latest_version = new semver(Utils::downloadUrl(config('phpvms.version_file'))); - - if (semver::gt($latest_version, $current_version)) { + if ($this->kvpRepo->get('new_version_available', false) === true) { + $latest_version = $this->kvpRepo->get('latest_version_tag'); Flash::warning('New version '.$latest_version.' is available!'); } } catch (\Exception $e) { diff --git a/app/Providers/CronServiceProvider.php b/app/Providers/CronServiceProvider.php index 28115014..89364e8e 100644 --- a/app/Providers/CronServiceProvider.php +++ b/app/Providers/CronServiceProvider.php @@ -2,7 +2,10 @@ namespace App\Providers; +use App\Cron\Hourly\RemoveExpiredBids; +use App\Cron\Hourly\RemoveExpiredLiveFlights; use App\Cron\Nightly\ApplyExpenses; +use App\Cron\Nightly\NewVersionCheck; use App\Cron\Nightly\PilotLeave; use App\Cron\Nightly\RecalculateBalances; use App\Cron\Nightly\RecalculateStats; @@ -25,6 +28,7 @@ class CronServiceProvider extends ServiceProvider PilotLeave::class, SetActiveFlights::class, RecalculateStats::class, + NewVersionCheck::class, ], CronWeekly::class => [ @@ -35,8 +39,8 @@ class CronServiceProvider extends ServiceProvider ], CronHourly::class => [ - \App\Cron\Hourly\RemoveExpiredBids::class, - \App\Cron\Hourly\RemoveExpiredLiveFlights::class, + RemoveExpiredBids::class, + RemoveExpiredLiveFlights::class, ], ]; } diff --git a/app/Repositories/KvpRepository.php b/app/Repositories/KvpRepository.php new file mode 100644 index 00000000..131849fa --- /dev/null +++ b/app/Repositories/KvpRepository.php @@ -0,0 +1,69 @@ +valueStore = Valuestore::make(config('phpvms.kvp_storage_path')); + } + + /** + * @param $key + * @param null $default + * + * @return array|string|null + */ + public function retrieve($key, $default = null) + { + return $this->get($key, $default); + } + + /** + * Get a value from the KVP store + * + * @param string $key + * @param mixed $default default value to return + * + * @return array|string|null + */ + public function get($key, $default = null) + { + if (!$this->valueStore->has($key)) { + return $default; + } + + return $this->valueStore->get($key); + } + + /** + * @alias store($key,$value) + * + * @param string $key + * @param mixed $value + * + * @return null + */ + public function save($key, $value) + { + return $this->store($key, $value); + } + + /** + * Save a value to the KVP store + * + * @param $key + * @param $value + * + * @return null + */ + public function store($key, $value) + { + return $this->valueStore->put($key, $value); + } +} diff --git a/app/Services/VersionService.php b/app/Services/VersionService.php new file mode 100644 index 00000000..ed63434d --- /dev/null +++ b/app/Services/VersionService.php @@ -0,0 +1,194 @@ +httpClient = $httpClient; + $this->kvpRepo = $kvpRepo; + } + + /** + * Clean the version string (e.,g strip the v in front) + * + * @param string $version + * + * @return string + */ + private function cleanVersionString($version): string + { + if ($version[0] === 'v') { + $version = substr($version, 1); + } + + return $version; + } + + /** + * Set the latest release version/tag into the KVP repo and return the tag + * + * @param $version_tag + * @param $download_url + * + * @return string The version string + */ + private function setLatestRelease($version_tag, $download_url): string + { + $version_tag = $this->cleanVersionString($version_tag); + + $this->kvpRepo->save('latest_version_tag', $version_tag); + $this->kvpRepo->save('latest_version_url', $download_url); + + return $version_tag; + } + + /** + * Find and return the Github asset line + * + * @param $release + * + * @return string + */ + private function getGithubAsset($release): string + { + foreach ($release['assets'] as $asset) { + if ($asset['content_type'] === 'application/gzip') { + return $asset['browser_download_url']; + } + } + + return ''; + } + + /** + * Download the latest version from github + */ + private function getLatestVersionGithub() + { + $releases = []; + + try { + $releases = $this->httpClient->get(config('phpvms.version_file'), [ + 'headers' => [ + 'Accept' => 'application/json', + ], + ]); + } catch (GuzzleException $e) { + Log::error('Error retrieving new version: '.$e->getMessage()); + } + + $include_prerelease = setting('general.check_prerelease_version', false); + foreach ($releases as $release) { + if ($release['prerelease'] === true) { + if ($include_prerelease) { + return $this->setLatestRelease( + $release['tag_name'], + $this->getGithubAsset($release) + ); + } + continue; + } + + return $this->setLatestRelease( + $release['tag_name'], + $this->getGithubAsset($release) + ); + } + + return $releases; + } + + /** + * Downloads the latest version and saves it into the KVP store + */ + public function getLatestVersion() + { + $latest_version = $this->getLatestVersionGithub(); + return $latest_version; + } + + /** + * Get the build ID, which is the date and the git log version + * + * @param array $cfg + * + * @return string + */ + public function getBuildId($cfg) + { + exec($cfg['git']['git-local'], $version); + $version = substr($version[0], 0, $cfg['build']['length']); + + // prefix with the date in YYMMDD format + $date = date('ymd'); + return $date.'.'.$version; + } + + /** + * Get the current version + * + * @param bool $include_build True will include the build ID + * + * @return string + */ + public function getCurrentVersion($include_build = true) + { + $version_file = config_path('version.yml'); + $cfg = Yaml::parse(file_get_contents($version_file)); + + $c = $cfg['current']; + $version = "{$c['major']}.{$c['minor']}.{$c['patch']}"; + + if ($include_build) { + // Get the current build id + $build_number = $this->getBuildId($cfg); + $cfg['build']['number'] = $build_number; + $version = $version.'+'.$build_number; + } + + return $version; + } + + /** + * See if a new version is available. Saves a flag into the KVP store if there is + * + * @param null [$current_version] + * + * @return bool + */ + public function isNewVersionAvailable($current_version = null) + { + if (!$current_version) { + $current_version = $this->getCurrentVersion(false); + } else { + $current_version = $this->cleanVersionString($current_version); + } + + $current_version = Version::fromString($current_version); + $latest_version = Version::fromString($this->getLatestVersion()); + + // Convert to semver + if ($latest_version->isGreaterThan($current_version)) { + $this->kvpRepo->save('new_version_available', true); + return true; + } + + $this->kvpRepo->save('new_version_available', false); + return false; + } +} diff --git a/app/Support/Http.php b/app/Support/Http.php index 571097d6..0cfb6482 100644 --- a/app/Support/Http.php +++ b/app/Support/Http.php @@ -20,7 +20,7 @@ class Http * * @return string */ - public static function get($uri, array $opts) + public static function get($uri, array $opts = []) { $opts = array_merge([ 'connect_timeout' => 2, // wait two seconds by default diff --git a/app/Support/HttpClient.php b/app/Support/HttpClient.php new file mode 100644 index 00000000..cdd94686 --- /dev/null +++ b/app/Support/HttpClient.php @@ -0,0 +1,47 @@ +httpClient = $httpClient; + } + + /** + * Download a URI. If a file is given, it will save the downloaded + * content into that file + * + * @param $uri + * @param array $opts + * + * @throws \GuzzleHttp\Exception\GuzzleException + * + * @return string + */ + public function get($uri, array $opts = []) + { + $opts = array_merge([ + 'connect_timeout' => 2, // wait two seconds by default + ], $opts); + + $response = $this->httpClient->request('GET', $uri, $opts); + + $body = $response->getBody()->getContents(); + $content_type = $response->getHeaderLine('content-type'); + if (strpos($content_type, 'application/json') !== false) { + $body = \GuzzleHttp\json_decode($body, true); + } + + return $body; + } +} diff --git a/composer.json b/composer.json index d8947151..ecd3de9c 100755 --- a/composer.json +++ b/composer.json @@ -13,7 +13,6 @@ "ext-mbstring": "*", "ext-pdo": "*", "composer/composer": "1.8.*", - "composer/semver": "1.4.*", "laravel/framework": "5.8.*", "akaunting/money": "1.0.*", "anhskohbo/no-captcha": "3.0.*", @@ -46,12 +45,13 @@ "prettus/l5-repository": "2.6.*", "santigarcor/laratrust": "5.2.*", "sebastiaanluca/laravel-helpers": "3.*", + "semver/semver": "^1.1", "spatie/laravel-pjax": "1.3.*", + "spatie/valuestore": "^1.2", "symfony/polyfill-iconv": "^1.11", "theiconic/php-ga-measurement-protocol": "2.7.*", "tivie/php-os-detector": "1.1.*", "toin0u/geotools-laravel": "1.0.*", - "vierbergenlars/php-semver": "3.0.*", "waavi/sanitizer": "1.0.*", "webpatser/laravel-uuid": "3.*" }, diff --git a/composer.lock b/composer.lock index c9527081..065ff490 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cba2f67665d4583407a72462dab8bf60", + "content-hash": "da494f087ae565d209fc971170f5a259", "packages": [ { "name": "akaunting/money", @@ -557,25 +557,25 @@ }, { "name": "composer/ca-bundle", - "version": "1.1.4", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d" + "reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d", - "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f26a67e397be0e5c00d7c52ec7b5010098e15ce5", + "reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", - "php": "^5.3.2 || ^7.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", "psr/log": "^1.0", "symfony/process": "^2.5 || ^3.0 || ^4.0" }, @@ -609,7 +609,7 @@ "ssl", "tls" ], - "time": "2019-01-28T09:30:10+00:00" + "time": "2019-08-02T09:05:43+00:00" }, { "name": "composer/composer", @@ -693,16 +693,16 @@ }, { "name": "composer/semver", - "version": "1.4.2", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", - "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", + "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", "shasum": "" }, "require": { @@ -751,20 +751,20 @@ "validation", "versioning" ], - "time": "2016-08-30T16:08:34+00:00" + "time": "2019-03-19T17:25:45+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a1aa51cf3ab838b83b0867b14e56fc20fbd55b3d" + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a1aa51cf3ab838b83b0867b14e56fc20fbd55b3d", - "reference": "a1aa51cf3ab838b83b0867b14e56fc20fbd55b3d", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", "shasum": "" }, "require": { @@ -811,7 +811,7 @@ "spdx", "validator" ], - "time": "2019-03-26T10:23:26+00:00" + "time": "2019-07-29T10:31:59+00:00" }, { "name": "composer/xdebug-handler", @@ -1157,28 +1157,30 @@ }, { "name": "doctrine/lexer", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" + "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", - "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e17f069ede36f7534b95adec71910ed1b49c74ea", + "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.2" }, "require-dev": { - "phpunit/phpunit": "^4.5" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1191,14 +1193,14 @@ "MIT" ], "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" @@ -1213,7 +1215,7 @@ "parser", "php" ], - "time": "2019-06-08T11:03:04+00:00" + "time": "2019-07-30T19:33:28+00:00" }, { "name": "dragonmantank/cron-expression", @@ -1271,16 +1273,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.9", + "version": "2.1.10", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25" + "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/128cc721d771ec2c46ce59698f4ca42b73f71b25", - "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", + "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec", "shasum": "" }, "require": { @@ -1290,7 +1292,8 @@ "require-dev": { "dominicsayers/isemail": "dev-master", "phpunit/phpunit": "^4.8.35||^5.7||^6.0", - "satooshi/php-coveralls": "^1.0.1" + "satooshi/php-coveralls": "^1.0.1", + "symfony/phpunit-bridge": "^4.4@dev" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -1324,7 +1327,7 @@ "validation", "validator" ], - "time": "2019-06-23T10:14:27+00:00" + "time": "2019-07-19T20:52:08+00:00" }, { "name": "elcobvg/laravel-opcache", @@ -2226,16 +2229,16 @@ }, { "name": "laravel/framework", - "version": "v5.8.27", + "version": "v5.8.31", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f1dccffb96f614895393e27e4667105a05407af5" + "reference": "24cc1786bd55876fa52380306354772355345efd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f1dccffb96f614895393e27e4667105a05407af5", - "reference": "f1dccffb96f614895393e27e4667105a05407af5", + "url": "https://api.github.com/repos/laravel/framework/zipball/24cc1786bd55876fa52380306354772355345efd", + "reference": "24cc1786bd55876fa52380306354772355345efd", "shasum": "" }, "require": { @@ -2369,24 +2372,24 @@ "framework", "laravel" ], - "time": "2019-07-02T13:43:47+00:00" + "time": "2019-08-06T15:09:02+00:00" }, { "name": "laravel/helpers", - "version": "v1.0.1", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/laravel/helpers.git", - "reference": "7f47ef43aaa76335d74e604fd2fc57a0e6f5a59f" + "reference": "b8eae9ddd461e89d0296f74fd069c413bf83b6fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/helpers/zipball/7f47ef43aaa76335d74e604fd2fc57a0e6f5a59f", - "reference": "7f47ef43aaa76335d74e604fd2fc57a0e6f5a59f", + "url": "https://api.github.com/repos/laravel/helpers/zipball/b8eae9ddd461e89d0296f74fd069c413bf83b6fa", + "reference": "b8eae9ddd461e89d0296f74fd069c413bf83b6fa", "shasum": "" }, "require": { - "illuminate/support": "~5.8.0|~5.9.0", + "illuminate/support": "~5.8.0|^6.0", "php": ">=7.1.3" }, "require-dev": { @@ -2422,7 +2425,7 @@ "helpers", "laravel" ], - "time": "2019-04-18T21:20:57+00:00" + "time": "2019-07-30T15:25:31+00:00" }, { "name": "laravelcollective/html", @@ -2998,16 +3001,16 @@ }, { "name": "nesbot/carbon", - "version": "2.20.0", + "version": "2.22.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498" + "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bc671b896c276795fad8426b0aa24e8ade0f2498", - "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1a0e48b5f656065ba3c265b058b25d36c2162a5e", + "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e", "shasum": "" }, "require": { @@ -3018,11 +3021,14 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", "kylekatarnls/multi-tester": "^1.1", - "phpmd/phpmd": "^2.6", + "phpmd/phpmd": "dev-php-7.1-compatibility", "phpstan/phpstan": "^0.11", "phpunit/phpunit": "^7.5 || ^8.0", "squizlabs/php_codesniffer": "^3.4" }, + "bin": [ + "bin/carbon" + ], "type": "library", "extra": { "laravel": { @@ -3045,6 +3051,10 @@ "name": "Brian Nesbitt", "email": "brian@nesbot.com", "homepage": "http://nesbot.com" + }, + { + "name": "kylekatarnls", + "homepage": "http://github.com/kylekatarnls" } ], "description": "A simple API extension for DateTime.", @@ -3054,7 +3064,7 @@ "datetime", "time" ], - "time": "2019-06-25T10:00:57+00:00" + "time": "2019-07-28T09:02:12+00:00" }, { "name": "nikic/php-parser", @@ -3179,16 +3189,16 @@ }, { "name": "opis/closure", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "f846725591203098246276b2e7b9e8b7814c4965" + "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/f846725591203098246276b2e7b9e8b7814c4965", - "reference": "f846725591203098246276b2e7b9e8b7814c4965", + "url": "https://api.github.com/repos/opis/closure/zipball/92927e26d7fc3f271efe1f55bdbb073fbb2f0722", + "reference": "92927e26d7fc3f271efe1f55bdbb073fbb2f0722", "shasum": "" }, "require": { @@ -3236,7 +3246,7 @@ "serialization", "serialize" ], - "time": "2019-05-31T20:04:32+00:00" + "time": "2019-07-09T21:58:11+00:00" }, { "name": "paragonie/random_compat", @@ -4397,6 +4407,54 @@ ], "time": "2015-10-13T18:44:15+00:00" }, + { + "name": "semver/semver", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/git-pull-request/php-semver.git", + "reference": "eb7a8fbda082b5c9dcdfc579a1b74c16ea04f7ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/git-pull-request/php-semver/zipball/eb7a8fbda082b5c9dcdfc579a1b74c16ea04f7ce", + "reference": "eb7a8fbda082b5c9dcdfc579a1b74c16ea04f7ce", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.0.x-dev", + "phpmetrics/phpmetrics": "^1.10", + "phpunit/phpunit": "^5.3", + "satooshi/php-coveralls": "^1.0", + "symfony/var-dumper": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "SemVer\\SemVer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Julien Dufresne", + "email": "github@dfrsn.me" + } + ], + "description": "The semver parser for PHP", + "homepage": "http://semver.org", + "abandoned": true, + "time": "2016-05-28T13:26:32+00:00" + }, { "name": "spatie/laravel-pjax", "version": "1.3.2", @@ -4449,6 +4507,59 @@ ], "time": "2018-02-06T13:21:42+00:00" }, + { + "name": "spatie/valuestore", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/valuestore.git", + "reference": "798897f7d571aa0a62786ae531d573d3c6af55d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/valuestore/zipball/798897f7d571aa0a62786ae531d573d3c6af55d0", + "reference": "798897f7d571aa0a62786ae531d573d3c6af55d0", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Valuestore\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Jolita Grazyte", + "email": "jolita@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily store some values", + "homepage": "https://github.com/spatie/valuestore", + "keywords": [ + "json", + "spatie", + "valuestore" + ], + "time": "2019-02-15T10:56:05+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.1", @@ -4513,16 +4624,16 @@ }, { "name": "symfony/console", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39" + "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b592b26a24265a35172d8a2094d8b10f22b7cc39", - "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39", + "url": "https://api.github.com/repos/symfony/console/zipball/8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", + "reference": "8b0ae5742ce9aaa8b0075665862c1ca397d1c1d9", "shasum": "" }, "require": { @@ -4584,11 +4695,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-06-13T11:03:18+00:00" + "time": "2019-07-24T17:13:59+00:00" }, { "name": "symfony/css-selector", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -4622,14 +4733,14 @@ "MIT" ], "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -4641,16 +4752,16 @@ }, { "name": "symfony/debug", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "d8f4fb38152e0eb6a433705e5f661d25b32c5fcd" + "reference": "527887c3858a2462b0137662c74837288b998ee3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/d8f4fb38152e0eb6a433705e5f661d25b32c5fcd", - "reference": "d8f4fb38152e0eb6a433705e5f661d25b32c5fcd", + "url": "https://api.github.com/repos/symfony/debug/zipball/527887c3858a2462b0137662c74837288b998ee3", + "reference": "527887c3858a2462b0137662c74837288b998ee3", "shasum": "" }, "require": { @@ -4693,11 +4804,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2019-06-19T15:27:09+00:00" + "time": "2019-07-23T11:21:36+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", @@ -4758,16 +4869,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d257021c1ab28d48d24a16de79dfab445ce93398" + "reference": "212b020949331b6531250584531363844b34a94e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d257021c1ab28d48d24a16de79dfab445ce93398", - "reference": "d257021c1ab28d48d24a16de79dfab445ce93398", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/212b020949331b6531250584531363844b34a94e", + "reference": "212b020949331b6531250584531363844b34a94e", "shasum": "" }, "require": { @@ -4824,7 +4935,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-06-13T11:03:18+00:00" + "time": "2019-06-27T06:42:14+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4886,7 +4997,7 @@ }, { "name": "symfony/filesystem", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -4936,16 +5047,16 @@ }, { "name": "symfony/finder", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a" + "reference": "9638d41e3729459860bb96f6247ccb61faaa45f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a", - "reference": "33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a", + "url": "https://api.github.com/repos/symfony/finder/zipball/9638d41e3729459860bb96f6247ccb61faaa45f2", + "reference": "9638d41e3729459860bb96f6247ccb61faaa45f2", "shasum": "" }, "require": { @@ -4981,20 +5092,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-06-13T11:03:18+00:00" + "time": "2019-06-28T13:16:30+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d" + "reference": "8b778ee0c27731105fbf1535f51793ad1ae0ba2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e1b507fcfa4e87d192281774b5ecd4265370180d", - "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8b778ee0c27731105fbf1535f51793ad1ae0ba2b", + "reference": "8b778ee0c27731105fbf1535f51793ad1ae0ba2b", "shasum": "" }, "require": { @@ -5036,20 +5147,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-06-26T09:25:00+00:00" + "time": "2019-07-23T11:21:36+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "4150f71e27ed37a74700561b77e3dbd754cbb44d" + "reference": "a414548d236ddd8fa3df52367d583e82339c5e95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4150f71e27ed37a74700561b77e3dbd754cbb44d", - "reference": "4150f71e27ed37a74700561b77e3dbd754cbb44d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a414548d236ddd8fa3df52367d583e82339c5e95", + "reference": "a414548d236ddd8fa3df52367d583e82339c5e95", "shasum": "" }, "require": { @@ -5128,20 +5239,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2019-06-26T14:26:16+00:00" + "time": "2019-07-28T07:10:23+00:00" }, { "name": "symfony/inflector", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "889dc28cb6350ddb302fe9b8c796e4e6eb836856" + "reference": "782e3959ea1fc95923624d6173eaf941ce3029b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/889dc28cb6350ddb302fe9b8c796e4e6eb836856", - "reference": "889dc28cb6350ddb302fe9b8c796e4e6eb836856", + "url": "https://api.github.com/repos/symfony/inflector/zipball/782e3959ea1fc95923624d6173eaf941ce3029b0", + "reference": "782e3959ea1fc95923624d6173eaf941ce3029b0", "shasum": "" }, "require": { @@ -5186,20 +5297,20 @@ "symfony", "words" ], - "time": "2019-05-30T09:28:08+00:00" + "time": "2019-07-25T10:54:24+00:00" }, { "name": "symfony/mime", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b" + "reference": "6b7148029b1dd5eda1502064f06d01357b7b2d8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ec2c5565de60e03f33d4296a655e3273f0ad1f8b", - "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b", + "url": "https://api.github.com/repos/symfony/mime/zipball/6b7148029b1dd5eda1502064f06d01357b7b2d8b", + "reference": "6b7148029b1dd5eda1502064f06d01357b7b2d8b", "shasum": "" }, "require": { @@ -5245,20 +5356,20 @@ "mime", "mime-type" ], - "time": "2019-06-04T09:22:54+00:00" + "time": "2019-07-19T16:21:19+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" + "reference": "550ebaac289296ce228a706d0867afc34687e3f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", + "reference": "550ebaac289296ce228a706d0867afc34687e3f4", "shasum": "" }, "require": { @@ -5270,7 +5381,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5287,12 +5398,12 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { - "name": "Gert de Pagter", - "email": "backendtea@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -5303,20 +5414,20 @@ "polyfill", "portable" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7" + "reference": "685968b11e61a347c18bf25db32effa478be610f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", - "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/685968b11e61a347c18bf25db32effa478be610f", + "reference": "685968b11e61a347c18bf25db32effa478be610f", "shasum": "" }, "require": { @@ -5328,7 +5439,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5362,20 +5473,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af" + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af", - "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", "shasum": "" }, "require": { @@ -5389,7 +5500,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5405,13 +5516,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Laurent Bassin", "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", @@ -5424,20 +5535,20 @@ "portable", "shim" ], - "time": "2019-03-04T13:44:35+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", "shasum": "" }, "require": { @@ -5449,7 +5560,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5483,20 +5594,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" + "reference": "04ce3335667451138df4307d6a9b61565560199e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", - "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", + "reference": "04ce3335667451138df4307d6a9b61565560199e", "shasum": "" }, "require": { @@ -5505,7 +5616,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5538,20 +5649,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd" + "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", - "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/2ceb49eaccb9352bff54d22570276bb75ba4a188", + "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188", "shasum": "" }, "require": { @@ -5560,7 +5671,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -5596,11 +5707,11 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/process", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", @@ -5649,16 +5760,16 @@ }, { "name": "symfony/property-access", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "18ea48862a39e364927e71b9e4942af3c1a1cb8c" + "reference": "42f3a6ddcb794c303d8fdbc33faf3f09cfefee62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/18ea48862a39e364927e71b9e4942af3c1a1cb8c", - "reference": "18ea48862a39e364927e71b9e4942af3c1a1cb8c", + "url": "https://api.github.com/repos/symfony/property-access/zipball/42f3a6ddcb794c303d8fdbc33faf3f09cfefee62", + "reference": "42f3a6ddcb794c303d8fdbc33faf3f09cfefee62", "shasum": "" }, "require": { @@ -5712,20 +5823,20 @@ "property path", "reflection" ], - "time": "2019-06-06T10:05:02+00:00" + "time": "2019-07-24T14:47:54+00:00" }, { "name": "symfony/routing", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "2ef809021d72071c611b218c47a3bf3b17b7325e" + "reference": "a88c47a5861549f5dc1197660818084c3b67d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/2ef809021d72071c611b218c47a3bf3b17b7325e", - "reference": "2ef809021d72071c611b218c47a3bf3b17b7325e", + "url": "https://api.github.com/repos/symfony/routing/zipball/a88c47a5861549f5dc1197660818084c3b67d773", + "reference": "a88c47a5861549f5dc1197660818084c3b67d773", "shasum": "" }, "require": { @@ -5788,20 +5899,20 @@ "uri", "url" ], - "time": "2019-06-26T13:54:39+00:00" + "time": "2019-07-23T14:43:56+00:00" }, { "name": "symfony/serializer", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "bbf3b52653dae353259c1761cbb6f8f056dff03e" + "reference": "ff127edf8c015d3a3922b0dd56ffa2c2508a7fda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/bbf3b52653dae353259c1761cbb6f8f056dff03e", - "reference": "bbf3b52653dae353259c1761cbb6f8f056dff03e", + "url": "https://api.github.com/repos/symfony/serializer/zipball/ff127edf8c015d3a3922b0dd56ffa2c2508a7fda", + "reference": "ff127edf8c015d3a3922b0dd56ffa2c2508a7fda", "shasum": "" }, "require": { @@ -5868,7 +5979,7 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2019-06-17T17:37:00+00:00" + "time": "2019-07-23T14:59:17+00:00" }, { "name": "symfony/service-contracts", @@ -5930,16 +6041,16 @@ }, { "name": "symfony/translation", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0" + "reference": "4e3e39cc485304f807622bdc64938e4633396406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/934ab1d18545149e012aa898cf02e9f23790f7a0", - "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0", + "url": "https://api.github.com/repos/symfony/translation/zipball/4e3e39cc485304f807622bdc64938e4633396406", + "reference": "4e3e39cc485304f807622bdc64938e4633396406", "shasum": "" }, "require": { @@ -6002,7 +6113,7 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2019-06-13T11:03:18+00:00" + "time": "2019-07-18T10:34:59+00:00" }, { "name": "symfony/translation-contracts", @@ -6063,16 +6174,16 @@ }, { "name": "symfony/var-dumper", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "45d6ef73671995aca565a1aa3d9a432a3ea63f91" + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/45d6ef73671995aca565a1aa3d9a432a3ea63f91", - "reference": "45d6ef73671995aca565a1aa3d9a432a3ea63f91", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e4110b992d2cbe198d7d3b244d079c1c58761d07", + "reference": "e4110b992d2cbe198d7d3b244d079c1c58761d07", "shasum": "" }, "require": { @@ -6135,20 +6246,20 @@ "debug", "dump" ], - "time": "2019-06-17T17:37:00+00:00" + "time": "2019-07-27T06:42:46+00:00" }, { "name": "symfony/yaml", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99" + "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c60ecf5ba842324433b46f58dc7afc4487dbab99", - "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99", + "url": "https://api.github.com/repos/symfony/yaml/zipball/34d29c2acd1ad65688f58452fd48a46bd996d5a6", + "reference": "34d29c2acd1ad65688f58452fd48a46bd996d5a6", "shasum": "" }, "require": { @@ -6194,7 +6305,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-04-06T14:04:46+00:00" + "time": "2019-07-24T14:47:54+00:00" }, { "name": "theiconic/php-ga-measurement-protocol", @@ -6394,58 +6505,6 @@ ], "time": "2015-02-23T12:40:40+00:00" }, - { - "name": "vierbergenlars/php-semver", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/vierbergenlars/php-semver.git", - "reference": "be22b86be4c1133acc42fd1685276792024af5f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vierbergenlars/php-semver/zipball/be22b86be4c1133acc42fd1685276792024af5f9", - "reference": "be22b86be4c1133acc42fd1685276792024af5f9", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4" - }, - "bin": [ - "bin/semver", - "bin/update-versions" - ], - "type": "library", - "autoload": { - "psr-0": { - "vierbergenlars\\SemVer\\": "src/", - "vierbergenlars\\LibJs\\": "src/" - }, - "classmap": [ - "src/vierbergenlars/SemVer/internal.php" - ] - }, - "notification-url": "http://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Vierbergen", - "email": "vierbergenlars@gmail.com" - } - ], - "description": "The Semantic Versioner for PHP", - "keywords": [ - "semantic", - "semver", - "versioning" - ], - "time": "2017-07-11T09:53:59+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v3.4.0", @@ -8236,16 +8295,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "3.0.2", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "c4a66b97f040e3e20b3aa2a243230a1c3a9f7c8c" + "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c4a66b97f040e3e20b3aa2a243230a1c3a9f7c8c", - "reference": "c4a66b97f040e3e20b3aa2a243230a1c3a9f7c8c", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e899757bb3df5ff6e95089132f32cd59aac2220a", + "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a", "shasum": "" }, "require": { @@ -8258,7 +8317,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -8281,20 +8340,20 @@ "keywords": [ "tokenizer" ], - "time": "2019-07-08T05:24:54+00:00" + "time": "2019-07-25T05:29:42+00:00" }, { "name": "phpunit/phpunit", - "version": "7.5.13", + "version": "7.5.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b9278591caa8630127f96c63b598712b699e671c" + "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b9278591caa8630127f96c63b598712b699e671c", - "reference": "b9278591caa8630127f96c63b598712b699e671c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2834789aeb9ac182ad69bfdf9ae91856a59945ff", + "reference": "2834789aeb9ac182ad69bfdf9ae91856a59945ff", "shasum": "" }, "require": { @@ -8354,8 +8413,8 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "role": "lead", + "email": "sebastian@phpunit.de" } ], "description": "The PHP Unit Testing framework.", @@ -8365,7 +8424,7 @@ "testing", "xunit" ], - "time": "2019-06-19T12:01:51+00:00" + "time": "2019-07-15T06:24:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -8986,7 +9045,7 @@ }, { "name": "symfony/options-resolver", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", @@ -9040,16 +9099,16 @@ }, { "name": "symfony/polyfill-php70", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "bc4858fb611bda58719124ca079baff854149c89" + "reference": "54b4c428a0054e254223797d2713c31e08610831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89", - "reference": "bc4858fb611bda58719124ca079baff854149c89", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/54b4c428a0054e254223797d2713c31e08610831", + "reference": "54b4c428a0054e254223797d2713c31e08610831", "shasum": "" }, "require": { @@ -9059,7 +9118,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -9095,11 +9154,11 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.3.2", + "version": "v4.3.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", diff --git a/config/phpvms.php b/config/phpvms.php index 5f27bb90..3908e27e 100644 --- a/config/phpvms.php +++ b/config/phpvms.php @@ -57,7 +57,12 @@ return [ /* * URL to the latest version file */ - 'version_file' => 'http://downloads.phpvms.net/VERSION', + 'version_file' => 'https://api.github.com/repos/nabeelio/phpvms/releases', + + /* + * Where the KVP file is stored + */ + 'kvp_storage_path' => storage_path('app/kvp.json'), /* * DO NOT CHANGE THESE! It will result in messed up data diff --git a/config/version.yml b/config/version.yml index a1f549c2..b83667f5 100644 --- a/config/version.yml +++ b/config/version.yml @@ -27,4 +27,4 @@ format: build: '{$build}' version: '{$major}.{$minor}.{$patch} (build {$build})' full: 'version {{''format.version''}}' - compact: 'v{$major}.{$minor}.{$patch}-{$build}' + compact: 'v{$major}.{$minor}.{$patch}+{$build}' diff --git a/tests/TestCase.php b/tests/TestCase.php index f5c98b8d..81efbff6 100755 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,6 +1,11 @@ 'application/json; charset=utf-8', + ], + $this->readDataFile($mockFile) + ), + ]); + + $handler = HandlerStack::create($mock); + $guzzleClient = new Client(['handler' => $handler]); + app()->instance(Client::class, $guzzleClient); + } + + /** + * Update a setting + * + * @param $key + * @param $value + */ + public function updateSetting($key, $value) + { + $settingsRepo = app(SettingRepository::class); + $settingsRepo->store($key, $value); + } + /** * So we can test private/protected methods * http://bit.ly/1mr5hMq diff --git a/tests/VersionTest.php b/tests/VersionTest.php new file mode 100644 index 00000000..32298129 --- /dev/null +++ b/tests/VersionTest.php @@ -0,0 +1,78 @@ +kvpRepo = app(KvpRepository::class); + } + + public function testGetLatestVersion() + { + setting('general.check_prerelease_version', false); + + $this->mockGuzzleClient('releases.json'); + $versionSvc = app(VersionService::class); + + $str = $versionSvc->getLatestVersion(); + + $this->assertEquals('7.0.0-alpha2', $str); + $this->assertEquals('7.0.0-alpha2', $this->kvpRepo->get('latest_version_tag')); + } + + public function testGetLatestPrereleaseVersion() + { + $this->updateSetting('general.check_prerelease_version', true); + + $this->mockGuzzleClient('releases.json'); + $versionSvc = app(VersionService::class); + + $str = $versionSvc->getLatestVersion(); + + $this->assertEquals('7.0.0-beta', $str); + $this->assertEquals('7.0.0-beta', $this->kvpRepo->get('latest_version_tag')); + } + + public function testNewVersionNotAvailable() + { + $this->updateSetting('general.check_prerelease_version', false); + + $versions = [ + 'v7.0.0', + '7.0.0', + '8.0.0', + '7.0.0-beta', + '7.0.0+buildid', + ]; + + foreach ($versions as $v) { + $this->mockGuzzleClient('releases.json'); + $versionSvc = app(VersionService::class); + $this->assertFalse($versionSvc->isNewVersionAvailable($v)); + } + } + + public function testNewVersionIsAvailable() + { + $this->updateSetting('general.check_prerelease_version', true); + + $versions = [ + 'v6.0.1', + '6.0.0', + '7.0.0-alpha', + ]; + + foreach ($versions as $v) { + $this->mockGuzzleClient('releases.json'); + $versionSvc = app(VersionService::class); + $this->assertTrue($versionSvc->isNewVersionAvailable($v)); + } + } +} diff --git a/tests/data/releases.json b/tests/data/releases.json new file mode 100644 index 00000000..8b5d9e0a --- /dev/null +++ b/tests/data/releases.json @@ -0,0 +1,360 @@ +[ + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/13667336", + "assets_url": "https://api.github.com/repos/nabeelio/phpvms/releases/13667336/assets", + "upload_url": "https://uploads.github.com/repos/nabeelio/phpvms/releases/13667336/assets{?name,label}", + "html_url": "https://github.com/nabeelio/phpvms/releases/tag/v7.0.0-beta", + "id": 13667336, + "node_id": "MDc6UmVsZWFzZTEzNjY3MzM2", + "tag_name": "v7.0.0-beta", + "target_commitish": "master", + "name": "", + "draft": false, + "author": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "prerelease": true, + "created_at": "2018-10-25T23:12:08Z", + "published_at": "2018-10-25T23:21:26Z", + "assets": [ + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/9415556", + "id": 9415556, + "node_id": "MDEyOlJlbGVhc2VBc3NldDk0MTU1NTY=", + "name": "phpvms-v7.0.0-beta.tar.gz", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 15567950, + "download_count": 1503, + "created_at": "2018-10-25T23:21:25Z", + "updated_at": "2018-10-25T23:21:26Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-beta/phpvms-v7.0.0-beta.tar.gz" + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/9415555", + "id": 9415555, + "node_id": "MDEyOlJlbGVhc2VBc3NldDk0MTU1NTU=", + "name": "phpvms-v7.0.0-beta.tar.gz.sha256", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 92, + "download_count": 174, + "created_at": "2018-10-25T23:21:24Z", + "updated_at": "2018-10-25T23:21:24Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-beta/phpvms-v7.0.0-beta.tar.gz.sha256" + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/9415554", + "id": 9415554, + "node_id": "MDEyOlJlbGVhc2VBc3NldDk0MTU1NTQ=", + "name": "release_version", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 21, + "download_count": 630, + "created_at": "2018-10-25T23:21:23Z", + "updated_at": "2018-10-25T23:21:23Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-beta/release_version" + } + ], + "tarball_url": "https://api.github.com/repos/nabeelio/phpvms/tarball/v7.0.0-beta", + "zipball_url": "https://api.github.com/repos/nabeelio/phpvms/zipball/v7.0.0-beta", + "body": "" + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/9810818", + "assets_url": "https://api.github.com/repos/nabeelio/phpvms/releases/9810818/assets", + "upload_url": "https://uploads.github.com/repos/nabeelio/phpvms/releases/9810818/assets{?name,label}", + "html_url": "https://github.com/nabeelio/phpvms/releases/tag/v7.0.0-alpha2", + "id": 9810818, + "node_id": "MDc6UmVsZWFzZTk4MTA4MTg=", + "tag_name": "v7.0.0-alpha2", + "target_commitish": "master", + "name": null, + "draft": false, + "author": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "prerelease": false, + "created_at": "2018-02-23T17:48:28Z", + "published_at": "2018-02-23T17:57:13Z", + "assets": [ + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/6307893", + "id": 6307893, + "node_id": "MDEyOlJlbGVhc2VBc3NldDYzMDc4OTM=", + "name": "phpvms-v7.0.0-alpha2.tar.gz", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 13122744, + "download_count": 1522, + "created_at": "2018-02-23T17:57:12Z", + "updated_at": "2018-02-23T17:57:13Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-alpha2/phpvms-v7.0.0-alpha2.tar.gz" + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/6307896", + "id": 6307896, + "node_id": "MDEyOlJlbGVhc2VBc3NldDYzMDc4OTY=", + "name": "phpvms-v7.0.0-alpha2.tar.gz.sha256", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 94, + "download_count": 209, + "created_at": "2018-02-23T17:57:13Z", + "updated_at": "2018-02-23T17:57:13Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-alpha2/phpvms-v7.0.0-alpha2.tar.gz.sha256" + } + ], + "tarball_url": "https://api.github.com/repos/nabeelio/phpvms/tarball/v7.0.0-alpha2", + "zipball_url": "https://api.github.com/repos/nabeelio/phpvms/zipball/v7.0.0-alpha2", + "body": null + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/9526184", + "assets_url": "https://api.github.com/repos/nabeelio/phpvms/releases/9526184/assets", + "upload_url": "https://uploads.github.com/repos/nabeelio/phpvms/releases/9526184/assets{?name,label}", + "html_url": "https://github.com/nabeelio/phpvms/releases/tag/v7.0.0-alpha1", + "id": 9526184, + "node_id": "MDc6UmVsZWFzZTk1MjYxODQ=", + "tag_name": "v7.0.0-alpha1", + "target_commitish": "master", + "name": null, + "draft": false, + "author": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "prerelease": false, + "created_at": "2018-02-04T18:49:50Z", + "published_at": "2018-02-04T18:55:52Z", + "assets": [ + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/6096096", + "id": 6096096, + "node_id": "MDEyOlJlbGVhc2VBc3NldDYwOTYwOTY=", + "name": "phpvms-v7.0.0-alpha1.tar.gz", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 13926978, + "download_count": 289, + "created_at": "2018-02-04T18:55:50Z", + "updated_at": "2018-02-04T18:55:51Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-alpha1/phpvms-v7.0.0-alpha1.tar.gz" + }, + { + "url": "https://api.github.com/repos/nabeelio/phpvms/releases/assets/6096097", + "id": 6096097, + "node_id": "MDEyOlJlbGVhc2VBc3NldDYwOTYwOTc=", + "name": "phpvms-v7.0.0-alpha1.tar.gz.sha256", + "label": "", + "uploader": { + "login": "nabeelio", + "id": 99736, + "node_id": "MDQ6VXNlcjk5NzM2", + "avatar_url": "https://avatars2.githubusercontent.com/u/99736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nabeelio", + "html_url": "https://github.com/nabeelio", + "followers_url": "https://api.github.com/users/nabeelio/followers", + "following_url": "https://api.github.com/users/nabeelio/following{/other_user}", + "gists_url": "https://api.github.com/users/nabeelio/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nabeelio/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nabeelio/subscriptions", + "organizations_url": "https://api.github.com/users/nabeelio/orgs", + "repos_url": "https://api.github.com/users/nabeelio/repos", + "events_url": "https://api.github.com/users/nabeelio/events{/privacy}", + "received_events_url": "https://api.github.com/users/nabeelio/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 94, + "download_count": 44, + "created_at": "2018-02-04T18:55:52Z", + "updated_at": "2018-02-04T18:55:52Z", + "browser_download_url": "https://github.com/nabeelio/phpvms/releases/download/v7.0.0-alpha1/phpvms-v7.0.0-alpha1.tar.gz.sha256" + } + ], + "tarball_url": "https://api.github.com/repos/nabeelio/phpvms/tarball/v7.0.0-alpha1", + "zipball_url": "https://api.github.com/repos/nabeelio/phpvms/zipball/v7.0.0-alpha1", + "body": null + } +]