diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js index 6c505854ba181..b68f6bdd53b6c 100644 --- a/services/codecov/codecov.service.js +++ b/services/codecov/codecov.service.js @@ -1,6 +1,6 @@ import Joi from 'joi' import { coveragePercentage } from '../color-formatters.js' -import { BaseSvgScrapingService } from '../index.js' +import { BaseSvgScrapingService, pathParam, queryParam } from '../index.js' import { parseJson } from '../../core/base-service/json.js' // https://docs.codecov.io/reference#totals @@ -35,12 +35,12 @@ const svgValueMatcher = />(\d{1,3}%|unknown)<\/text><\/g>/ const badgeTokenPattern = /^\w{10}$/ -const documentation = ` +const description = `

You may specify a Codecov badge token to get coverage for a private repository.

- You can find the token under the badge section of your project settings page, in this url: https://codecov.io/{vcsName}/{user}/{repo}/settings/badge. + You can find the token under the badge section of your project settings page, in this url: https://codecov.io/<vcsName>/<user>/<repo>/settings/badge.

` @@ -54,39 +54,43 @@ export default class Codecov extends BaseSvgScrapingService { queryParamSchema, } - static examples = [ - { - title: 'Codecov', - pattern: ':vcsName(github|gh|bitbucket|bb|gl|gitlab)/:user/:repo', - namedParams: { - vcsName: 'github', - user: 'codecov', - repo: 'example-node', + static openApi = { + '/codecov/c/{vcsName}/{user}/{repo}': { + get: { + summary: 'Codecov', + description, + parameters: [ + pathParam({ + name: 'vcsName', + example: 'github', + schema: { type: 'string', enum: this.getEnum('vcsName') }, + }), + pathParam({ name: 'user', example: 'codecov' }), + pathParam({ name: 'repo', example: 'example-node' }), + queryParam({ name: 'token', example: 'a1b2c3d4e5' }), + queryParam({ name: 'flag', example: 'flag_name' }), + ], }, - queryParams: { - token: 'a1b2c3d4e5', - flag: 'flag_name', - }, - staticPreview: this.render({ coverage: 90 }), - documentation, }, - { - title: 'Codecov branch', - pattern: ':vcsName(github|gh|bitbucket|bb|gl|gitlab)/:user/:repo/:branch', - namedParams: { - vcsName: 'github', - user: 'codecov', - repo: 'example-node', - branch: 'master', - }, - queryParams: { - token: 'a1b2c3d4e5', - flag: 'flag_name', + '/codecov/c/{vcsName}/{user}/{repo}/{branch}': { + get: { + summary: 'Codecov (with branch)', + description, + parameters: [ + pathParam({ + name: 'vcsName', + example: 'github', + schema: { type: 'string', enum: this.getEnum('vcsName') }, + }), + pathParam({ name: 'user', example: 'codecov' }), + pathParam({ name: 'repo', example: 'example-node' }), + pathParam({ name: 'branch', example: 'master' }), + queryParam({ name: 'token', example: 'a1b2c3d4e5' }), + queryParam({ name: 'flag', example: 'flag_name' }), + ], }, - staticPreview: this.render({ coverage: 90 }), - documentation, }, - ] + } static defaultBadgeData = { label: 'coverage' } diff --git a/services/obs/obs.service.js b/services/obs/obs.service.js index f45f60cfdf9e7..11111f2783d14 100644 --- a/services/obs/obs.service.js +++ b/services/obs/obs.service.js @@ -1,5 +1,5 @@ import Joi from 'joi' -import { BaseXmlService } from '../index.js' +import { BaseXmlService, pathParam, queryParam } from '../index.js' import { optionalUrl } from '../validators.js' import { isBuildStatus, renderBuildStatusBadge } from './obs-build-status.js' @@ -26,23 +26,22 @@ export default class ObsService extends BaseXmlService { isRequired: true, } - static examples = [ - { - title: 'OBS package build status', - namedParams: { - project: 'openSUSE:Tools', - packageName: 'osc', - repository: 'Debian_11', - arch: 'x86_64', + static openApi = { + '/obs/{project}/{packageName}/{repository}/{arch}': { + get: { + summary: 'OBS package build status', + description: + '[Open Build Service](https://openbuildservice.org/) (OBS) is a generic system to build and distribute binary packages', + parameters: [ + pathParam({ name: 'project', example: 'openSUSE:Tools' }), + pathParam({ name: 'packageName', example: 'osc' }), + pathParam({ name: 'repository', example: 'Debian_11' }), + pathParam({ name: 'arch', example: 'x86_64' }), + queryParam({ name: 'instance', example: 'https://api.opensuse.org' }), + ], }, - queryParams: { instance: 'https://api.opensuse.org' }, - staticPreview: this.render({ - repository: 'Debian_11', - status: 'succeeded', - }), - keywords: ['open build service'], }, - ] + } static defaultBadgeData = { label: 'build' } diff --git a/services/scrutinizer/scrutinizer-build.service.js b/services/scrutinizer/scrutinizer-build.service.js index a48a3ada7c142..0374fefd4a50a 100644 --- a/services/scrutinizer/scrutinizer-build.service.js +++ b/services/scrutinizer/scrutinizer-build.service.js @@ -1,5 +1,6 @@ import Joi from 'joi' import { isBuildStatus, renderBuildStatusBadge } from '../build-status.js' +import { pathParams } from '../index.js' import ScrutinizerBase from './scrutinizer-base.js' const schema = Joi.object({ @@ -38,19 +39,39 @@ class ScrutinizerBuild extends ScrutinizerBuildBase { pattern: ':vcs(g|b)/:user/:repo/:branch*', } - static examples = [ - { - title: 'Scrutinizer build (GitHub/Bitbucket)', - pattern: ':vcs(g|b)/:user/:repo/:branch?', - namedParams: { - vcs: 'g', - user: 'filp', - repo: 'whoops', - branch: 'master', + static openApi = { + '/scrutinizer/build/{vcs}/{user}/{repo}': { + get: { + summary: 'Scrutinizer build (GitHub/Bitbucket)', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + ), }, - staticPreview: renderBuildStatusBadge({ status: 'passing' }), }, - ] + '/scrutinizer/build/{vcs}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer build (GitHub/Bitbucket) with branch', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ vcs, user, repo, branch }) { return this.makeBadge({ @@ -71,19 +92,29 @@ class ScrutinizerGitLabBuild extends ScrutinizerBuildBase { // The example used is valid, but the project will not be accessible if Shields users try to use it. // https://gitlab.propertywindow.nl/propertywindow/client // https://scrutinizer-ci.com/gl/propertywindow/propertywindow/client/badges/quality-score.png?b=master&s=dfae6992a48184cc2333b4c349cec0447f0d67c2 - static examples = [ - { - title: 'Scrutinizer build (GitLab)', - pattern: ':instance/:user/:repo/:branch?', - namedParams: { - instance: 'propertywindow', - user: 'propertywindow', - repo: 'client', - branch: 'master', + static openApi = { + '/scrutinizer/build/gl/{instance}/{user}/{repo}': { + get: { + summary: 'Scrutinizer build (GitLab)', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + ), }, - staticPreview: renderBuildStatusBadge({ status: 'passing' }), }, - ] + '/scrutinizer/build/gl/{instance}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer build (GitLab) with branch', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ instance, user, repo, branch }) { return this.makeBadge({ diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js index 77bd5c73e17f7..c8803bbf84a06 100644 --- a/services/scrutinizer/scrutinizer-coverage.service.js +++ b/services/scrutinizer/scrutinizer-coverage.service.js @@ -1,6 +1,6 @@ import Joi from 'joi' import { colorScale } from '../color-formatters.js' -import { NotFound } from '../index.js' +import { NotFound, pathParams } from '../index.js' import ScrutinizerBase from './scrutinizer-base.js' const schema = Joi.object({ @@ -70,19 +70,39 @@ class ScrutinizerCoverage extends ScrutinizerCoverageBase { pattern: ':vcs(g|b)/:user/:repo/:branch*', } - static examples = [ - { - title: 'Scrutinizer coverage (GitHub/BitBucket)', - pattern: ':vcs(g|b)/:user/:repo/:branch?', - namedParams: { - vcs: 'g', - user: 'filp', - repo: 'whoops', - branch: 'master', + static openApi = { + '/scrutinizer/coverage/{vcs}/{user}/{repo}': { + get: { + summary: 'Scrutinizer coverage (GitHub/Bitbucket)', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + ), }, - staticPreview: this.render({ coverage: 86 }), }, - ] + '/scrutinizer/coverage/{vcs}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer coverage (GitHub/Bitbucket) with branch', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ vcs, user, repo, branch }) { return this.makeBadge({ @@ -103,19 +123,29 @@ class ScrutinizerCoverageGitLab extends ScrutinizerCoverageBase { // The example used is valid, but the project will not be accessible if Shields users try to use it. // https://gitlab.propertywindow.nl/propertywindow/client // https://scrutinizer-ci.com/gl/propertywindow/propertywindow/client/badges/quality-score.png?b=master&s=dfae6992a48184cc2333b4c349cec0447f0d67c2 - static examples = [ - { - title: 'Scrutinizer coverage (GitLab)', - pattern: ':instance/:user/:repo/:branch?', - namedParams: { - instance: 'propertywindow', - user: 'propertywindow', - repo: 'client', - branch: 'master', + static openApi = { + '/scrutinizer/coverage/gl/{instance}/{user}/{repo}': { + get: { + summary: 'Scrutinizer coverage (GitLab)', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + ), }, - staticPreview: this.render({ coverage: 94 }), }, - ] + '/scrutinizer/coverage/gl/{instance}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer coverage (GitLab) with branch', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ instance, user, repo, branch }) { return this.makeBadge({ diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js index f0b69896fba60..8ef4271723278 100644 --- a/services/scrutinizer/scrutinizer-quality.service.js +++ b/services/scrutinizer/scrutinizer-quality.service.js @@ -1,5 +1,6 @@ import Joi from 'joi' import { colorScale } from '../color-formatters.js' +import { pathParams } from '../index.js' import ScrutinizerBase from './scrutinizer-base.js' const schema = Joi.object({ @@ -58,19 +59,39 @@ class ScrutinizerQuality extends ScrutinizerQualityBase { pattern: ':vcs(g|b)/:user/:repo/:branch*', } - static examples = [ - { - title: 'Scrutinizer code quality (GitHub/Bitbucket)', - pattern: ':vcs(g|b)/:user/:repo/:branch?', - namedParams: { - vcs: 'g', - user: 'filp', - repo: 'whoops', - branch: 'master', + static openApi = { + '/scrutinizer/quality/{vcs}/{user}/{repo}': { + get: { + summary: 'Scrutinizer quality (GitHub/Bitbucket)', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + ), }, - staticPreview: this.render({ score: 8.26 }), }, - ] + '/scrutinizer/quality/{vcs}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer quality (GitHub/Bitbucket) with branch', + parameters: pathParams( + { + name: 'vcs', + example: 'g', + description: 'Platform: Either Github or Bitbucket', + schema: { type: 'string', enum: this.getEnum('vcs') }, + }, + { name: 'user', example: 'filp' }, + { name: 'repo', example: 'whoops' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ vcs, user, repo, branch }) { return this.makeBadge({ @@ -91,19 +112,29 @@ class ScrutinizerQualityGitLab extends ScrutinizerQualityBase { // The example used is valid, but the project will not be accessible if Shields users try to use it. // https://gitlab.propertywindow.nl/propertywindow/client // https://scrutinizer-ci.com/gl/propertywindow/propertywindow/client/badges/quality-score.png?b=master&s=dfae6992a48184cc2333b4c349cec0447f0d67c2 - static examples = [ - { - title: 'Scrutinizer coverage (GitLab)', - pattern: ':instance/:user/:repo/:branch?', - namedParams: { - instance: 'propertywindow', - user: 'propertywindow', - repo: 'client', - branch: 'master', + static openApi = { + '/scrutinizer/quality/gl/{instance}/{user}/{repo}': { + get: { + summary: 'Scrutinizer quality (GitLab)', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + ), }, - staticPreview: this.render({ score: 10.0 }), }, - ] + '/scrutinizer/quality/gl/{instance}/{user}/{repo}/{branch}': { + get: { + summary: 'Scrutinizer quality (GitLab) with branch', + parameters: pathParams( + { name: 'instance', example: 'propertywindow' }, + { name: 'user', example: 'propertywindow' }, + { name: 'repo', example: 'client' }, + { name: 'branch', example: 'master' }, + ), + }, + }, + } async handle({ instance, user, repo, branch }) { return this.makeBadge({ diff --git a/services/sourceforge/sourceforge-downloads.service.js b/services/sourceforge/sourceforge-downloads.service.js index 134c52f20cd82..c0ed9c592d667 100644 --- a/services/sourceforge/sourceforge-downloads.service.js +++ b/services/sourceforge/sourceforge-downloads.service.js @@ -2,7 +2,7 @@ import Joi from 'joi' import dayjs from 'dayjs' import { renderDownloadsBadge } from '../downloads.js' import { nonNegativeInteger } from '../validators.js' -import { BaseJsonService } from '../index.js' +import { BaseJsonService, pathParams } from '../index.js' const schema = Joi.object({ total: nonNegativeInteger, @@ -32,36 +32,40 @@ export default class SourceforgeDownloads extends BaseJsonService { static route = { base: 'sourceforge', - pattern: ':interval(dt|dm|dw|dd)/:project/:folder*', + pattern: ':interval(dd|dw|dm|dt)/:project/:folder*', } - static examples = [ - { - title: 'SourceForge Downloads', - pattern: ':interval(dt|dm|dw|dd)/:project', - namedParams: { - interval: 'dm', - project: 'sevenzip', + static openApi = { + '/sourceforge/{interval}/{project}': { + get: { + summary: 'SourceForge Downloads', + parameters: pathParams( + { + name: 'interval', + example: 'dm', + description: 'Daily, Weekly, Monthly, or Total downloads', + schema: { type: 'string', enum: this.getEnum('interval') }, + }, + { name: 'project', example: 'sevenzip' }, + ), }, - staticPreview: this.render({ - downloads: 215990, - interval: 'dm', - }), }, - { - title: 'SourceForge Downloads (folder)', - pattern: ':interval(dt|dm|dw|dd)/:project/:folder', - namedParams: { - interval: 'dm', - project: 'arianne', - folder: 'stendhal', + '/sourceforge/{interval}/{project}/{folder}': { + get: { + summary: 'SourceForge Downloads (folder)', + parameters: pathParams( + { + name: 'interval', + example: 'dm', + description: 'Daily, Weekly, Monthly, or Total downloads', + schema: { type: 'string', enum: this.getEnum('interval') }, + }, + { name: 'project', example: 'arianne' }, + { name: 'folder', example: 'stendhal' }, + ), }, - staticPreview: this.render({ - downloads: 550, - interval: 'dm', - }), }, - ] + } static defaultBadgeData = { label: 'sourceforge' }