Compare commits

...
Author SHA1 Message Date
anuraghazra cf4cfbeac8 infra: getPrNumber fix
Test / build (push) Canceled after 0s
2020-08-10 19:59:03 +05:30
anuraghazra 7a4b0930fc Merge branch 'master' of https://github.com/anuraghazra/github-readme-stats 2020-08-10 19:46:49 +05:30
anuraghazra 4c43bdbfa2 infra: fix preview-theme 2020-08-10 19:46:17 +05:30
anuraghazra 89ca60ce00 infra: added doc-translation auto label 2020-08-10 19:44:24 +05:30
morihaya 277e177876 docs(translation): Update readme_ja.md (#353)
Corrects the Japanese language into more natural sentences.
2020-08-10 19:41:51 +05:30
Anurag Hazra ee513240ef feat: adde CustomError class for better secondary errors (#355) 2020-08-10 19:36:56 +05:30
Anurag HazraandGithub Readme Stats Bot 4df291e697 docs(theme): Auto update theme readme (#351)
Co-authored-by: Github Readme Stats Bot <no-reply@githubreadmestats.com>
2020-08-09 22:31:23 +05:30
Anurag Hazra af1929a3e6 refactor: Improved gradient (#350)
* fix: fixed tests for gradient

* docs: added docs for gradient
2020-08-09 22:11:01 +05:30
14 changed files with 123 additions and 56 deletions
+1
View File
@@ -1 +1,2 @@
themes: themes/index.js
doc-translation: docs/*
-2
View File
@@ -26,5 +26,3 @@ jobs:
env:
CI: true
PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
+1 -6
View File
@@ -38,12 +38,7 @@ module.exports = async (req, res) => {
parseBoolean(include_all_commits)
);
} catch (err) {
return res.send(
renderError(
err.message,
"Make sure the provided username is not an organization"
)
);
return res.send(renderError(err.message, err.secondaryMessage));
}
const cacheSeconds = clampValue(
+1 -3
View File
@@ -4,7 +4,6 @@ const {
parseBoolean,
clampValue,
CONSTANTS,
logger,
} = require("../src/common/utils");
const fetchRepo = require("../src/fetchers/repo-fetcher");
const renderRepoCard = require("../src/cards/repo-card");
@@ -29,8 +28,7 @@ module.exports = async (req, res) => {
try {
repoData = await fetchRepo(username, repo);
} catch (err) {
logger.error(err);
return res.send(renderError(err.message));
return res.send(renderError(err.message, err.secondaryMessage));
}
let cacheSeconds = clampValue(
+1 -1
View File
@@ -30,7 +30,7 @@ module.exports = async (req, res) => {
try {
topLangs = await fetchTopLanguages(username);
} catch (err) {
return res.send(renderError(err.message));
return res.send(renderError(err.message, err.secondaryMessage));
}
const cacheSeconds = clampValue(
+4 -4
View File
@@ -290,14 +290,14 @@ NOTE: [#58](https://github.com/anuraghazra/github-readme-stats/pull/58) 以降
## :sparkling_heart: Support the project
私はできる限りのことをオープンソースで行い、これらのプロジェクトを利用して支援を必要としている皆さんに返信するようにしています。もちろんです。
これは時間がかかります。無料でご利用いただけます。
私はできる限りのことをオープンソースで行い、これらのプロジェクトを利用して支援を必要としている皆さんに返信するようにしています。
もちろんそれには時間が掛かる場合がありますが、無料でご利用いただけます。
しかし、もしあなたがこのプロジェクトを使っていて、それに満足しているのであれば、あるいは単に私にものを作り続けることを奨励したいのであれば、いくつかの方法があります。
- あなたの readme で github-readme-stats を使用して適切なクレジットを付与し、それにリンクします (´∀` )
- 主演とプロジェクトの共有 :rocket:
- [![paypal.me/anuraghazra](https://ionicabizau.github.io/badges/paypal.svg)](https://www.paypal.me/anuraghazra) - PayPal を介して 1 回限りの寄付を行うことができます。私はおそらく ~~コーヒー~~ お茶買うでしょう。 :tea:
- このプロジェクトにスターを贈り、他の人達にもシェアしてください :rocket:
- [![paypal.me/anuraghazra](https://ionicabizau.github.io/badges/paypal.svg)](https://www.paypal.me/anuraghazra) - PayPal を介して 1 回限りの寄付を行うことができます。私はおそらく ~~コーヒー~~ お茶を買うでしょう。 :tea:
Thanks! :heart:
+12
View File
@@ -131,6 +131,14 @@ You can customize the appearance of your `Stats Card` or `Repo Card` however you
- `theme` - name of the theme, choose from [all available themes](./themes/README.md)
- `cache_seconds` - set the cache header manually _(min: 1800, max: 86400)_
##### Gradient in bg_color
You can provide multiple comma saperated values in bg_color option to render a gradient, the format of the gradient is :-
```
&bg_color=DEG,COLOR1,COLRO2,COLOR3...COLOR10
```
> Note on cache: Repo cards have default cache of 30mins (1800 seconds) if the fork count & star count is less than 1k otherwise it's 2hours (7200). Also note that cache is clamped to minimum of 30min and maximum of 24hours
#### Stats Card Exclusive Options:
@@ -250,6 +258,10 @@ Choose from any of the [default themes](#themes)
![Anurag's github stats](https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&theme=radical)
- Gradient
![Anurag's github stats](https://github-readme-stats.vercel.app/api?username=anuraghazra&bg_color=30,e96443,904e95&title_color=fff&text_color=fff)
- Customizing stats card
![Anurag's github stats](https://github-readme-stats.vercel.app/api/?username=anuraghazra&show_icons=true&title_color=fff&icon_color=79ff97&text_color=9f9f9f&bg_color=151515)
+13 -9
View File
@@ -3,21 +3,25 @@ const github = require("@actions/github");
const parse = require("parse-diff");
require("dotenv").config();
const parsePullRequestId = (githubRef) => {
const result = /refs\/pull\/(\d+)\/merge/g.exec(githubRef);
if (!result) {
console.log("Reference not found.");
return 297;
function getPrNumber() {
const pullRequest = github.context.payload.pull_request;
if (!pullRequest) {
return undefined;
}
const [, pullRequestId] = result;
return pullRequestId;
};
return pullRequest.number;
}
async function run() {
try {
const token = core.getInput("token");
const octokit = github.getOctokit(token || process.env.PERSONAL_TOKEN);
const pullRequestId = parsePullRequestId(process.env.GITHUB_REF);
const pullRequestId = getPrNumber();
if (!pullRequestId) {
console.log("PR not found");
return;
}
let res = await octokit.pulls.get({
owner: "anuraghazra",
+27 -7
View File
@@ -85,6 +85,27 @@ class Card {
`;
}
renderGradient() {
if (typeof this.colors.bgColor !== "object") return;
const gradients = this.colors.bgColor.slice(1);
return typeof this.colors.bgColor === "object"
? `
<defs>
<linearGradient
id="gradient"
gradientTransform="rotate(${this.colors.bgColor[0]})"
>
${gradients.map((grad, index) => {
let offset = (index * 100) / (gradients.length - 1);
return `<stop offset="${offset}%" stop-color="#${grad}" />`;
})}
</linearGradient>
</defs>
`
: "";
}
render(body) {
return `
<svg
@@ -109,12 +130,7 @@ class Card {
}
</style>
${typeof this.colors.bgColor == 'object' ? `<defs>
<linearGradient id="gradient" gradientTransform="rotate(${this.colors.bgColor[0]})">
<stop offset="0%" stop-color="#${this.colors.bgColor[1]}" />
<stop offset="100%" stop-color="#${this.colors.bgColor[2]}" />
</linearGradient>
</defs>` : ""}
${this.renderGradient()}
<rect
data-testid="card-bg"
@@ -124,7 +140,11 @@ class Card {
height="99%"
stroke="#E4E2E2"
width="${this.width - 1}"
fill="${typeof this.colors.bgColor == 'object' ? "url(#gradient)" : this.colors.bgColor}"
fill="${
typeof this.colors.bgColor === "object"
? "url(#gradient)"
: this.colors.bgColor
}"
stroke-opacity="${this.hideBorder ? 0 : 1}"
/>
+2 -2
View File
@@ -1,8 +1,8 @@
const { logger } = require("../common/utils");
const { logger, CustomError } = require("../common/utils");
const retryer = async (fetcher, variables, retries = 0) => {
if (retries > 7) {
throw new Error("Maximum retries exceeded");
throw new CustomError("Maximum retries exceeded", CustomError.MAX_RETRY);
}
try {
logger.log(`Trying PAT_${retries + 1}`);
+34 -2
View File
@@ -14,7 +14,7 @@ const renderError = (message, secondaryMessage = "") => {
<text x="25" y="45" class="text">Something went wrong! file an issue at https://git.io/JJmN9</text>
<text data-testid="message" x="25" y="55" class="text small">
<tspan x="25" dy="18">${encodeHTML(message)}</tspan>
<tspan x="25" dy="18" class="gray">${secondaryMessage}</tspan>
<tspan x="25" dy="18" class="gray">${secondaryMessage}</tspan>
</text>
</svg>
`;
@@ -60,8 +60,22 @@ function clampValue(number, min, max) {
return Math.max(min, Math.min(number, max));
}
function isValidGradient(colors) {
return isValidHexColor(colors[1]) && isValidHexColor(colors[2]);
}
function fallbackColor(color, fallbackColor) {
return (isValidHexColor(color) && `#${color}`) || (color.includes(',') && isValidHexColor(color.split(',')[1]) && isValidHexColor(color.split(',')[2]) && color.split(',')) || fallbackColor;
let colors = color.split(",");
let gradient = null;
if (colors.length > 1 && isValidGradient(colors)) {
gradient = colors;
}
return (
(gradient ? gradient : isValidHexColor(color) && `#${color}`) ||
fallbackColor
);
}
function request(data, headers) {
@@ -156,6 +170,23 @@ const CONSTANTS = {
ONE_DAY: 86400,
};
const SECONDARY_ERROR_MESSAGES = {
MAX_RETRY:
"Please add an env variable called PAT_1 with your github token in vercel",
USER_NOT_FOUND: "Make sure the provided username is not an organization",
};
class CustomError extends Error {
constructor(message, type) {
super(message);
this.type = type;
this.secondaryMessage = SECONDARY_ERROR_MESSAGES[type] || "adsad";
}
static MAX_RETRY = "MAX_RETRY";
static USER_NOT_FOUND = "USER_NOT_FOUND";
}
module.exports = {
renderError,
kFormatter,
@@ -171,4 +202,5 @@ module.exports = {
wrapTextMultiline,
logger,
CONSTANTS,
CustomError,
};
+5 -2
View File
@@ -1,4 +1,4 @@
const { request, logger } = require("../common/utils");
const { request, logger, CustomError } = require("../common/utils");
const axios = require("axios");
const retryer = require("../common/retryer");
const calculateRank = require("../calculateRank");
@@ -109,7 +109,10 @@ async function fetchStats(
if (res.data.errors) {
logger.error(res.data.errors);
throw Error(res.data.errors[0].message || "Could not fetch user");
throw new CustomError(
res.data.errors[0].message || "Could not fetch user",
CustomError.USER_NOT_FOUND
);
}
const user = res.data.data.user;
+12 -10
View File
@@ -138,9 +138,10 @@ describe("Card", () => {
title_color: "f00",
icon_color: "0f0",
text_color: "00f",
bg_color: "90,fff,000",
bg_color: "90,fff,000,f00",
theme: "default",
});
const card = new Card({
height: 200,
colors: {
@@ -155,17 +156,18 @@ describe("Card", () => {
"fill",
"url(#gradient)"
);
expect(document.querySelector('defs linearGradient')).toHaveAttribute(
expect(document.querySelector("defs linearGradient")).toHaveAttribute(
"gradientTransform",
"rotate(90)"
);
expect(document.querySelector('defs linearGradient stop:nth-child(1)')).toHaveAttribute(
"stop-color",
"#fff"
);
expect(document.querySelector('defs linearGradient stop:nth-child(2)')).toHaveAttribute(
"stop-color",
"#000"
);
expect(
document.querySelector("defs linearGradient stop:nth-child(1)")
).toHaveAttribute("stop-color", "#fff");
expect(
document.querySelector("defs linearGradient stop:nth-child(2)")
).toHaveAttribute("stop-color", "#000");
expect(
document.querySelector("defs linearGradient stop:nth-child(3)")
).toHaveAttribute("stop-color", "#f00");
});
});
+10 -8
View File
@@ -22,10 +22,10 @@ Use `?theme=THEME_NAME` parameter like so :-
| `highcontrast` ![highcontrast][highcontrast] | `dracula` ![dracula][dracula] | `prussian` ![prussian][prussian] |
| `monokai` ![monokai][monokai] | `vue` ![vue][vue] | `shades-of-purple` ![shades-of-purple][shades-of-purple] |
| `nightowl` ![nightowl][nightowl] | `buefy` ![buefy][buefy] | `blue-green` ![blue-green][blue-green] |
| `algolia` ![algolia][algolia] | `great-gatsby` ![great-gatsby][great-gatsby] | `bear` ![bear][bear] |
| `solarized-dark` ![solarized-dark][solarized-dark] | `solarized-light` ![solarized-light][solarized-light] | `nord` ![nord][nord] |
| `gotham` ![gotham][gotham] | `material-palenight` ![material-palenight][material-palenight] | `graywhite` ![graywhite][graywhite] |
| `vue-dark` ![vue-dark][vue-dark] | | [Add your theme][add-theme] |
| `algolia` ![algolia][algolia] | `great-gatsby` ![great-gatsby][great-gatsby] | `darcula` ![darcula][darcula] |
| `bear` ![bear][bear] | `solarized-dark` ![solarized-dark][solarized-dark] | `solarized-light` ![solarized-light][solarized-light] |
| `nord` ![nord][nord] | `gotham` ![gotham][gotham] | `material-palenight` ![material-palenight][material-palenight] |
| `graywhite` ![graywhite][graywhite] | `vue-dark` ![vue-dark][vue-dark] | [Add your theme][add-theme] |
## Repo Card
@@ -39,10 +39,10 @@ Use `?theme=THEME_NAME` parameter like so :-
| `highcontrast` ![highcontrast][highcontrast_repo] | `dracula` ![dracula][dracula_repo] | `prussian` ![prussian][prussian_repo] |
| `monokai` ![monokai][monokai_repo] | `vue` ![vue][vue_repo] | `shades-of-purple` ![shades-of-purple][shades-of-purple_repo] |
| `nightowl` ![nightowl][nightowl_repo] | `buefy` ![buefy][buefy_repo] | `blue-green` ![blue-green][blue-green_repo] |
| `algolia` ![algolia][algolia_repo] | `great-gatsby` ![great-gatsby][great-gatsby_repo] | `bear` ![bear][bear_repo] |
| `solarized-dark` ![solarized-dark][solarized-dark_repo] | `solarized-light` ![solarized-light][solarized-light_repo] | `nord` ![nord][nord_repo] |
| `gotham` ![gotham][gotham_repo] | `material-palenight` ![material-palenight][material-palenight_repo] | `graywhite` ![graywhite][graywhite_repo] |
| `vue-dark` ![vue-dark][vue-dark_repo] | | [Add your theme][add-theme] |
| `algolia` ![algolia][algolia_repo] | `great-gatsby` ![great-gatsby][great-gatsby_repo] | `darcula` ![darcula][darcula_repo] |
| `bear` ![bear][bear_repo] | `solarized-dark` ![solarized-dark][solarized-dark_repo] | `solarized-light` ![solarized-light][solarized-light_repo] |
| `nord` ![nord][nord_repo] | `gotham` ![gotham][gotham_repo] | `material-palenight` ![material-palenight][material-palenight_repo] |
| `graywhite` ![graywhite][graywhite_repo] | `vue-dark` ![vue-dark][vue-dark_repo] | [Add your theme][add-theme] |
[default]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=default
@@ -66,6 +66,7 @@ Use `?theme=THEME_NAME` parameter like so :-
[blue-green]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=blue-green
[algolia]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=algolia
[great-gatsby]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=great-gatsby
[darcula]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=darcula
[bear]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=bear
[solarized-dark]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=solarized-dark
[solarized-light]: https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true&hide=contribs,prs&cache_seconds=86400&theme=solarized-light
@@ -97,6 +98,7 @@ Use `?theme=THEME_NAME` parameter like so :-
[blue-green_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=blue-green
[algolia_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=algolia
[great-gatsby_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=great-gatsby
[darcula_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=darcula
[bear_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=bear
[solarized-dark_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=solarized-dark
[solarized-light_repo]: https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats&cache_seconds=86400&theme=solarized-light