@atomist/sdm-pack-sloc
Version:
Extension Pack for an Atomist SDM to integrate code metrics
113 lines • 4.21 kB
JavaScript
;
/*
* Copyright © 2018 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const automation_client_1 = require("@atomist/automation-client");
const _ = require("lodash");
const sloc = require("sloc");
const languages_1 = require("./languages");
/**
* Report about a project's files in a given language
*/
class LanguageReport {
constructor(language, fileReports) {
this.language = language;
this.fileReports = fileReports;
}
/**
* Return stats for each language
* @return {CodeStats[]}
*/
get stats() {
return consolidate(this.language, this.fileReports.map(fr => fr.stats));
}
}
exports.LanguageReport = LanguageReport;
/**
* Consolidate the given stats for a particular language
* @param {Language} language
* @param {CodeStats[]} stats
* @return {CodeStats}
*/
function consolidate(language, stats) {
return {
language,
total: _.sum(stats.map(r => r.total)),
source: _.sum(stats.map(r => r.source)),
comment: _.sum(stats.map(r => r.comment)),
single: _.sum(stats.map(r => r.single)),
block: _.sum(stats.map(r => r.block)),
};
}
exports.consolidate = consolidate;
/**
* Report about lines of code in various languages.
*/
class LanguagesReport {
constructor(languageReports) {
this.languageReports = languageReports;
}
get languagesScanned() {
return _.uniq(this.languageReports.map(lr => lr.language));
}
/**
* Return only the found languages
* @return {CodeStats[]}
*/
get relevantLanguageReports() {
return this.languageReports.filter(lr => lr.stats.total > 0);
}
}
exports.LanguagesReport = LanguagesReport;
/**
* Use the sloc library to compute code statistics
* @param {Project} p
* @param {string} request
* @return {Promise<LanguageReport>}
*/
function reportForLanguage(p, request) {
return __awaiter(this, void 0, void 0, function* () {
const extension = request.language.extensions[0];
const globs = request.language.extensions.map(ext => `**/*.${ext}`);
const fileReports = yield automation_client_1.projectUtils.gatherFromFiles(p, globs, (f) => __awaiter(this, void 0, void 0, function* () {
const content = yield f.getContent();
const stats = sloc(content, extension);
return {
stats,
file: f,
language: request.language,
};
}));
return new LanguageReport(request.language, fileReports);
});
}
exports.reportForLanguage = reportForLanguage;
function reportForLanguages(p, requests = languages_1.AllLanguages.map(language => ({ language }))) {
return __awaiter(this, void 0, void 0, function* () {
const languageReports = yield Promise.all(requests.map(r => reportForLanguage(p, r)));
return new LanguagesReport(languageReports);
});
}
exports.reportForLanguages = reportForLanguages;
//# sourceMappingURL=slocReport.js.map