gh_contributors 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.md +19 -0
- data/gh_contributors.gemspec +18 -0
- data/lib/gh_contributors.rb +116 -0
- data/lib/gh_contributors/version.rb +4 -0
- metadata +50 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Github Contributors
|
2
|
+
|
3
|
+
Update static files with github contributors list.
|
4
|
+
|
5
|
+
- Static content update for speed and avoiding GH limits.
|
6
|
+
- Read GitHub contributions, transform to urls and update files.
|
7
|
+
- All public methods return self for easy chaining.
|
8
|
+
|
9
|
+
# Example
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
GhContributors.for_org('railsisntaller').to_urls.update_files('public/contributors.html')
|
13
|
+
GhContributors.for_repo('railsisntaller/website').to_urls.update_files('public/index.html')
|
14
|
+
```
|
15
|
+
|
16
|
+
# TODO
|
17
|
+
|
18
|
+
1. add tests
|
19
|
+
2. improve docs
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
Kernel.load File.expand_path("../lib/gh_contributors/version.rb", __FILE__)
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "gh_contributors"
|
8
|
+
s.version = GhContributors::VERSION
|
9
|
+
s.authors = ["Michal Papis"]
|
10
|
+
s.email = ["mpapis@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/mpapis/gh_contributors"
|
12
|
+
s.summary = %q{Update static files with github contributors list.}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
|
17
|
+
#s.add_development_dependency "smf-gem"
|
18
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#/usr/bin/env ruby
|
2
|
+
|
3
|
+
##
|
4
|
+
# static content update for speed and avoiding GH limits
|
5
|
+
# read GitHub contributions, transform to urls and update files
|
6
|
+
# all public methods return self for easy chaining
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# GhContributors.for_org('railsisntaller').to_urls.update_files('public/contributors.html')
|
11
|
+
# GhContributors.for_repo('railsisntaller/website').to_urls.update_files('public/index.html', 'public/contributors.html')
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'json'
|
15
|
+
require 'open-uri'
|
16
|
+
|
17
|
+
class GhContributors
|
18
|
+
DEFAULT_URL_FORMAT = %q{%Q{<a href="#{data['url']}" title="#{login} - #{data['contributions']}"><img src="#{data['avatar_url']}" alt="#{login} - #{data['contributions']}"/></a>}}
|
19
|
+
DEFAULT_SEARCH = /<span class="contributors">.*?<\/span>/m
|
20
|
+
DEFAULT_REPLACE = %q{%Q{<span class="contributors">\n#{@data.join("\n")}\n</span>}}
|
21
|
+
|
22
|
+
attr_reader :data
|
23
|
+
|
24
|
+
# for_org('railsinstaller')
|
25
|
+
def self.for_org(name)
|
26
|
+
GhContributors.new.for_org(name)
|
27
|
+
end
|
28
|
+
def for_org(name)
|
29
|
+
@data = load_json(url_builder("orgs/#{name}/repos")).map{ |repo|
|
30
|
+
log "repository: #{name}/#{repo['name']}"
|
31
|
+
load_json(repo['contributors_url'])
|
32
|
+
}.inject(&:+)
|
33
|
+
calculate
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
# for_repo('railsinstaller/webapp')
|
38
|
+
def self.for_repo(name)
|
39
|
+
GhContributors.new.for_repo(name)
|
40
|
+
end
|
41
|
+
def for_repo(name)
|
42
|
+
log "repository: #{name}"
|
43
|
+
@data = load_json(url_builder("repos/#{name}/contributors"))
|
44
|
+
calculate
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_urls(format=GhContributors::DEFAULT_URL_FORMAT)
|
49
|
+
@data.map! {|login, data|
|
50
|
+
log "user: #{login} - #{data['contributions']}"
|
51
|
+
if block_given?
|
52
|
+
yield login, data
|
53
|
+
else
|
54
|
+
eval format
|
55
|
+
end
|
56
|
+
}
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
def update_files(*files)
|
61
|
+
options = files.last.kind_of?(Hash) ? files.pop : {}
|
62
|
+
options[:search] ||= DEFAULT_SEARCH
|
63
|
+
options[:replace] ||= DEFAULT_REPLACE
|
64
|
+
files = files.first if files.first.kind_of? Array
|
65
|
+
files.each do |file|
|
66
|
+
log "file: #{file}"
|
67
|
+
update_file(file) do |text|
|
68
|
+
if block_given?
|
69
|
+
text = yield text, @data, file
|
70
|
+
else
|
71
|
+
text.sub(options[:search], eval(options[:replace]))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# group data, calculate contributions, sort by contributions
|
81
|
+
def calculate
|
82
|
+
@data = @data.group_by {|contributor|
|
83
|
+
contributor['login']
|
84
|
+
}.map {|login, data|
|
85
|
+
[login, {
|
86
|
+
'avatar_url' => data.first['avatar_url'],
|
87
|
+
'url' => data.first['url'],
|
88
|
+
'contributions' => data.map{|repo| repo['contributions'].to_i}.inject(&:+)
|
89
|
+
}]
|
90
|
+
}.sort_by{|login, data|
|
91
|
+
[1000000/data['contributions'], login]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
# Build full path to resource to use
|
96
|
+
def url_builder(path)
|
97
|
+
"https://api.github.com/#{path}"
|
98
|
+
end
|
99
|
+
|
100
|
+
# Load json from url
|
101
|
+
def load_json(url)
|
102
|
+
open(url){ |json| JSON.load(json) }
|
103
|
+
end
|
104
|
+
|
105
|
+
# Allow editing file text in a block
|
106
|
+
# Example: update_file('some.txt'){|text| text.gsub(/bla/,'ble')}
|
107
|
+
def update_file(file)
|
108
|
+
text = File.read(file)
|
109
|
+
text = yield text
|
110
|
+
File.open(file, 'w') { |f| f.write(text) }
|
111
|
+
end
|
112
|
+
|
113
|
+
def log(text)
|
114
|
+
puts text
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gh_contributors
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michal Papis
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
- mpapis@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- README.md
|
23
|
+
- gh_contributors.gemspec
|
24
|
+
- lib/gh_contributors.rb
|
25
|
+
- lib/gh_contributors/version.rb
|
26
|
+
homepage: https://github.com/mpapis/gh_contributors
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.25
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: Update static files with github contributors list.
|
50
|
+
test_files: []
|