Split tests (#88)

This commit is contained in:
Simon Lecoq
2021-02-01 20:37:17 +01:00
committed by GitHub
parent c9e530c16b
commit eb89bc3f1b
25 changed files with 575 additions and 361 deletions

View File

@@ -162,7 +162,6 @@ This section explain how metrics is structured.
* `fonts.css` contains additional fonts used to render metrics * `fonts.css` contains additional fonts used to render metrics
* `template.mjs` contains template source code * `template.mjs` contains template source code
* `tests/` contains tests * `tests/` contains tests
* `testscases.js` contains tests case
* `metrics.test.js` contains metrics testers * `metrics.test.js` contains metrics testers
* `Dockerfile` contains docker instructions used to build metrics image * `Dockerfile` contains docker instructions used to build metrics image
* `package.json` contains dependencies and command line aliases * `package.json` contains dependencies and command line aliases
@@ -576,7 +575,7 @@ json:
Creating tests for your plugin ensure that external changes don't break it. Creating tests for your plugin ensure that external changes don't break it.
You can define your tests cases in [`testscases.js`](/tests/testscases.js), which will automatically test your plugin with: You can define your tests cases in `tests.yml` in your plugin directory, which will automatically test your plugin with:
- Metrics action - Metrics action
- Metrics web instance - Metrics web instance
- Metrics web instance placeholder (rendered by browser) - Metrics web instance placeholder (rendered by browser)

View File

@@ -43,5 +43,10 @@
"devDependencies": { "devDependencies": {
"jest": "^26.6.3", "jest": "^26.6.3",
"libxmljs": "^0.19.7" "libxmljs": "^0.19.7"
},
"jest": {
"testEnvironment":"node",
"testTimeout":60000,
"transform":{}
} }
} }

View File

@@ -0,0 +1,21 @@
- name: Activity plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_activity: yes
- name: Activity plugin (filtered)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_activity: yes
plugin_activity_filter: pr, issue
- name: Activity plugin (complete)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_activity: yes
plugin_activity_limit: 100
plugin_activity_days: 14
plugin_activity_filter: all

View File

@@ -0,0 +1,60 @@
- name: Anilist plugin (default)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
- name: Anilist plugin (manga only)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_medias: manga
- name: Anilist plugin (anime only)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_medias: anime
- name: Anilist plugin (favorites section)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_sections: favorites
- name: Anilist plugin (watching/reading section)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_sections: watching, reading
- name: Anilist plugin (characters section)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_sections: characters
- name: Anilist plugin (additional options)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_limit: 0
plugin_anilist_shuffle: no
plugin_anilist_user: user
- name: Anilist plugin (complete)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_anilist: yes
plugin_anilist_medias: manga, anime
plugin_anilist_sections: favorites, watching, reading, characters
plugin_anilist_limit: 0
plugin_anilist_shuffle: no
plugin_anilist_user: user

View File

@@ -0,0 +1,45 @@
- name: Base (header)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: header
base_header: yes # For web instance
- name: Base (activity)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: activity
base_activity: yes # For web instance
- name: Base (community)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: community
base_community: yes # For web instance
- name: Base (repositories)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: repositories
base_repositories: yes # For web instance
- name: Base (metadata)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: metadata
base_metadata: yes # For web instance
- name: Base (complete)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: header, activity, community, repositories, metadata
base_header: yes # For web instance
base_activity: yes # For web instance
base_community: yes # For web instance
base_repositories: yes # For web instance
base_metadata: yes # For web instance

View File

@@ -0,0 +1,26 @@
- name: Image output (jpeg)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
config_output: jpeg
- name: Image output (png)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
config_output: png
- name: Disable animations
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
config_animations: no
- name: Community templates
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
template: "@classic"
setup_community_templates: "lowlighter/metrics@master:classic"
modes:
- action

View File

@@ -0,0 +1,5 @@
- name: Follow-up plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_followup: yes

View File

@@ -0,0 +1,5 @@
- name: Gists plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_gists: yes

View File

@@ -0,0 +1,30 @@
- name: Habits plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_habits: yes
- name: Habits plugin (charts)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_habits: yes
plugin_habits_facts: no
plugin_habits_charts: yes
config_timezone: Europe/Paris
- name: Habits plugin (facts)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_habits: yes
plugin_habits_facts: yes
- name: Habits plugin (complete)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_habits: yes
plugin_habits_facts: yes
plugin_habits_charts: yes
config_timezone: Europe/Paris

