octocat_herder 0.0.2 → 0.1.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.
- data/.document +2 -1
- data/.travis.yml +3 -0
- data/CONTRIBUTING.markdown +93 -0
- data/Gemfile +8 -6
- data/Gemfile.lock +5 -1
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.markdown +46 -0
- data/Rakefile +2 -9
- data/VERSION +1 -1
- data/lib/octocat_herder/base.rb +53 -44
- data/lib/octocat_herder/connection.rb +145 -6
- data/lib/octocat_herder/pull_request/repo.rb +38 -4
- data/lib/octocat_herder/pull_request.rb +186 -24
- data/lib/octocat_herder/repository.rb +128 -11
- data/lib/octocat_herder/user.rb +107 -8
- data/lib/octocat_herder.rb +22 -1
- data/octocat_herder.gemspec +17 -9
- data/spec/octocat_herder/connection_spec.rb +4 -4
- metadata +48 -14
- data/README.rdoc +0 -19
data/.document
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
Checklist (and a short version for the impatient)
|
2
|
+
=================================================
|
3
|
+
|
4
|
+
* Commits:
|
5
|
+
|
6
|
+
- Make commits of logical units.
|
7
|
+
|
8
|
+
- Check for unnecessary whitespace with "git diff --check" before
|
9
|
+
committing.
|
10
|
+
|
11
|
+
- Commit using Unix line endings (check the settings around "crlf"
|
12
|
+
in git-config(1)).
|
13
|
+
|
14
|
+
- Do not check in commented out code or unneeded files.
|
15
|
+
|
16
|
+
- The first line of the commit message should be a short
|
17
|
+
description (50 characters is the soft limit, excluding ticket
|
18
|
+
number(s)), and should skip the full stop.
|
19
|
+
|
20
|
+
- The body should provide a meaningful commit message, which:
|
21
|
+
|
22
|
+
- uses the imperative, present tense: "change", not "changed" or
|
23
|
+
"changes".
|
24
|
+
|
25
|
+
- includes motivation for the change, and contrasts its
|
26
|
+
implementation with the previous behavior.
|
27
|
+
|
28
|
+
- Make sure that you have tests for the bug you are fixing, or
|
29
|
+
feature you are adding.
|
30
|
+
|
31
|
+
- Make sure the test suite passes after your commit (rake spec).
|
32
|
+
|
33
|
+
* Submission:
|
34
|
+
|
35
|
+
- Fork the repository on GitHub.
|
36
|
+
|
37
|
+
- Push your changes to a topic branch in your fork of the
|
38
|
+
repository.
|
39
|
+
|
40
|
+
- Submit a pull request.
|
41
|
+
|
42
|
+
The long version
|
43
|
+
================
|
44
|
+
|
45
|
+
1. Make separate commits for logically separate changes.
|
46
|
+
|
47
|
+
Please break your commits down into logically consistent units
|
48
|
+
which include new or changed tests relevent to the rest of the
|
49
|
+
change. The goal of doing this is to make the diff easier to
|
50
|
+
read for whoever is reviewing your code. In general, the easier
|
51
|
+
your diff is to read, the more likely someone will be happy to
|
52
|
+
review it and get it into the code base.
|
53
|
+
|
54
|
+
If you're going to refactor a piece of code, please do so as a
|
55
|
+
separate commit from your feature or bug fix changes.
|
56
|
+
|
57
|
+
We also really appreciate changes that include tests to make
|
58
|
+
sure the bug isn't re-introduced, and that the feature isn't
|
59
|
+
accidentally broken.
|
60
|
+
|
61
|
+
Describe the technical detail of the change(s). If your
|
62
|
+
description starts to get too long, that's a good sign that you
|
63
|
+
probably need to split up your commit into more finely grained
|
64
|
+
pieces.
|
65
|
+
|
66
|
+
Commits which plainly describe the the things which help
|
67
|
+
reviewers check the patch and future developers understand the
|
68
|
+
code are much more likely to be merged in with a minimum of
|
69
|
+
bike-shedding or requested changes. Ideally, the commit message
|
70
|
+
would include information, and be in a form suitable for
|
71
|
+
inclusion in the release notes.
|
72
|
+
|
73
|
+
Please also check that you are not introducing any trailing
|
74
|
+
whitespaces or other "whitespace errors". You can do this by
|
75
|
+
running "git diff --check" on your changes before you commit.
|
76
|
+
|
77
|
+
3. Sending your changes
|
78
|
+
|
79
|
+
To submit your changes via a GitHub pull request, we _highly_
|
80
|
+
recommend that you have them on a topic branch, instead of
|
81
|
+
directly on "master". It makes things much easier to keep track
|
82
|
+
of, especially if you decide to work on another thing before
|
83
|
+
your first change is merged in.
|
84
|
+
|
85
|
+
GitHub has some pretty good
|
86
|
+
[general documentation](http://help.github.com/) on using
|
87
|
+
their site. They also have documentation on
|
88
|
+
[creating pull requests](http://help.github.com/send-pull-requests/).
|
89
|
+
|
90
|
+
In general, after pushing your topic branch up to your
|
91
|
+
repository on GitHub, you'll switch to the branch in the GitHub
|
92
|
+
UI and click "Pull Request" towards the top of the page in order
|
93
|
+
to open a pull request.
|
data/Gemfile
CHANGED
@@ -4,10 +4,12 @@ gem "httparty", "~> 0.7.8"
|
|
4
4
|
gem "link_header", "~> 0.0.5"
|
5
5
|
|
6
6
|
group :development do
|
7
|
-
gem "rspec",
|
8
|
-
gem "mocha",
|
9
|
-
gem "bundler",
|
10
|
-
gem "jeweler",
|
11
|
-
gem "rcov",
|
12
|
-
gem "
|
7
|
+
gem "rspec", "~> 2.6.0"
|
8
|
+
gem "mocha", "~> 0.9.12"
|
9
|
+
gem "bundler", "~> 1.0.0"
|
10
|
+
gem "jeweler", "~> 1.6.4"
|
11
|
+
gem "rcov", ">= 0"
|
12
|
+
gem "yard", "~> 0.6.0"
|
13
|
+
gem "rdoc", "~> 3.8.0"
|
14
|
+
gem "bluecloth", "~>2.1.0"
|
13
15
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
bluecloth (2.1.0)
|
4
5
|
crack (0.1.8)
|
5
6
|
diff-lcs (1.1.2)
|
6
7
|
git (1.2.5)
|
@@ -23,16 +24,19 @@ GEM
|
|
23
24
|
rspec-expectations (2.6.0)
|
24
25
|
diff-lcs (~> 1.1.2)
|
25
26
|
rspec-mocks (2.6.0)
|
27
|
+
yard (0.6.8)
|
26
28
|
|
27
29
|
PLATFORMS
|
28
30
|
ruby
|
29
31
|
|
30
32
|
DEPENDENCIES
|
33
|
+
bluecloth (~> 2.1.0)
|
31
34
|
bundler (~> 1.0.0)
|
32
35
|
httparty (~> 0.7.8)
|
33
36
|
jeweler (~> 1.6.4)
|
34
37
|
link_header (~> 0.0.5)
|
35
38
|
mocha (~> 0.9.12)
|
36
39
|
rcov
|
37
|
-
rdoc (
|
40
|
+
rdoc (~> 3.8.0)
|
38
41
|
rspec (~> 2.6.0)
|
42
|
+
yard (~> 0.6.0)
|
data/{LICENSE.txt → LICENSE}
RENAMED
File without changes
|
data/README.markdown
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Octocat Herder [](http://travis-ci.org/jhelwig/octocat_herder)
|
2
|
+
|
3
|
+
Octocat Herder is a wrapper for the GitHub v3 API.
|
4
|
+
|
5
|
+
## On-line documentation
|
6
|
+
|
7
|
+
* [rdoc.info](http://rdoc.info/gems/octocat_herder/frames)
|
8
|
+
|
9
|
+
## Requirements
|
10
|
+
|
11
|
+
* Gems
|
12
|
+
* link_header
|
13
|
+
* httparty
|
14
|
+
|
15
|
+
## Basic usage
|
16
|
+
|
17
|
+
Quick start:
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
=> true
|
21
|
+
require 'octocat_herder'
|
22
|
+
=> true
|
23
|
+
|
24
|
+
herder = OctocatHerder.new
|
25
|
+
=> #<OctocatHerder:0x7f792d3c4918 ...>
|
26
|
+
|
27
|
+
me = herder.user 'jhelwig'
|
28
|
+
=> #<OctocatHerder::User:0x7f792d3b6070 ...>
|
29
|
+
|
30
|
+
me.html_url
|
31
|
+
=> "https://github.com/jhelwig"
|
32
|
+
|
33
|
+
me.available_attributes.sort
|
34
|
+
=> ["avatar_url", "bio", "blog", "company", "created_at", "email", "followers", "following", "hireable", "html_url", "location", "login", "name", "public_gists", "public_repos", "url", "user_id", "user_type"]
|
35
|
+
|
36
|
+
repos = me.repositories
|
37
|
+
=> [#<OctocatHerder::Repository:0x7f792d364bf8 ...>, #<OctocatHerder::Repository:0x7f792d364bd0 ..>, #<OctocatHerder::Repository:0x7f792d364ba8 ...>, ...]
|
38
|
+
|
39
|
+
|
40
|
+
## Contributing to octocat_herder
|
41
|
+
|
42
|
+
See {file:CONTRIBUTING.markdown CONTRIBUTING.markdown} for further details.
|
43
|
+
|
44
|
+
## Copyright
|
45
|
+
|
46
|
+
Copyright (c) 2011 Jacob Helwig. See {file:LICENSE LICENSE} for further details.
|
data/Rakefile
CHANGED
@@ -38,12 +38,5 @@ end
|
|
38
38
|
|
39
39
|
task :default => :spec
|
40
40
|
|
41
|
-
require '
|
42
|
-
Rake::
|
43
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
44
|
-
|
45
|
-
rdoc.rdoc_dir = 'rdoc'
|
46
|
-
rdoc.title = "octocat_herder #{version}"
|
47
|
-
rdoc.rdoc_files.include('README*')
|
48
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
49
|
-
end
|
41
|
+
require 'yard'
|
42
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/octocat_herder/base.rb
CHANGED
@@ -1,19 +1,50 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'link_header'
|
3
|
-
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'parsedate'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
4
9
|
require 'uri'
|
5
10
|
|
6
11
|
require 'octocat_herder/connection'
|
7
12
|
|
8
13
|
class OctocatHerder
|
9
|
-
|
10
|
-
|
11
|
-
|
14
|
+
# This provides most of the functionality to interact with the
|
15
|
+
# GitHub v3 API.
|
16
|
+
module Base
|
17
|
+
# The re-hydrated JSON retrieved from the GitHub API.
|
18
|
+
#
|
19
|
+
# @since 0.0.1
|
20
|
+
# @return [Hash]
|
21
|
+
attr_reader :raw
|
22
|
+
|
23
|
+
# Our {OctocatHerder::Connection}, so we can make more requests
|
24
|
+
# based on the information we retrieved from the GitHub API.
|
25
|
+
#
|
26
|
+
# @since 0.0.1
|
27
|
+
# @return [OctocatHerder::Connection]
|
28
|
+
attr_reader :connection
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
# @since 0.0.1
|
32
|
+
#
|
33
|
+
# @param [Hash] raw_hash The re-hydrated JSON received from the
|
34
|
+
# GitHub API via {OctocatHerder::Connection}.
|
35
|
+
#
|
36
|
+
# @param [OctocatHerder::Connection] conn If not provided requests
|
37
|
+
# will be unauthenticated.
|
12
38
|
def initialize(raw_hash, conn = OctocatHerder::Connection.new)
|
13
39
|
@connection = conn
|
14
40
|
@raw = raw_hash
|
15
41
|
end
|
16
42
|
|
43
|
+
# We use the +method_missing+ magic to create accessors for the
|
44
|
+
# information we got back from the GitHub API. You can get a list
|
45
|
+
# of all of the available things from {#available_attributes}.
|
46
|
+
#
|
47
|
+
# @since 0.0.1
|
17
48
|
def method_missing(id, *args)
|
18
49
|
unless @raw and @raw.keys.include?(id.id2name)
|
19
50
|
raise NoMethodError.new("undefined method #{id.id2name} for #{self}:#{self.class}")
|
@@ -22,6 +53,13 @@ class OctocatHerder
|
|
22
53
|
@raw[id.id2name]
|
23
54
|
end
|
24
55
|
|
56
|
+
# This returns a list of the things that the API request returned
|
57
|
+
# to us.
|
58
|
+
#
|
59
|
+
# @since 0.0.1
|
60
|
+
#
|
61
|
+
# @return [Array<String>] Names of available methods providing
|
62
|
+
# additional detail about the object.
|
25
63
|
def available_attributes
|
26
64
|
attrs = []
|
27
65
|
attrs += @raw.keys.reject do |k|
|
@@ -36,53 +74,24 @@ class OctocatHerder
|
|
36
74
|
|
37
75
|
private
|
38
76
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
query_string = query_string_from_params(query_params)
|
45
|
-
|
46
|
-
result = conn.get(end_point + query_string, options)
|
47
|
-
raise "Unable to retrieve #{end_point}" unless result
|
48
|
-
|
49
|
-
full_result = result.parsed_response
|
50
|
-
|
51
|
-
if paginated
|
52
|
-
if next_page = page_from_headers(result.headers, 'next')
|
53
|
-
query_params[:page] = next_page
|
54
|
-
|
55
|
-
new_options = options.merge(query_params)
|
56
|
-
new_options[:paginated] = true
|
57
|
-
|
58
|
-
full_result += raw_get(conn, end_point, new_options)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
full_result
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.page_from_headers(headers, type)
|
66
|
-
link = LinkHeader.parse(headers['link']).find_link(['rel', type])
|
67
|
-
return unless link
|
68
|
-
|
69
|
-
CGI.parse(URI.parse(link.href).query)['page'].first
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.query_string_from_params(params)
|
73
|
-
return '' if params.keys.empty?
|
74
|
-
|
75
|
-
'?' + params.map {|k,v| "#{URI.escape("#{k}")}=#{URI.escape("#{v}")}"}.join('&')
|
76
|
-
end
|
77
|
-
|
77
|
+
# Intended to be overridden in classes using {OctocatHerder::Base},
|
78
|
+
# so they can make the methods they define show up in
|
79
|
+
# {#available_attributes}.
|
80
|
+
#
|
81
|
+
# @since 0.0.1
|
78
82
|
def additional_attributes
|
79
83
|
[]
|
80
84
|
end
|
81
85
|
|
86
|
+
# @since 0.0.1
|
82
87
|
def parse_date_time(date_time)
|
83
88
|
return nil unless date_time
|
84
89
|
|
85
|
-
|
90
|
+
if defined? ParseDate
|
91
|
+
Time.utc(*ParseDate.parsedate(date_time))
|
92
|
+
else
|
93
|
+
DateTime.parse date_time
|
94
|
+
end
|
86
95
|
end
|
87
96
|
end
|
88
97
|
end
|
@@ -2,16 +2,48 @@ require 'httparty'
|
|
2
2
|
require 'link_header'
|
3
3
|
|
4
4
|
class OctocatHerder
|
5
|
+
# This implements some additional functionality around HTTParty to
|
6
|
+
# help make working with the GitHub API a little nicer.
|
5
7
|
class Connection
|
6
8
|
include HTTParty
|
7
9
|
base_uri 'https://api.github.com'
|
8
10
|
|
9
|
-
|
11
|
+
# User name to use when doing basic HTTP authentication.
|
12
|
+
#
|
13
|
+
# @since 0.0.1
|
14
|
+
attr_reader :user_name
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
16
|
+
# Password to use when doing basic HTTP authentication.
|
17
|
+
#
|
18
|
+
# @since 0.0.1
|
19
|
+
attr_reader :password
|
20
|
+
|
21
|
+
# The OAuth2 token to use when doing OAuth2 authentication.
|
22
|
+
#
|
23
|
+
# @since 0.0.1
|
24
|
+
attr_reader :oauth2_token
|
14
25
|
|
26
|
+
# If provided a hash of login information, the
|
27
|
+
# {OctocatHerder::Connection} will attempt to make authenticated
|
28
|
+
# requests.
|
29
|
+
#
|
30
|
+
# @example Unauthenticated requests
|
31
|
+
# connection = OctocatHerder::Connection.new
|
32
|
+
#
|
33
|
+
# @example Providing an OAuth2 token
|
34
|
+
# connection = OctocatHerder::Connection.new :oauth2_token => 'token'
|
35
|
+
#
|
36
|
+
# @example Providing user name & password
|
37
|
+
# connection = OctocatHerder::Connection.new :user_name => 'user', :password => 'pass'
|
38
|
+
#
|
39
|
+
# If no hash is provided, then unauthenticated requests will be
|
40
|
+
# made.
|
41
|
+
#
|
42
|
+
# @since 0.0.1
|
43
|
+
# @param [Hash<Symbol => String>] options Login information
|
44
|
+
# @option options [String] :user_name
|
45
|
+
# @option options [String] :password
|
46
|
+
# @option options [String] :oauth2_token
|
15
47
|
def initialize(options={})
|
16
48
|
raise ArgumentError.new(
|
17
49
|
"OctocatHerder::Connection does not accept: #{options.class}"
|
@@ -29,7 +61,7 @@ class OctocatHerder
|
|
29
61
|
end
|
30
62
|
|
31
63
|
if options.keys.include?(:oauth2_token) and options.keys.include?(:user_name)
|
32
|
-
raise ArgumentError.new('Cannot provide both an OAuth2
|
64
|
+
raise ArgumentError.new('Cannot provide both an OAuth2 token, and a user name and password')
|
33
65
|
end
|
34
66
|
|
35
67
|
@user_name = options[:user_name]
|
@@ -43,13 +75,120 @@ class OctocatHerder
|
|
43
75
|
end
|
44
76
|
end
|
45
77
|
|
78
|
+
# Execute a GET request against the GitHub v3 API.
|
79
|
+
#
|
80
|
+
# @since development
|
81
|
+
#
|
82
|
+
# @param [String] end_point The part of the API URL after
|
83
|
+
# +'api.github.com'+, including the leading +'/'+.
|
84
|
+
#
|
85
|
+
# @param [Hash] options A Hash of options to be passed down to
|
86
|
+
# HTTParty, with a couple of extra options.
|
87
|
+
#
|
88
|
+
# @option options [true, false] :paginated Retrieve all pages from
|
89
|
+
# a paginated end-point.
|
90
|
+
#
|
91
|
+
# @option options [Hash<String, Symbol => String>] :params
|
92
|
+
# Constructed into a query string using
|
93
|
+
# {OctocatHerder::Connection#query_string_from_params}.
|
46
94
|
def get(end_point, options={})
|
95
|
+
paginated = options.delete(:paginated)
|
96
|
+
options[:params] ||= {}
|
97
|
+
|
98
|
+
options[:params][:per_page] = 100 if paginated and options[:params][:per_page].nil?
|
99
|
+
|
100
|
+
result = raw_get(end_point, options)
|
101
|
+
raise "Unable to retrieve #{end_point}" unless result
|
102
|
+
|
103
|
+
full_result = result.parsed_response
|
104
|
+
|
105
|
+
if paginated
|
106
|
+
if next_page = page_from_headers(result.headers, 'next')
|
107
|
+
options[:params][:page] = next_page
|
108
|
+
options[:paginated] = true
|
109
|
+
|
110
|
+
full_result += raw_get(end_point, options)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
full_result
|
115
|
+
end
|
116
|
+
|
117
|
+
# Small wrapper around HTTParty.get, which handles adding
|
118
|
+
# authentication information to the API request.
|
119
|
+
#
|
120
|
+
# @since development
|
121
|
+
def raw_get(end_point, options={})
|
122
|
+
query_params = options.delete(:params) || {}
|
123
|
+
query_string = query_string_from_params(query_params)
|
124
|
+
|
47
125
|
request_options = options.merge(httparty_options)
|
48
126
|
if httparty_options.has_key?(:headers) and options.has_key(:headers)
|
49
127
|
request_options[:headers] = options[:headers].merge(httparty_options[:headers])
|
50
128
|
end
|
51
129
|
|
52
|
-
OctocatHerder::Connection.get(end_point, request_options)
|
130
|
+
OctocatHerder::Connection.get(end_point + query_string, request_options)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Are we making authenticated requests?
|
134
|
+
#
|
135
|
+
# @since development
|
136
|
+
# @return [true, false]
|
137
|
+
def authenticated_requests?
|
138
|
+
if (user_name and password) or oauth2_token
|
139
|
+
true
|
140
|
+
else
|
141
|
+
false
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Retrieve the page number of a given 'Link:' header from a hash
|
146
|
+
# of HTTP Headers
|
147
|
+
#
|
148
|
+
# +type+ can be one of:
|
149
|
+
# ['+next+'] The immediate next page of results.
|
150
|
+
# ['+last+'] The last page of first.
|
151
|
+
# ['+first+'] The first page of results.
|
152
|
+
# ['+prev+'] The immediate previous page of results.
|
153
|
+
#
|
154
|
+
# @since development
|
155
|
+
#
|
156
|
+
# @raise [ArgumentError] If type is not one of the allowed values.
|
157
|
+
#
|
158
|
+
# @param [Hash] headers
|
159
|
+
#
|
160
|
+
# @param ['next', 'last', 'first', 'prev'] type
|
161
|
+
def page_from_headers(headers, type)
|
162
|
+
raise ArgumentError.new(
|
163
|
+
"Unknown type: #{type}"
|
164
|
+
) unless ['next', 'last', 'first', 'prev'].include? type
|
165
|
+
|
166
|
+
link = LinkHeader.parse(headers['link']).find_link(['rel', type])
|
167
|
+
return unless link
|
168
|
+
|
169
|
+
CGI.parse(URI.parse(link.href).query)['page'].first
|
170
|
+
end
|
171
|
+
|
172
|
+
# Convenience method to generate URL query strings.
|
173
|
+
#
|
174
|
+
# @since development
|
175
|
+
#
|
176
|
+
# @param [Hash] params A Hash of key/values to be turned into a
|
177
|
+
# URL query string. Does not support nested data.
|
178
|
+
#
|
179
|
+
# @return [String] Empty string if params is an empty hash,
|
180
|
+
# otherwise a string of the query parameters with a leading
|
181
|
+
# +'?'+.
|
182
|
+
def query_string_from_params(params)
|
183
|
+
return '' if params.keys.empty?
|
184
|
+
|
185
|
+
'?' + params.map {|k,v| "#{URI.escape("#{k}")}=#{URI.escape("#{v}")}"}.join('&')
|
186
|
+
end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
def httparty_options
|
191
|
+
@httparty_options || {}
|
53
192
|
end
|
54
193
|
end
|
55
194
|
end
|
@@ -3,32 +3,66 @@ require 'octocat_herder/user'
|
|
3
3
|
require 'octocat_herder/repository'
|
4
4
|
|
5
5
|
class OctocatHerder
|
6
|
-
class PullRequest
|
7
|
-
|
6
|
+
class PullRequest
|
7
|
+
# A representation of the repsoitory meta-data returned from the
|
8
|
+
# pull request API. This is only ever useful when returned from
|
9
|
+
# OctocatHerder::PullRequest#head or
|
10
|
+
# OctocatHerder::PullRequest#base.
|
11
|
+
class Repo
|
12
|
+
include OctocatHerder::Base
|
13
|
+
|
14
|
+
# The login name of the owner of this repository.
|
15
|
+
#
|
16
|
+
# @since 0.0.1
|
17
|
+
# @return [String]
|
8
18
|
def user_login
|
9
19
|
@raw['user']['login']
|
10
20
|
end
|
11
21
|
|
22
|
+
# The ID number of the owner of this repository.
|
23
|
+
#
|
24
|
+
# @since 0.0.1
|
25
|
+
# @return [Integer]
|
12
26
|
def user_id
|
13
27
|
@raw['user']['id']
|
14
28
|
end
|
15
29
|
|
30
|
+
# The URL to the avatar image of the owner of this repository.
|
31
|
+
#
|
32
|
+
# @since 0.0.1
|
33
|
+
# @return [String]
|
16
34
|
def user_avatar_url
|
17
35
|
@raw['user']['avatar_url']
|
18
36
|
end
|
19
37
|
|
38
|
+
# The URL of the owner of this repository.
|
39
|
+
#
|
40
|
+
# @since 0.0.1
|
41
|
+
# @return [String]
|
20
42
|
def user_url
|
21
43
|
@raw['user']['url']
|
22
44
|
end
|
23
45
|
|
46
|
+
# The owner of this repository.
|
47
|
+
#
|
48
|
+
# @note This is cached locally to the instance of OctocatHerder::PullRequest::Repo, but will make an additional API request to populate it initially.
|
49
|
+
#
|
50
|
+
# @since 0.0.1
|
51
|
+
# @return [OctocatHerder::User]
|
24
52
|
def user
|
25
|
-
@user
|
53
|
+
@user ||= OctocatHerder::User.fetch(@raw['user'], connection)
|
26
54
|
end
|
27
55
|
|
56
|
+
# The detailed information about the repository.
|
57
|
+
#
|
58
|
+
# @since 0.0.1
|
59
|
+
# @return [OctocatHerder::Repository]
|
28
60
|
def repo
|
29
|
-
@repo
|
61
|
+
@repo ||= OctocatHerder::Repository.new(@raw['repo'], connection)
|
30
62
|
end
|
31
63
|
|
64
|
+
private
|
65
|
+
|
32
66
|
def addtional_attributes
|
33
67
|
['user_login', 'user_id', 'user_avatar_url', 'user_url']
|
34
68
|
end
|