Skip to content

Commit 82b0e1e

Browse files
committed
new deployment
1 parent 53caf1d commit 82b0e1e

File tree

7 files changed

+233
-28
lines changed

7 files changed

+233
-28
lines changed

404/index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<title>Page not found</title>
88
<link rel="shortcut icon" href="/img/coderstats.png">
99
<link rel="canonical" href="http://localhost:8080/404/" />
10-
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
10+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
1111
<link rel="stylesheet" href="/compiled/style.css">
1212
</head>
1313
<body>
@@ -22,9 +22,9 @@ <h1>Page not found</h1>
2222
<a href="https://chrome.google.com/webstore/detail/necogepejonacpphmlmcagmbjaogpbng">Chrome Extension</a><a href="https://addons.mozilla.org/en-US/firefox/addon/coderstats/">Firefox Add-on</a><a href="https://teespring.com/stores/codershirts" title="T-Shirts, hoodies, mugs and stickers for coders">CoderShirts Store</a>
2323
</footer>
2424

25-
<script src="//cdn.jsdelivr.net/npm/vue"></script>
26-
<script src="//cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
27-
<script src="//cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
28-
<script src="//cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
25+
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
26+
<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
27+
<script src="https://cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
28+
<script src="https://cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
2929
</body>
3030
</html>

