unofficial-github-api 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
|
|
1
|
+
require 'unofficial-github-api/github_api'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'work_queue'
|
2
|
+
require 'chronic'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'open-uri'
|
5
|
+
module GithubApi
|
6
|
+
class User
|
7
|
+
attr_reader :name
|
8
|
+
def initialize(user_name)
|
9
|
+
@name = user_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def followers
|
13
|
+
wq = WorkQueue.new 5
|
14
|
+
list = {}
|
15
|
+
pages = get_number_of_followers_pages
|
16
|
+
(1..pages).to_a.each do |i|
|
17
|
+
wq.enqueue_b do
|
18
|
+
list[i] = FollowersPage.new(name, i).followers_list
|
19
|
+
end
|
20
|
+
end
|
21
|
+
wq.join
|
22
|
+
list.values.flatten
|
23
|
+
end
|
24
|
+
|
25
|
+
def created_at
|
26
|
+
Chronic.parse(Nokogiri::HTML(open("https://github.com/#{name}")).css('span.join-date').text)
|
27
|
+
end
|
28
|
+
|
29
|
+
def followers_size
|
30
|
+
Nokogiri::HTML(open("https://github.com/#{name}/followers")).xpath('//*[@id="site-container"]/div[1]/div/ul/li/span/span/a[2]').text.gsub(/\,/,'').to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
def commits_size
|
34
|
+
Nokogiri::HTML(open("https://github.com/#{name}")).xpath('//*[@id="contributions-calendar"]/div[3]/div[1]/span[1]').text.split(' ').first.gsub(/\,/,'').to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_number_of_followers_pages
|
38
|
+
(followers_size.to_f/51).ceil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class FollowersPage
|
43
|
+
attr_reader :name, :page
|
44
|
+
def initialize(user_name, page_number)
|
45
|
+
@name = user_name
|
46
|
+
@page = page_number
|
47
|
+
end
|
48
|
+
|
49
|
+
def content
|
50
|
+
@content ||= Nokogiri::HTML(open("https://github.com/#{name}/followers?page=#{page}"))
|
51
|
+
end
|
52
|
+
|
53
|
+
def follower_row(i)
|
54
|
+
content.xpath("//*[@id='site-container']/div[2]/ol/li[#{i}]")
|
55
|
+
end
|
56
|
+
|
57
|
+
def follower_name(i)
|
58
|
+
follower_row(i).children[1].attributes['href'].value.gsub(/\//,'')
|
59
|
+
end
|
60
|
+
|
61
|
+
def follower_exists?(i)
|
62
|
+
follower_row(i).to_ary != []
|
63
|
+
end
|
64
|
+
|
65
|
+
def followers_list
|
66
|
+
i, list = 1, []
|
67
|
+
while follower_exists?(i)
|
68
|
+
list << follower_name(i)
|
69
|
+
i += 1
|
70
|
+
end
|
71
|
+
list
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'GithubApi User' do
|
4
|
+
before(:all) do
|
5
|
+
@grigorik = GithubApi::User.new('igrigorik')
|
6
|
+
@max = GithubApi::User.new('mac-r')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should get number of commits' do
|
10
|
+
@grigorik.commits_size.should == 229
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should get number of followers' do
|
14
|
+
@grigorik.followers_size.should == 2217
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should get number of followers pages' do
|
18
|
+
@grigorik.get_number_of_followers_pages.should == 44
|
19
|
+
@max.get_number_of_followers_pages.should == 1
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should get list of followers' do
|
23
|
+
@max.followers.should == ['s0ber', 'targence', 'kossnocorp', 'Pistol92', 'denova', 'Virakocha', 'drinkius']
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should get join date' do
|
27
|
+
@grigorik.created_at.should == Time.new(2008,5,17, 12)
|
28
|
+
@max.created_at.should == Time.new(2011,10,1, 12)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'GithubApi FollowersPage' do
|
33
|
+
before(:all) do
|
34
|
+
@grigorik = GithubApi::FollowersPage.new('igrigorik', 1)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should check if follower exists' do
|
38
|
+
@grigorik.follower_exists?(1).should == true
|
39
|
+
@grigorik.follower_exists?(100).should == false
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should get a nickname of the first follower' do
|
43
|
+
@grigorik.follower_name(1).should == 'confa'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should return followers list per page' do
|
47
|
+
@grigorik.followers_list.should == ['confa', 'sainavaneethan', 'nano-monkey', 'shokai', 'pid', 'pielgrzym', 'deanhume', 'mohnish', 'mdi', 'delqn', 'emohacker', 'leoj3n', 'florinbroasca', 'guypod', 'mahinshaw', 'yuyay', 'jonathanchrisp', 'xinhui', 'code6', 'riywo', 'vieten', 'hugoabonizio', 'KevinQiangK', '9minds', 'ice-melon', 'danzajdband', 'umitunal', 'technommy', 'yuanyan', 'nadavhollander', 'peterood', 'rubymerchant', 'choppen5', 'hxgdzyuyi', 'rsaccoll', 'kostyantyn', 'grauwoelfchen', 'mirosr', 'ivalkeen', 'robwilliams', 'rogerjnak', 'sdeguardi', 'wyg1258', 'waibo', 'vitoleandro', 'aaronjwood', 'samsonradu', 'jaspervalero', 'nwokeo', 'wangshijun2010', 'bradberger']
|
48
|
+
GithubApi::FollowersPage.new('igrigorik', 1000).followers_list.should == []
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: unofficial-github-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Max Makarochkin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: nokogiri
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: work_queue
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: chronic
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Read more documentation at repository homepage.
|
111
|
+
email: maxim.makarochkin@gmail.com
|
112
|
+
executables: []
|
113
|
+
extensions: []
|
114
|
+
extra_rdoc_files: []
|
115
|
+
files:
|
116
|
+
- lib/unofficial-github-api/github_api.rb
|
117
|
+
- lib/unofficial-github-api/version.rb
|
118
|
+
- lib/unofficial-github-api.rb
|
119
|
+
- spec/github-api/github_api_spec.rb
|
120
|
+
- spec/spec_helper.rb
|
121
|
+
homepage: https://github.com/mac-r/unofficial-github-api
|
122
|
+
licenses:
|
123
|
+
- MIT
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options: []
|
126
|
+
require_paths:
|
127
|
+
- lib
|
128
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 1.9.3
|
134
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 1.8.23
|
143
|
+
signing_key:
|
144
|
+
specification_version: 3
|
145
|
+
summary: Unofficial Github API
|
146
|
+
test_files: []
|
147
|
+
has_rdoc:
|