Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deprecate [tokei] service #9581

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
86 changes: 11 additions & 75 deletions services/tokei/tokei.service.js
@@ -1,75 +1,11 @@
import Joi from 'joi'
import { metric } from '../text-formatters.js'
import { nonNegativeInteger } from '../validators.js'
import { BaseJsonService } from '../index.js'

const schema = Joi.object({
lines: nonNegativeInteger,
}).required()

const documentation = `
The \`provider\` is the domain name of git host.
If no TLD is provided, \`.com\` will be added.
For example, setting \`gitlab\` or \`bitbucket.org\` as the
provider also works.

Tokei will automatically count all files with a recognized extension. It will
automatically ignore files and folders in \`.ignore\` files. If you
want to ignore files or folders specifically for tokei, add them to the
\`.tokeignore\` in the root of your repository. See
[https://github.com/XAMPPRocky/tokei#excluding-folders](https://github.com/XAMPPRocky/tokei#excluding-folders)
for more info.
`

export default class Tokei extends BaseJsonService {
static category = 'size'

static route = { base: 'tokei/lines', pattern: ':provider/:user/:repo' }

static examples = [
{
title: 'Lines of code',
namedParams: {
provider: 'github',
user: 'badges',
repo: 'shields',
},
staticPreview: this.render({ lines: 119500 }),
keywords: ['loc', 'tokei'],
documentation,
},
]

static defaultBadgeData = {
label: 'total lines',
color: 'blue',
}

static render({ lines }) {
return { message: metric(lines) }
}

async fetch({ provider, user, repo }) {
// This request uses the tokei-rs (https://github.com/XAMPPRocky/tokei_rs) API.
//
// By default, the API returns an svg, but when the Accept HTTP header is set to
// `application/json`, it sends json data. The `_requestJson` method
// automatically sets the Accept Header to what we need, so we don't need to
// specify it here.
//
// This behaviour of the API is "documented" here:
// https://github.com/XAMPPRocky/tokei_rs/issues/8#issuecomment-475071147
return this._requestJson({
schema,
url: `https://tokei.rs/b1/${provider}/${user}/${repo}`,
httpErrors: {
400: 'repo not found',
},
})
}

async handle({ provider, user, repo }) {
const { lines } = await this.fetch({ provider, user, repo })
return this.constructor.render({ lines })
}
}
import { deprecatedService } from '../index.js'

export const Tokei = deprecatedService({
category: 'size',
route: {
base: 'tokei/lines',
pattern: ':various*',
},
label: 'tokei',
dateAdded: new Date('2023-09-17'),
})
23 changes: 2 additions & 21 deletions services/tokei/tokei.tester.js
@@ -1,30 +1,11 @@
import { ServiceTester } from '../tester.js'
import { isMetric } from '../test-validators.js'

export const t = new ServiceTester({ id: 'tokei', title: 'Tokei LOC Tests' })

t.create('GitHub LOC')
.get('/lines/github/badges/shields.json')
.expectBadge({ label: 'total lines', message: isMetric })

t.create('GitLab LOC')
.get('/lines/gitlab/shields-ops-group/tag-test.json')
.timeout(15000)
.expectBadge({ label: 'total lines', message: isMetric })

t.create('GitHub LOC (with .com)')
.get('/lines/github.com/badges/shields.json')
.expectBadge({ label: 'total lines', message: isMetric })

t.create('GitLab LOC (with .com)')
.get('/lines/gitlab.com/shields-ops-group/tag-test.json')
.timeout(15000)
.expectBadge({ label: 'total lines', message: isMetric })
.expectBadge({ label: 'tokei', message: 'no longer available' })

t.create('BitBucket LOC')
.get('/lines/bitbucket.org/MonliH/tokei-shields-test.json')
.expectBadge({ label: 'total lines', message: isMetric })

t.create('Invalid Provider')
.get('/lines/example/tezos/tezos.json')
.expectBadge({ label: 'total lines', message: 'repo not found' })
.expectBadge({ label: 'tokei', message: 'no longer available' })