From ef4c16b96d0face7d9b7d130e0d545e5e8a90cbf Mon Sep 17 00:00:00 2001 From: wassname Date: Tue, 10 Jan 2017 13:00:58 +0800 Subject: [PATCH] Misc --- package.json | 2 +- src/index.html | 18 +++- src/js/example_data.js | 4 +- src/js/fetch_stats.js | 48 +++++++---- src/js/main.js | 186 +++++++++++++++++++++++++++++++---------- 5 files changed, 193 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 7d05f0a..8c74ad6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Compare github repositories", "main": "index.js", "scripts": { - "start": "http-server -o", + "start": "http-server src -o ", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "wassname", diff --git a/src/index.html b/src/index.html index 1199942..216feaf 100644 --- a/src/index.html +++ b/src/index.html @@ -14,6 +14,7 @@ + @@ -24,10 +25,19 @@ - - -src="https://cdnjs.cloudflare.com/ajax/libs/gh.js/3.0.8/gh.min.js" charset="utf-8"> -src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js" charset="utf-8"> + + + + + + + + + + + + + diff --git a/src/js/example_data.js b/src/js/example_data.js index 0db88ea..49f936f 100644 --- a/src/js/example_data.js +++ b/src/js/example_data.js @@ -1,6 +1,6 @@ var coins = { "Bitcoin": 'https://github.com/bitcoin/bitcoin', - "Etherium": 'https://github.com/ethereum/go-ethereum', + "Ethereum": 'https://github.com/ethereum/go-ethereum', "Ripple": 'https://github.com/ripple/rippled', "Litecoin": 'https://github.com/litecoin-project/litecoin', "Monero": 'https://github.com/monero-project/monero', @@ -21,7 +21,7 @@ var coins = { 'E-Dinar Coin': 'https://github.com/edincoin/EDINARCOIN', //'ARDOR':'', 'GameCredits': 'https://github.com/gamecredits-project/GameCredits', - 'Swisscoin': 'https://github.com/SCNPay/swiscoin', + 'Swiscoin': 'https://github.com/SCNPay/swiscoin', 'Bitshares': 'https://github.com/bitshares/bitshares-2', /** Notable below top 25 **/ "Nxt": 'https://bitbucket.org/JeanLucPicard/nxt', // bitbucket diff --git a/src/js/fetch_stats.js b/src/js/fetch_stats.js index 0d84a8a..415fc8e 100644 --- a/src/js/fetch_stats.js +++ b/src/js/fetch_stats.js @@ -2,20 +2,25 @@ * TODO cache requests by date */ -// cache and save github api token -$('#token').val(localStorage['gh_token']) -$('#token').on('change', function() { - localStorage['gh_token'] = $('$token').val() +let gh = new GitHub(localStorage['gh_token'] || '') +$(document).ready(function() { + + // cache and save github api token + $('#token').val(localStorage['gh_token']) + $('#token').on('change', function() { + localStorage['gh_token'] = $('#token').val() + }) + gh = new GitHub(localStorage['gh_token'] || '') }) -let gh = new GitHub(localStorage['gh_token'] || '') -function promiseGitHubStats(url) { - var apiUrl = url.replace('https://github.com/', '') +function promiseGitHubRepoStats(url) { + + var apiUrl = "repos/" + url.replace('https://github.com/', '') var promiseStats = new Promise(function(resolve, reject) { - gh.get("repos/" + apiUrl, (err, response) => { + gh.get(apiUrl, (err, response) => { if (err) reject(err) else @@ -24,7 +29,7 @@ function promiseGitHubStats(url) { }) var promiseContributors = new Promise(function(resolve, reject) { - gh.get("repos/" + apiUrl + '/stats/contributors', (err, response) => { + gh.get(apiUrl + '/contributors', {all:true, opts:{per_page:100}}, (err, response) => { if (err) reject(err) else @@ -33,12 +38,12 @@ function promiseGitHubStats(url) { }).then(r => { return { contributors: r.length, - //commits: _.sum(r.map(c => c.total)) + commits: _.sum(r.map(c => c.contributions)) } }) var promiseCommits = new Promise(function(resolve, reject) { - gh.get("repos/" + apiUrl + '/stats/participation', (err, response) => { + gh.get(apiUrl + '/stats/participation', {opts:{per_page:100}}, (err, response) => { if (err) reject(err) else @@ -50,8 +55,21 @@ function promiseGitHubStats(url) { } }) + var promiseChanges = new Promise(function(resolve, reject) { + gh.get(apiUrl + '/stats/code_frequency', {opts:{per_page:100}}, (err, response) => { + if (err) + reject(err) + else + resolve(response) + }) + }).then(r => { + return { + 'code_frequency': _.round(_.mean(r.total), 3) + } + }) + var promiseReleases = new Promise(function(resolve, reject) { - gh.get("repos/" + apiUrl + '/releases', (err, response) => { + gh.get(apiUrl + '/releases', {opts:{per_page:100}}, (err, response) => { if (err) reject(err) else @@ -61,13 +79,11 @@ function promiseGitHubStats(url) { return {'releases': r.length} }) - https : //api.github.com/repos/bitcoin/bitcoin/releases - - return Promise.all([promiseStats, promiseContributors, promiseCommits, promiseReleases]).then(data => _.merge(...data)) + return Promise.all([promiseStats, promiseContributors, promiseChanges, promiseCommits, promiseReleases]).then(data => _.merge(...data)) } -function promiseBitbucketStats(url) { +function promiseBitbucketRepoStats(url) { url = url.replace('https://bitbucket.org/', 'https://api.bitbucket.org/2.0/repositories/') // get all commits using a while(res.next) loop, then filter by date, to get comits per week. This part is slow diff --git a/src/js/main.js b/src/js/main.js index 6864efa..ac7ef02 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -1,40 +1,46 @@ /** - TODO: - consider using add/minus as well/instead of commits - total commits (add contributor contributions) - sum projects over organisations -- paginate contributors to get over 100 - see if it's a fork? +- add use input to enter repos **/ // format: name from on coinmarketcap: core Github project or repo +function renderUrl(data){return ''+data+''} +function renderDate(data){return data?moment(data).format('YYYY/MM/DD'):data} var columns = [ { "data": "coin", "title": "coin" - }, { + }, + { "data": "commits_per_week", - "title": "commits_per_week (for last year)" - }, { + "title": "commits per week (for last year)" + }, + { "data": "watchers", "title": "watchers" - }, { - "data": "open_issues", - "title": "open_issues" }, - - //{ - // "data": "size", - // "title": "size" - //}, + { + "data": "open_issues", + "title": "open issues" + }, + { + "data": "size", + "title": "size", + "visible": false + }, { "data": "created_at", - "title": "created_at" + "title": "created", + render: renderDate }, { "data": "updated_at", - "title": "updated_at" + "title": "updated", + render: renderDate }, { "data": "contributors", "title": "contributors (up to 100)" @@ -48,15 +54,79 @@ var columns = [ "data": "language", "title": "language" }, - //{ - // "data": "description", - // "title": "description" - //}, - + { + "data": "description", + "title": "description", + "visible": false + }, + { + "data": "commits", + "title": "commits", + "visible": false + }, + { + "data": "code_frequency", + "title": "code frequency", + "visible": false + }, + { + "data": "pushed_at", + "title": "pushed", + "visible": false, + render: renderDate + }, { "data": "url", - "title": "url" - } + "title": "url", + render: renderUrl + }, + // { + // "data": "id", + // "title": "id", + // "visible": false + // }, + { + "data": "name", + "title": "name", + "visible": false + }, + // { + // "data": "full_name", + // "title": "full_name", + // "visible": false + // }, + // { + // "data": "owner", + // "title": "owner", + // "visible": false + // }, + // { + // "data": "private", + // "title": "private", + // "visible": false + // }, + { + "data": "fork", + "title": "fork", + "visible": false + }, + { + "data": "homepage", + "title": "homepage", + "visible": false, + render: renderUrl + }, + // { + // "data": "default_branch", + // "title": "default_branch", + // "visible": false + // }, + // { + // "data": "permissions", + // "title": "permissions", + // "visible": false + // }, + ] /** parse dates then format **/ @@ -93,36 +163,68 @@ function makeMarkDownTable(data) { return table } -$(document).ready(function() { - // Collect data - let promises = Object.keys(coins).map(coin => { - var url = coins[coin] - if (url.includes('github.com')) { - return promiseGitHubStats(url).then(data => { - data.coin = coin - data.url = url - return data - }) - } else { - return promiseBitbucketStats(url).then(data => { - data.coin = coin - data.url = url - return data - }) +/** fill missing attribtes so datatables stops complaining **/ +function fillAll(data, columns){ + return data.map(row=>{ + for (var i = 0; i < columns.length; i++) { + var key = columns[i].data + if (row[key]===undefined) row[key] = '' } + return row + }) +} +$(document).ready(function() { + $('#refresh').on('click', function(){ + localStorage['gh-data'] = '' + window.location.reload() }) - Promise.all(promises).then(data => { - data = parseDates(data) - localStorage['gh-data'] = JSON.stringify(data) + // Collect data + let promises + if (!localStorage['gh-data']) + promises = Promise.all(Object.keys(coins).map(coin => { + var url = coins[coin] + if (url.includes('github.com')) { + return promiseGitHubRepoStats(url).then(data => { + data.coin = coin + data.url = url + return data + }) + } else { + return promiseBitbucketRepoStats(url).then(data => { + data.coin = coin + data.url = url + return data + }) + } + + })) + .then((data) => { + // cache + localStorage['gh-data'] = JSON.stringify(data) + return data + }) + else promises = Promise.resolve(JSON.parse(localStorage['gh-data'])) + + + + promises.then(data => { + // data = parseDates(data) + data = fillAll(data, columns) + $('#table').DataTable({ data: _.values(data), columns, "order": [ [1, "desc"] - ] + ], + pageLength: 100, + "lengthMenu": [ 10, 25, 50, 75, 100,800], + buttons: ['colvis'], + stateSave: true, + dom: 'Bfrtip', }) $('#markdown').val(makeMarkDownTable(data))