mirror of
https://github.com/IonicaBizau/git-stats.git
synced 2024-12-22 13:22:11 +01:00
Code style, new dependencies
Use the prototype way to create git-stats instances. With this feature we could create as many git-stats instances we need, by providing the configuration path. Added typpy and deffy packages as dependencies.
This commit is contained in:
parent
e93ece67f7
commit
28a2881f9e
3 changed files with 60 additions and 37 deletions
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
// Dependencies
|
// Dependencies
|
||||||
var GitStats = require("../lib")
|
var GitStats = new (require("../lib"))()
|
||||||
, Moment = require("moment")
|
, Moment = require("moment")
|
||||||
, Logger = require("bug-killer")
|
, Logger = require("bug-killer")
|
||||||
, CLP = require("clp")
|
, CLP = require("clp")
|
||||||
|
|
91
lib/index.js
91
lib/index.js
|
@ -10,17 +10,18 @@ var Ul = require("ul")
|
||||||
, CliGhCal = require("cli-gh-cal")
|
, CliGhCal = require("cli-gh-cal")
|
||||||
, GitLogParser = require("gitlog-parser").parse
|
, GitLogParser = require("gitlog-parser").parse
|
||||||
, ChildProcess = require("child_process")
|
, ChildProcess = require("child_process")
|
||||||
|
, Deffy = require("deffy")
|
||||||
|
, Typpy = require("typpy")
|
||||||
, Exec = ChildProcess.exec
|
, Exec = ChildProcess.exec
|
||||||
, Spawn = ChildProcess.spawn
|
, Spawn = ChildProcess.spawn
|
||||||
;
|
;
|
||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
const STORE_PATH = Abs("~/.git-stats")
|
const DATE_FORMAT = "MMM D, YYYY";
|
||||||
, DATE_FORMAT = "MMM D, YYYY"
|
|
||||||
;
|
|
||||||
|
|
||||||
// Constructor
|
function GitStats(confPath) {
|
||||||
var GitStats = module.exports = {};
|
this.path = Deffy(confPath, Abs("~/.git-stats"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* record
|
* record
|
||||||
|
@ -37,16 +38,19 @@ var GitStats = module.exports = {};
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.record = function (data, callback) {
|
GitStats.prototype.record = function (data, callback) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
// Validate data
|
// Validate data
|
||||||
callback = callback || function (err) { if (err) throw err; };
|
callback = callback || function (err) { if (err) throw err; };
|
||||||
data = Object(data);
|
data = Object(data);
|
||||||
|
|
||||||
if (typeof data.date === "string") {
|
if (typeof data.date === "string") {
|
||||||
data.date = new Moment(new Date(data.date));
|
data.date = new Moment(new Date(data.date));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data.date || !/^Moment|Date$/.test(data.date.constructor.name)) {
|
if (!/^moment|date$/.test(Typpy(data.date))) {
|
||||||
callback(new Error("The date field should be a string or a date object."));
|
callback(new Error("The date field should be a string or a date object."));
|
||||||
return GitStats;
|
return GitStats;
|
||||||
}
|
}
|
||||||
|
@ -62,8 +66,9 @@ GitStats.record = function (data, callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get stats
|
// Get stats
|
||||||
GitStats.get(function (err, stats) {
|
self.get(function (err, stats) {
|
||||||
stats = stats || {};
|
stats = stats || {};
|
||||||
|
|
||||||
var day = data.date.format(DATE_FORMAT)
|
var day = data.date.format(DATE_FORMAT)
|
||||||
, today = stats[day] = Object(stats[day])
|
, today = stats[day] = Object(stats[day])
|
||||||
, repo = today[data.url] = Object(today[data.url])
|
, repo = today[data.url] = Object(today[data.url])
|
||||||
|
@ -71,10 +76,10 @@ GitStats.record = function (data, callback) {
|
||||||
|
|
||||||
repo[data.hash] = { date: data.date };
|
repo[data.hash] = { date: data.date };
|
||||||
|
|
||||||
GitStats.save(stats, callback);
|
self.save(stats, callback);
|
||||||
});
|
});
|
||||||
|
|
||||||
return GitStats;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,11 +91,12 @@ GitStats.record = function (data, callback) {
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.get = function (callback) {
|
GitStats.prototype.get = function (callback) {
|
||||||
ReadJson(STORE_PATH, function (err, data) {
|
var self = this;
|
||||||
|
ReadJson(self.path, function (err, data) {
|
||||||
|
|
||||||
if (err && err.code === "ENOENT") {
|
if (err && err.code === "ENOENT") {
|
||||||
return GitStats.save({}, function (err) {
|
return self.save({}, function (err) {
|
||||||
callback(err, {});
|
callback(err, {});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -98,7 +104,7 @@ GitStats.get = function (callback) {
|
||||||
if (err) { return callback(err); }
|
if (err) { return callback(err); }
|
||||||
callback(null, data);
|
callback(null, data);
|
||||||
});
|
});
|
||||||
return GitStats;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,9 +117,9 @@ GitStats.get = function (callback) {
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.save = function (stats, callback) {
|
GitStats.prototype.save = function (stats, callback) {
|
||||||
WriteJson(STORE_PATH, stats, callback);
|
WriteJson(self.path, stats, callback);
|
||||||
return GitStats;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -131,7 +137,7 @@ GitStats.save = function (stats, callback) {
|
||||||
* @param {Function} callback The callback function called with the current day formatted (type: string) and the `Moment` date object.
|
* @param {Function} callback The callback function called with the current day formatted (type: string) and the `Moment` date object.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.iterateDays = function (data, callback) {
|
GitStats.prototype.iterateDays = function (data, callback) {
|
||||||
|
|
||||||
if (typeof data === "function") {
|
if (typeof data === "function") {
|
||||||
callback = data;
|
callback = data;
|
||||||
|
@ -156,7 +162,7 @@ GitStats.iterateDays = function (data, callback) {
|
||||||
start.add(1, "days");
|
start.add(1, "days");
|
||||||
}
|
}
|
||||||
|
|
||||||
return GitStats;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -169,15 +175,17 @@ GitStats.iterateDays = function (data, callback) {
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.graph = function (data, callback) {
|
GitStats.prototype.graph = function (data, callback) {
|
||||||
|
|
||||||
if (typeof data === "function") {
|
if (typeof data === "function") {
|
||||||
callback = data;
|
callback = data;
|
||||||
data = undefined;
|
data = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
// Get commits
|
// Get commits
|
||||||
GitStats.get(function (err, stats) {
|
self.get(function (err, stats) {
|
||||||
if (err) { return callback(err); }
|
if (err) { return callback(err); }
|
||||||
|
|
||||||
var cDayObj = null
|
var cDayObj = null
|
||||||
|
@ -185,7 +193,7 @@ GitStats.graph = function (data, callback) {
|
||||||
;
|
;
|
||||||
|
|
||||||
// Iterate days
|
// Iterate days
|
||||||
GitStats.iterateDays(data, function (cDay) {
|
self.iterateDays(data, function (cDay) {
|
||||||
cDayObj = year[cDay] = {
|
cDayObj = year[cDay] = {
|
||||||
_: stats[cDay] || {}
|
_: stats[cDay] || {}
|
||||||
, c: 0
|
, c: 0
|
||||||
|
@ -199,7 +207,7 @@ GitStats.graph = function (data, callback) {
|
||||||
callback(null, year);
|
callback(null, year);
|
||||||
});
|
});
|
||||||
|
|
||||||
return GitStats;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -212,8 +220,11 @@ GitStats.graph = function (data, callback) {
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.calendar = function (data, callback) {
|
GitStats.prototype.calendar = function (data, callback) {
|
||||||
GitStats.graph(data, function (err, graph) {
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.graph(data, function (err, graph) {
|
||||||
if (err) { return callback(err); }
|
if (err) { return callback(err); }
|
||||||
|
|
||||||
var cal = { total: 0, days: {}, cStreak: 0, lStreak: 0, max: 0 }
|
var cal = { total: 0, days: {}, cStreak: 0, lStreak: 0, max: 0 }
|
||||||
|
@ -252,7 +263,7 @@ GitStats.calendar = function (data, callback) {
|
||||||
|
|
||||||
callback(null, cal);
|
callback(null, cal);
|
||||||
});
|
});
|
||||||
return GitStats;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -265,17 +276,19 @@ GitStats.calendar = function (data, callback) {
|
||||||
* @param {Function} callback The callback function.
|
* @param {Function} callback The callback function.
|
||||||
* @return {GitStats} The `GitStats` object.
|
* @return {GitStats} The `GitStats` object.
|
||||||
*/
|
*/
|
||||||
GitStats.ansiCalendar = function (data, callback) {
|
GitStats.prototype.ansiCalendar = function (data, callback) {
|
||||||
|
|
||||||
if (typeof data === "function") {
|
if (typeof data === "function") {
|
||||||
callback = data;
|
callback = data;
|
||||||
data = undefined;
|
data = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
GitStats.graph(data, function (err, graph) {
|
var self = this;
|
||||||
|
|
||||||
|
self.graph(data, function (err, graph) {
|
||||||
var cal = [];
|
var cal = [];
|
||||||
|
|
||||||
GitStats.iterateDays(data, function (cDay) {
|
self.iterateDays(data, function (cDay) {
|
||||||
cDayObj = graph[cDay];
|
cDayObj = graph[cDay];
|
||||||
if (!cDayObj) { return; }
|
if (!cDayObj) { return; }
|
||||||
cal.push([cDay, cDayObj.c]);
|
cal.push([cDay, cDayObj.c]);
|
||||||
|
@ -288,10 +301,10 @@ GitStats.ansiCalendar = function (data, callback) {
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
return GitStats;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
GitStats.authors = function (options, callback) {
|
GitStats.prototype.authors = function (options, callback) {
|
||||||
var repo = new Gry(options.repo);
|
var repo = new Gry(options.repo);
|
||||||
repo.exec("shortlog -s -n --all", function (err, stdout) {
|
repo.exec("shortlog -s -n --all", function (err, stdout) {
|
||||||
if (err) { return callback(err); }
|
if (err) { return callback(err); }
|
||||||
|
@ -307,9 +320,10 @@ GitStats.authors = function (options, callback) {
|
||||||
});
|
});
|
||||||
callback(null, pieData);
|
callback(null, pieData);
|
||||||
});
|
});
|
||||||
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
GitStats.authorsPie = function (options, callback) {
|
GitStats.prototype.authorsPie = function (options, callback) {
|
||||||
if (typeof options === "string") {
|
if (typeof options === "string") {
|
||||||
options = {
|
options = {
|
||||||
repo: options
|
repo: options
|
||||||
|
@ -324,12 +338,13 @@ GitStats.authorsPie = function (options, callback) {
|
||||||
return callback(new Error("The repository folder doesn't exist."));
|
return callback(new Error("The repository folder doesn't exist."));
|
||||||
}
|
}
|
||||||
|
|
||||||
var repo = new Gry(options.repo)
|
var self = this
|
||||||
|
, repo = new Gry(options.repo)
|
||||||
, pie = null
|
, pie = null
|
||||||
, pieData = []
|
, pieData = []
|
||||||
;
|
;
|
||||||
|
|
||||||
GitStats.authors(options, function (err, authors) {
|
self.authors(options, function (err, authors) {
|
||||||
if (err) { return callback(err); }
|
if (err) { return callback(err); }
|
||||||
if (authors.length > 50) {
|
if (authors.length > 50) {
|
||||||
var others = {
|
var others = {
|
||||||
|
@ -350,9 +365,11 @@ GitStats.authorsPie = function (options, callback) {
|
||||||
|
|
||||||
callback(null, pie.toString());
|
callback(null, pie.toString());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
GitStats.globalActivity = function (options, callback) {
|
GitStats.prototype.globalActivity = function (options, callback) {
|
||||||
|
|
||||||
if (typeof options === "string") {
|
if (typeof options === "string") {
|
||||||
options = {
|
options = {
|
||||||
|
@ -387,4 +404,8 @@ GitStats.globalActivity = function (options, callback) {
|
||||||
, end: options.end
|
, end: options.end
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports = GitStats;
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
"abs": "^1.0.0",
|
"abs": "^1.0.0",
|
||||||
"gry": "^4.0.0",
|
"gry": "^4.0.0",
|
||||||
"gitlog-parser": "0.0.2",
|
"gitlog-parser": "0.0.2",
|
||||||
"progress": "1.1.8"
|
"progress": "1.1.8",
|
||||||
|
"deffy": "2.0.0",
|
||||||
|
"typpy": "2.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue