git-layer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4cbb0bebca82b86ea11ae6a2eb66f7add11a64fe
4
- data.tar.gz: a4b1f053eca049071b27b51e167108b31378cd82
3
+ metadata.gz: b8e7f46792d7ac85b292095906bcdb307827d43a
4
+ data.tar.gz: 12dbbbfece451b5132d268411f07fc68244aa8f7
5
5
  SHA512:
6
- metadata.gz: 2189a1024e11e10bebf4e3cec2f3678b6f351f3dd3b3d4071cf7a77d410099b68619d22514d955d1afacf817b9ae70e57953b22fde9f15889c6a67c57d7ae722
7
- data.tar.gz: 1f7e8d6e44899a684a5b44e0239d690b201170a23d02c777f83dcac56c4b35e867038672370dddfe8a7e10d4e7981101f2e25d08387e191f3c9abc5d0a8c912d
6
+ metadata.gz: 8de25742c418a1264ad57e9a32d48388f7a30734e651a847f26765a746bd1deafcc4e2e9fae3f7bc127265541f44b23ba9435bc24cd38cc6a0d0d4d9f42bfbb6
7
+ data.tar.gz: a036d450af77885870b8f8dd01d5014445f983864cd4e13fbd42375975f01c25b3a870db2138ec71dd21696129b69dd79d65d309f9c3a0b4e35486cac1296e68
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.0.0"
4
+ script: "bundle exec rspec spec"
data/Gemfile CHANGED
@@ -15,4 +15,5 @@ group :development do
15
15
  gem 'webmock'
16
16
  gem 'rest-client'
17
17
  gem 'json'
18
+ gem 'pry'
18
19
  end
data/Gemfile.lock CHANGED
@@ -3,6 +3,7 @@ GEM
3
3
  specs:
4
4
  addressable (2.3.5)
5
5
  builder (3.2.2)
6
+ coderay (1.0.9)
6
7
  crack (0.4.1)
7
8
  safe_yaml (~> 0.9.0)
8
9
  diff-lcs (1.1.3)
@@ -32,6 +33,7 @@ GEM
32
33
  json (1.8.0)
33
34
  jwt (0.1.8)
34
35
  multi_json (>= 1.5)
36
+ method_source (0.8.2)
35
37
  mime-types (1.25)
36
38
  multi_json (1.8.1)
37
39
  multi_xml (0.5.5)
@@ -44,6 +46,10 @@ GEM
44
46
  multi_json (~> 1.0)
45
47
  multi_xml (~> 0.5)
46
48
  rack (~> 1.2)
49
+ pry (0.9.12.2)
50
+ coderay (~> 1.0.5)
51
+ method_source (~> 0.8)
52
+ slop (~> 3.4)
47
53
  rack (1.5.2)
48
54
  rake (10.1.0)
49
55
  rdoc (3.12.2)
@@ -63,6 +69,7 @@ GEM
63
69
  multi_json (~> 1.0)
64
70
  simplecov-html (~> 0.7.1)
65
71
  simplecov-html (0.7.1)
72
+ slop (3.4.6)
66
73
  webmock (1.14.0)
67
74
  addressable (>= 2.2.7)
68
75
  crack (>= 0.3.2)
@@ -75,6 +82,7 @@ DEPENDENCIES
75
82
  dotenv
76
83
  jeweler (~> 1.8.7)
77
84
  json
85
+ pry
78
86
  rdoc (~> 3.12)
79
87
  rest-client
80
88
  rspec (~> 2.8.0)
