Skip to content

Commit

Permalink
[gem cdnjs appveyor] refactor ruby gems service (#1680)
Browse files Browse the repository at this point in the history
* allow services to export >1 classes

This change to loadServiceClasses() allows us to define
services which either export a single service class e.g:

module.exports = class Cdnjs extends BaseService {
  //...
}

or more than one. e.g:

module.exports = {
  GemVersion,
  GemDownloads,
  GemOwner,
  GemRank,
}

* refactor ruby gem badges

- move badge code to service classes
- throw exceptions for errors
- use let and const
- change tests to expect 'downloads' label for error badges
- general tidying

* fix typo in tests

* Don't always use class name in example label

This allows (for example) GemVersion and GemDownloads
both to use the example label 'Gem'
  • Loading branch information
chris48s authored May 10, 2018
1 parent f43096a commit b5635bf
Show file tree
Hide file tree
Showing 7 changed files with 346 additions and 243 deletions.
56 changes: 0 additions & 56 deletions lib/all-badge-examples.js
Original file line number Diff line number Diff line change
Expand Up @@ -445,34 +445,6 @@ const allBadgeExamples = [
'node'
]
},
{
title: 'Gem',
previewUri: '/gem/dv/rails/stable.svg',
keywords: [
'ruby'
]
},
{
title: 'Gem',
previewUri: '/gem/dv/rails/4.1.0.svg',
keywords: [
'ruby'
]
},
{
title: 'Gem',
previewUri: '/gem/dtv/rails.svg',
keywords: [
'ruby'
]
},
{
title: 'Gem',
previewUri: '/gem/dt/rails.svg',
keywords: [
'ruby'
]
},
{
title: 'Chocolatey',
previewUri: '/chocolatey/dt/scriptcs.svg'
Expand Down Expand Up @@ -864,13 +836,6 @@ const allBadgeExamples = [
'conda'
]
},
{
title: 'Gem',
previewUri: '/gem/v/formatador.svg',
keywords: [
'ruby'
]
},
{
title: 'LuaRocks',
previewUri: '/luarocks/v/mpeterv/luacheck.svg',
Expand Down Expand Up @@ -1833,27 +1798,6 @@ const allBadgeExamples = [
title: 'Puppet Forge',
previewUri: '/puppetforge/mc/camptocamp.svg'
},
{
title: 'Gems',
previewUri: '/gem/u/raphink.svg',
keywords: [
'ruby'
]
},
{
title: 'Gems',
previewUri: '/gem/rt/puppet.svg',
keywords: [
'ruby'
]
},
{
title: 'Gems',
previewUri: '/gem/rd/facter.svg',
keywords: [
'ruby'
]
},
{
title: 'DUB',
previewUri: '/dub/l/vibe-d.svg',
Expand Down
176 changes: 0 additions & 176 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ const {
const {
currencyFromCode,
metric,
ordinalNumber,
starRating,
omitv,
addv: versionText,
Expand Down Expand Up @@ -2071,181 +2070,6 @@ cache(function(data, match, sendBadge, request) {
});
}));

// Gem version integration.
camp.route(/^\/gem\/v\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var repo = match[1]; // eg, `formatador`.
var format = match[2];
var apiUrl = 'https://rubygems.org/api/v1/gems/' + repo + '.json';
var badgeData = getBadgeData('gem', data);
request(apiUrl, function(err, res, buffer) {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData);
return;
}
try {
var data = JSON.parse(buffer);
var version = data.version;
badgeData.text[1] = versionText(version);
badgeData.colorscheme = versionColor(version);
sendBadge(format, badgeData);
} catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
});
}));

// Gem download count
camp.route(/^\/gem\/(dt|dtv|dv)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var info = match[1]; // either dt, dtv or dv.
var repo = match[2]; // eg, "rails"
var splited_url = repo.split('/');
repo = splited_url[0];
var version = (splited_url.length > 1)
? splited_url[splited_url.length - 1]
: null;
version = (version === "stable") ? version : semver.valid(version);
var format = match[3];

let leftSide;
if (version) {
leftSide = 'downloads@' + version;
} else {
if (info === "dtv") {
leftSide = 'downloads@latest';
} else {
leftSide = 'downloads';
}
}
const badgeData = getBadgeData(leftSide, data);

if (info === "dv"){
apiUrl = 'https://rubygems.org/api/v1/versions/' + repo + '.json';
} else {
var apiUrl = 'https://rubygems.org/api/v1/gems/' + repo + '.json';
}
var parameters = {
headers: {
'Accept': 'application/atom+json,application/json'
}
};
request(apiUrl, parameters, function(err, res, buffer) {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData);
return;
}
try {
var data = JSON.parse(buffer);
var downloads;
if (info === "dt") {
downloads = metric(data.downloads);
} else if (info === "dtv") {
downloads = metric(data.version_downloads);
} else if (info === "dv") {
downloads = "invalid";

var version_data;
if (version !== null && version === "stable") {

var versions = data.filter(function(ver) {
return ver.prerelease === false;
}).map(function(ver) {
return ver.number;
});
// Found latest stable version.
var stable_version = latestVersion(versions);
version_data = data.filter(function(ver) {
return ver.number === stable_version;
})[0];
downloads = metric(version_data.downloads_count);

} else if (version !== null) {

version_data = data.filter(function(ver) {
return ver.number === version;
})[0];

downloads = metric(version_data.downloads_count);
}
} else { downloads = "invalid"; }
badgeData.text[1] = downloads;
badgeData.colorscheme = downloadCountColor(downloads);
sendBadge(format, badgeData);
} catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
});
}));

// Gem owner stats
camp.route(/^\/gem\/u\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var user = match[1]; // eg, "raphink"
var format = match[2];
var url = 'https://rubygems.org/api/v1/owners/' + user + '/gems.json';
var badgeData = getBadgeData('gems', data);
request(url, function(err, res, buffer) {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData);
return;
}
try {
var data = JSON.parse(buffer);
var count = data.length;
badgeData.colorscheme = floorCountColor(count, 10, 50, 100);
badgeData.text[1] = count;
sendBadge(format, badgeData);
} catch (e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
});
}));


// Gem ranking
camp.route(/^\/gem\/(rt|rd)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var info = match[1]; // either rt or rd
var repo = match[2]; // eg, "rspec-puppet-facts"
var format = match[3];
var url = 'http://bestgems.org/api/v1/gems/' + repo;
var totalRank = (info === 'rt');
var dailyRank = (info === 'rd');
if (totalRank) {
url += '/total_ranking.json';
} else if (dailyRank) {
url += '/daily_ranking.json';
}
var badgeData = getBadgeData('rank', data);
request(url, function(err, res, buffer) {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData);
return;
}
try {
var data = JSON.parse(buffer);
var rank;
if (totalRank) {
rank = data[0].total_ranking;
} else if (dailyRank) {
rank = data[0].daily_ranking;
}
var count = Math.floor(100000 / rank);
badgeData.colorscheme = floorCountColor(count, 10, 50, 100);
badgeData.text[1] = ordinalNumber(rank);
badgeData.text[1] += totalRank? '': ' daily';
sendBadge(format, badgeData);
} catch (e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
});
}));

// PyPI integration.
camp.route(/^\/pypi\/([^/]+)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
Expand Down
2 changes: 1 addition & 1 deletion services/appveyor/appveyor.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ module.exports = class AppVeyor extends BaseService {
previewUrl: 'gruntjs/grunt',
},
{
title: 'branch',
title: `${this.name} branch`,
previewUrl: 'gruntjs/grunt/master',
},
];
Expand Down
2 changes: 1 addition & 1 deletion services/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ module.exports = class BaseService {
}

return {
title: title ? `${this.name} ${title}` : this.name,
title: title ? `${title}` : this.name,
previewUri: `${this._makeFullUrl(previewUrl)}.svg`,
exampleUri: exampleUrl ? `${this._makeFullUrl(exampleUrl)}.svg` : undefined,
documentation,
Expand Down
Loading

0 comments on commit b5635bf

Please sign in to comment.