jscpd
Version:
Copy/paste detector for programming code, support JavaScript, CoffeeScript, PHP, Ruby, Python, Less, Go, Java, Yaml, C#, C++, C, Puppet, Twig languages
101 lines • 10.4 kB
JavaScript
"use strict";
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
var events_1 = require("../events");
var jscpd_1 = require("../jscpd");
var models_1 = require("../stores/models");
var options_1 = require("../utils/options");
var StatisticListener = /** @class */ (function () {
function StatisticListener(options) {
this.options = options;
this.statistic = {
detectionDate: new Date().toISOString(),
formats: {},
total: StatisticListener.getDefaultStatistic()
};
this.statistic.threshold = this.options.threshold;
}
StatisticListener.getDefaultStatistic = function () {
return {
lines: 0,
sources: 0,
clones: 0,
duplicatedLines: 0,
percentage: 0,
newDuplicatedLines: 0,
newClones: 0
};
};
StatisticListener.prototype.attach = function (eventEmitter) {
eventEmitter.on(events_1.MATCH_SOURCE_EVENT, this.matchSource.bind(this));
eventEmitter.on(events_1.CLONE_FOUND_EVENT, this.cloneFound.bind(this));
};
StatisticListener.prototype.cloneFound = function (clone) {
var id = clone.duplicationA.sourceId;
var id2 = clone.duplicationB.sourceId;
var linesCount = clone.duplicationA.end.line - clone.duplicationA.start.line;
this.statistic.total.clones++;
this.statistic.total.duplicatedLines += linesCount;
this.statistic.formats[clone.format].total.clones++;
this.statistic.formats[clone.format].total.duplicatedLines += linesCount;
this.statistic.formats[clone.format].sources[id].clones++;
this.statistic.formats[clone.format].sources[id].duplicatedLines += linesCount;
this.statistic.formats[clone.format].sources[id2].clones++;
this.statistic.formats[clone.format].sources[id2].duplicatedLines += linesCount;
this.updatePercentage(clone.format);
this.saveStatistic();
};
StatisticListener.prototype.matchSource = function (source) {
source.format = source.format || 'javascript';
if (!this.statistic.formats.hasOwnProperty(source.format)) {
this.statistic.formats[source.format] = {
sources: {},
total: StatisticListener.getDefaultStatistic()
};
}
this.statistic.total.sources++;
this.statistic.total.lines += source.lines;
this.statistic.formats[source.format].total.sources++;
this.statistic.formats[source.format].total.lines += source.lines;
this.statistic.formats[source.format].sources[source.id] =
this.statistic.formats[source.format].sources[source.id] || StatisticListener.getDefaultStatistic();
this.statistic.formats[source.format].sources[source.id].sources = 1;
this.statistic.formats[source.format].sources[source.id].lines += source.lines;
this.updatePercentage(source.format);
this.saveStatistic();
};
StatisticListener.prototype.saveStatistic = function () {
var statisticStore = jscpd_1.getStoreManager().getStore(models_1.STATISTIC_DB);
statisticStore.set(options_1.getOption('executionId', this.options), this.statistic);
};
StatisticListener.prototype.updatePercentage = function (format) {
var _this = this;
this.statistic.total.percentage = this.calculatePercentage(this.statistic.total.lines, this.statistic.total.duplicatedLines);
this.statistic.formats[format].total.percentage = this.calculatePercentage(this.statistic.formats[format].total.lines, this.statistic.formats[format].total.duplicatedLines);
Object.entries(this.statistic.formats[format].sources).forEach(function (_a) {
var _b = __read(_a, 2), id = _b[0], stat = _b[1];
_this.statistic.formats[format].sources[id].percentage = _this.calculatePercentage(stat.lines, stat.duplicatedLines);
});
};
StatisticListener.prototype.calculatePercentage = function (totalLines, clonedLines) {
return totalLines ? Math.round((10000 * clonedLines) / totalLines) / 100 : 0.0;
};
return StatisticListener;
}());
exports.StatisticListener = StatisticListener;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGlzdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpc3RlbmVycy9zdGF0aXN0aWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esb0NBQXFGO0FBS3JGLGtDQUEyQztBQUMzQywyQ0FBZ0Q7QUFDaEQsNENBQTZDO0FBRTdDO0lBbUJFLDJCQUFvQixPQUFpQjtRQUFqQixZQUFPLEdBQVAsT0FBTyxDQUFVO1FBTjdCLGNBQVMsR0FBZTtZQUM5QixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDdkMsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7U0FDL0MsQ0FBQztRQUdBLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3BELENBQUM7SUFwQmMscUNBQW1CLEdBQWxDO1FBQ0UsT0FBTztZQUNMLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsQ0FBQztZQUNULGVBQWUsRUFBRSxDQUFDO1lBQ2xCLFVBQVUsRUFBRSxDQUFDO1lBQ2Isa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDO0lBWU0sa0NBQU0sR0FBYixVQUFjLFlBQStCO1FBQzNDLFlBQVksQ0FBQyxFQUFFLENBQUMsMkJBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRSxZQUFZLENBQUMsRUFBRSxDQUFDLDBCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVPLHNDQUFVLEdBQWxCLFVBQW1CLEtBQWE7UUFDOUIsSUFBTSxFQUFF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