data/README.rdoc CHANGED
@@ -1,6 +1,4 @@
1
- {<img src="http://ga.bling.phillbaker.com/images/shield_imagined_ga_wdi.png" />}[https://generalassemb.ly/education/web-development-immersive]
2
-
3
- = git-layer-gem
1
+ {<img src="http://ga.bling.phillbaker.com/images/shield_imagined_ga_other.png" />}[https://generalassemb.ly]
4
2
 
5
3
  A lightweight wrapper for the Github API V3
6
4
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.2.0
data/git-layer.gemspec ADDED
@@ -0,0 +1,83 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "git-layer"
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Theodore Cleveland"]
12
+ s.date = "2013-10-26"
13
+ s.description = "Just writing a gem to get user information through the github api"
14
+ s.email = "tcclevela@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ ".travis.yml",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "git-layer.gemspec",
30
+ "lib/github.rb",
31
+ "lib/github/client.rb",
32
+ "lib/github/helpers.rb",
33
+ "lib/github/repo.rb",
34
+ "lib/github/repos_response_wrapper.rb",
35
+ "spec/git-layer_spec.rb",
36
+ "spec/helper.rb"
37
+ ]
38
+ s.homepage = "http://github.com/tcclevela/git-layer"
39
+ s.licenses = ["MIT"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = "2.0.3"
42
+ s.summary = "A simple github api wrapper for my app"
43
+
44
+ if s.respond_to? :specification_version then
45
+ s.specification_version = 4
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
49
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
50
+ s.add_development_dependency(%q<bundler>, ["~> 1.0"])
51
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.7"])
52
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
53
+ s.add_development_dependency(%q<dotenv>, [">= 0"])
54
+ s.add_development_dependency(%q<webmock>, [">= 0"])
55
+ s.add_development_dependency(%q<rest-client>, [">= 0"])
56
+ s.add_development_dependency(%q<json>, [">= 0"])
57
+ s.add_development_dependency(%q<pry>, [">= 0"])
58
+ else
59
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
60
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
61
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
63
+ s.add_dependency(%q<simplecov>, [">= 0"])
64
+ s.add_dependency(%q<dotenv>, [">= 0"])
65
+ s.add_dependency(%q<webmock>, [">= 0"])
66
+ s.add_dependency(%q<rest-client>, [">= 0"])
67
+ s.add_dependency(%q<json>, [">= 0"])
68
+ s.add_dependency(%q<pry>, [">= 0"])
69
+ end
70
+ else
71
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
72
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
73
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
74
+ s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
75
+ s.add_dependency(%q<simplecov>, [">= 0"])
76
+ s.add_dependency(%q<dotenv>, [">= 0"])
77
+ s.add_dependency(%q<webmock>, [">= 0"])
78
+ s.add_dependency(%q<rest-client>, [">= 0"])
79
+ s.add_dependency(%q<json>, [">= 0"])
80
+ s.add_dependency(%q<pry>, [">= 0"])
81
+ end
82
+ end
83
+
data/lib/github.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require_relative 'github/helpers'
1
2
  require_relative 'github/client'
3
+ require_relative 'github/repo'
4
+ require_relative 'github/repos_response_wrapper'
5
+ require 'pry'
2
6
 
3
7
  module Github
4
8
 
data/lib/github/client.rb CHANGED
@@ -1,39 +1,110 @@
1
1
  require 'rest-client'
2
+ require 'json'
2
3
 
3
4
  module Github
4
5
  class Client
5
-
6
-
7
6
  DEFAULT_OPTIONS = {
8
7
  access_token: nil,
8
+ user: {}
9
9
  }
10
10
 
11
11
  attr_accessor :options
12
12
 
13
+ # stores user access_token to make authenticated requests
13
14
  def initialize(options={})
14
- store_options options
15
+ store_options(options)
15
16
  check_token
16
17
  end
17
18
 
19
+ # returns user access_token
18
20
  def access_token
19
21
  @options[:access_token]
20
22
  end
21
23
 
22
- def user
23
- RestClient.get("https://api.github.com/user", {params: {:access_token => self.access_token}})
24
+ # fetches user information from github API using access_token
25
+ # to identify user
26
+ def user(options={})
27
+ if options.empty?
28
+ get_user('user') if options.empty?
29
+ else
30
+ get_user("users/#{options[:login]}")
31
+ end
32
+ end
33
+
34
+ # getter functions access information storked in
35
+ # @options or fetch information (which stores it)
36
+ # and returns it
37
+
38
+ # getter for name
39
+ def name(options={})
40
+ if options.empty?
41
+ user["name"]
42
+ else
43
+ user(options)["name"]
44
+ end
45
+ end
46
+
47
+ # getter for login
48
+ def login(options={})
49
+ if options.empty?
50
+ user["login"]
51
+ else
52
+ options[:login]
53
+ end
24
54
  end
25
55
 
56
+ # getter for email
57
+ def email(options={})
58
+ if options.empty?
59
+ user["email"]
60
+ else
61
+ user(options)["email"]
62
+ end
63
+ end
64
+
65
+ # getter for user page url
66
+ def html_url(options={})
67
+ if options.empty?
68
+ user["html_url"]
69
+ else
70
+ user(options)["html_url"]
71
+ end
72
+ end
73
+
74
+ # getter for url to get repositories from API
75
+ def repos_url(options={})
76
+ if options.empty?
77
+ user['repos_url']
78
+ else
79
+ user(options)['repos_url']
80
+ end
81
+ end
82
+
83
+ # fetches user's repositories and wraps them in RepoResponseWrapper
84
+ def repos(options={})
85
+ Github::ReposResponseWrapper.new(request(repos_url(options), access_token), access_token)
86
+ end
26
87
 
27
88
  private
28
89
 
90
+
91
+ # stores provided optiosn (included access token)
29
92
  def store_options(options)
30
93
  @options ||= DEFAULT_OPTIONS.dup
31
94
  @options.merge!(options)
32
95
  end
33
96
 
97
+ # checks presence of access token on initialization. Client doesn't work without it
34
98
  def check_token
35
99
  raise ArgumentError, "No access token provided" if !access_token
36
100
  end
101
+
102
+ # fetches user information from API using access_token to identify user
103
+ def get_user(path)
104
+ JSON.parse(RestClient.get("https://api.github.com/" + path, {params: {access_token: self.access_token}}))
105
+ end
106
+
107
+
37
108
  end
38
109
 
39
110
  end
@@ -0,0 +1,6 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ # makes a request to url passing access token provided
4
+ def request(url, token)
5
+ JSON.parse(RestClient.get(url, {params: {access_token: token}}))
6
+ end
@@ -0,0 +1,61 @@
1
+ module Github
2
+ class Repo
3
+ attr_reader :info
4
+
5
+ def initialize(repo_info, token)
6
+ store(repo_info)
7
+ store_token(token)
8
+ end
9
+
10
+ def language
11
+ @info['language']
12
+ end
13
+
14
+ def name
15
+ @info['name']
16
+ end
17
+
18
+ def owner_login
19
+ @info['owner']['login']
20
+ end
21
+
22
+ def forked?
23
+ @info['fork']
24
+ end
25
+
26
+ def url
27
+ @info['html_url']
28
+ end
29
+
30
+ def commits_url
31
+ @info['commits_url'].split('{')[0]
32
+ end
33
+
34
+ def languages_url
35
+ @info['languages_url']
36
+ end
37
+
38
+ def access_token
39
+ self.info['access_token']
40
+ end
41
+
42
+ def commits
43
+ request(commits_url, access_token)
44
+ end
45
+
46
+ def languages
47
+ request(languages_url, access_token)
48
+ end
49
+
50
+ private
51
+
52
+ def store(repo)
53
+ @info||={}
54
+ @info.merge!(repo)
55
+ end
56
+
57
+ def store_token(token)
58
+ @info['access_token'] = token
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,15 @@
1
+ module Github
2
+ class ReposResponseWrapper
3
+ attr_reader :response
4
+ def initialize(response=[], token)
5
+ @response = []
6
+ response.each do |repo_info|
7
+ @response << Github::Repo.new(repo_info, token)
8
+ end
9
+ end
10
+
11
+ def count
12
+ @response.count
13
+ end
14
+ end
15
+ end
@@ -1,23 +1,198 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/helper')
2
2
  require 'webmock/rspec'
3
+ USER_RESPONSE = '{"login":"user_login", "repos_url": "http://api/github.com/user_name/repos", "name": "user_name","email": "test.email@example.com","html_url": "http://www.github.com/user_name"}'
4
+ EXAMPLE_USER_RESPONSE = '{"login": "tcclevela", "id": 4340941, "avatar_url": "https://0.gravatar.com/avatar/35120b8227f24c04d7ac2095876db64e?d=https%3A%2F%2Fidenticons.github.com%2Fed559600885df5d58a479d1398f6b765.png", "gravatar_id": "35120b8227f24c04d7ac2095876db64e", "url": "https://api.github.com/users/tcclevela", "html_url": "https://github.com/tcclevela", "followers_url": "https://api.github.com/users/tcclevela/followers", "following_url": "https://api.github.com/users/tcclevela/following{/other_user}", "gists_url": "https://api.github.com/users/tcclevela/gists{/gist_id}", "starred_url": "https://api.github.com/users/tcclevela/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tcclevela/subscriptions", "organizations_url": "https://api.github.com/users/tcclevela/orgs", "repos_url": "https://api.github.com/users/tcclevela/repos", "events_url": "https://api.github.com/users/tcclevela/events{/privacy}", "received_events_url": "https://api.github.com/users/tcclevela/received_events", "type": "User", "site_admin": false, "name": "Teddy Cleveland", "company": "General Assembly", "blog": "http://www.theodorecleveland.com", "location": "Boston", "email": "tcclevela@gmail.com", "hireable": true, "bio": null, "public_repos": 81, "followers": 30, "following": 28, "created_at": "2013-05-04T16:46:49Z", "updated_at": "2013-10-18T18:01:23Z", "public_gists": 5}'
5
+ EXAMPLE_REPO_RESPONSE = '[{ "id": 11029752, "name": "address_book", "full_name": "tcclevela/address_book", "owner": { "login": "tcclevela", "id": 4340941, "avatar_url": "https://0.gravatar.com/avatar/35120b8227f24c04d7ac2095876db64e?d=https%3A%2F%2Fidenticons.github.com%2Fed559600885df5d58a479d1398f6b765.png", "gravatar_id": "35120b8227f24c04d7ac2095876db64e", "url": "https://api.github.com/users/tcclevela", "html_url": "https://github.com/tcclevela", "followers_url": "https://api.github.com/users/tcclevela/followers", "following_url": "https://api.github.com/users/tcclevela/following{/other_user}", "gists_url": "https://api.github.com/users/tcclevela/gists{/gist_id}", "starred_url": "https://api.github.com/users/tcclevela/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tcclevela/subscriptions", "organizations_url": "https://api.github.com/users/tcclevela/orgs", "repos_url": "https://api.github.com/users/tcclevela/repos", "events_url": "https://api.github.com/users/tcclevela/events{/privacy}", "received_events_url": "https://api.github.com/users/tcclevela/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/tcclevela/address_book", "description": "", "fork": true, "url": "https://api.github.com/repos/tcclevela/address_book", "forks_url": "https://api.github.com/repos/tcclevela/address_book/forks", "keys_url": "https://api.github.com/repos/tcclevela/address_book/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/tcclevela/address_book/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/tcclevela/address_book/teams", "hooks_url": "https://api.github.com/repos/tcclevela/address_book/hooks", "issue_events_url": "https://api.github.com/repos/tcclevela/address_book/issues/events{/number}", "events_url": "https://api.github.com/repos/tcclevela/address_book/events", "assignees_url": "https://api.github.com/repos/tcclevela/address_book/assignees{/user}", "branches_url": "https://api.github.com/repos/tcclevela/address_book/branches{/branch}", "tags_url": "https://api.github.com/repos/tcclevela/address_book/tags", "blobs_url": "https://api.github.com/repos/tcclevela/address_book/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/tcclevela/address_book/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/tcclevela/address_book/git/refs{/sha}", "trees_url": "https://api.github.com/repos/tcclevela/address_book/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/tcclevela/address_book/statuses/{sha}", "languages_url": "https://api.github.com/repos/tcclevela/address_book/languages", "stargazers_url": "https://api.github.com/repos/tcclevela/address_book/stargazers", "contributors_url": "https://api.github.com/repos/tcclevela/address_book/contributors", "subscribers_url": "https://api.github.com/repos/tcclevela/address_book/subscribers", "subscription_url": "https://api.github.com/repos/tcclevela/address_book/subscription", "commits_url": "https://api.github.com/repos/tcclevela/address_book/commits{/sha}", "git_commits_url": "https://api.github.com/repos/tcclevela/address_book/git/commits{/sha}", "comments_url": "https://api.github.com/repos/tcclevela/address_book/comments{/number}", "issue_comment_url": "https://api.github.com/repos/tcclevela/address_book/issues/comments/{number}", "contents_url": "https://api.github.com/repos/tcclevela/address_book/contents/{+path}", "compare_url": "https://api.github.com/repos/tcclevela/address_book/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/tcclevela/address_book/merges", "archive_url": "https://api.github.com/repos/tcclevela/address_book/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/tcclevela/address_book/downloads", "issues_url": "https://api.github.com/repos/tcclevela/address_book/issues{/number}", "pulls_url": "https://api.github.com/repos/tcclevela/address_book/pulls{/number}", "milestones_url": "https://api.github.com/repos/tcclevela/address_book/milestones{/number}", "notifications_url": "https://api.github.com/repos/tcclevela/address_book/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/tcclevela/address_book/labels{/name}", "created_at": "2013-06-28T15:15:19Z", "updated_at": "2013-06-28T17:18:39Z", "pushed_at": "2013-06-28T17:18:38Z", "git_url": "git://github.com/tcclevela/address_book.git", "ssh_url": "git@github.com:tcclevela/address_book.git", "clone_url": "https://github.com/tcclevela/address_book.git", "svn_url": "https://github.com/tcclevela/address_book", "homepage": null, "size": 132, "watchers_count": 0, "language": "Ruby", "has_issues": false, "has_downloads": true, "has_wiki": true, "forks_count": 0, "mirror_url": null, "open_issues_count": 0, "forks": 0, "open_issues": 0, "watchers": 0, "master_branch": "master", "default_branch": "master" }, { "id": 12090792, "name": "ajax_flags", "full_name": "tcclevela/ajax_flags", "owner": { "login": "tcclevela", "id": 4340941, "avatar_url": "https://0.gravatar.com/avatar/35120b8227f24c04d7ac2095876db64e?d=https%3A%2F%2Fidenticons.github.com%2Fed559600885df5d58a479d1398f6b765.png", "gravatar_id": "35120b8227f24c04d7ac2095876db64e", "url": "https://api.github.com/users/tcclevela", "html_url": "https://github.com/tcclevela", "followers_url": "https://api.github.com/users/tcclevela/followers", "following_url": "https://api.github.com/users/tcclevela/following{/other_user}", "gists_url": "https://api.github.com/users/tcclevela/gists{/gist_id}", "starred_url": "https://api.github.com/users/tcclevela/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tcclevela/subscriptions", "organizations_url": "https://api.github.com/users/tcclevela/orgs", "repos_url": "https://api.github.com/users/tcclevela/repos", "events_url": "https://api.github.com/users/tcclevela/events{/privacy}", "received_events_url": "https://api.github.com/users/tcclevela/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/tcclevela/ajax_flags", "description": "", "fork": true, "url": "https://api.github.com/repos/tcclevela/ajax_flags", "forks_url": "https://api.github.com/repos/tcclevela/ajax_flags/forks", "keys_url": "https://api.github.com/repos/tcclevela/ajax_flags/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/tcclevela/ajax_flags/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/tcclevela/ajax_flags/teams", "hooks_url": "https://api.github.com/repos/tcclevela/ajax_flags/hooks", "issue_events_url": "https://api.github.com/repos/tcclevela/ajax_flags/issues/events{/number}", "events_url": "https://api.github.com/repos/tcclevela/ajax_flags/events", "assignees_url": "https://api.github.com/repos/tcclevela/ajax_flags/assignees{/user}", "branches_url": "https://api.github.com/repos/tcclevela/ajax_flags/branches{/branch}", "tags_url": "https://api.github.com/repos/tcclevela/ajax_flags/tags", "blobs_url": "https://api.github.com/repos/tcclevela/ajax_flags/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/tcclevela/ajax_flags/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/tcclevela/ajax_flags/git/refs{/sha}", "trees_url": "https://api.github.com/repos/tcclevela/ajax_flags/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/tcclevela/ajax_flags/statuses/{sha}", "languages_url": "https://api.github.com/repos/tcclevela/ajax_flags/languages", "stargazers_url": "https://api.github.com/repos/tcclevela/ajax_flags/stargazers", "contributors_url": "https://api.github.com/repos/tcclevela/ajax_flags/contributors", "subscribers_url": "https://api.github.com/repos/tcclevela/ajax_flags/subscribers", "subscription_url": "https://api.github.com/repos/tcclevela/ajax_flags/subscription", "commits_url": "https://api.github.com/repos/tcclevela/ajax_flags/commits{/sha}", "git_commits_url": "https://api.github.com/repos/tcclevela/ajax_flags/git/commits{/sha}", "comments_url": "https://api.github.com/repos/tcclevela/ajax_flags/comments{/number}", "issue_comment_url": "https://api.github.com/repos/tcclevela/ajax_flags/issues/comments/{number}", "contents_url": "https://api.github.com/repos/tcclevela/ajax_flags/contents/{+path}", "compare_url": "https://api.github.com/repos/tcclevela/ajax_flags/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/tcclevela/ajax_flags/merges", "archive_url": "https://api.github.com/repos/tcclevela/ajax_flags/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/tcclevela/ajax_flags/downloads", "issues_url": "https://api.github.com/repos/tcclevela/ajax_flags/issues{/number}", "pulls_url": "https://api.github.com/repos/tcclevela/ajax_flags/pulls{/number}", "milestones_url": "https://api.github.com/repos/tcclevela/ajax_flags/milestones{/number}", "notifications_url": "https://api.github.com/repos/tcclevela/ajax_flags/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/tcclevela/ajax_flags/labels{/name}", "created_at": "2013-08-13T19:35:44Z", "updated_at": "2013-08-15T19:39:53Z", "pushed_at": "2013-08-14T01:13:52Z", "git_url": "git://github.com/tcclevela/ajax_flags.git", "ssh_url": "git@github.com:tcclevela/ajax_flags.git", "clone_url": "https://github.com/tcclevela/ajax_flags.git", "svn_url": "https://github.com/tcclevela/ajax_flags", "homepage": null, "size": 479, "watchers_count": 0, "language": "JavaScript", "has_issues": false, "has_downloads": true, "has_wiki": true, "forks_count": 0, "mirror_url": null, "open_issues_count": 0, "forks": 0, "open_issues": 0, "watchers": 0, "master_branch": "master", "default_branch": "master" }]'
6
+ EXAMPLE_REPO_INFO = '{ "id": 11029752, "name": "address_book", "full_name": "tcclevela/address_book", "owner": { "login": "tcclevela", "id": 4340941, "avatar_url": "https://0.gravatar.com/avatar/35120b8227f24c04d7ac2095876db64e?d=https%3A%2F%2Fidenticons.github.com%2Fed559600885df5d58a479d1398f6b765.png", "gravatar_id": "35120b8227f24c04d7ac2095876db64e", "url": "https://api.github.com/users/tcclevela", "html_url": "https://github.com/tcclevela", "followers_url": "https://api.github.com/users/tcclevela/followers", "following_url": "https://api.github.com/users/tcclevela/following{/other_user}", "gists_url": "https://api.github.com/users/tcclevela/gists{/gist_id}", "starred_url": "https://api.github.com/users/tcclevela/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tcclevela/subscriptions", "organizations_url": "https://api.github.com/users/tcclevela/orgs", "repos_url": "https://api.github.com/users/tcclevela/repos", "events_url": "https://api.github.com/users/tcclevela/events{/privacy}", "received_events_url": "https://api.github.com/users/tcclevela/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/tcclevela/address_book", "description": "", "fork": true, "url": "https://api.github.com/repos/tcclevela/address_book", "forks_url": "https://api.github.com/repos/tcclevela/address_book/forks", "keys_url": "https://api.github.com/repos/tcclevela/address_book/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/tcclevela/address_book/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/tcclevela/address_book/teams", "hooks_url": "https://api.github.com/repos/tcclevela/address_book/hooks", "issue_events_url": "https://api.github.com/repos/tcclevela/address_book/issues/events{/number}", "events_url": "https://api.github.com/repos/tcclevela/address_book/events", "assignees_url": "https://api.github.com/repos/tcclevela/address_book/assignees{/user}", "branches_url": "https://api.github.com/repos/tcclevela/address_book/branches{/branch}", "tags_url": "https://api.github.com/repos/tcclevela/address_book/tags", "blobs_url": "https://api.github.com/repos/tcclevela/address_book/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/tcclevela/address_book/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/tcclevela/address_book/git/refs{/sha}", "trees_url": "https://api.github.com/repos/tcclevela/address_book/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/tcclevela/address_book/statuses/{sha}", "languages_url": "https://api.github.com/repos/tcclevela/address_book/languages", "stargazers_url": "https://api.github.com/repos/tcclevela/address_book/stargazers", "contributors_url": "https://api.github.com/repos/tcclevela/address_book/contributors", "subscribers_url": "https://api.github.com/repos/tcclevela/address_book/subscribers", "subscription_url": "https://api.github.com/repos/tcclevela/address_book/subscription", "commits_url": "https://api.github.com/repos/tcclevela/address_book/commits{/sha}", "git_commits_url": "https://api.github.com/repos/tcclevela/address_book/git/commits{/sha}", "comments_url": "https://api.github.com/repos/tcclevela/address_book/comments{/number}", "issue_comment_url": "https://api.github.com/repos/tcclevela/address_book/issues/comments/{number}", "contents_url": "https://api.github.com/repos/tcclevela/address_book/contents/{+path}", "compare_url": "https://api.github.com/repos/tcclevela/address_book/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/tcclevela/address_book/merges", "archive_url": "https://api.github.com/repos/tcclevela/address_book/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/tcclevela/address_book/downloads", "issues_url": "https://api.github.com/repos/tcclevela/address_book/issues{/number}", "pulls_url": "https://api.github.com/repos/tcclevela/address_book/pulls{/number}", "milestones_url": "https://api.github.com/repos/tcclevela/address_book/milestones{/number}", "notifications_url": "https://api.github.com/repos/tcclevela/address_book/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/tcclevela/address_book/labels{/name}", "created_at": "2013-06-28T15:15:19Z", "updated_at": "2013-06-28T17:18:39Z", "pushed_at": "2013-06-28T17:18:38Z", "git_url": "git://github.com/tcclevela/address_book.git", "ssh_url": "git@github.com:tcclevela/address_book.git", "clone_url": "https://github.com/tcclevela/address_book.git", "svn_url": "https://github.com/tcclevela/address_book", "homepage": null, "size": 132, "watchers_count": 0, "language": "Ruby", "has_issues": false, "has_downloads": true, "has_wiki": true, "forks_count": 0, "mirror_url": null, "open_issues_count": 0, "forks": 0, "open_issues": 0, "watchers": 0, "master_branch": "master", "default_branch": "master" }'
7
+ EXAMPLE_REPO_INFO_B = '{ "id": 11029752, "name": "address_book", "full_name": "tcclevela/address_book", "owner": { "login": "tcclevela", "id": 4340941, "avatar_url": "https://0.gravatar.com/avatar/35120b8227f24c04d7ac2095876db64e?d=https%3A%2F%2Fidenticons.github.com%2Fed559600885df5d58a479d1398f6b765.png", "gravatar_id": "35120b8227f24c04d7ac2095876db64e", "url": "https://api.github.com/users/tcclevela", "html_url": "https://github.com/tcclevela", "followers_url": "https://api.github.com/users/tcclevela/followers", "following_url": "https://api.github.com/users/tcclevela/following{/other_user}", "gists_url": "https://api.github.com/users/tcclevela/gists{/gist_id}", "starred_url": "https://api.github.com/users/tcclevela/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tcclevela/subscriptions", "organizations_url": "https://api.github.com/users/tcclevela/orgs", "repos_url": "https://api.github.com/users/tcclevela/repos", "events_url": "https://api.github.com/users/tcclevela/events{/privacy}", "received_events_url": "https://api.github.com/users/tcclevela/received_events", "type": "User", "site_admin": false }, "private": false, "html_url": "https://github.com/tcclevela/address_book", "description": "", "fork": false, "url": "https://api.github.com/repos/tcclevela/address_book", "forks_url": "https://api.github.com/repos/tcclevela/address_book/forks", "keys_url": "https://api.github.com/repos/tcclevela/address_book/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/tcclevela/address_book/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/tcclevela/address_book/teams", "hooks_url": "https://api.github.com/repos/tcclevela/address_book/hooks", "issue_events_url": "https://api.github.com/repos/tcclevela/address_book/issues/events{/number}", "events_url": "https://api.github.com/repos/tcclevela/address_book/events", "assignees_url": "https://api.github.com/repos/tcclevela/address_book/assignees{/user}", "branches_url": "https://api.github.com/repos/tcclevela/address_book/branches{/branch}", "tags_url": "https://api.github.com/repos/tcclevela/address_book/tags", "blobs_url": "https://api.github.com/repos/tcclevela/address_book/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/tcclevela/address_book/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/tcclevela/address_book/git/refs{/sha}", "trees_url": "https://api.github.com/repos/tcclevela/address_book/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/tcclevela/address_book/statuses/{sha}", "languages_url": "https://api.github.com/repos/tcclevela/address_book/languages", "stargazers_url": "https://api.github.com/repos/tcclevela/address_book/stargazers", "contributors_url": "https://api.github.com/repos/tcclevela/address_book/contributors", "subscribers_url": "https://api.github.com/repos/tcclevela/address_book/subscribers", "subscription_url": "https://api.github.com/repos/tcclevela/address_book/subscription", "commits_url": "https://api.github.com/repos/tcclevela/address_book/commits{/sha}", "git_commits_url": "https://api.github.com/repos/tcclevela/address_book/git/commits{/sha}", "comments_url": "https://api.github.com/repos/tcclevela/address_book/comments{/number}", "issue_comment_url": "https://api.github.com/repos/tcclevela/address_book/issues/comments/{number}", "contents_url": "https://api.github.com/repos/tcclevela/address_book/contents/{+path}", "compare_url": "https://api.github.com/repos/tcclevela/address_book/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/tcclevela/address_book/merges", "archive_url": "https://api.github.com/repos/tcclevela/address_book/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/tcclevela/address_book/downloads", "issues_url": "https://api.github.com/repos/tcclevela/address_book/issues{/number}", "pulls_url": "https://api.github.com/repos/tcclevela/address_book/pulls{/number}", "milestones_url": "https://api.github.com/repos/tcclevela/address_book/milestones{/number}", "notifications_url": "https://api.github.com/repos/tcclevela/address_book/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/tcclevela/address_book/labels{/name}", "created_at": "2013-06-28T15:15:19Z", "updated_at": "2013-06-28T17:18:39Z", "pushed_at": "2013-06-28T17:18:38Z", "git_url": "git://github.com/tcclevela/address_book.git", "ssh_url": "git@github.com:tcclevela/address_book.git", "clone_url": "https://github.com/tcclevela/address_book.git", "svn_url": "https://github.com/tcclevela/address_book", "homepage": null, "size": 132, "watchers_count": 0, "language": "Ruby", "has_issues": false, "has_downloads": true, "has_wiki": true, "forks_count": 0, "mirror_url": null, "open_issues_count": 0, "forks": 0, "open_issues": 0, "watchers": 0, "master_branch": "master", "default_branch": "master" }'
8
+ EXAMPLE_COMMITS_RESPONSE = ' {"commits": "list"}'
9
+ EXAMPLE_LANGUAGES_RESPONSE = ' {"Ruby": 204929, "JavaScript": 104030, "C++": 1235}'
3
10
 
4
11
  describe "Github" do
5
- it 'should return raise error if initialized without token' do
6
- expect do
7
- Github.new()
8
- end.to raise_error(ArgumentError)
12
+
13
+ describe "initialize" do
14
+ it 'should return raise error if initialized without token' do
15
+ expect do
16
+ Github.new()
17
+ end.to raise_error(ArgumentError)
18
+ end
19
+
20
+ it 'should return the authentication token after initialization' do
21
+ github = Github.new(access_token: 'token')
22
+ github.access_token.should eq('token')
23
+ end
9
24
  end
10
25
 
11
- context 'after initialization with token' do
26
+ context 'Github::Client' do
12
27
  subject{Github.new(access_token: 'token')}
13
- it 'should return the authentication token after initialization' do
14
- subject.access_token.should eq('token')
28
+
29
+ describe "#user method on Github object" do
30
+ it "should return the current user\'s information if no username is passed" do
31
+ stub_request(:get, "https://api.github.com/user?access_token=token")
32
+ .to_return(body: USER_RESPONSE, status: 200)
33
+ user = subject.user
34
+ user["name"].should eq('user_name')
35
+ user["email"].should eq('test.email@example.com')
36
+ user["html_url"].should eq('http://www.github.com/user_name')
37
+ end
38
+ end
39
+
40
+ describe "#name" do
41
+ it "should return the current user's name if no username is passed" do
42
+ stub_request(:get, "https://api.github.com/user?access_token=token")
43
+ .to_return(body: USER_RESPONSE, status: 200)
44
+ subject.name.should eq('user_name')
45
+ end
46
+
47
+ it "should return the searched user's name if username is passed" do
48
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
49
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
50
+ subject.name(login: 'tcclevela').should eq('Teddy Cleveland')
51
+ end
52
+ end
53
+
54
+ describe "#login" do
55
+ it "should return the current user's login if no username is passed" do
56
+ stub_request(:get, "https://api.github.com/user?access_token=token")
57
+ .to_return(body: USER_RESPONSE, status: 200)
58
+ subject.login.should eq('user_login')
59
+ end
60
+ it "should return the current user's login if username is passed" do
61
+ subject.login(login: 'tcclevela').should eq('tcclevela')
62
+ end
63
+ end
64
+
65
+ describe "#email" do
66
+ it "should return the current user's email if no username is passed" do
67
+ stub_request(:get, "https://api.github.com/user?access_token=token")
68
+ .to_return(body: USER_RESPONSE, status: 200)
69
+ subject.email.should eq('test.email@example.com')
70
+ end
71
+
72
+ it "should return the searched user's email if username is passed" do
73
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
74
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
75
+ subject.email(login: 'tcclevela').should eq('tcclevela@gmail.com')
76
+ end
77
+ end
78
+
79
+ describe "#html_url" do
80
+ it "should return the html url of the current user if no login is passed" do
81
+ stub_request(:get, "https://api.github.com/user?access_token=token")
82
+ .to_return(body: USER_RESPONSE, status: 200)
83
+ subject.html_url.should eq("http://www.github.com/user_name")
84
+ end
85
+ it "should return the url of the specified user if login is passed" do
86
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
87
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
88
+ subject.html_url(login: 'tcclevela').should eq("https://github.com/tcclevela")
89
+ end
90
+ end
91
+
92
+ describe "#repos_url" do
93
+ it "should return the repos url of the current user if no login is passed" do
94
+ stub_request(:get, "https://api.github.com/user?access_token=token")
95
+ .to_return(body: USER_RESPONSE, status: 200)
96
+ subject.repos_url.should eq("http://api/github.com/user_name/repos")
97
+ end
98
+
99
+ it "should return the repos url of the specified user if login is passed" do
100
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
101
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
102
+ subject.repos_url(login: 'tcclevela').should eq("https://api.github.com/users/tcclevela/repos")
103
+ end
104
+ end
105
+ describe "#repos" do
106
+ it "should return an array" do
107
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
108
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
109
+ stub_request(:get, "https://api.github.com/users/tcclevela/repos?access_token=token")
110
+ .to_return(body: EXAMPLE_REPO_RESPONSE, status: 200)
111
+ subject.repos(login: 'tcclevela').class.should eq(Github::ReposResponseWrapper)
112
+ end
113
+
114
+ it 'should return an array of Github::Repo objects' do
115
+ stub_request(:get, "https://api.github.com/users/tcclevela?access_token=token")
116
+ .to_return(body: EXAMPLE_USER_RESPONSE, status: 200)
117
+ stub_request(:get, "https://api.github.com/users/tcclevela/repos?access_token=token")
118
+ .to_return(body: EXAMPLE_REPO_RESPONSE, status: 200)
119
+ subject.repos(login: 'tcclevela').response.first.class.should eq(Github::Repo)
120
+ end
121
+
122
+ it "should return the repos of the current user if no login is passed" do
123
+ stub_request(:get, "https://api.github.com/user?access_token=token")
124
+ .to_return(body: USER_RESPONSE, status: 200)
125
+ stub_request(:get, "http://api/github.com/user_name/repos?access_token=token")
126
+ .to_return(body: EXAMPLE_REPO_RESPONSE, status: 200)
127
+ subject.repos.response.first.class.should eq(Github::Repo)
128
+ end
129
+ end
130
+ end
131
+
132
+ context "Repo submodule" do
133
+ subject{Github::Repo.new(JSON.parse(EXAMPLE_REPO_INFO), 'token')}
134
+
135
+ describe "#language" do
136
+ it "should return the primary language that the repository is written in" do
137
+ subject.language.should eq("Ruby")
138
+ end
139
+ end
140
+
141
+ describe "#name" do
142
+ it "should return the name of the repository" do
143
+ subject.name.should eq("address_book")
144
+ end
145
+ end
146
+
147
+ describe "#owner_login" do
148
+ it "should return the login of the repo owner" do
149
+ subject.owner_login.should eq("tcclevela")
150
+ end
15
151
  end
16
- it "should load the current user\'s information" do
17
- stub_request(:get, "https://api.github.com/user?access_token=token")
18
- .to_return(body: {user: {username: 'uname'}}, status: 200)
19
- subject.user.should eq(user: {username: 'uname'})
152
+
153
+ describe "#forked?" do
154
+ it "should return true if repository is forked" do
155
+ subject.forked?.should eq(true)
156
+ end
157
+
158
+ it "should return false if respository was created by owner" do
159
+ unforked = Github::Repo.new(JSON.parse(EXAMPLE_REPO_INFO_B), 'token');
160
+ unforked.forked?.should eq(false)
161
+ end
20
162
  end
21
163
 
164
+ describe "url" do
165
+ it "should return the html_url of the repository" do
166
+ subject.url.should eq("https://github.com/tcclevela/address_book")
167
+ end
168
+ end
169
+
170
+ describe "#commits_url" do
171
+ it "should hit the API and retrieve the commits for the repository" do
172
+ subject.commits_url.should eq("https://api.github.com/repos/tcclevela/address_book/commits")
173
+ end
174
+ end
175
+
176
+ describe "#access_token" do
177
+ it "should return the access token with which the Github::Repo was initialized" do
178
+ subject.access_token.should eq('token')
179
+ end
180
+ end
181
+
182
+ describe "#commits" do
183
+ it "should return commits by hitting the commits url passing token as authentication" do
184
+ stub_request(:get, "https://api.github.com/repos/tcclevela/address_book/commits?access_token=token")
185
+ .to_return(body: EXAMPLE_COMMITS_RESPONSE, status: 200 )
186
+ subject.commits.should eq(JSON.parse(EXAMPLE_COMMITS_RESPONSE))
187
+ end
188
+ end
189
+
190
+ describe "#languages" do
191
+ it "should returna hash containging language-byte pairs" do
192
+ stub_request(:get, "https://api.github.com/repos/tcclevela/address_book/languages?access_token=token")
193
+ .to_return(body: EXAMPLE_LANGUAGES_RESPONSE, status: 200)
194
+ subject.languages.should eq(JSON.parse(EXAMPLE_LANGUAGES_RESPONSE))
195
+ end
196
+ end
22
197
  end
23
198
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-layer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theodore Cleveland
@@ -160,14 +160,19 @@ extra_rdoc_files:
160
160
  files:
161
161
  - .document
162
162
  - .rspec
163
+ - .travis.yml
163
164
  - Gemfile
164
165
  - Gemfile.lock
165
166
  - LICENSE.txt
166
167
  - README.rdoc
167
168
  - Rakefile
168
169
  - VERSION
170
+ - git-layer.gemspec
169
171
  - lib/github.rb
170
172
  - lib/github/client.rb
173
+ - lib/github/helpers.rb
174
+ - lib/github/repo.rb
175
+ - lib/github/repos_response_wrapper.rb
171
176
  - spec/git-layer_spec.rb
172
177
  - spec/helper.rb
173
178
  homepage: http://github.com/tcclevela/git-layer