From e5e6a02dbf6aa79e44b8648a3791e474e1514474 Mon Sep 17 00:00:00 2001 From: Jonah Lawrence Date: Sat, 10 Dec 2022 22:06:13 -0700 Subject: [PATCH 01/14] Vercel configuration changes --- .github/workflows/translation-progress.yml | 2 +- .gitignore | 1 + .vercelignore | 20 ++++++++++++++++++++ Procfile | 2 +- {src => api}/card.php | 0 {src => api}/colors.php | 0 {src => api}/demo/apple-touch-icon.png | Bin {src => api}/demo/css/style.css | 0 {src => api}/demo/css/toggle-dark.css | 0 {src => api}/demo/favicon-16x16.png | Bin {src => api}/demo/favicon-32x32.png | Bin {src => api}/demo/icon.svg | 0 {src => api}/demo/index.php | 4 ++-- {src => api}/demo/js/accordion.js | 0 {src => api}/demo/js/jscolor.min.js | 0 {src => api}/demo/js/script.js | 0 {src => api}/demo/js/toggle-dark.js | 0 {src => api}/demo/preview.php | 4 ++-- {src => api}/index.php | 6 +++--- {src => api}/stats.php | 6 +++--- {src => api}/themes.php | 0 {src => api}/translations.php | 0 composer.json | 4 ++-- composer.lock | 12 ++++++------ scripts/translation-progress.php | 8 ++++---- tests/OptionsTest.php | 6 +++--- tests/RenderTest.php | 2 +- tests/StatsTest.php | 6 +++--- tests/TranslationsTest.php | 4 ++-- vercel.json | 13 +++++++++++++ 30 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 .vercelignore rename {src => api}/card.php (100%) rename {src => api}/colors.php (100%) rename {src => api}/demo/apple-touch-icon.png (100%) rename {src => api}/demo/css/style.css (100%) rename {src => api}/demo/css/toggle-dark.css (100%) rename {src => api}/demo/favicon-16x16.png (100%) rename {src => api}/demo/favicon-32x32.png (100%) rename {src => api}/demo/icon.svg (100%) rename {src => api}/demo/index.php (98%) rename {src => api}/demo/js/accordion.js (100%) rename {src => api}/demo/js/jscolor.min.js (100%) rename {src => api}/demo/js/script.js (100%) rename {src => api}/demo/js/toggle-dark.js (100%) rename {src => api}/demo/preview.php (91%) rename {src => api}/index.php (89%) rename {src => api}/stats.php (98%) rename {src => api}/themes.php (100%) rename {src => api}/translations.php (100%) create mode 100644 vercel.json diff --git a/.github/workflows/translation-progress.yml b/.github/workflows/translation-progress.yml index a8aa7314..a75ef494 100644 --- a/.github/workflows/translation-progress.yml +++ b/.github/workflows/translation-progress.yml @@ -6,7 +6,7 @@ on: branches: - main paths: - - "src/translations.php" + - "api/translations.php" - "scripts/translation-progress.php" - ".github/workflows/translation-progress.yml" - "README.md" diff --git a/.gitignore b/.gitignore index c3a01b49..560625aa 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules/ composer.phar yarn.lock package-lock.json +.vercel # Local Configuration package.json diff --git a/.vercelignore b/.vercelignore new file mode 100644 index 00000000..e9c5a7aa --- /dev/null +++ b/.vercelignore @@ -0,0 +1,20 @@ +# Generated files +vendor/ +node_modules/ +*.log +composer.phar +yarn.lock +package-lock.json +composer.lock + +# Local Configuration +package.json +.DS_Store + +# Environment +.env +DOCKER_ENV +docker_tag + +# IDE +.vscode/ diff --git a/Procfile b/Procfile index 29bb24c8..7284f824 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: vendor/bin/heroku-php-apache2 src/ +web: vendor/bin/heroku-php-apache2 api/ diff --git a/src/card.php b/api/card.php similarity index 100% rename from src/card.php rename to api/card.php diff --git a/src/colors.php b/api/colors.php similarity index 100% rename from src/colors.php rename to api/colors.php diff --git a/src/demo/apple-touch-icon.png b/api/demo/apple-touch-icon.png similarity index 100% rename from src/demo/apple-touch-icon.png rename to api/demo/apple-touch-icon.png diff --git a/src/demo/css/style.css b/api/demo/css/style.css similarity index 100% rename from src/demo/css/style.css rename to api/demo/css/style.css diff --git a/src/demo/css/toggle-dark.css b/api/demo/css/toggle-dark.css similarity index 100% rename from src/demo/css/toggle-dark.css rename to api/demo/css/toggle-dark.css diff --git a/src/demo/favicon-16x16.png b/api/demo/favicon-16x16.png similarity index 100% rename from src/demo/favicon-16x16.png rename to api/demo/favicon-16x16.png diff --git a/src/demo/favicon-32x32.png b/api/demo/favicon-32x32.png similarity index 100% rename from src/demo/favicon-32x32.png rename to api/demo/favicon-32x32.png diff --git a/src/demo/icon.svg b/api/demo/icon.svg similarity index 100% rename from src/demo/icon.svg rename to api/demo/icon.svg diff --git a/src/demo/index.php b/api/demo/index.php similarity index 98% rename from src/demo/index.php rename to api/demo/index.php index 1ab77111..be99f5a1 100644 --- a/src/demo/index.php +++ b/api/demo/index.php @@ -1,7 +1,7 @@ safeLoad(); // if environment variables are not loaded, display error -if (!isset($_SERVER["TOKEN"])) { - $message = file_exists(dirname(__DIR__ . "../.env", 1)) +if (!isset($_ENV["TOKEN"])) { + $message = file_exists(dirname(__DIR__, 1) . "/.env") ? "Missing token in config. Check Contributing.md for details." : ".env was not found. Check Contributing.md for details."; renderOutput($message, 500); diff --git a/src/stats.php b/api/stats.php similarity index 98% rename from src/stats.php rename to api/stats.php index 0c668925..e34a5f82 100644 --- a/src/stats.php +++ b/api/stats.php @@ -98,11 +98,11 @@ function getGitHubTokens() return $GLOBALS["ALL_TOKENS"]; } // find all tokens in environment variables - $tokens = isset($_SERVER["TOKEN"]) ? [$_SERVER["TOKEN"]] : []; + $tokens = isset($_ENV["TOKEN"]) ? [$_ENV["TOKEN"]] : []; $index = 2; - while (isset($_SERVER["TOKEN{$index}"])) { + while (isset($_ENV["TOKEN{$index}"])) { // add token to list - $tokens[] = $_SERVER["TOKEN{$index}"]; + $tokens[] = $_ENV["TOKEN{$index}"]; $index++; } // store for future use diff --git a/src/themes.php b/api/themes.php similarity index 100% rename from src/themes.php rename to api/themes.php diff --git a/src/translations.php b/api/translations.php similarity index 100% rename from src/translations.php rename to api/translations.php diff --git a/composer.json b/composer.json index ef9b143e..dc50678d 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "homepage": "https://github.com/DenverCoder1/github-readme-streak-stats", "autoload": { "classmap": [ - "src/" + "api/" ] }, "require": { @@ -28,7 +28,7 @@ "scripts": { "start": [ "Composer\\Config::disableProcessTimeout", - "php -S localhost:8000 -t src" + "php -S localhost:8000 -t api" ], "test": "./vendor/bin/phpunit --testdox tests", "lint": "prettier --check *.md **/*.{php,md,js,css} !**/*.min.js --print-width 120", diff --git a/composer.lock b/composer.lock index 5a78d8a8..f09a7ff2 100644 --- a/composer.lock +++ b/composer.lock @@ -1093,16 +1093,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.26", + "version": "9.5.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38", + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38", "shasum": "" }, "require": { @@ -1175,7 +1175,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27" }, "funding": [ { @@ -1191,7 +1191,7 @@ "type": "tidelift" } ], - "time": "2022-10-28T06:00:21+00:00" + "time": "2022-12-09T07:31:23+00:00" }, { "name": "sebastian/cli-parser", diff --git a/scripts/translation-progress.php b/scripts/translation-progress.php index bf962bd2..ae49909e 100644 --- a/scripts/translation-progress.php +++ b/scripts/translation-progress.php @@ -1,6 +1,6 @@ $phrases) { $translated = 0; @@ -70,7 +70,7 @@ function progressToBadges(array $progress): string $badges .= str_repeat("| --- ", $per_row) . "|" . "\n"; $i = 0; foreach (array_values($progress) as $data) { - $line_url = "https://github.com/DenverCoder1/github-readme-streak-stats/blob/main/src/translations.php#L{$data["line_number"]}"; + $line_url = "https://github.com/DenverCoder1/github-readme-streak-stats/blob/main/api/translations.php#L{$data["line_number"]}"; $badges .= "| [`{$data["locale"]}`]({$line_url}) - {$data["locale_name"]}
[![{$data["locale_name"]} {$data["percentage"]}%](https://progress-bar.dev/{$data["percentage"]})]({$line_url}) "; $i++; if ($i % $per_row === 0) { @@ -108,7 +108,7 @@ function updateReadme(string $path, string $start, string $end, string $content) $progress = getProgress($GLOBALS["TRANSLATIONS"]); $badges = "\n" . progressToBadges($progress); $update = updateReadme( - __DIR__ . "/../README.md", + dirname(__DIR__, 1) . "/README.md", "", "", $badges diff --git a/tests/OptionsTest.php b/tests/OptionsTest.php index 15fb0e1d..661ac88f 100644 --- a/tests/OptionsTest.php +++ b/tests/OptionsTest.php @@ -5,7 +5,7 @@ use PHPUnit\Framework\TestCase; // load functions -require_once "src/card.php"; +require_once "api/card.php"; final class OptionsTest extends TestCase { @@ -28,7 +28,7 @@ final class OptionsTest extends TestCase public function testThemes(): void { // check that getRequestedTheme returns correct colors for each theme - $themes = include "src/themes.php"; + $themes = include "api/themes.php"; foreach ($themes as $theme => $colors) { $params = ["theme" => $theme]; $actualColors = getRequestedTheme($params); @@ -54,7 +54,7 @@ public function testFallbackToDefaultTheme(): void public function testThemesHaveValidParameters(): void { // check that all themes contain all parameters and have valid values - $themes = include "src/themes.php"; + $themes = include "api/themes.php"; $hexRegex = "/^#([a-f0-9]{3}|[a-f0-9]{4}|[a-f0-9]{6}|[a-f0-9]{8})$/"; foreach ($themes as $theme => $colors) { // check that there are no extra keys in the theme diff --git a/tests/RenderTest.php b/tests/RenderTest.php index c939981d..3dc758dd 100644 --- a/tests/RenderTest.php +++ b/tests/RenderTest.php @@ -5,7 +5,7 @@ use PHPUnit\Framework\TestCase; // load functions -require_once "src/card.php"; +require_once "api/card.php"; final class RenderTest extends TestCase { diff --git a/tests/StatsTest.php b/tests/StatsTest.php index c353464a..961c79a5 100644 --- a/tests/StatsTest.php +++ b/tests/StatsTest.php @@ -6,15 +6,15 @@ // load functions require_once dirname(__DIR__, 1) . "/vendor/autoload.php"; -require_once "src/stats.php"; +require_once "api/stats.php"; // load .env $dotenv = \Dotenv\Dotenv::createImmutable(dirname(__DIR__, 1)); $dotenv->safeLoad(); // if environment variables are not loaded, display error -if (!isset($_SERVER["TOKEN"])) { - $message = file_exists(dirname(__DIR__ . "../.env", 1)) +if (!isset($_ENV["TOKEN"])) { + $message = file_exists(dirname(__DIR__, 1) . "/.env") ? "Missing token in config. Check Contributing.md for details." : ".env was not found. Check Contributing.md for details."; diff --git a/tests/TranslationsTest.php b/tests/TranslationsTest.php index 7bac333d..065270ee 100644 --- a/tests/TranslationsTest.php +++ b/tests/TranslationsTest.php @@ -14,7 +14,7 @@ final class TranslationsTest extends TestCase */ public function testAllPhrasesValid(): void { - $translations = include "src/translations.php"; + $translations = include "api/translations.php"; $locales = array_keys($translations); $valid_phrases = [ "rtl", @@ -37,7 +37,7 @@ public function testAllPhrasesValid(): void */ public function testLocalesSortedAlphabetically(): void { - $translations = include "src/translations.php"; + $translations = include "api/translations.php"; $locales = array_keys($translations); // check that "en" is first $this->assertEquals("en", $locales[0]); diff --git a/vercel.json b/vercel.json new file mode 100644 index 00000000..35c77e0c --- /dev/null +++ b/vercel.json @@ -0,0 +1,13 @@ +{ + "routes": [ + { "handle": "filesystem" }, + { "src": "/demo/?", "dest": "/api/demo/index.php" }, + { "src": "/demo/(.*)", "dest": "/api/demo/$1" }, + { "src": "/", "dest": "/api/index.php" } + ], + "functions": { + "api/**/*.php": { + "runtime": "vercel-php@0.5.2" + } + } +} From fb95b95ba5deec1d3e9ba5c23f713b8d573a0b0f Mon Sep 17 00:00:00 2001 From: Jonah Lawrence Date: Sat, 24 Dec 2022 18:39:47 -0700 Subject: [PATCH 02/14] fallbacks for NumberFormatter, IntlDatePatternGenerator --- api/card.php | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/api/card.php b/api/card.php index fe03f35d..0cbdace9 100644 --- a/api/card.php +++ b/api/card.php @@ -14,7 +14,11 @@ function formatDate(string $dateString, string|null $format, string $locale): st { $date = new DateTime($dateString); $formatted = ""; - $patternGenerator = new IntlDatePatternGenerator($locale); + if (class_exists("IntlDatePatternGenerator")) { + $patternGenerator = new IntlDatePatternGenerator($locale); + } else { + $format = "M j, Y"; + } // if current year, display only month and day if (date_format($date, "Y") == date("Y")) { if ($format) { @@ -213,18 +217,29 @@ function generateCard(array $stats, array $params = null): string $dateFormat = $params["date_format"] ?? ($localeTranslations["date_format"] ?? null); // number formatter - $numFormatter = new NumberFormatter($localeCode, NumberFormatter::DECIMAL); + // check if NumberFormatter is available + if (class_exists("NumberFormatter")) { + $numFormatter = new NumberFormatter($localeCode, NumberFormatter::DECIMAL); + $formatNumber = function ($number) use ($numFormatter) { + return $numFormatter->format($number); + }; + } else { + // fallback to number_format + $formatNumber = function ($number) { + return number_format($number); + }; + } // read border_radius parameter, default to 4.5 if not set $borderRadius = $params["border_radius"] ?? "4.5"; // total contributions - $totalContributions = $numFormatter->format($stats["totalContributions"]); + $totalContributions = $formatNumber($stats["totalContributions"]); $firstContribution = formatDate($stats["firstContribution"], $dateFormat, $localeCode); $totalContributionsRange = $firstContribution . " - " . $localeTranslations["Present"]; // current streak - $currentStreak = $numFormatter->format($stats["currentStreak"]["length"]); + $currentStreak = $formatNumber($stats["currentStreak"]["length"]); $currentStreakStart = formatDate($stats["currentStreak"]["start"], $dateFormat, $localeCode); $currentStreakEnd = formatDate($stats["currentStreak"]["end"], $dateFormat, $localeCode); $currentStreakRange = $currentStreakStart; @@ -233,7 +248,7 @@ function generateCard(array $stats, array $params = null): string } // longest streak - $longestStreak = $numFormatter->format($stats["longestStreak"]["length"]); + $longestStreak = $formatNumber($stats["longestStreak"]["length"]); $longestStreakStart = formatDate($stats["longestStreak"]["start"], $dateFormat, $localeCode); $longestStreakEnd = formatDate($stats["longestStreak"]["end"], $dateFormat, $localeCode); $longestStreakRange = $longestStreakStart; From cb31e059f60b7b304345ba54ed81816bd6198452 Mon Sep 17 00:00:00 2001 From: Jonah Lawrence Date: Sat, 24 Dec 2022 19:03:54 -0700 Subject: [PATCH 03/14] fix demo site --- api/demo/index.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/api/demo/index.php b/api/demo/index.php index e3f49626..76936952 100644 --- a/api/demo/index.php +++ b/api/demo/index.php @@ -47,8 +47,8 @@ function gtag() { GitHub Readme Streak Stats Demo - - + + @@ -56,10 +56,10 @@ function gtag() { - - - - + + + + @@ -114,7 +114,13 @@ function gtag() {