View File

@@ -0,0 +1,20 @@
- name: Isocalendar plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_isocalendar: yes
- name: Isocalendar plugin (half-year)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_isocalendar: yes
plugin_isocalendar_duration: half-year
- name: Isocalendar plugin (full-year)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_isocalendar: yes
plugin_isocalendar_duration: full-year

View File

@@ -0,0 +1,44 @@
- name: Language plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
- name: Language plugin (ignored languages)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
plugin_languages_ignored: html, css, dockerfile
- name: Language plugin (skipped repositories)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
plugin_languages_skipped: metrics
- name: Language plugin (custom color set)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
plugin_languages_colors: complementary
- name: Language plugin (with details)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
plugin_languages_details: percentage
- name: Language plugin (complete)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_languages: yes
plugin_languages_ignored: html, css, dockerfile
plugin_languages_skipped: metrics
plugin_languages_colors: rainbow
plugin_languages_details: bytes-size, percentage

View File

@@ -0,0 +1,7 @@
- name: Lines plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
base: repositories
plugin_lines: yes

View File

@@ -0,0 +1,30 @@
- name: Music plugin (playlist - apple)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_music: yes
plugin_music_playlist: https://embed.music.apple.com/fr/playlist/usr-share/pl.u-V9D7m8Etjmjd0D
- name: Music plugin (playlist - spotify)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_music: yes
plugin_music_playlist: https://open.spotify.com/embed/playlist/3nfA87oeJw4LFVcUDjRcqi
- name: Music plugin (recent - spotify)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_music_token: MOCKED_CLIENT_ID, MOCKED_CLIENT_SECRET, MOCKED_REFRESH_TOKEN
plugin_music: yes
plugin_music_provider: spotify
- name: Music plugin (recent - lastfm)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_music_token: MOCKED_TOKEN
plugin_music: yes
plugin_music_provider: lastfm
plugin_music_user: RJ

View File

@@ -0,0 +1,39 @@
- name: PageSpeed plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_pagespeed_token: MOCKED_TOKEN
plugin_pagespeed: yes
- name: PageSpeed plugin (different url)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_pagespeed_token: MOCKED_TOKEN
plugin_pagespeed: yes
plugin_pagespeed_url: github.com
- name: PageSpeed plugin (detailed)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_pagespeed_token: MOCKED_TOKEN
plugin_pagespeed: yes
plugin_pagespeed_detailed: yes
- name: PageSpeed plugin (screenshot)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_pagespeed_token: MOCKED_TOKEN
plugin_pagespeed: yes
plugin_pagespeed_screenshot: yes
- name: PageSpeed plugin (complete)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_pagespeed_token: MOCKED_TOKEN
plugin_pagespeed: yes
plugin_pagespeed_detailed: yes
plugin_pagespeed_screenshot: yes

View File

@@ -0,0 +1,63 @@
- name: People plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
- name: People plugin (followers)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: followers
- name: People plugin (following)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: following
- name: People plugin (sponsoring)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: sponsoring
- name: People plugin (sponsors)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: sponsors
- name: People plugin (stargazers)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: stargazers
- name: People plugin (watchers)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: watchers
- name: People plugin (thanks)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_types: thanks
plugin_people_thanks: lowlighter
- name: People plugin (identicons)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOKEN
plugin_people: yes
plugin_people_identicons: yes

View File

@@ -0,0 +1,7 @@
- name: Posts plugin (dev.to)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_posts: yes
plugin_posts_source: dev.to
plugin_posts_user: lowlighter

View File

@@ -0,0 +1,22 @@
- name: Projects plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_projects: yes
- name: Projects plugin (repositories)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_projects: yes
plugin_projects_repositories: lowlighter/metrics/projects/1
plugin_projects_limit: 0
- name: Projects plugin (descriptions)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_projects: yes
plugin_projects_repositories: lowlighter/metrics/projects/1
plugin_projects_limit: 0
plugin_projects_descriptions: yes

View File

@@ -0,0 +1,5 @@
- name: Stargazers plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_stargazers: yes

View File

@@ -0,0 +1,5 @@
- name: Stars plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_stars: yes

View File

