github-api-client 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,28 @@
1
+ #!/usr/bin/ruby
2
+ $LOAD_PATH << './github_api' << './lib/github_api'
3
+
4
+ require 'net/http'
5
+ require 'uri'
6
+ require 'yaml'
7
+ require 'singleton'
8
+ require 'active_record'
9
+
10
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => 'ruby.db'
11
+
12
+ require 'base'
13
+ require 'user'
14
+ require 'browser'
15
+ require 'rainbow'
16
+
17
+
18
+ begin
19
+ unless $user = GitHub::User.where(YAML::load_file('config/secrets.yml')['user']).first
20
+ $user = GitHub::User.create(YAML::load_file('config/secrets.yml')['user'])
21
+ end rescue puts "Run rake db:migrate task and restart application"
22
+
23
+ rescue Errno::ENOENT
24
+ puts "Could not load config/secrets.yml, have you defined it?"
25
+ end
26
+
27
+ module GitHub #:nodoc:
28
+ end
@@ -0,0 +1,80 @@
1
+ module GitHub
2
+ # Basic functionality inherited later
3
+ class Base
4
+ # Sends key= value signals at object, that inherits it
5
+ def build(options = {})
6
+ options.each_pair do |k, v|
7
+ self.send "#{k.to_sym}=", v
8
+ end
9
+ end
10
+
11
+ # Synchronizes every information from local database with GitHub
12
+ # == VERY DANGEROUS AND EVIL
13
+ # Recursively gets all* GitHub Users, takes years to fetch
14
+ # * - all that have at least one follower
15
+ def self.sync
16
+ puts "Synchronizing local database with GitHub"
17
+ users = GitHub::User.all
18
+ count = users.count
19
+ i = 1
20
+ users.each do |user|
21
+ puts "#{count.to_s} / #{i.to_s} - Updating records"
22
+ i = i + 1
23
+ # Disabled because of its length
24
+ #user.get
25
+ #user.get_followers
26
+ end
27
+ end
28
+
29
+ # Converts pitfalls from GitHub API differences into normal data
30
+ def self.parse_attributes(attributes)
31
+ #p attributes
32
+ {:name => :login, :username => :login, :fullname => :name, :followers => :followers_count, :repos => :public_repo_count, :created => :nil}.each do |k, v|
33
+ unless v == :nil
34
+ attributes[v] = attributes[k.to_s]
35
+ end
36
+ attributes.delete k.to_s
37
+ end
38
+ attributes
39
+ end
40
+
41
+ def to_ary #:nodoc:
42
+ return self.attributes
43
+ end
44
+
45
+ def method_missing(method, *args, &block) #:nodoc:
46
+ puts "Missing #{method}"
47
+ end
48
+ end
49
+
50
+ # Singleton class, that is used globally
51
+ class Helper
52
+ include Singleton
53
+
54
+ # Recognizing objects retrieved from GitHub, creating new and assigning parameters
55
+ # from YAML
56
+ # === Objects
57
+ # * GitHub::User - recognition by key 'user'
58
+ # More to be added soon
59
+ def self.build_from_yaml(yaml)
60
+ yaml = YAML::load yaml
61
+ object = case
62
+ when yaml.has_key?('user') then [GitHub::User, 'user']
63
+ when yaml.has_key?('users') then [[GitHub::User], 'users']
64
+ end
65
+ if object.first.class == Array
66
+ objects = []
67
+ yaml[object[1]].each do |single_yaml|
68
+ o = object.first.first.new
69
+ o.build single_yaml
70
+ objects << o
71
+ end
72
+ objects
73
+ else
74
+ object[0] = object.first.new
75
+ object.first.build yaml[object[1]]
76
+ object.first
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,25 @@
1
+ module GitHub
2
+ # Handles low-level HTTP requests
3
+ class Browser
4
+ include Singleton
5
+
6
+ # Returnes root uri for GitHub API
7
+ def self.base_uri
8
+ "http://github.com/api/v2/yaml"
9
+ end
10
+
11
+ # Runs HTTP GET request at given uri
12
+ def self.get(uri)
13
+ uri = uri.gsub(" ","+")
14
+ puts "Requesting #{URI.parse(self.base_uri + uri)}"
15
+ Net::HTTP.get URI.parse(self.base_uri + uri)
16
+ end
17
+
18
+ # Runs HTTP POST requests with options such as GitHub::User.auth_info
19
+ def self.post(uri, options = {})
20
+ uri = uri.gsub(" ","+")
21
+ puts "Requesting #{URI.parse(self.base_uri + uri)} with options: #{options}"
22
+ Net::HTTP.post_form URI.parse(self.base_uri + uri), options
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,93 @@
1
+ module GitHub
2
+ # Basic model, stores retrieved user and his associations
3
+ class User < ActiveRecord::Base
4
+ has_and_belongs_to_many :followers, :foreign_key => 'follower_id', :association_foreign_key => 'following_id', :join_table => 'followings', :class_name => 'User'
5
+ has_and_belongs_to_many :following, :foreign_key => 'following_id', :association_foreign_key => 'follower_id', :join_table => 'followings', :class_name => 'User'
6
+
7
+ # Fetches info about current_user from GitHub
8
+ # GitHub::User.new.build(:login => 'asd', :token => 'token').get #=> GitHub::User
9
+ def get
10
+ self.update_attributes YAML::load(GitHub::Browser.get("/user/show/#{self.login}"))['user']
11
+ self
12
+ end
13
+
14
+ # Static function, that gets information about GitHub::User by login.
15
+ # === Examples
16
+ # GitHub::User.get('defunkt') #=> GitHub::User
17
+ def self.get(login)
18
+ return GitHub::User.find_or_create_by_login YAML::load(GitHub::Browser.get("/user/show/#{login}"))['user']
19
+ end
20
+
21
+ def self.search(login)
22
+ users = []
23
+ YAML::load(GitHub::Browser.get("/user/search/#{login}"))['users'].each do |user|
24
+ users << GitHub::User.find_or_create_by_login(GitHub::Base.parse_attributes(user))
25
+ end
26
+ users
27
+ end
28
+
29
+ def set(route = [], options = {}) #:nodoc:
30
+ return GitHub::Browser.post "/#{route.join('/')}", options.merge(self.auth_info)
31
+ end
32
+
33
+ # End-user way to fetch information
34
+ def fetch(*things)
35
+ things.each do |thing|
36
+ case thing
37
+ when :self then get
38
+ when :followers then get_followers
39
+ end
40
+ end
41
+ self
42
+ end
43
+
44
+ # Executes when you got a real object
45
+ private
46
+ def get_followers
47
+ users = YAML::load(GitHub::Browser.get "/user/show/#{login}/followers")['users']
48
+
49
+ ids = []
50
+ i = 1
51
+ users.each do |user|
52
+ puts "#{users.length.to_s} / #{i.to_s} - Fetching followers"
53
+ i = i + 1
54
+ u = GitHub::User.find_or_create_by_login(user)
55
+ ids << u.id
56
+ end
57
+
58
+ self.follower_ids = ids
59
+ self
60
+ end
61
+
62
+ # Returns an array with logins of GitHub::User followers
63
+ public
64
+ def self.get_followers(login)
65
+ users = YAML::load(GitHub::Browser.get "/user/show/#{login}/followers")['users']
66
+
67
+ # Loading each user (not effective with 688 followers like schacon has)
68
+ objects = []
69
+ i = 1
70
+ users.each do |user|
71
+ puts "#{users.length.to_s} / #{i.to_s} - Fetching followers"
72
+ i = i + 1
73
+ u = GitHub::User.find_or_create_by_login(user)
74
+ objects << u
75
+ end
76
+ return objects
77
+ end
78
+
79
+ # Collects information from authenticated user.
80
+ # Used by post requests to authenticate
81
+ def auth_info
82
+ {:login => self.login, :token => self.token}
83
+ end
84
+
85
+ # Experimental, sets information about GitHub::User or returns authenticated :self
86
+ def post(login, options = {})
87
+ if [:self, :me].include? login
88
+ login = self.login
89
+ end
90
+ return GitHub::Browser.post "/user/show/#{login}", options.merge(self.auth_info)
91
+ end
92
+ end
93
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github-api-client
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - "Jakub Oko\xC5\x84ski"
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-11-28 00:00:00 +01:00
17
+ default_executable:
18
+ dependencies: []
19
+
20
+ description: Library for easy GitHub API browsing
21
+ email: kuba@okonski.org
22
+ executables: []
23
+
24
+ extensions: []
25
+
26
+ extra_rdoc_files: []
27
+
28
+ files:
29
+ - lib/github_api.rb
30
+ - lib/github_api/base.rb
31
+ - lib/github_api/browser.rb
32
+ - lib/github_api/user.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/farnoy/github-api-client
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.3.7
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: Library for easy GitHub API browsing
65
+ test_files: []
66
+