git_hub 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +16 -2
- data/VERSION +1 -1
- data/bin/git_hub +1 -2
- data/git_hub.gemspec +30 -3
- data/lib/git_hub/api.rb +6 -0
- data/lib/git_hub/base.rb +52 -10
- data/lib/git_hub/commit.rb +45 -0
- data/lib/git_hub/repo.rb +47 -51
- data/rdoc/classes/GitHub/Api.html +300 -0
- data/rdoc/classes/GitHub/Base.html +423 -0
- data/rdoc/classes/GitHub/Repo.html +738 -0
- data/rdoc/classes/GitHub.html +310 -0
- data/rdoc/created.rid +1 -0
- data/rdoc/files/README_rdoc.html +171 -0
- data/rdoc/files/lib/git_hub/api_rb.html +103 -0
- data/rdoc/files/lib/git_hub/base_rb.html +101 -0
- data/rdoc/files/lib/git_hub/repo_rb.html +91 -0
- data/rdoc/files/lib/git_hub_rb.html +91 -0
- data/rdoc/fr_class_index.html +33 -0
- data/rdoc/fr_file_index.html +35 -0
- data/rdoc/fr_method_index.html +81 -0
- data/rdoc/index.html +23 -0
- data/rdoc/rdoc-style.css +299 -0
- data/spec/git_hub/base_spec.rb +2 -2
- data/spec/git_hub/commit_spec.rb +53 -0
- data/spec/git_hub/repo_spec.rb +123 -85
- data/spec/spec_helper.rb +35 -8
- data/spec/stubs/api_route_error.res +14 -0
- data/spec/stubs/commits/list/joe007/fine_repo/master/README.res +28 -0
- data/spec/stubs/commits/list/joe007/fine_repo/master.res +84 -0
- data/spec/stubs/commits/show/joe007/fine_repo/5e61f0687c40ca48214d09dc7ae2d0d0d8fbfeb8.res +38 -0
- data/spec/stubs/repos/create.1.res +22 -0
- data/spec/stubs/repos/{create.res → create.2.res} +0 -0
- data/spec/stubs/repos/create.3.res +100 -0
- data/spec/stubs/repos/create.4.res +14 -0
- data/spec/stubs/repos/show/joe007/fine_repo/branches.res +15 -0
- data/spec/stubs/repos/show/joe007/fine_repo/tags.res +17 -0
- metadata +30 -3
data/README.rdoc
CHANGED
@@ -18,14 +18,28 @@ Contributors always welcome!
|
|
18
18
|
require 'git_hub'
|
19
19
|
include GitHub
|
20
20
|
|
21
|
-
# Find existing repos
|
21
|
+
# Find existing repos:
|
22
22
|
repo = Repo.find(:user=>user_name, :repo=>repo_name)
|
23
23
|
repos = Repo.find(:user=>user_name)
|
24
24
|
search_repos = Repo.find(:query=>['search','terms'])
|
25
25
|
|
26
|
-
#
|
26
|
+
# Retrieve tags, branches and commits for a repo:
|
27
|
+
puts repo.tags['v0.1.0']
|
28
|
+
puts repo.branches['master']
|
29
|
+
repo.commits.each {|commit| p commit.author}
|
30
|
+
|
31
|
+
# Retrieve info for a specific commit:
|
32
|
+
commits = Commit.find(:user=>user_name, :repo=>repo_name, :branch=>'master')
|
33
|
+
commits = Commit.find(:user=>user_name, :repo=>repo_name, :branch=>'master', :path=>'README.rdoc')
|
34
|
+
commit = Commit.find(:user=>user_name, :repo=>repo_name, :sha=>'commit_sha')
|
35
|
+
# or, if repo is already retrieved:
|
36
|
+
commit = repo.commits.last
|
37
|
+
commit = repo.tags['v0.1.0'] #TODO - now returns only sha, not Commit
|
38
|
+
|
39
|
+
# Create new repo or delete existing repo (need to authenticate with your github credentials first)
|
27
40
|
Api.auth = {:user=>user_name, :token=>token}
|
28
41
|
new_repo = Repo.create(:name=>repo_name, :desc=>'Description', :homepage=>'http://your_page.org', :private=> false)
|
42
|
+
new_repo.delete
|
29
43
|
|
30
44
|
== REQUIREMENTS:
|
31
45
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/git_hub
CHANGED
data/git_hub.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{git_hub}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["arvicco"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-11}
|
13
13
|
s.default_executable = %q{git_hub}
|
14
14
|
s.description = %q{Simple interface to github API}
|
15
15
|
s.email = %q{arvitallian@gmail.com}
|
@@ -31,19 +31,45 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/git_hub.rb",
|
32
32
|
"lib/git_hub/api.rb",
|
33
33
|
"lib/git_hub/base.rb",
|
34
|
+
"lib/git_hub/commit.rb",
|
34
35
|
"lib/git_hub/repo.rb",
|
36
|
+
"rdoc/classes/GitHub.html",
|
37
|
+
"rdoc/classes/GitHub/Api.html",
|
38
|
+
"rdoc/classes/GitHub/Base.html",
|
39
|
+
"rdoc/classes/GitHub/Repo.html",
|
40
|
+
"rdoc/created.rid",
|
41
|
+
"rdoc/files/README_rdoc.html",
|
42
|
+
"rdoc/files/lib/git_hub/api_rb.html",
|
43
|
+
"rdoc/files/lib/git_hub/base_rb.html",
|
44
|
+
"rdoc/files/lib/git_hub/repo_rb.html",
|
45
|
+
"rdoc/files/lib/git_hub_rb.html",
|
46
|
+
"rdoc/fr_class_index.html",
|
47
|
+
"rdoc/fr_file_index.html",
|
48
|
+
"rdoc/fr_method_index.html",
|
49
|
+
"rdoc/index.html",
|
50
|
+
"rdoc/rdoc-style.css",
|
35
51
|
"spec/git_hub/api_spec.rb",
|
36
52
|
"spec/git_hub/base_spec.rb",
|
53
|
+
"spec/git_hub/commit_spec.rb",
|
37
54
|
"spec/git_hub/repo_spec.rb",
|
38
55
|
"spec/spec.opts",
|
39
56
|
"spec/spec_helper.rb",
|
40
|
-
"spec/stubs/
|
57
|
+
"spec/stubs/api_route_error.res",
|
58
|
+
"spec/stubs/commits/list/joe007/fine_repo/master.res",
|
59
|
+
"spec/stubs/commits/list/joe007/fine_repo/master/README.res",
|
60
|
+
"spec/stubs/commits/show/joe007/fine_repo/5e61f0687c40ca48214d09dc7ae2d0d0d8fbfeb8.res",
|
61
|
+
"spec/stubs/repos/create.1.res",
|
62
|
+
"spec/stubs/repos/create.2.res",
|
63
|
+
"spec/stubs/repos/create.3.res",
|
64
|
+
"spec/stubs/repos/create.4.res",
|
41
65
|
"spec/stubs/repos/delete/new_repo.1.res",
|
42
66
|
"spec/stubs/repos/delete/new_repo.2.res",
|
43
67
|
"spec/stubs/repos/search/joe+repo.res",
|
44
68
|
"spec/stubs/repos/show/joe007.res",
|
45
69
|
"spec/stubs/repos/show/joe007/err_repo.res",
|
46
70
|
"spec/stubs/repos/show/joe007/fine_repo.res",
|
71
|
+
"spec/stubs/repos/show/joe007/fine_repo/branches.res",
|
72
|
+
"spec/stubs/repos/show/joe007/fine_repo/tags.res",
|
47
73
|
"spec/stubs/repos/show/joe007/new_repo.res"
|
48
74
|
]
|
49
75
|
s.homepage = %q{http://github.com/arvicco/git_hub}
|
@@ -54,6 +80,7 @@ Gem::Specification.new do |s|
|
|
54
80
|
s.test_files = [
|
55
81
|
"spec/git_hub/api_spec.rb",
|
56
82
|
"spec/git_hub/base_spec.rb",
|
83
|
+
"spec/git_hub/commit_spec.rb",
|
57
84
|
"spec/git_hub/repo_spec.rb",
|
58
85
|
"spec/spec_helper.rb"
|
59
86
|
]
|
data/lib/git_hub/api.rb
CHANGED
@@ -15,6 +15,12 @@ module GitHub
|
|
15
15
|
auth != {}
|
16
16
|
end
|
17
17
|
|
18
|
+
def ensure_auth opts ={}
|
19
|
+
return if authenticated?
|
20
|
+
@auth = {'login'=>opts[:login], 'token'=>opts[:token]}
|
21
|
+
raise("Authentication failed") unless authenticated?
|
22
|
+
end
|
23
|
+
|
18
24
|
# Turns string into appropriate class constant, returns nil if class not found
|
19
25
|
def classify name
|
20
26
|
klass = name.split("::").inject(Kernel) {|klass, const_name| klass.const_get const_name }
|
data/lib/git_hub/base.rb
CHANGED
@@ -2,24 +2,25 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
module GitHub
|
4
4
|
class Base
|
5
|
-
@base_uri = ''
|
6
5
|
|
7
6
|
def initialize(attributes={})
|
7
|
+
update_attributes attributes
|
8
|
+
end
|
9
|
+
|
10
|
+
def update_attributes attributes
|
8
11
|
attributes.each do |key, value|
|
9
12
|
raise "No attr_accessor for #{key} on #{self.class}" unless respond_to?("#{key}=")
|
10
|
-
self.send("#{key}=", value)
|
13
|
+
self.send("#{key.to_s}=", value)
|
11
14
|
end
|
12
15
|
end
|
13
16
|
|
14
|
-
def self.base_uri uri
|
15
|
-
@base_uri = uri
|
16
|
-
end
|
17
|
-
|
18
17
|
class << self
|
19
18
|
def request verb, uri, params = {}
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
path = uri[0] == '/' ? base_uri+uri : uri
|
20
|
+
#p "request: #{verb} #{path} #{params}"
|
21
|
+
res = api.request verb, path, params
|
22
|
+
YAML::load(res.body) if res.respond_to?(:body)
|
23
|
+
#p "response: #{res}: #{res.code}: #{res.http_version}: #{res.message}", res.body
|
23
24
|
end
|
24
25
|
|
25
26
|
def get uri, params ={}
|
@@ -31,7 +32,43 @@ module GitHub
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def api
|
34
|
-
@@api ||=
|
35
|
+
@@api ||= Api.instance
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_resource base_uri, singulars, plurals
|
39
|
+
@base_uri = base_uri
|
40
|
+
@singulars = [singulars].flatten
|
41
|
+
@plurals = [plurals].flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
def base_uri
|
45
|
+
@base_uri || ""
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def normalize opts
|
51
|
+
opts[:user] ||= opts[:owner] || opts[:username] || opts[:login] || api.auth['login']
|
52
|
+
opts[:repo] ||= opts[:repository] || opts[:name] || opts[:project]
|
53
|
+
opts[:sha] ||= opts[:hash] || opts[:object_id] || opts[:id]
|
54
|
+
opts[:description] ||= opts[:descr] || opts[:desc]
|
55
|
+
opts[:query] ||= opts[:search]
|
56
|
+
opts[:branch] ||= 'master'
|
57
|
+
opts[:public] ||= !opts[:private] unless opts[:public] = false # defaults to true
|
58
|
+
end
|
59
|
+
|
60
|
+
def instantiate hash
|
61
|
+
if res = contains(hash, @singulars)
|
62
|
+
new res
|
63
|
+
elsif res = contains(hash, @plurals)
|
64
|
+
res.map {|r| new r}
|
65
|
+
else
|
66
|
+
hash
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def contains hash, keys
|
71
|
+
keys.inject(nil) {|memo, key| memo ||= hash[key.to_s]}
|
35
72
|
end
|
36
73
|
end
|
37
74
|
|
@@ -46,5 +83,10 @@ module GitHub
|
|
46
83
|
def api
|
47
84
|
self.class.api
|
48
85
|
end
|
86
|
+
|
87
|
+
def to_s
|
88
|
+
name
|
89
|
+
end
|
90
|
+
|
49
91
|
end
|
50
92
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module GitHub
|
2
|
+
class Commit < Base
|
3
|
+
|
4
|
+
set_resource 'http://github.com/api/v2/yaml/commits', 'commit', ['commits', 'tags', 'branches']
|
5
|
+
|
6
|
+
attr_accessor :id, :author, :committer, :parents, :url, :committed_date, :authored_date, :message, :tree,
|
7
|
+
# :user, :name, :sha, :repo,
|
8
|
+
# retrieving commit for a specific sha - "/show/#{opts[:user]}/#{opts[:repo]}/#{opts[:sha]}"
|
9
|
+
:added, :modified, :removed
|
10
|
+
|
11
|
+
def initialize opts
|
12
|
+
super
|
13
|
+
raise "Unable to initialize #{self.class} without id(sha)" unless sha
|
14
|
+
end
|
15
|
+
|
16
|
+
alias name id
|
17
|
+
alias name= id=
|
18
|
+
alias sha id
|
19
|
+
alias sha= id=
|
20
|
+
|
21
|
+
class << self
|
22
|
+
# Find commits, accepts Hash with keys:
|
23
|
+
# :user/:owner/:username:: Github user name
|
24
|
+
# :repo/:repository/:project:: Repo name
|
25
|
+
# :branch:: Repo branch - default 'master'
|
26
|
+
# :path:: For specific path
|
27
|
+
# :sha/:hash/:id:: Unique commit id (sha)
|
28
|
+
def find(opts)
|
29
|
+
normalize opts
|
30
|
+
raise "Unable to find Commits for #{opts}" unless opts[:user] && opts[:repo]
|
31
|
+
path = if opts[:sha]
|
32
|
+
"/show/#{opts[:user]}/#{opts[:repo]}/#{opts[:sha]}"
|
33
|
+
elsif opts[:path]
|
34
|
+
"/list/#{opts[:user]}/#{opts[:repo]}/#{opts[:branch]}/#{opts[:path]}"
|
35
|
+
else
|
36
|
+
"/list/#{opts[:user]}/#{opts[:repo]}/#{opts[:branch]}"
|
37
|
+
end
|
38
|
+
instantiate get(path)
|
39
|
+
end
|
40
|
+
|
41
|
+
#alias show find
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/git_hub/repo.rb
CHANGED
@@ -24,7 +24,7 @@ module GitHub
|
|
24
24
|
# twitter = username, password, digest
|
25
25
|
}
|
26
26
|
|
27
|
-
|
27
|
+
set_resource 'http://github.com/api/v2/yaml/repos', 'repository', 'repositories'
|
28
28
|
|
29
29
|
attr_accessor :name, :owner, :description, :url, :homepage, :open_issues, :watchers, :forks, :fork, :private,
|
30
30
|
# additional attributes from search:
|
@@ -32,8 +32,8 @@ module GitHub
|
|
32
32
|
|
33
33
|
def initialize options
|
34
34
|
super
|
35
|
-
raise "Unable to initialize #{self.class} without name" unless
|
36
|
-
@url ||= "http://github.com/#{
|
35
|
+
raise "Unable to initialize #{self.class} without name" unless user && name
|
36
|
+
@url ||= "http://github.com/#{user}/#{name}"
|
37
37
|
@type ||= "repo"
|
38
38
|
end
|
39
39
|
|
@@ -41,6 +41,8 @@ module GitHub
|
|
41
41
|
alias followers watchers
|
42
42
|
alias username= owner=
|
43
43
|
alias username owner
|
44
|
+
alias user= owner=
|
45
|
+
alias user owner
|
44
46
|
|
45
47
|
def fork?;
|
46
48
|
!!self.fork
|
@@ -51,71 +53,65 @@ module GitHub
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def clone_url
|
54
|
-
url = private? || api.auth['login'] == self.
|
55
|
-
url += "#{self.
|
56
|
+
url = private? || api.auth['login'] == self.user ? "git@github.com:" : "git://github.com/"
|
57
|
+
url += "#{self.user}/#{self.name}.git"
|
58
|
+
end
|
59
|
+
|
60
|
+
def tags
|
61
|
+
result = get "/show/#{self.user}/#{self.name}/tags"
|
62
|
+
result['tags'] || result
|
63
|
+
end
|
64
|
+
|
65
|
+
def branches
|
66
|
+
result = get "/show/#{self.user}/#{self.name}/branches"
|
67
|
+
result['branches'] || result
|
68
|
+
end
|
69
|
+
|
70
|
+
def commits opts = {}
|
71
|
+
Commit.find opts.merge(:user => self.user, :repo => self.name)
|
56
72
|
end
|
57
73
|
|
58
74
|
class << self # Repo class methods
|
59
|
-
|
60
|
-
#
|
61
|
-
#
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
result = get(path)
|
73
|
-
if result['repository']
|
74
|
-
new result['repository']
|
75
|
-
elsif result['repositories']
|
76
|
-
result['repositories'].map {|r| new r}
|
75
|
+
|
76
|
+
# Find repo(s) of a (valid) github user, accepts Hash with keys:
|
77
|
+
# :owner/:user/:username:: Github user name
|
78
|
+
# :repo/:repository/:project/:name:: Repo name
|
79
|
+
# :query/:search:: Array of search terms as Strings or Symbols
|
80
|
+
def find(opts)
|
81
|
+
normalize opts
|
82
|
+
path = if opts[:query]
|
83
|
+
"/search/#{opts[:query].map(&:to_s).join('+')}"
|
84
|
+
elsif opts[:user] && opts[:repo]
|
85
|
+
"/show/#{opts[:user]}/#{opts[:repo]}"
|
86
|
+
elsif opts[:user]
|
87
|
+
"/show/#{opts[:user]}"
|
77
88
|
else
|
78
|
-
|
89
|
+
raise "Unable to find #{self.class}(s) for #{opts}"
|
79
90
|
end
|
91
|
+
instantiate get(path)
|
80
92
|
end
|
81
93
|
|
82
94
|
alias show find
|
83
95
|
alias search find
|
84
96
|
|
85
97
|
# Create new github repo, accepts Hash with :repo, :description, :homepage, :public/:private
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
description = opts[:description] || opts[:descr] || opts[:desc]
|
92
|
-
homepage = opts[:homepage]
|
93
|
-
public = opts[:public] || !opts[:private] # default to true
|
94
|
-
else # repo name as a single parameter
|
95
|
-
repo = params.first.to_s
|
96
|
-
description = nil
|
97
|
-
homepage = nil
|
98
|
-
public = false
|
99
|
-
end
|
100
|
-
raise("Unable to create #{self.class} without authorization") unless api.authenticated?
|
101
|
-
result = post("/create", 'name' => repo, 'description' => description,
|
102
|
-
'homepage' => homepage, 'public' => (public ? 1 : 0))
|
103
|
-
if result['repository']
|
104
|
-
new result['repository']
|
105
|
-
else
|
106
|
-
result
|
107
|
-
end
|
98
|
+
def create(opts)
|
99
|
+
normalize opts
|
100
|
+
api.ensure_auth opts
|
101
|
+
instantiate post("/create", 'name' => opts[:repo], 'description' => opts[:description],
|
102
|
+
'homepage' => opts[:homepage], 'public' => (opts[:public] ? 1 : 0))
|
108
103
|
end
|
109
104
|
end
|
110
105
|
|
111
|
-
# Delete github repo
|
112
|
-
def delete
|
113
|
-
|
106
|
+
# Delete github repo, accepts optional Hash with authentication
|
107
|
+
def delete(opts = {})
|
108
|
+
api.ensure_auth opts
|
109
|
+
result = post("/delete/#{name}")
|
114
110
|
if result['delete_token']
|
115
|
-
post("/delete/#{
|
111
|
+
post("/delete/#{name}", 'delete_token' => result['delete_token'])
|
116
112
|
else
|
117
113
|
result
|
118
|
-
end
|
114
|
+
end
|
119
115
|
end
|
120
116
|
|
121
117
|
def add_service
|