@@ -0,0 +1,69 @@
- name: Topics plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
- name: Topics plugin (starred - starred sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: starred
plugin_topics_sort: starred
- name: Topics plugin (starred - activity sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: starred
plugin_topics_sort: activity
- name: Topics plugin (starred - stars sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: starred
plugin_topics_sort: stars
- name: Topics plugin (starred - random sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: starred
plugin_topics_sort: random
- name: Topics plugin (mastered - starred sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: mastered
plugin_topics_sort: starred
- name: Topics plugin (mastered - activity sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: mastered
plugin_topics_sort: activity
- name: Topics plugin (mastered - stars sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: mastered
plugin_topics_sort: stars
- name: Topics plugin (mastered - random sort)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
plugin_topics: yes
plugin_topics_mode: mastered
plugin_topics_sort: random

View File

@@ -0,0 +1,6 @@
- name: Traffic plugin (default)
uses: lowlighter/metrics@latest
with:
token: MOCKED_TOCKEN
base: repositories
plugin_traffic: yes

View File

@@ -0,0 +1,14 @@
- name: Tweets plugin (default)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_tweets: yes
plugin_tweets_token: MOCKED_TOKEN
- name: Tweets plugin (different user)
uses: lowlighter/metrics@latest
with:
token: NOT_NEEDED
plugin_tweets: yes
plugin_tweets_user: twitterdev
plugin_tweets_token: MOCKED_TOKEN

View File

@@ -11,7 +11,7 @@
//Retrieving single repository //Retrieving single repository
console.debug(`metrics/compute/${login}/${repo} > retrieving single repository ${repo}`) console.debug(`metrics/compute/${login}/${repo} > retrieving single repository ${repo}`)
const {[account]:{repository}} = await graphql(queries.base.repository({login, repo, account})) const {[account === "bypass" ? "user" : account]:{repository}} = await graphql(queries.base.repository({login, repo, account}))
data.user.repositories.nodes = [repository] data.user.repositories.nodes = [repository]
data.repo = repository data.repo = repository

View File

@@ -1,7 +1,3 @@
/**
* @jest-environment node
*/
//Imports //Imports
const processes = require("child_process") const processes = require("child_process")
const yaml = require("js-yaml") const yaml = require("js-yaml")
@@ -33,21 +29,13 @@
//Web instance //Web instance
const web = {} const web = {}
web.run = async (vars) => (await axios(`http://localhost:3000/lowlighter?${new url.URLSearchParams(Object.fromEntries(Object.entries(vars).map(([key, value]) => [key.replace(/^plugin_/, "").replace(/_/g, "."), value])))}`)).status === 200 web.run = async (vars) => (await axios(`http://localhost:3000/lowlighter?${new url.URLSearchParams(Object.fromEntries(Object.entries(vars).map(([key, value]) => [key.replace(/^plugin_/, "").replace(/_/g, "."), value])))}`)).status === 200
beforeAll(async done => { web.start = async () => new Promise(solve => {
await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true}) let stdout = ""
await new Promise((solve, reject) => { web.instance = processes.spawn("node", ["source/app/web/index.mjs"], {env:{...process.env, USE_MOCKED_DATA:true, NO_SETTINGS:true}})
let stdout = "" web.instance.stdout.on("data", data => (stdout += data, /Server ready !/.test(stdout) ? solve() : null))
web.instance = processes.spawn("node", ["source/app/web/index.mjs"], {env:{...process.env, USE_MOCKED_DATA:true, NO_SETTINGS:true}}) web.instance.stderr.on("data", data => console.error(`${data}`))
web.instance.stdout.on("data", data => (stdout += data, /Server ready !/.test(stdout) ? solve() : null))
web.instance.stderr.on("data", data => console.error(`${data}`))
})
done()
})
afterAll(async done => {
await web.instance.kill("SIGKILL")
await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true})
done()
}) })
web.stop = async () => await web.instance.kill("SIGKILL")
//Web instance placeholder //Web instance placeholder
require("./../source/app/web/statics/app.placeholder.js") require("./../source/app/web/statics/app.placeholder.js")
@@ -69,8 +57,42 @@
}) === "string" }) === "string"
} }
//Test cases //Setup
const tests = require("./testscases")() beforeAll(async done => {
//Clean community template
await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true})
//Start web instance
await web.start()
done()
})
//Teardown
afterAll(async done => {
//Stop web instance
await web.stop()
//Clean community template
await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true})
done()
})
//Load metadata (as jest doesn't support ESM modules, we use this dirty hack)
const metadata = JSON.parse(`${processes.spawnSync("node", [
"--input-type", "module",
"--eval", 'import metadata from "./source/app/metrics/metadata.mjs";console.log(JSON.stringify(await metadata({log:false})))'
]).stdout}`)
//Build tests index
const tests = []
for (const name in metadata.plugins) {
const cases = yaml
.load(fs.readFileSync(path.join(__dirname, "../source/plugins", name, "tests.yml"), "utf8"))
.map(({name:test, with:inputs, modes = []}) => {
const skip = new Set(Object.entries(metadata.templates).filter(([_, {readme:{compatibility}}]) => !compatibility[name]).map(([template]) => template))
if (!(metadata.plugins[name].supports.includes("repository")))
skip.add("repository")
return [test, inputs, {skip:[...skip], modes}]
})
tests.push(...cases)
}
//Tests run //Tests run
describe("GitHub Action", () => describe("GitHub Action", () =>
@@ -83,16 +105,7 @@
if ((skip.includes(template))||((modes.length)&&(!modes.includes("action")))) if ((skip.includes(template))||((modes.length)&&(!modes.includes("action"))))
test.skip(name, () => null) test.skip(name, () => null)
else else
test(name, async () => expect(await action.run({ test(name, async () => expect(await action.run({template, base:"", query:JSON.stringify(query), plugins_errors_fatal:true, dryrun:true, use_mocked_data:true, verify:true, ...input})).toBe(true))
token:"MOCKED_TOKEN",
plugin_pagespeed_token:"MOCKED_TOKEN",
plugin_tweets_token:"MOCKED_TOKEN",
plugin_music_token:"MOCKED_CLIENT_ID, MOCKED_CLIENT_SECRET, MOCKED_REFRESH_TOKEN",
template, base:"", query:JSON.stringify(query),
config_timezone:"Europe/Paris",
plugins_errors_fatal:true, dryrun:true, use_mocked_data:true, verify:true,
...input
})).toBe(true), 60*1e3)
}) })
) )
@@ -106,12 +119,7 @@
if ((skip.includes(template))||((modes.length)&&(!modes.includes("web")))) if ((skip.includes(template))||((modes.length)&&(!modes.includes("web"))))
test.skip(name, () => null) test.skip(name, () => null)
else else
test(name, async () => expect(await web.run({ test(name, async () => expect(await web.run({template, base:0, ...query, plugins_errors_fatal:true, verify:true, ...input})).toBe(true))
template, base:0, ...query,
config_timezone:"Europe/Paris",
plugins_errors_fatal:true, verify:true,
...input
})).toBe(true), 60*1e3)
}) })
) )
@@ -124,13 +132,6 @@
if ((skip.includes(template))||((modes.length)&&(!modes.includes("placeholder")))) if ((skip.includes(template))||((modes.length)&&(!modes.includes("placeholder"))))
test.skip(name, () => null) test.skip(name, () => null)
else else
test(name, async () => expect(await placeholder.run({ test(name, async () => expect(await placeholder.run({template, base:0, ...query, ...input})).toBe(true))
template, base:0, ...query,
config_timezone:"Europe/Paris",
plugins_errors_fatal:true, verify:true,
...input
})).toBe(true))
}) })
) )

