From 94edf013fcb4ef4f22dc7476da7486cb61c3d6a4 Mon Sep 17 00:00:00 2001 From: Joe Izzard Date: Mon, 2 Sep 2024 13:44:00 +0100 Subject: [PATCH 1/5] add file_url param Add file_url param to allow pulling from non-github sources --- services/osslifecycle/osslifecycle.service.js | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/services/osslifecycle/osslifecycle.service.js b/services/osslifecycle/osslifecycle.service.js index 0e4f2303fa128..6bb6324d56496 100644 --- a/services/osslifecycle/osslifecycle.service.js +++ b/services/osslifecycle/osslifecycle.service.js @@ -1,4 +1,11 @@ -import { BaseService, InvalidResponse, pathParams } from '../index.js' +import Joi from 'joi' +import { optionalUrl } from '../validators.js' +import { + BaseService, + InvalidResponse, + pathParams, + queryParam, +} from '../index.js' const description = ` OSS Lifecycle is an initiative started by Netflix to classify open-source projects into lifecycles @@ -9,18 +16,38 @@ single line similar to the following: \`osslifecycle=active\`. Other suggested v can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstracker). ` +const queryParamSchema = Joi.object({ + file_url: optionalUrl, +}).required() + export default class OssTracker extends BaseService { static category = 'other' static route = { - base: 'osslifecycle', - pattern: ':user/:repo/:branch*', + base: '', + pattern: 'osslifecycle/:user?/:repo?/:branch*', + queryParamSchema, } static openApi = { + '/osslifecycle': { + get: { + summary: 'OSS Lifecycle (From URL)', + description, + parameters: [ + queryParam({ + name: 'file_url', + example: + 'https://raw.githubusercontent.com/Netflix/aws-autoscaling/master/OSSMETADATA', + required: true, + description: 'URL for the `OSSMETADATA` file', + }), + ], + }, + }, '/osslifecycle/{user}/{repo}': { get: { - summary: 'OSS Lifecycle', + summary: 'OSS Lifecycle (GitHub)', description, parameters: pathParams( { @@ -36,7 +63,7 @@ export default class OssTracker extends BaseService { }, '/osslifecycle/{user}/{repo}/{branch}': { get: { - summary: 'OSS Lifecycle (branch)', + summary: 'OSS Lifecycle (GitHub branch)', description, parameters: pathParams( { @@ -87,17 +114,24 @@ export default class OssTracker extends BaseService { } } - async fetch({ user, repo, branch }) { - return this._request({ - url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/OSSMETADATA`, - }) + async fetch({ user, repo, branch, fileUrl }) { + if (fileUrl) { + return this._request({ + url: fileUrl, + }) + } else { + return this._request({ + url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/OSSMETADATA`, + }) + } } - async handle({ user, repo, branch }) { + async handle({ user, repo, branch }, { file_url: fileUrl = '' }) { const { buffer } = await this.fetch({ user, repo, branch: branch || 'HEAD', + fileUrl, }) try { const status = buffer.match(/osslifecycle=([a-z]+)/im)[1] From 0f30709816237a3c5f5c5aeff10fe7adee705101 Mon Sep 17 00:00:00 2001 From: Joe Izzard Date: Mon, 2 Sep 2024 13:54:27 +0100 Subject: [PATCH 2/5] add test for file_url param Add test using file_url variant of OSS Lifecycle badge using Netflix OSSTracker repo --- services/osslifecycle/osslifecycle.tester.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/osslifecycle/osslifecycle.tester.js b/services/osslifecycle/osslifecycle.tester.js index 829af85f03c24..fae69c14f2dee 100644 --- a/services/osslifecycle/osslifecycle.tester.js +++ b/services/osslifecycle/osslifecycle.tester.js @@ -60,3 +60,13 @@ t.create('oss metadata not found').get('/PyvesB/empty-repo.json').expectBadge({ label: 'oss lifecycle', message: 'not found', }) + +t.create('osslifecycle status (file)') + .get( + '.json?file_url=https://raw.githubusercontent.com/Netflix/osstracker/master/OSSMETADATA', + ) + .expectBadge({ + label: 'oss lifecycle', + message: 'active', + color: 'brightgreen', + }) From c7888a13630ca10291ad820790850d722676a53f Mon Sep 17 00:00:00 2001 From: Joe Izzard Date: Mon, 2 Sep 2024 18:34:05 +0100 Subject: [PATCH 3/5] remove old pattern from main service Remove all references and code for the old /{user}/{repo} and /{user}/{repo}/{branch} functionality. This will be replaced by a redirect service. Also updated all tests to use the new file_url method --- services/osslifecycle/osslifecycle.service.js | 66 +++---------------- services/osslifecycle/osslifecycle.tester.js | 53 +++++++-------- 2 files changed, 35 insertions(+), 84 deletions(-) diff --git a/services/osslifecycle/osslifecycle.service.js b/services/osslifecycle/osslifecycle.service.js index 6bb6324d56496..3fc00436ae365 100644 --- a/services/osslifecycle/osslifecycle.service.js +++ b/services/osslifecycle/osslifecycle.service.js @@ -1,11 +1,6 @@ import Joi from 'joi' import { optionalUrl } from '../validators.js' -import { - BaseService, - InvalidResponse, - pathParams, - queryParam, -} from '../index.js' +import { BaseService, InvalidResponse, queryParam } from '../index.js' const description = ` OSS Lifecycle is an initiative started by Netflix to classify open-source projects into lifecycles @@ -17,7 +12,7 @@ can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstrac ` const queryParamSchema = Joi.object({ - file_url: optionalUrl, + file_url: optionalUrl.required(), }).required() export default class OssTracker extends BaseService { @@ -25,14 +20,14 @@ export default class OssTracker extends BaseService { static route = { base: '', - pattern: 'osslifecycle/:user?/:repo?/:branch*', + pattern: 'osslifecycle', queryParamSchema, } static openApi = { '/osslifecycle': { get: { - summary: 'OSS Lifecycle (From URL)', + summary: 'OSS Lifecycle', description, parameters: [ queryParam({ @@ -45,42 +40,6 @@ export default class OssTracker extends BaseService { ], }, }, - '/osslifecycle/{user}/{repo}': { - get: { - summary: 'OSS Lifecycle (GitHub)', - description, - parameters: pathParams( - { - name: 'user', - example: 'Teevity', - }, - { - name: 'repo', - example: 'ice', - }, - ), - }, - }, - '/osslifecycle/{user}/{repo}/{branch}': { - get: { - summary: 'OSS Lifecycle (GitHub branch)', - description, - parameters: pathParams( - { - name: 'user', - example: 'Netflix', - }, - { - name: 'repo', - example: 'osstracker', - }, - { - name: 'branch', - example: 'documentation', - }, - ), - }, - }, } static defaultBadgeData = { label: 'oss lifecycle' } @@ -114,23 +73,14 @@ export default class OssTracker extends BaseService { } } - async fetch({ user, repo, branch, fileUrl }) { - if (fileUrl) { - return this._request({ - url: fileUrl, - }) - } else { - return this._request({ - url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/OSSMETADATA`, - }) - } + async fetch({ fileUrl }) { + return this._request({ + url: fileUrl, + }) } async handle({ user, repo, branch }, { file_url: fileUrl = '' }) { const { buffer } = await this.fetch({ - user, - repo, - branch: branch || 'HEAD', fileUrl, }) try { diff --git a/services/osslifecycle/osslifecycle.tester.js b/services/osslifecycle/osslifecycle.tester.js index fae69c14f2dee..2599d936bdbf8 100644 --- a/services/osslifecycle/osslifecycle.tester.js +++ b/services/osslifecycle/osslifecycle.tester.js @@ -5,14 +5,20 @@ export const t = new ServiceTester({ title: 'OSS Lifecycle', }) -t.create('osslifecycle active status').get('/netflix/sureal.json').expectBadge({ - label: 'oss lifecycle', - message: 'active', - color: 'brightgreen', -}) +t.create('osslifecycle active status') + .get( + '.json?file_url=https://raw.githubusercontent.com/Netflix/sureal/HEAD/OSSMETADATA', + ) + .expectBadge({ + label: 'oss lifecycle', + message: 'active', + color: 'brightgreen', + }) t.create('osslifecycle maintenance status') - .get('/Teevity/ice.json') + .get( + '.json?file_url=https://raw.githubusercontent.com/Teevity/ice/HEAD/OSSMETADATA', + ) .expectBadge({ label: 'oss lifecycle', message: 'maintenance', @@ -20,28 +26,29 @@ t.create('osslifecycle maintenance status') }) t.create('osslifecycle archived status') - .get('/Netflix/rx-aws-java-sdk.json') + .get( + '.json?file_url=https://raw.githubusercontent.com/Netflix/rx-aws-java-sdk/HEAD/OSSMETADATA', + ) .expectBadge({ label: 'oss lifecycle', message: 'archived', color: 'red', }) -t.create('osslifecycle other status').get('/Netflix/metacat.json').expectBadge({ - label: 'oss lifecycle', - message: 'private', - color: 'lightgrey', -}) - -t.create('osslifecycle status (branch)') - .get('/Netflix/osstracker/documentation.json') +t.create('osslifecycle other status') + .get( + '.json?file_url=https://raw.githubusercontent.com/Netflix/metacat/HEAD/OSSMETADATA', + ) .expectBadge({ label: 'oss lifecycle', - message: 'active', + message: 'private', + color: 'lightgrey', }) t.create('oss metadata in unexpected format') - .get('/some-user/some-project.json') + .get( + '.json?file_url=https://raw.githubusercontent.com/some-user/some-project/HEAD/OSSMETADATA', + ) .intercept( nock => nock('https://raw.githubusercontent.com') @@ -56,17 +63,11 @@ t.create('oss metadata in unexpected format') message: 'metadata in unexpected format', }) -t.create('oss metadata not found').get('/PyvesB/empty-repo.json').expectBadge({ - label: 'oss lifecycle', - message: 'not found', -}) - -t.create('osslifecycle status (file)') +t.create('oss metadata not found') .get( - '.json?file_url=https://raw.githubusercontent.com/Netflix/osstracker/master/OSSMETADATA', + '.json?file_url=https://raw.githubusercontent.com/PyvesB/empty-repo/HEAD/OSSMETADATA', ) .expectBadge({ label: 'oss lifecycle', - message: 'active', - color: 'brightgreen', + message: 'not found', }) From e28933db613d9fdfbcd40ba07f831c77a7f239e3 Mon Sep 17 00:00:00 2001 From: Joe Izzard Date: Mon, 2 Sep 2024 21:42:20 +0100 Subject: [PATCH 4/5] add osslifecycle redirector add a redirector for the original osslifecycle pattern --- .../osslifecycle-redirector.service.js | 20 ++++++++++++++ .../osslifecycle-redirector.tester.js | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 services/osslifecycle/osslifecycle-redirector.service.js create mode 100644 services/osslifecycle/osslifecycle-redirector.tester.js diff --git a/services/osslifecycle/osslifecycle-redirector.service.js b/services/osslifecycle/osslifecycle-redirector.service.js new file mode 100644 index 0000000000000..abdefb0a91536 --- /dev/null +++ b/services/osslifecycle/osslifecycle-redirector.service.js @@ -0,0 +1,20 @@ +import { redirector } from '../index.js' + +const commonProps = { + category: 'other', + dateAdded: new Date('2024-09-02'), +} + +export default [ + redirector({ + route: { + base: 'osslifecycle', + pattern: ':user/:repo/:branch*', + }, + transformPath: () => '/osslifecycle', + transformQueryParams: ({ user, repo, branch }) => ({ + file_url: `https://raw.githubusercontent.com/${user}/${repo}/${branch || 'HEAD'}/OSSMETADATA`, + }), + ...commonProps, + }), +] diff --git a/services/osslifecycle/osslifecycle-redirector.tester.js b/services/osslifecycle/osslifecycle-redirector.tester.js new file mode 100644 index 0000000000000..e098229b436d5 --- /dev/null +++ b/services/osslifecycle/osslifecycle-redirector.tester.js @@ -0,0 +1,26 @@ +import queryString from 'querystring' +import { ServiceTester } from '../tester.js' + +export const t = new ServiceTester({ + id: 'osslifecycleRedirect', + title: 'OSSLifecycleRedirect', + pathPrefix: '/osslifecycle', +}) + +t.create('oss lifecycle redirect') + .get('/netflix/osstracker.svg') + .expectRedirect( + `/osslifecycle.svg?${queryString.stringify({ + file_url: + 'https://raw.githubusercontent.com/netflix/osstracker/HEAD/OSSMETADATA', + })}`, + ) + +t.create('oss lifecycle redirect (branch)') + .get('/netflix/osstracker/documentation.svg') + .expectRedirect( + `/osslifecycle.svg?${queryString.stringify({ + file_url: + 'https://raw.githubusercontent.com/netflix/osstracker/documentation/OSSMETADATA', + })}`, + ) From a2c275089d481f70ad1c1be96e3f427c1be02df5 Mon Sep 17 00:00:00 2001 From: Joe Izzard Date: Wed, 4 Sep 2024 22:36:36 +0100 Subject: [PATCH 5/5] tweaks to docs and handle function Tweak the Description to remove reference to GitHub as now works with any repository, and updated handle function to remove reference to unused variables. --- services/osslifecycle/osslifecycle.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/osslifecycle/osslifecycle.service.js b/services/osslifecycle/osslifecycle.service.js index 3fc00436ae365..483b3035c3d00 100644 --- a/services/osslifecycle/osslifecycle.service.js +++ b/services/osslifecycle/osslifecycle.service.js @@ -5,7 +5,7 @@ import { BaseService, InvalidResponse, queryParam } from '../index.js' const description = ` OSS Lifecycle is an initiative started by Netflix to classify open-source projects into lifecycles and clearly identify which projects are active and which ones are retired. To enable this badge, -simply create an OSSMETADATA tagging file at the root of your GitHub repository containing a +simply create an OSSMETADATA tagging file at the root of your repository containing a single line similar to the following: \`osslifecycle=active\`. Other suggested values are \`osslifecycle=maintenance\` and \`osslifecycle=archived\`. A working example can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstracker). @@ -79,7 +79,7 @@ export default class OssTracker extends BaseService { }) } - async handle({ user, repo, branch }, { file_url: fileUrl = '' }) { + async handle(pathParams, { file_url: fileUrl = '' }) { const { buffer } = await this.fetch({ fileUrl, })