compiled/coder.js

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,143 @@
1-
const DEV=0;let bar_options={axisX:{onlyInteger:!0},axisY:{offset:100,showGrid:!1},horizontalBars:!0,reverseData:!0},github_user=null;document.location.hash?github_user=document.location.hash.replace('#',''):document.location.href='/',document.title=`CoderStats(${github_user})`,document.getElementsByClassName('brand')[0].textContent=document.title;let url_user=`https://api.github.com/users/${github_user}`,url_repos=`${url_user}/repos?sort=pushed&per_page=100`,months_short=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];let coder=new Vue({el:'#coder',data:{repos:[],response:{},sort_orders:{},sort_key:'',user:null},computed:{repos_pushed:function(){return this.repos.filter((a)=>a.pushed_at>a.created_at)},repos_pushed_ratio:function(){return this.repos.length?this.repos_pushed.length/this.repos.length:0},languages:function(){return d3.nest().key((a)=>a.language).rollup((a)=>a.length).entries(this.repos_pushed.filter((a)=>a.language)).sort((c,a)=>a.value-c.value)},issues:function(){return this.repoRanking('open_issues_count')},forks:function(){return this.repoRanking('forks_count')},stars:function(){return this.repoRanking('stargazers_count')},total_forks:function(){return d3.sum(this.forks,(a)=>a.forks_count)},total_issues:function(){return d3.sum(this.issues,(a)=>a.open_issues_count)},total_stars:function(){return d3.sum(this.stars,(a)=>a.stargazers_count)}},filters:{fixURL:(a)=>(a.startsWith('http')||(a=`http://${a}`),a),formatDate:(a)=>{let b=new Date(a);return`${b.getDate()} ${months_short[b.getMonth()]} ${b.getYear()+1900}`},formatURL:(a)=>a.split('://').pop().replace(/\/$/,'')},created:function(){this.fetchRepos(),this.fetchUser()},updated:function(){let a=this.languages.slice(0,10);new Chartist.Bar('#language-ranking',{labels:a.map((a)=>a.key),series:[a.map((a)=>a.value)]},bar_options),this.rankingGraph(this.issues.slice(0,10),'open_issues_count','#issues-ranking'),this.rankingGraph(this.forks.slice(0,10),'forks_count','#forks-ranking'),this.rankingGraph(this.stars.slice(0,10),'stargazers_count','#stars-ranking')},methods:{fetchRepos:function(){this.$http.get(url_repos).then((a)=>{this.response.repos=a,this.repos=a.body})},fetchUser:function(){this.$http.get(url_user).then((a)=>{this.response.user=a,this.user=a.body,this.user.name||(this.user.name=this.user.login)})},order:function(a){return 0>this.sort_orders[a]?'dsc':'asc'},rankingGraph:function(a,b,c){a.length&&new Chartist.Bar(c,{labels:a.map((a)=>a.name),series:[a.map((a)=>a[b])]},bar_options)},repoRanking:function(c){return this.repos_pushed.filter((a)=>a[c]).sort((d,a)=>a[c]-d[c])},sortBy:function(c,d='number'){let e='string'===d?'':0;this.sort_key=c,this.sort_orders[c]=-1*(this.sort_orders[c]||1),this.repos.sort((f,a)=>{let b=f[c]||e,g=a[c]||e;return'string'===d&&(b=b.toLowerCase(),g=g.toLowerCase()),(b===g?0:b>g?1:-1)*this.sort_orders[c]})}}});
1+
const DEV = 0;
2+
3+
let bar_options = {
4+
axisX: { onlyInteger: true },
5+
axisY: { offset: 100, showGrid: false },
6+
horizontalBars: true,
7+
reverseData: true
8+
};
9+
10+
let github_user = null;
11+
if (document.location.hash) {
12+
github_user = document.location.hash.replace('#', '');
13+
} else {
14+
document.location.href = '/';
15+
}
16+
// Set these values here because they are outside of vue's scope.
17+
let short_title = `CoderStats(${github_user})`;
18+
document.title = document.title.replace('CoderStats', short_title);
19+
document.getElementsByClassName('brand')[0].textContent = short_title;
20+
21+
let url_user = `https://api.github.com/users/${github_user}`,
22+
url_repos = `${url_user}/repos?sort=pushed&per_page=100`,
23+
months_short = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
24+
25+
if (DEV) {
26+
url_user = '/data/user.json';
27+
url_repos = '/data/repos.json';
28+
}
29+
30+
let coder = new Vue({
31+
el: '#coder',
32+
data: {
33+
repos: [],
34+
response: {},
35+
sort_orders: {},
36+
sort_key: '',
37+
user: null
38+
},
39+
computed: {
40+
// Only repos the user actually pushed at, i.e. no forks with no user commits.
41+
repos_pushed: function () {
42+
return this.repos.filter(d => d.pushed_at > d.created_at);
43+
},
44+
repos_pushed_ratio: function () {
45+
return this.repos.length ? this.repos_pushed.length / this.repos.length : 0;
46+
},
47+
languages: function () {
48+
return d3.nest().key(d => d.language).rollup(leaves => leaves.length).entries(this.repos_pushed.filter(d => d.language)).sort((a, b) => b.value - a.value);
49+
},
50+
issues: function () {
51+
return this.repoRanking('open_issues_count');
52+
},
53+
forks: function () {
54+
return this.repoRanking('forks_count');
55+
},
56+
stars: function () {
57+
return this.repoRanking('stargazers_count');
58+
},
59+
total_forks: function () {
60+
return d3.sum(this.forks, d => d.forks_count);
61+
},
62+
total_issues: function () {
63+
return d3.sum(this.issues, d => d.open_issues_count);
64+
},
65+
total_stars: function () {
66+
return d3.sum(this.stars, d => d.stargazers_count);
67+
}
68+
},
69+
filters: {
70+
fixURL: value => {
71+
if (!value.startsWith('http')) {
72+
value = `http://${value}`;
73+
}
74+
return value;
75+
},
76+
formatDate: value => {
77+
let dt = new Date(value);
78+
return `${dt.getDate()} ${months_short[dt.getMonth()]} ${dt.getYear() + 1900}`;
79+
},
80+
formatURL: value => {
81+
return value.split('://').pop().replace(/\/$/, '');
82+
}
83+
},
84+
created: function () {
85+
this.fetchRepos();
86+
this.fetchUser();
87+
},
88+
updated: function () {
89+
let language_ranking = this.languages.slice(0, 10);
90+
new Chartist.Bar('#language-ranking', {
91+
labels: language_ranking.map(d => d.key),
92+
series: [language_ranking.map(d => d.value)]
93+
}, bar_options);
94+
95+
this.rankingGraph(this.issues.slice(0, 10), 'open_issues_count', '#issues-ranking');
96+
this.rankingGraph(this.forks.slice(0, 10), 'forks_count', '#forks-ranking');
97+
this.rankingGraph(this.stars.slice(0, 10), 'stargazers_count', '#stars-ranking');
98+
},
99+
methods: {
100+
fetchRepos: function () {
101+
this.$http.get(url_repos).then(response => {
102+
this.response.repos = response;
103+
this.repos = response.body;
104+
});
105+
},
106+
fetchUser: function () {
107+
this.$http.get(url_user).then(response => {
108+
this.response.user = response;
109+
this.user = response.body;
110+
if (!this.user.name) this.user.name = this.user.login;
111+
});
112+
},
113+
order: function (key) {
114+
// asc is default, because sort orders are initially unset
115+
return this.sort_orders[key] < 0 ? 'dsc' : 'asc';
116+
},
117+
rankingGraph: function (series, property, selector) {
118+
if (series.length) {
119+
new Chartist.Bar(selector, {
120+
labels: series.map(d => d.name),
121+
series: [series.map(d => d[property])]
122+
}, bar_options);
123+
}
124+
},
125+
repoRanking: function (property) {
126+
return this.repos_pushed.filter(d => d[property]).sort((a, b) => b[property] - a[property]);
127+
},
128+
sortBy: function (key, type = 'number') {
129+
let default_value = type === 'string' ? '' : 0;
130+
this.sort_key = key;
131+
this.sort_orders[key] = (this.sort_orders[key] || 1) * -1;
132+
this.repos.sort((a, b) => {
133+
let x = a[key] || default_value,
134+
y = b[key] || default_value;
135+
if (type === 'string') {
136+
x = x.toLowerCase();
137+
y = y.toLowerCase();
138+
}
139+
return (x === y ? 0 : x > y ? 1 : -1) * this.sort_orders[key];
140+
});
141+
}
142+
}
143+
});

