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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy