git-layer 0.1.0 → 0.2.0

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.
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