968a285777974bfe2b5ba880fbffee59d6ebae2e
[yaffs-website] / vendor / psy / psysh / src / Psy / VersionUpdater / IntervalChecker.php
1 <?php
2
3 /*
4  * This file is part of Psy Shell.
5  *
6  * (c) 2012-2017 Justin Hileman
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Psy\VersionUpdater;
13
14 use Psy\Shell;
15
16 class IntervalChecker extends GitHubChecker
17 {
18     private $cacheFile;
19     private $interval;
20
21     public function __construct($cacheFile, $interval)
22     {
23         $this->cacheFile = $cacheFile;
24         $this->interval  = $interval;
25     }
26
27     public function fetchLatestRelease()
28     {
29         // Read the cached file
30         $cached = json_decode(@file_get_contents($this->cacheFile, false));
31         if ($cached && isset($cached->last_check) && isset($cached->release)) {
32             $now = new \DateTime();
33             $lastCheck = new \DateTime($cached->last_check);
34             if ($lastCheck >= $now->sub($this->getDateInterval())) {
35                 return $cached->release;
36             }
37         }
38
39         // Fall back to fetching from GitHub
40         $release = parent::fetchLatestRelease();
41         if ($release && isset($release->tag_name)) {
42             $this->updateCache($release);
43         }
44
45         return $release;
46     }
47
48     private function getDateInterval()
49     {
50         switch ($this->interval) {
51             case Checker::DAILY:
52                 return new \DateInterval('P1D');
53             case Checker::WEEKLY:
54                 return new \DateInterval('P1W');
55             case Checker::MONTHLY:
56                 return new \DateInterval('P1M');
57         }
58     }
59
60     private function updateCache($release)
61     {
62         $data = array(
63             'last_check' => date(DATE_ATOM),
64             'release'    => $release,
65         );
66
67         file_put_contents($this->cacheFile, json_encode($data));
68     }
69 }