compiled/front.js

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,59 @@
1-
Vue.component('user-link',{props:['login','avatar_url'],template:`
1+
Vue.component('user-link', {
2+
props: ['login', 'avatar_url'],
3+
template: `
24
<div class="col-1-xl col-2-l col-4-m col-12">
35
<a v-bind:href="'/github#' + login">
46
<img :src="avatar_url" :alt="login"/><br>
57
<i class="fa fa-user" aria-hidden="true"></i> {{ login }}
68
</a>
79
</div>
8-
`}),new Vue({el:'#active-users',data:{events:null},computed:{users:function(){return d3.nest().key((a)=>a.actor.login).entries(this.events.filter((a)=>'PushEvent'===a.type)).sort((c,a)=>a.values.length-c.values.length)}},created:function(){this.$http.get('https://api.github.com/events').then((a)=>{this.events=a.body})}}),new Vue({el:'#followed-users',data:{users:[]},created:function(){this.$http.get('/data/users.json').then((a)=>{this.users=a.body.items})}}),new Vue({el:'#most-repos-users',data:{users:[]},created:function(){this.$http.get('/data/most-repos-users.json').then((a)=>{this.users=a.body.items})}}),new Vue({el:'#earliest-users',data:{users:[]},created:function(){this.$http.get('/data/earliest-users.json').then((a)=>{this.users=a.body.items})}});
10+
`
11+
});
12+
13+
new Vue({
14+
el: '#active-users',
15+
data: { events: null },
16+
computed: {
17+
users: function () {
18+
return d3.nest().key(d => d.actor.login).entries(this.events.filter(d => d.type === 'PushEvent')).sort((a, b) => b.values.length - a.values.length);
19+
}
20+
},
21+
created: function () {
22+
this.$http.get('https://api.github.com/events').then(response => {
23+
this.events = response.body;
24+
});
25+
}
26+
});
27+
28+
new Vue({
29+
el: '#followed-users',
30+
data: { users: [] },
31+
created: function () {
32+
// https://api.github.com/search/users?q=repos:%3E1&sort=followers&order=desc
33+
this.$http.get('/data/users.json').then(response => {
34+
this.users = response.body.items;
35+
});
36+
}
37+
});
38+
39+
new Vue({
40+
el: '#most-repos-users',
41+
data: { users: [] },
42+
created: function () {
43+
// https://api.github.com/search/users?q=repos:%3E1%20type:user&sort=repositories&order=desc
44+
this.$http.get('/data/most-repos-users.json').then(response => {
45+
this.users = response.body.items;
46+
});
47+
}
48+
});
49+
50+
new Vue({
51+
el: '#earliest-users',
52+
data: { users: [] },
53+
created: function () {
54+
// https://api.github.com/search/users?q=repos:%3E1%20type:user&sort=joined&order=asc
55+
this.$http.get('/data/earliest-users.json').then(response => {
56+
this.users = response.body.items;
57+
});
58+
}
59+
});

compiled/search.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
1-
let search=new Vue({el:'#search',data:{username:''},methods:{coder:function(){this.username&&(document.location.href=`/github#${this.username}`)}}});
1+
let search = new Vue({
2+
el: '#search',
3+
data: {
4+
username: ''
5+
},
6+
methods: {
7+
coder: function () {
8+
if (this.username) {
9+
document.location.href = `/github#${this.username}`;
10+
}
11+
}
12+
}
13+
});