View File

@@ -1,314 +0,0 @@
/** Test cases */
module.exports = function () {
return [
["Base (header)", {
base:"header",
base_header:true,
}],
["Base (activity", {
base:"activity",
base_activity:true,
}],
["Base (community)", {
base:"community",
base_community:true,
}],
["Base (repositories)", {
base:"repositories",
base_repositories:true,
}],
["Base (metadata)", {
base:"metadata",
base_metadata:true,
}],
["Base (complete)", {
base:"header, activity, community, repositories, metadata",
base_header:true,
base_activity:true,
base_community:true,
base_repositories:true,
base_metadata:true,
}],
["Image output (jpeg)", {
config_output:"jpeg",
}],
["Image output (png)", {
config_output:"png",
}],
["Disable animations", {
config_animations:"no",
}],
["PageSpeed plugin (default)", {
plugin_pagespeed:true,
}],
["PageSpeed plugin (different url)", {
plugin_pagespeed:true,
plugin_pagespeed_url:"github.com",
}],
["PageSpeed plugin (detailed)", {
plugin_pagespeed:true,
plugin_pagespeed_detailed:true,
}],
["PageSpeed plugin (screenshot)", {
plugin_pagespeed:true,
plugin_pagespeed_screenshot:true,
}],
["PageSpeed plugin (complete)", {
plugin_pagespeed:true,
plugin_pagespeed_detailed:true,
plugin_pagespeed_screenshot:true,
}],
["Isocalendar plugin (default)", {
plugin_isocalendar: true,
}, {skip:["terminal", "repository"]}],
["Isocalendar plugin (half-year)", {
plugin_isocalendar: true,
plugin_isocalendar_duration: "half-year",
}, {skip:["terminal", "repository"]}],
["Isocalendar plugin (full-year)", {
plugin_isocalendar: true,
plugin_isocalendar_duration: "full-year",
}, {skip:["terminal", "repository"]}],
["Music plugin (playlist - apple)", {
plugin_music:true,
plugin_music_playlist:"https://embed.music.apple.com/fr/playlist/usr-share/pl.u-V9D7m8Etjmjd0D",
}, {skip:["terminal", "repository"]}],
["Music plugin (playlist - spotify)", {
plugin_music:true,
plugin_music_playlist:"https://open.spotify.com/embed/playlist/3nfA87oeJw4LFVcUDjRcqi",
}, {skip:["terminal", "repository"]}],
["Music plugin (recent - spotify)", {
plugin_music:true,
plugin_music_provider: "spotify",
}, {skip:["terminal", "repository"]}],
["Music plugin (recent - lastfm)", {
plugin_music:true,
plugin_music_provider: "lastfm",
plugin_music_user: "RJ",
}, {skip:["terminal", "repository"]}],
["Language plugin (default)", {
plugin_languages:true,
}],
["Language plugin (ignored languages)", {
plugin_languages:true,
plugin_languages_ignored:"html, css, dockerfile",
}],
["Language plugin (skipped repositories)", {
plugin_languages:true,
plugin_languages_skipped:"metrics",
}],
["Language plugin (custom color set)", {
plugin_languages:true,
plugin_languages_colors:"0:ff0000,1:red",
}],
["Language plugin (custom color set)", {
plugin_languages:true,
plugin_languages_colors:"complementary",
}],
["Language plugin (with details)", {
plugin_languages:true,
plugin_languages_details:"percentage",
}],
["Language plugin (complete)", {
plugin_languages:true,
plugin_languages_ignored:"html, css, dockerfile",
plugin_languages_skipped:"metrics",
plugin_languages_colors:"rainbow",
plugin_languages_details:"bytes-size, percentage",
}],
["Follow-up plugin (default)", {
plugin_followup:true,
}],
["Topics plugin (default)", {
plugin_topics:true,
}, {skip:["terminal", "repository"]}],
["Topics plugin (starred - starred sort)", {
plugin_topics:true,
plugin_topics_mode:"starred",
plugin_topics_sort:"starred",
}, {skip:["terminal", "repository"]}],
["Topics plugin (starred - activity sort)", {
plugin_topics:true,
plugin_topics_mode:"starred",
plugin_topics_sort:"activity",
}, {skip:["terminal", "repository"]}],
["Topics plugin (starred - stars sort)", {
plugin_topics:true,
plugin_topics_mode:"starred",
plugin_topics_sort:"stars",
}, {skip:["terminal", "repository"]}],
["Topics plugin (starred - random sort)", {
plugin_topics:true,
plugin_topics_mode:"starred",
plugin_topics_sort:"random",
}, {skip:["terminal", "repository"]}],
["Topics plugin (mastered - starred sort)", {
plugin_topics:true,
plugin_topics_mode:"mastered",
plugin_topics_sort:"starred",
}, {skip:["terminal", "repository"]}],
["Topics plugin (mastered - activity sort)", {
plugin_topics:true,
plugin_topics_mode:"mastered",
plugin_topics_sort:"activity",
}, {skip:["terminal", "repository"]}],
["Topics plugin (mastered - stars sort)", {
plugin_topics:true,
plugin_topics_mode:"mastered",
plugin_topics_sort:"stars",
}, {skip:["terminal", "repository"]}],
["Topics plugin (mastered - random sort)", {
plugin_topics:true,
plugin_topics_mode:"mastered",
plugin_topics_sort:"random",
}, {skip:["terminal", "repository"]}],
["Projects plugin (default)", {
plugin_projects:true,
}, {skip:["terminal"]}],
["Projects plugin (repositories)", {
plugin_projects:true,
plugin_projects_repositories:"lowlighter/metrics/projects/1",
plugin_projects_limit:0,
}, {skip:["terminal"]}],
["Projects plugin (descriptions)", {
plugin_projects:true,
plugin_projects_repositories:"lowlighter/metrics/projects/1",
plugin_projects_limit:0,
plugin_projects_descriptions:true,
}, {skip:["terminal"]}],
["Lines plugin (default)", {
base:"repositories",
plugin_lines:true,
}],
["Traffic plugin (default)", {
base:"repositories",
plugin_traffic:true,
}],
["Tweets plugin (default)", {
plugin_tweets:true,
}, {skip:["terminal", "repository"]}],
["Tweets plugin (different user)", {
plugin_tweets:true,
plugin_tweets_user:"twitterdev",
}, {skip:["terminal", "repository"]}],
["Posts plugin (dev.to)", {
user:"lowlighter",
plugin_posts:true,
plugin_posts_source:"dev.to",
}, {skip:["terminal", "repository"]}],
["Habits plugin (default)", {
plugin_habits:true,
plugin_habits_from:5,
}, {skip:["terminal", "repository"]}],
["Habits plugin (charts)", {
plugin_habits:true,
plugin_habits_from:5,
plugin_habits_charts:true,
}, {skip:["terminal", "repository"]}],
["Habits plugin (facts)", {
plugin_habits:true,
plugin_habits_from:5,
plugin_habits_facts:true,
}, {skip:["terminal", "repository"]}],
["Habits plugin (complete)", {
plugin_habits:true,
plugin_habits_from:5,
plugin_habits_charts:true,
}, {skip:["terminal", "repository"]}],
["Activity plugin (default)", {
plugin_activity:true,
plugin_activity_limit:100,
plugin_activity_days:14,
plugin_activity_filter:"all",
}, {skip:["terminal", "repository"]}],
["Activity plugin (filtered)", {
plugin_activity:true,
plugin_activity_filter:"pr, issue",
}, {skip:["terminal", "repository"]}],
["Stars plugin (default)", {
plugin_stars:true,
}, {skip:["terminal", "repository"]}],
["Stargazers plugin (default)", {
plugin_stargazers:true,
}, {skip:["terminal"]}],
["Gists plugin (default)", {
plugin_gists:true,
}, {skip:["terminal", "repository"]}],
["People plugin (default)", {
plugin_people:true,
}, {skip:["terminal", "repository"]}],
["People plugin (followers)", {
plugin_people:true,
plugin_people_types:"followers",
}, {skip:["terminal", "repository"]}],
["People plugin (following)", {
plugin_people:true,
plugin_people_types:"following",
}, {skip:["terminal", "repository"]}],
["People plugin (sponsoring)", {
plugin_people:true,
plugin_people_types:"sponsoring",
}, {skip:["terminal", "repository"]}],
["People plugin (sponsors)", {
plugin_people:true,
plugin_people_types:"sponsors",
}, {skip:["terminal"]}],
["People plugin (stargazers)", {
plugin_people:true,
plugin_people_types:"stargazers",
}, {skip:["classic", "terminal"]}],
["People plugin (watchers)", {
plugin_people:true,
plugin_people_types:"watchers",
}, {skip:["classic", "terminal"]}],
["People plugin (thanks)", {
plugin_people:true,
plugin_people_types:"thanks",
plugin_people_thanks:"lowlighter",
}, {skip:["classic", "terminal"]}],
["People plugin (identicons)", {
plugin_people:true,
plugin_people_identicons:true,
}, {skip:["terminal", "repository"]}],
["Anilist plugin (default)", {
plugin_anilist:true,
}, {skip:["terminal", "repository"]}],
["Anilist plugin (manga only)", {
plugin_anilist:true,
plugin_anilist_medias:"manga",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (anime only)", {
plugin_anilist:true,
plugin_anilist_medias:"anime",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (favorites section)", {
plugin_anilist:true,
plugin_anilist_sections:"favorites",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (watching/reading section)", {
plugin_anilist:true,
plugin_anilist_sections:"watching, reading",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (characters section)", {
plugin_anilist:true,
plugin_anilist_sections:"characters",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (additional options)", {
plugin_anilist:true,
plugin_anilist_limit:0,
plugin_anilist_shuffle:false,
plugin_anilist_user:"anilist",
}, {skip:["terminal", "repository"]}],
["Anilist plugin (complete)", {
plugin_anilist:true,
plugin_anilist_medias:"manga, anime",
plugin_anilist_sections:"favorites, watching, reading, characters",
plugin_anilist_limit:0,
plugin_anilist_shuffle:false,
}, {skip:["terminal", "repository"]}],
["Community templates", {
template:"@classic",
setup_community_templates:"lowlighter/metrics@master:classic",
}, {skip:["terminal", "repository"], modes:["action"]}]
]
}