github-v3-api 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/github-v3-api.gemspec +7 -2
- data/lib/github_v3_api/entity.rb +58 -0
- data/lib/github_v3_api/org.rb +8 -43
- data/lib/github_v3_api/orgs_api.rb +10 -0
- data/lib/github_v3_api/repo.rb +16 -0
- data/lib/github_v3_api/repos_api.rb +45 -0
- data/lib/github_v3_api.rb +11 -0
- data/spec/github_v3_api_spec.rb +7 -0
- data/spec/org_spec.rb +9 -0
- data/spec/orgs_api_spec.rb +17 -0
- data/spec/repo_spec.rb +35 -0
- data/spec/repos_api_spec.rb +25 -0
- metadata +9 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/github-v3-api.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{github-v3-api}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Wilger"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-24}
|
13
13
|
s.description = %q{Ponies}
|
14
14
|
s.email = %q{johnwilger@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -30,11 +30,16 @@ Gem::Specification.new do |s|
|
|
30
30
|
"github-v3-api.gemspec",
|
31
31
|
"lib/github-v3-api.rb",
|
32
32
|
"lib/github_v3_api.rb",
|
33
|
+
"lib/github_v3_api/entity.rb",
|
33
34
|
"lib/github_v3_api/org.rb",
|
34
35
|
"lib/github_v3_api/orgs_api.rb",
|
36
|
+
"lib/github_v3_api/repo.rb",
|
37
|
+
"lib/github_v3_api/repos_api.rb",
|
35
38
|
"spec/github_v3_api_spec.rb",
|
36
39
|
"spec/org_spec.rb",
|
37
40
|
"spec/orgs_api_spec.rb",
|
41
|
+
"spec/repo_spec.rb",
|
42
|
+
"spec/repos_api_spec.rb",
|
38
43
|
"spec/spec_helper.rb"
|
39
44
|
]
|
40
45
|
s.homepage = %q{http://github.com/jwilger/github-v3-api}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class GitHubV3API
|
2
|
+
# This is the base class used for value objects returned by the API. See
|
3
|
+
# descendent classes for more details.
|
4
|
+
class Entity
|
5
|
+
def self.new_with_all_data(api, data) #:nodoc:
|
6
|
+
entity = allocate
|
7
|
+
entity.initialize_fetched(api, data)
|
8
|
+
entity
|
9
|
+
end
|
10
|
+
|
11
|
+
# +api+:: an instance of the API class associated with the subclass of
|
12
|
+
# Entity being instantiated.
|
13
|
+
# +data+:: a Hash with keys corresponding to the data fields for the
|
14
|
+
# subclass of Entity being instantiated
|
15
|
+
def initialize(api, data)
|
16
|
+
@api = api
|
17
|
+
@data = data
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize_fetched(api, data) #:nodoc:
|
21
|
+
initialize(api, data)
|
22
|
+
@fetched = true
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](key) #:nodoc:
|
26
|
+
fetch_data unless @fetched
|
27
|
+
@data[key]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.attr_reader(*fields) #:nodoc:
|
31
|
+
fields.each do |field|
|
32
|
+
define_method field do
|
33
|
+
self[field.to_s]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
# Provides access to the raw data hash for subclasses.
|
41
|
+
def data
|
42
|
+
@data
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def fetch_data #:nodoc:
|
48
|
+
result = @api.get(*natural_key)
|
49
|
+
@data = result.data
|
50
|
+
@fetched = true
|
51
|
+
end
|
52
|
+
|
53
|
+
# Provides access to the api object for subclasses
|
54
|
+
def api
|
55
|
+
@api
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/github_v3_api/org.rb
CHANGED
@@ -1,58 +1,23 @@
|
|
1
1
|
# See GitHubV3API documentation in lib/github_v3_api.rb
|
2
2
|
class GitHubV3API
|
3
3
|
# Represents a single GitHub Org and provides access to its data attributes.
|
4
|
-
class Org
|
5
|
-
def self.new_with_all_data(api, org_data) #:nodoc:
|
6
|
-
org = self.allocate
|
7
|
-
org.initialize_fetched(api, org_data)
|
8
|
-
org
|
9
|
-
end
|
10
|
-
|
11
|
-
# +api+:: an instance of GitHubV3API::OrgsAPI
|
12
|
-
# +org_data+:: a Hash with keys corresponding to the org data supported by
|
13
|
-
# GitHub
|
14
|
-
#
|
15
|
-
def initialize(api, org_data)
|
16
|
-
@api = api
|
17
|
-
@org_data = org_data
|
18
|
-
end
|
19
|
-
|
20
|
-
def initialize_fetched(api, org_data) #:nodoc:
|
21
|
-
initialize(api, org_data)
|
22
|
-
@fetched = true
|
23
|
-
end
|
24
|
-
|
25
|
-
def [](key) #:nodoc:
|
26
|
-
fetch_data unless @fetched
|
27
|
-
@org_data[key]
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.attr_reader(*fields) #:nodoc:
|
31
|
-
fields.each do |field|
|
32
|
-
define_method field do
|
33
|
-
self[field.to_s]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
4
|
+
class Org < Entity
|
38
5
|
attr_reader :avatar_url, :billing_email, :blog, :collaborators,
|
39
6
|
:company, :created_at, :disk_usage, :email, :followers, :following,
|
40
7
|
:html_url, :id, :location, :login, :name, :owned_private_repos, :plan,
|
41
8
|
:private_gists, :private_repos, :public_gists, :public_repos, :space,
|
42
9
|
:total_private_repos, :type, :url
|
43
10
|
|
44
|
-
|
45
|
-
|
46
|
-
def
|
47
|
-
|
11
|
+
# Returns an array of GitHubV3API::Repo instances representing the repos
|
12
|
+
# that belong to this org
|
13
|
+
def repos
|
14
|
+
api.list_repos(login)
|
48
15
|
end
|
49
16
|
|
50
|
-
private
|
17
|
+
private
|
51
18
|
|
52
|
-
def
|
53
|
-
|
54
|
-
@org_data = result.org_data
|
55
|
-
@fetched = true
|
19
|
+
def natural_key
|
20
|
+
[data['login']]
|
56
21
|
end
|
57
22
|
end
|
58
23
|
end
|
@@ -39,5 +39,15 @@ class GitHubV3API
|
|
39
39
|
org_data = @connection.get("/orgs/#{org_login}")
|
40
40
|
GitHubV3API::Org.new_with_all_data(self, org_data)
|
41
41
|
end
|
42
|
+
|
43
|
+
# Returns an array of GitHubV3API::Repo instances representing the repos
|
44
|
+
# that belong to the specified org.
|
45
|
+
#
|
46
|
+
# +org_login+:: the string ID of the organization, e.g. "github"
|
47
|
+
def list_repos(org_login)
|
48
|
+
@connection.get("/orgs/#{org_login}/repos").map do |repo_data|
|
49
|
+
GitHubV3API::Repo.new(@connection.repos, repo_data)
|
50
|
+
end
|
51
|
+
end
|
42
52
|
end
|
43
53
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# See GitHubV3API documentation in lib/github_v3_api.rb
|
2
|
+
class GitHubV3API
|
3
|
+
# Represents a single GitHub Repo and provides access to its data attributes.
|
4
|
+
class Repo < Entity
|
5
|
+
attr_reader :created_at, :description, :fork, :forks, :has_downloads,
|
6
|
+
:has_issues, :has_wiki, :homepage, :html_url, :language, :master_branch,
|
7
|
+
:name, :open_issues, :organization, :owner, :parent, :private, :pushed_at,
|
8
|
+
:size, :source, :url, :watchers
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def natural_key
|
13
|
+
[data['owner']['login'], data['name']]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# See GitHubV3API documentation in lib/github_v3_api.rb
|
2
|
+
class GitHubV3API
|
3
|
+
# Provides access to the GitHub Repos API (http://developer.github.com/v3/repos/)
|
4
|
+
#
|
5
|
+
# example:
|
6
|
+
#
|
7
|
+
# api = GitHubV3API.new(ACCESS_TOKEN)
|
8
|
+
#
|
9
|
+
# # get list of all of the user's public and private repos
|
10
|
+
# repos = api.repos.list
|
11
|
+
# #=> returns an array of GitHubV3API::Repo instances
|
12
|
+
#
|
13
|
+
# repo = api.repo.get('octocat', 'hello-world')
|
14
|
+
# #=> returns an instance of GitHubV3API::Repo
|
15
|
+
#
|
16
|
+
# repo.name
|
17
|
+
# #=> 'hello-world'
|
18
|
+
#
|
19
|
+
class ReposAPI
|
20
|
+
# Typically not used directly. Use GitHubV3API#repos instead.
|
21
|
+
#
|
22
|
+
# +connection+:: an instance of GitHubV3API
|
23
|
+
def initialize(connection)
|
24
|
+
@connection = connection
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns an array of GitHubV3API::Repo instances representing the
|
28
|
+
# user's public and private repos
|
29
|
+
def list
|
30
|
+
@connection.get('/user/repos').map do |repo_data|
|
31
|
+
GitHubV3API::Repo.new(self, repo_data)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns a GitHubV3API::Repo instance for the specified +user+ and
|
36
|
+
# +repo_name+.
|
37
|
+
#
|
38
|
+
# +user+:: the string ID of the user, e.g. "octocat"
|
39
|
+
# +repo_name+:: the string ID of the repository, e.g. "hello-world"
|
40
|
+
def get(user, repo_name)
|
41
|
+
org_data = @connection.get("/repos/#{user}/#{repo_name}")
|
42
|
+
GitHubV3API::Repo.new_with_all_data(self, org_data)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/github_v3_api.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
|
+
require 'github_v3_api/entity'
|
3
4
|
require 'github_v3_api/orgs_api'
|
4
5
|
require 'github_v3_api/org'
|
6
|
+
require 'github_v3_api/repos_api'
|
7
|
+
require 'github_v3_api/repo'
|
5
8
|
|
6
9
|
# This is the main entry-point to the GitHub v3 API.
|
7
10
|
#
|
@@ -30,6 +33,14 @@ class GitHubV3API
|
|
30
33
|
OrgsAPI.new(self)
|
31
34
|
end
|
32
35
|
|
36
|
+
# Entry-point for access to the GitHub Repos API
|
37
|
+
#
|
38
|
+
# Returns an instance of GitHubV3API::ReposAPI that will use the access_token
|
39
|
+
# associated with this instance.
|
40
|
+
def repos
|
41
|
+
ReposAPI.new(self)
|
42
|
+
end
|
43
|
+
|
33
44
|
def get(path) #:nodoc:
|
34
45
|
result = RestClient.get("https://api.github.com" + path,
|
35
46
|
{:accept => :json,
|
data/spec/github_v3_api_spec.rb
CHANGED
@@ -12,6 +12,13 @@ describe GitHubV3API do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
describe '#repos' do
|
16
|
+
it 'returns an instance of GitHubV3API::ReposAPI' do
|
17
|
+
api = GitHubV3API.new('abcde')
|
18
|
+
api.repos.should be_kind_of GitHubV3API::ReposAPI
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
15
22
|
describe '#get' do
|
16
23
|
it 'does a get request to the specified path at the GitHub API server and adds the access token' do
|
17
24
|
RestClient.should_receive(:get) \
|
data/spec/org_spec.rb
CHANGED
@@ -35,4 +35,13 @@ describe GitHubV3API::Org do
|
|
35
35
|
org['foo'].should be_nil
|
36
36
|
end
|
37
37
|
end
|
38
|
+
|
39
|
+
describe '#repos' do
|
40
|
+
it 'returns an array of Repo objects that belong to this org' do
|
41
|
+
api = mock(GitHubV3API::OrgsAPI)
|
42
|
+
api.should_receive(:list_repos).with('github').and_return([:repo1, :repo2])
|
43
|
+
org = GitHubV3API::Org.new_with_all_data(api, 'login' => 'github')
|
44
|
+
org.repos.should == [:repo1, :repo2]
|
45
|
+
end
|
46
|
+
end
|
38
47
|
end
|
data/spec/orgs_api_spec.rb
CHANGED
@@ -22,4 +22,21 @@ describe GitHubV3API::OrgsAPI do
|
|
22
22
|
api.get('octocat').should == :org
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
describe '#list_repos' do
|
27
|
+
it 'returns the public and private repos for the specified org' do
|
28
|
+
connection = mock(GitHubV3API, :repos => :repos_api)
|
29
|
+
connection.should_receive(:get) \
|
30
|
+
.with('/orgs/github/repos') \
|
31
|
+
.and_return([:repo1_hash, :repo2_hash])
|
32
|
+
GitHubV3API::Repo.should_receive(:new) \
|
33
|
+
.with(:repos_api, :repo1_hash) \
|
34
|
+
.and_return(:repo1)
|
35
|
+
GitHubV3API::Repo.should_receive(:new) \
|
36
|
+
.with(:repos_api, :repo2_hash) \
|
37
|
+
.and_return(:repo2)
|
38
|
+
api = GitHubV3API::OrgsAPI.new(connection)
|
39
|
+
api.list_repos('github').should == [:repo1, :repo2]
|
40
|
+
end
|
41
|
+
end
|
25
42
|
end
|
data/spec/repo_spec.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitHubV3API::Repo do
|
4
|
+
describe 'attr_readers' do
|
5
|
+
it 'should define attr_readers that pull values from the repo data' do
|
6
|
+
fields = %w(created_at description fork forks has_downloads has_issues
|
7
|
+
has_wiki homepage html_url language master_branch name open_issues
|
8
|
+
organization owner parent private pushed_at size source url watchers)
|
9
|
+
fields.each do |f|
|
10
|
+
repo = GitHubV3API::Repo.new_with_all_data(stub('api'), {f.to_s => 'foo'})
|
11
|
+
repo.methods.should include(f)
|
12
|
+
repo.send(f).should == 'foo'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#[]' do
|
18
|
+
it 'returns the repo data for the specified key' do
|
19
|
+
api = stub(GitHubV3API::ReposAPI)
|
20
|
+
repo = GitHubV3API::Repo \
|
21
|
+
.new_with_all_data(api, 'name' => 'hello-world', 'owner' => {'login' => 'octocat'})
|
22
|
+
repo['name'].should == 'hello-world'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'only fetches the data once' do
|
26
|
+
api = mock(GitHubV3API::ReposAPI)
|
27
|
+
api.should_receive(:get).once.with('octocat', 'hello-world') \
|
28
|
+
.and_return(GitHubV3API::Repo.new(api, 'name' => 'hello-world', 'owner' => {'login' => 'octocat'}, 'private' => true))
|
29
|
+
repo = GitHubV3API::Repo.new(api, 'name' => 'hello-world', 'owner' => {'login' => 'octocat'})
|
30
|
+
repo['name'].should == 'hello-world'
|
31
|
+
repo['owner'].should == {'login' => 'octocat'}
|
32
|
+
repo['private'].should == true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitHubV3API::ReposAPI do
|
4
|
+
describe '#list' do
|
5
|
+
it 'returns the public and private repos for the authenticated user' do
|
6
|
+
connection = mock(GitHubV3API)
|
7
|
+
connection.should_receive(:get).with('/user/repos').and_return([:repo_hash1, :repo_hash2])
|
8
|
+
api = GitHubV3API::ReposAPI.new(connection)
|
9
|
+
GitHubV3API::Repo.should_receive(:new).with(api, :repo_hash1).and_return(:repo1)
|
10
|
+
GitHubV3API::Repo.should_receive(:new).with(api, :repo_hash2).and_return(:repo2)
|
11
|
+
repos = api.list
|
12
|
+
repos.should == [:repo1, :repo2]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#get' do
|
17
|
+
it 'returns a fully-hydrated Repo object for the specified user and repo name' do
|
18
|
+
connection = mock(GitHubV3API)
|
19
|
+
connection.should_receive(:get).with('/repos/octocat/hello-world').and_return(:repo_hash)
|
20
|
+
api = GitHubV3API::ReposAPI.new(connection)
|
21
|
+
GitHubV3API::Repo.should_receive(:new_with_all_data).with(api, :repo_hash).and_return(:repo)
|
22
|
+
api.get('octocat', 'hello-world').should == :repo
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: github-v3-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Wilger
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-06-
|
18
|
+
date: 2011-06-24 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -167,11 +167,16 @@ files:
|
|
167
167
|
- github-v3-api.gemspec
|
168
168
|
- lib/github-v3-api.rb
|
169
169
|
- lib/github_v3_api.rb
|
170
|
+
- lib/github_v3_api/entity.rb
|
170
171
|
- lib/github_v3_api/org.rb
|
171
172
|
- lib/github_v3_api/orgs_api.rb
|
173
|
+
- lib/github_v3_api/repo.rb
|
174
|
+
- lib/github_v3_api/repos_api.rb
|
172
175
|
- spec/github_v3_api_spec.rb
|
173
176
|
- spec/org_spec.rb
|
174
177
|
- spec/orgs_api_spec.rb
|
178
|
+
- spec/repo_spec.rb
|
179
|
+
- spec/repos_api_spec.rb
|
175
180
|
- spec/spec_helper.rb
|
176
181
|
has_rdoc: true
|
177
182
|
homepage: http://github.com/jwilger/github-v3-api
|