github/index.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6-
<meta name="description" content="">
7-
<title>CoderStats</title>
6+
<meta name="description" content="Summary statistics, rankings and repositories about public source code repositories on GitHub.">
7+
<title>CoderStats - Summary Statistics, Rankings and Repositories</title>
88
<link rel="shortcut icon" href="/img/coderstats.png">
99
<link rel="canonical" href="http://localhost:8080/github/" />
10-
<link rel="stylesheet" href="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css">
10+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css">
1111
<link rel="stylesheet" href="/compiled/coder.css">
12-
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
12+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
1313
<link rel="stylesheet" href="/compiled/style.css">
1414
</head>
1515
<body>
1616
<nav class="container-full clear"><div class="row">
1717
<div class="col-12 col-4-xl col-4-l col-5-m">
18-
<a href="/"><img src="/img/coderstats.png"></a>
18+
<a href="/"><img src="/img/coderstats.png" alt="logo"></a>
1919
<span class="brand">CoderStats()</span>
2020
</div>
2121
<div class="col-12 col-8-xl col-8-l col-7-m" id="search">
@@ -160,12 +160,12 @@ <h2 id="repos">Repositories</h2>
160160
<a href="https://chrome.google.com/webstore/detail/necogepejonacpphmlmcagmbjaogpbng">Chrome Extension</a><a href="https://addons.mozilla.org/en-US/firefox/addon/coderstats/">Firefox Add-on</a><a href="https://teespring.com/stores/codershirts" title="T-Shirts, hoodies, mugs and stickers for coders">CoderShirts Store</a>
161161
</footer>
162162

163-
<script src="//cdn.jsdelivr.net/npm/vue"></script>
164-
<script src="//cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
165-
<script src="//cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
166-
<script src="//cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
163+
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
164+
<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
165+
<script src="https://cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
166+
<script src="https://cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
167167

168-
<script src="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
168+
<script src="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
169169
<script src="/compiled/coder.js"></script>
170170
<script src="/compiled/search.js"></script>
171171
</body>

index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6-
<meta name="description" content="">
6+
<meta name="description" content="CoderStats is a free service that displays statistics about public source code repositories for GitHub users and organizations.">
77
<title>CoderStats - View Statistics for Millions of GitHub Users and Organizations</title>
88
<link rel="shortcut icon" href="/img/coderstats.png">
99
<link rel="canonical" href="http://localhost:8080/" />
10-
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
10+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
1111
<link rel="stylesheet" href="/compiled/style.css">
1212
</head>
1313
<body>
@@ -74,10 +74,10 @@ <h2>Users with old accounts</h2>
7474
<a href="https://chrome.google.com/webstore/detail/necogepejonacpphmlmcagmbjaogpbng">Chrome Extension</a><a href="https://addons.mozilla.org/en-US/firefox/addon/coderstats/">Firefox Add-on</a><a href="https://teespring.com/stores/codershirts" title="T-Shirts, hoodies, mugs and stickers for coders">CoderShirts Store</a>
7575
</footer>
7676

77-
<script src="//cdn.jsdelivr.net/npm/vue"></script>
78-
<script src="//cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
79-
<script src="//cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
80-
<script src="//cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
77+
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
78+
<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1/dist/vue-resource.min.js"></script>
79+
<script src="https://cdn.jsdelivr.net/npm/d3-collection@1.0.7/dist/d3-collection.min.js"></script>
80+
<script src="https://cdn.jsdelivr.net/npm/d3-array@2.2.0/dist/d3-array.min.js"></script>
8181

8282
<script src="/compiled/front.js"></script>
8383
<script src="/compiled/search.js"></script>

rss.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
<channel><title>RSS Feed</title>
44
<link>http://localhost:8080</link>
55
<description>RSS Feed</description>
6-
<lastBuildDate>Wed, 29 May 2019 01:23:37 </lastBuildDate>
6+
<lastBuildDate>Wed, 29 May 2019 11:17:18 </lastBuildDate>
77
<generator>Logya</generator>
88
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
99
<item>
10-
<title><![CDATA[CoderStats]]></title>
10+
<title><![CDATA[CoderStats - Summary Statistics, Rankings and Repositories]]></title>
1111
<link><![CDATA[http://localhost:8080/github/]]></link>
12-
<description><![CDATA[<p></p>]]></description>
12+
<description><![CDATA[<p>Summary statistics, rankings and repositories about public source code repositories on GitHub.</p>]]></description>
1313
<guid><![CDATA[http://localhost:8080/github/]]></guid>
1414
<pubDate>Fri, 22 Sep 2017 22:12:48 </pubDate>
1515
</item>

0 commit comments

Comments
 (0)