dash-docs/_plugins/contributors.rb
Saivann 63dac6894a Support GitHub API pagination
(GitHub now returns only limited data per API Call)
2014-04-21 17:38:27 -04:00

72 lines
1.9 KiB
Ruby

#contributors.rb fetches Bitcoin Core contributors list and set
#site.contributors array. This is later used to display the
#list of contributors on the "Development" page.
require 'open-uri'
require 'json'
require 'yaml'
module Jekyll
class CategoryGenerator < Generator
def fetch_contributors
page = 1
contributors = []
while page < 10 do
begin
ar = JSON.parse(open("https://api.github.com/repos/bitcoin/bitcoin/contributors?page=#{page}&per_page=100","User-Agent"=>"Ruby/#{RUBY_VERSION}").read)
rescue
print 'GitHub API Call Failed!'
break
end
break if (ar.length == 0)
contributors.push(*ar)
page += 1
end
contributors.map do |x|
x['name'] = x['login'] unless x.has_key?('name')
x['name'] = x['login'] if x['name'] == ""
x
end
end
def merge_contributors(contributors, aliases)
contributors = contributors.map do |c|
c['name'] = aliases[c['name']] if aliases.has_key?(c['name'])
c
end
hoaoh = contributors.reduce({}) do |result, item|
result.merge({ item['name'] => [item] }) { |key, old, new| old[0]['contributions'] += new[0]['contributions']; old }
end
hoaoh.values.map { |sublist|
sublist.reduce({}) do |merged,h|
merged.merge(h) do |key,old,new| (key=='name' ? old : old+new) end
end
}.flatten
end
def generate(site)
class << site
attr_accessor :contributors
alias contrib_site_payload site_payload
def site_payload
h = contrib_site_payload
payload = h["site"]
payload["contributors"] = self.contributors
h["site"] = payload
h
end
end
site.contributors = merge_contributors(fetch_contributors(), site.config['aliases']).sort_by{|c| - c['contributions']}
end
end
end