Version 1
[yaffs-website] / vendor / psy / psysh / src / Psy / VersionUpdater / IntervalChecker.php
diff --git a/vendor/psy/psysh/src/Psy/VersionUpdater/IntervalChecker.php b/vendor/psy/psysh/src/Psy/VersionUpdater/IntervalChecker.php
new file mode 100644 (file)
index 0000000..c34ea69
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of Psy Shell.
+ *
+ * (c) 2012-2017 Justin Hileman
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Psy\VersionUpdater;
+
+use Psy\Shell;
+
+class IntervalChecker extends GitHubChecker
+{
+    private $cacheFile;
+    private $interval;
+
+    public function __construct($cacheFile, $interval)
+    {
+        $this->cacheFile = $cacheFile;
+        $this->interval = $interval;
+    }
+
+    public function fetchLatestRelease()
+    {
+        // Read the cached file
+        $cached = json_decode(@file_get_contents($this->cacheFile, false));
+        if ($cached && isset($cached->last_check) && isset($cached->release)) {
+            $now = new \DateTime();
+            $lastCheck = new \DateTime($cached->last_check);
+            if ($lastCheck >= $now->sub($this->getDateInterval())) {
+                return $cached->release;
+            }
+        }
+
+        // Fall back to fetching from GitHub
+        $release = parent::fetchLatestRelease();
+        if ($release && isset($release->tag_name)) {
+            $this->updateCache($release);
+        }
+
+        return $release;
+    }
+
+    private function getDateInterval()
+    {
+        switch ($this->interval) {
+            case Checker::DAILY:
+                return new \DateInterval('P1D');
+            case Checker::WEEKLY:
+                return new \DateInterval('P1W');
+            case Checker::MONTHLY:
+                return new \DateInterval('P1M');
+        }
+    }
+
+    private function updateCache($release)
+    {
+        $data = array(
+            'last_check' => date(DATE_ATOM),
+            'release'    => $release,
+        );
+
+        file_put_contents($this->cacheFile, json_encode($data));
+    }
+}