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,3 @@
1
+ module GithubApi
2
+ VERSION = '0.0.1'
3
+ 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
@@ -0,0 +1,3 @@
1
+ $: << File.join(File.dirname(__FILE__), '/../lib' )
2
+ require 'rspec'
3
+ require 'unofficial-github-api'
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: