Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 82b0e1e

Browse filesBrowse files
committed
new deployment
1 parent 53caf1d commit 82b0e1e
Copy full SHA for 82b0e1e

File tree

7 files changed

+233
-28
lines changed
Filter options

7 files changed

+233
-28
lines changed

‎404/index.html

Copy file name to clipboardExpand all lines: 404/index.html
+5-5Lines 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

Copy file name to clipboard
+143-1Lines 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

Copy file name to clipboard
+53-2Lines 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

Copy file name to clipboard
+13-1Lines 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

Copy file name to clipboardExpand all lines: github/index.html
+10-10Lines 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

Copy file name to clipboardExpand all lines: index.html
+6-6Lines 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

Copy file name to clipboardExpand all lines: rss.xml
+3-3Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.