unofficial-github-api 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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:
|