Bauke/tildes-issue-log
Bauke
/
tildes-issue-log
Archived
1
Fork 0
This repository has been archived on 2022-10-04. You can view files and clone it, but cannot push or open issues or pull requests.
tildes-issue-log/statistics.js

151 lines
4.0 KiB
JavaScript

/**
* @function avgTime
* @description Returns the average time it takes to close an issue in hours or days.
* @param {Array} data Array with paths leading to GitLab Issue .json files
* @param {string} time 'hours' or 'days'
* @returns {number}
*/
function avgTime(data, time) {
if (time !== 'hours' && time !== 'days') {
return new Error('avgTime(data, time): time should be "hours" or "days"');
}
let avg;
for (const file of data) {
const issue = require(file.path);
const openDate = new Date(issue.created_at);
const closeDate = new Date(issue.closed_at);
let diff;
if (time === 'days') {
diff = (closeDate - openDate) / (1000 * 60 * 60 * 24);
} else if (time === 'hours') {
diff = (closeDate - openDate) / (1000 * 60 * 60);
}
avg = (typeof avg === 'undefined') ?
avg = diff :
avg += diff;
}
return (avg / data.length).toFixed(2);
}
/**
* @function freqUsers
* @description Returns the top X issue creators.
* @param {Array} data Array with paths leading to GitLab Issue .json files
* @param {number} maxUsers Maximum amount of users to return, defaults to 3
* @returns {Object}
*/
function freqUsers(data, maxUsers) {
if (typeof maxUsers === 'undefined') {
maxUsers = 3;
}
const userCounts = {};
for (const file of data) {
const issue = require(file.path);
if (typeof userCounts[issue.author.username] === 'undefined') {
userCounts[issue.author.username] = 1;
} else {
userCounts[issue.author.username]++;
}
}
const sortedArray = Object.keys(userCounts).sort((a, b) => userCounts[b] - userCounts[a]);
const sortedObject = {};
for (let i = 0; i < maxUsers; i++) {
if (typeof sortedArray[i] === 'undefined') {
break;
}
sortedObject[sortedArray[i]] = userCounts[sortedArray[i]];
}
return sortedObject;
}
/**
* @function labelsAlphabet
* @description Returns all labels found in alphabetical order with their amount.
* @param {Array} data Array with paths leading to GitLab Issue .json files
* @param {boolean} checkNull Boolean whether or not to check if closed_at is null (for currently open issues)
* @returns {Object}
*/
function labelsAlphabet(data, checkNull) {
if (typeof checkNull === 'undefined') {
checkNull = false;
}
const labels = {};
for (const file of data) {
const issue = require(file.path);
if (checkNull && issue.closed_at !== null) {
continue;
}
for (const label of issue.labels) {
if (typeof labels[label] === 'undefined') {
labels[label] = 1;
} else {
labels[label]++;
}
}
}
const labelsOrdered = {};
Object.keys(labels).sort().forEach(label => {
labelsOrdered[label] = labels[label];
});
return labelsOrdered;
}
/**
* @function changedLines
* @description Returns the number of added, deleted and total lines changed
* @param {Array} data Array with paths leading to GitLab Commit .json files (with stats)
* @returns {Object} Object with added/deleted/total lines changed
*/
function changedLines(data) {
const stats = {
added: 0,
deleted: 0,
total: 0
};
for (const file of data) {
const commit = require(file.path);
stats.added += commit.stats.additions;
stats.deleted += commit.stats.deletions;
stats.total += commit.stats.additions - commit.stats.deletions;
}
return stats;
}
/**
* @function uniqueContributors
* @description Returns the names of all contributors
* @param {Array} data Array with paths leading to GitLab Commit .json files (with stats)
* @returns {Array} Array with names of all contributors
*/
function uniqueContributors(data) {
const contributors = [];
for (const file of data) {
const commit = require(file.path);
if (!contributors.includes(commit.author_name)) {
contributors.push(commit.author_name);
}
}
return contributors;
}
exports.avgTime = avgTime;
exports.freqUsers = freqUsers;
exports.labelsAlphabet = labelsAlphabet;
exports.changedLines = changedLines;
exports.uniqueContributors = uniqueContributors;