github_api 0.8.11 → 0.9.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/README.md +21 -14
- data/features/activity/notifications.feature +15 -0
- data/features/cassettes/activity/notifications/list_user.yml +54 -0
- data/features/step_definitions/common_steps.rb +8 -9
- data/lib/github_api.rb +3 -4
- data/lib/github_api/activity.rb +8 -13
- data/lib/github_api/activity/events.rb +0 -5
- data/lib/github_api/activity/notifications.rb +0 -5
- data/lib/github_api/api.rb +27 -22
- data/lib/github_api/api_factory.rb +13 -12
- data/lib/github_api/authorizations.rb +0 -5
- data/lib/github_api/client.rb +33 -33
- data/lib/github_api/configuration.rb +10 -2
- data/lib/github_api/connection.rb +2 -3
- data/lib/github_api/constants.rb +0 -3
- data/lib/github_api/gists.rb +2 -7
- data/lib/github_api/git_data.rb +10 -15
- data/lib/github_api/git_data/blobs.rb +0 -5
- data/lib/github_api/git_data/commits.rb +0 -5
- data/lib/github_api/git_data/references.rb +3 -7
- data/lib/github_api/git_data/tags.rb +0 -5
- data/lib/github_api/git_data/trees.rb +0 -5
- data/lib/github_api/gitignore.rb +0 -5
- data/lib/github_api/issues.rb +10 -15
- data/lib/github_api/issues/comments.rb +0 -5
- data/lib/github_api/issues/events.rb +0 -5
- data/lib/github_api/issues/labels.rb +0 -5
- data/lib/github_api/issues/milestones.rb +0 -5
- data/lib/github_api/markdown.rb +0 -5
- data/lib/github_api/meta.rb +0 -5
- data/lib/github_api/orgs.rb +4 -9
- data/lib/github_api/page_iterator.rb +44 -29
- data/lib/github_api/paged_request.rb +12 -12
- data/lib/github_api/{result.rb → pagination.rb} +19 -86
- data/lib/github_api/params_hash.rb +1 -1
- data/lib/github_api/pull_requests.rb +2 -7
- data/lib/github_api/repos.rb +22 -27
- data/lib/github_api/request.rb +7 -4
- data/lib/github_api/response/header.rb +76 -0
- data/lib/github_api/response_wrapper.rb +126 -0
- data/lib/github_api/scopes.rb +1 -1
- data/lib/github_api/search.rb +0 -5
- data/lib/github_api/users.rb +6 -11
- data/lib/github_api/version.rb +2 -2
- data/spec/github/activity/notifications/get_spec.rb +1 -1
- data/spec/github/activity/starring/starred_spec.rb +1 -1
- data/spec/github/activity/watching/watched_spec.rb +1 -1
- data/spec/github/api_factory_spec.rb +7 -8
- data/spec/github/api_spec.rb +0 -7
- data/spec/github/authorization_spec.rb +22 -32
- data/spec/github/authorizations/create_spec.rb +49 -0
- data/spec/github/authorizations/delete_spec.rb +39 -0
- data/spec/github/authorizations/get_spec.rb +49 -0
- data/spec/github/authorizations/list_spec.rb +55 -0
- data/spec/github/authorizations/update_spec.rb +50 -0
- data/spec/github/authorizations_spec.rb +2 -236
- data/spec/github/gists/comments/create_spec.rb +1 -1
- data/spec/github/gists/comments/edit_spec.rb +1 -1
- data/spec/github/gists/comments/get_spec.rb +1 -1
- data/spec/github/gists/create_spec.rb +1 -1
- data/spec/github/gists/edit_spec.rb +1 -1
- data/spec/github/gists/fork_spec.rb +1 -1
- data/spec/github/gists/get_spec.rb +1 -1
- data/spec/github/git_data/blobs/create_spec.rb +1 -1
- data/spec/github/git_data/blobs/get_spec.rb +1 -1
- data/spec/github/git_data/commits/create_spec.rb +1 -1
- data/spec/github/git_data/commits/get_spec.rb +1 -1
- data/spec/github/git_data/references/create_spec.rb +2 -2
- data/spec/github/git_data/references/get_spec.rb +1 -1
- data/spec/github/git_data/references/list_spec.rb +16 -6
- data/spec/github/git_data/tags/create_spec.rb +1 -1
- data/spec/github/git_data/tags/get_spec.rb +1 -1
- data/spec/github/git_data/trees/create_spec.rb +1 -1
- data/spec/github/git_data/trees/get_spec.rb +4 -4
- data/spec/github/issues/comments/create_spec.rb +1 -1
- data/spec/github/issues/comments/edit_spec.rb +1 -1
- data/spec/github/issues/comments/get_spec.rb +1 -1
- data/spec/github/issues/create_spec.rb +1 -1
- data/spec/github/issues/edit_spec.rb +1 -1
- data/spec/github/issues/events/get_spec.rb +1 -1
- data/spec/github/issues/get_spec.rb +1 -1
- data/spec/github/issues/labels/create_spec.rb +1 -1
- data/spec/github/issues/labels/get_spec.rb +1 -1
- data/spec/github/issues/labels/update_spec.rb +1 -1
- data/spec/github/issues/milestones/create_spec.rb +1 -1
- data/spec/github/issues/milestones/delete_spec.rb +1 -1
- data/spec/github/issues/milestones/get_spec.rb +1 -1
- data/spec/github/issues/milestones/update_spec.rb +1 -1
- data/spec/github/orgs/edit_spec.rb +1 -1
- data/spec/github/orgs/get_spec.rb +1 -1
- data/spec/github/orgs/teams/create_spec.rb +1 -1
- data/spec/github/orgs/teams/edit_spec.rb +1 -1
- data/spec/github/orgs/teams/get_spec.rb +1 -1
- data/spec/github/paged_request_spec.rb +34 -29
- data/spec/github/pagination/iterator/number_spec.rb +118 -0
- data/spec/github/pagination/iterator/sha_spec.rb +67 -0
- data/spec/github/pull_requests/comments/create_spec.rb +1 -1
- data/spec/github/pull_requests/comments/edit_spec.rb +1 -1
- data/spec/github/pull_requests/comments/get_spec.rb +1 -1
- data/spec/github/pull_requests/create_spec.rb +1 -1
- data/spec/github/pull_requests/get_spec.rb +1 -1
- data/spec/github/pull_requests/update_spec.rb +1 -1
- data/spec/github/repos/branch_spec.rb +1 -1
- data/spec/github/repos/comments/create_spec.rb +1 -1
- data/spec/github/repos/comments/get_spec.rb +1 -1
- data/spec/github/repos/comments/update_spec.rb +1 -1
- data/spec/github/repos/commits/get_spec.rb +1 -1
- data/spec/github/repos/create_spec.rb +1 -1
- data/spec/github/repos/downloads/create_spec.rb +1 -1
- data/spec/github/repos/downloads/get_spec.rb +1 -1
- data/spec/github/repos/edit_spec.rb +1 -1
- data/spec/github/repos/forks/create_spec.rb +1 -1
- data/spec/github/repos/get_spec.rb +1 -1
- data/spec/github/repos/hooks/create_spec.rb +1 -1
- data/spec/github/repos/hooks/edit_spec.rb +1 -1
- data/spec/github/repos/hooks/get_spec.rb +1 -1
- data/spec/github/repos/languages_spec.rb +1 -1
- data/spec/github/repos/merging/merge_spec.rb +1 -1
- data/spec/github/repos/statuses/create_spec.rb +1 -1
- data/spec/github/repos/tags_spec.rb +1 -1
- data/spec/github/repos/teams_spec.rb +1 -1
- data/spec/github/request/endpoint_spec.rb +24 -0
- data/spec/github/request/request_spec.rb +38 -0
- data/spec/github/{result_spec.rb → response_wrapper_spec.rb} +14 -13
- data/spec/github/users/emails/list_spec.rb +1 -1
- data/spec/github/users/get_spec.rb +2 -7
- data/spec/github/users/keys/create_spec.rb +1 -1
- data/spec/github/users/keys/get_spec.rb +1 -1
- data/spec/github/users/keys/update_spec.rb +1 -1
- data/spec/github/users/update_spec.rb +1 -1
- data/spec/github_spec.rb +1 -6
- data/spec/{github/activity → integration}/activity_spec.rb +0 -0
- data/spec/{github/gists → integration}/gists_spec.rb +2 -0
- data/spec/{github/git_data → integration}/git_data_spec.rb +0 -0
- data/spec/{github/issues → integration}/issues_spec.rb +2 -0
- data/spec/integration/options_spec.rb +103 -23
- data/spec/{github/orgs → integration}/orgs_spec.rb +0 -0
- data/spec/{github/pull_requests → integration}/pull_requests_spec.rb +0 -0
- data/spec/{github → integration}/repos_spec.rb +2 -0
- data/spec/{github/users → integration}/users_spec.rb +0 -0
- data/spec/shared/array_of_resources_behaviour.rb +1 -1
- metadata +55 -46
- data/lib/github_api/page_uri_processor.rb +0 -25
- data/lib/github_api/response/helpers.rb +0 -21
- data/spec/github/page_iterator_spec.rb +0 -260
- data/spec/github/response/helpers_spec.rb +0 -16
|
@@ -1,27 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Github
|
|
4
|
+
|
|
5
|
+
# A module that adds http get request to response pagination
|
|
2
6
|
module PagedRequest
|
|
3
7
|
include Github::Constants
|
|
4
8
|
|
|
5
|
-
extend self
|
|
6
|
-
|
|
7
9
|
FIRST_PAGE = 1 # Default request page if none provided
|
|
8
10
|
|
|
9
11
|
PER_PAGE = 30 # Default number of items as specified by API
|
|
10
12
|
|
|
11
13
|
NOT_FOUND = -1 # Either page or per_page parameter not present
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
# Check if current api instance has default per_page param set,
|
|
16
|
+
# otherwise use global default.
|
|
17
|
+
#
|
|
17
18
|
def default_page_size
|
|
18
|
-
|
|
19
|
+
current_api.per_page ? current_api.per_page : PER_PAGE
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def default_page
|
|
22
|
-
|
|
23
|
+
current_api.page ? current_api.page : FIRST_PAGE
|
|
23
24
|
end
|
|
24
25
|
|
|
26
|
+
# Perform http get request with paginatoin parameters
|
|
27
|
+
#
|
|
25
28
|
def page_request(path, params={})
|
|
26
29
|
if params[PARAM_PER_PAGE] == NOT_FOUND
|
|
27
30
|
params[PARAM_PER_PAGE] = default_page_size
|
|
@@ -30,10 +33,7 @@ module Github
|
|
|
30
33
|
params[PARAM_PAGE] = default_page
|
|
31
34
|
end
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
Github::PagedRequest.per_page = params[PARAM_PER_PAGE]
|
|
35
|
-
|
|
36
|
-
Github.api_client.get_request path, params
|
|
36
|
+
current_api.get_request(path, params)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
end # PagedRequest
|
|
@@ -1,87 +1,25 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
module Github
|
|
4
|
-
module Result
|
|
5
|
-
include Github::Constants
|
|
6
|
-
|
|
7
|
-
# TODO Add result counts method to check total items looking at result links
|
|
8
|
-
|
|
9
|
-
# All request headers
|
|
10
|
-
def headers
|
|
11
|
-
loaded? ? @env[:response_headers] : nil
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def oauth_scopes
|
|
15
|
-
loaded? ? @env[:response_headers][OAUTH_SCOPES] : nil
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def accepted_oauth_scopes
|
|
19
|
-
loaded? ? @env[:response_headers][ACCEPTED_OAUTH_SCOPES] : nil
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Requests are limited to API v3 to 5000 per hour.
|
|
23
|
-
def ratelimit_limit
|
|
24
|
-
loaded? ? @env[:response_headers][RATELIMIT_LIMIT] : nil
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def ratelimit_remaining
|
|
28
|
-
loaded? ? @env[:response_headers][RATELIMIT_REMAINING] : nil
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def cache_control
|
|
32
|
-
loaded? ? @env[:response_headers][CACHE_CONTROL] : nil
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def content_type
|
|
36
|
-
loaded? ? @env[:response_headers][CONTENT_TYPE] : nil
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def content_length
|
|
40
|
-
loaded? ? @env[:response_headers][CONTENT_LENGTH] : nil
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def etag
|
|
44
|
-
loaded? ? @env[:response_headers][ETAG] : nil
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def date
|
|
48
|
-
loaded? ? @env[:response_headers][DATE] : nil
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def location
|
|
52
|
-
loaded? ? @env[:response_headers][LOCATION] : nil
|
|
53
|
-
end
|
|
54
4
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def status
|
|
60
|
-
loaded? ? @env[:status] : nil
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def success?
|
|
64
|
-
(200..299).include? status
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Returns raw body
|
|
68
|
-
def body
|
|
69
|
-
loaded? ? @env[:body] : nil
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def loaded?
|
|
73
|
-
!!@env
|
|
74
|
-
end
|
|
5
|
+
# A module that decorates response with pagination helpers
|
|
6
|
+
module Pagination
|
|
7
|
+
include Github::Constants
|
|
75
8
|
|
|
76
9
|
# Return page links
|
|
77
10
|
def links
|
|
78
|
-
|
|
11
|
+
@links = Github::PageLinks.new(env[:response_headers])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Retrive number of total pages base on current :per_page parameter
|
|
15
|
+
def count_pages
|
|
16
|
+
page_iterator.count.to_i
|
|
79
17
|
end
|
|
80
18
|
|
|
81
19
|
# Iterator like each for response pages. If there are no pages to
|
|
82
|
-
# iterate over this method will return
|
|
20
|
+
# iterate over this method will return current page.
|
|
83
21
|
def each_page
|
|
84
|
-
yield self
|
|
22
|
+
yield self
|
|
85
23
|
while page_iterator.has_next?
|
|
86
24
|
yield next_page
|
|
87
25
|
end
|
|
@@ -93,7 +31,7 @@ module Github
|
|
|
93
31
|
def first_page
|
|
94
32
|
first_request = page_iterator.first
|
|
95
33
|
self.instance_eval { @env = first_request.env } if first_request
|
|
96
|
-
|
|
34
|
+
first_request
|
|
97
35
|
end
|
|
98
36
|
|
|
99
37
|
# Retrives the result of the next page. Returns <tt>nil</tt> if there is
|
|
@@ -101,7 +39,7 @@ module Github
|
|
|
101
39
|
def next_page
|
|
102
40
|
next_request = page_iterator.next
|
|
103
41
|
self.instance_eval { @env = next_request.env } if next_request
|
|
104
|
-
|
|
42
|
+
next_request
|
|
105
43
|
end
|
|
106
44
|
|
|
107
45
|
# Retrives the result of the previous page. Returns <tt>nil</tt> if there is
|
|
@@ -109,7 +47,7 @@ module Github
|
|
|
109
47
|
def prev_page
|
|
110
48
|
prev_request = page_iterator.prev
|
|
111
49
|
self.instance_eval { @env = prev_request.env } if prev_request
|
|
112
|
-
|
|
50
|
+
prev_request
|
|
113
51
|
end
|
|
114
52
|
alias :previous_page :prev_page
|
|
115
53
|
|
|
@@ -119,7 +57,7 @@ module Github
|
|
|
119
57
|
def last_page
|
|
120
58
|
last_request = page_iterator.last
|
|
121
59
|
self.instance_eval { @env = last_request.env } if last_request
|
|
122
|
-
|
|
60
|
+
last_request
|
|
123
61
|
end
|
|
124
62
|
|
|
125
63
|
# Retrives a specific result for a page given page number.
|
|
@@ -129,7 +67,7 @@ module Github
|
|
|
129
67
|
def page(page_number)
|
|
130
68
|
request = page_iterator.get_page(page_number)
|
|
131
69
|
self.instance_eval { @env = request.env } if request
|
|
132
|
-
|
|
70
|
+
request
|
|
133
71
|
end
|
|
134
72
|
|
|
135
73
|
# Returns <tt>true</tt> if there is another page in the result set,
|
|
@@ -138,17 +76,12 @@ module Github
|
|
|
138
76
|
page_iterator.has_next?
|
|
139
77
|
end
|
|
140
78
|
|
|
141
|
-
|
|
142
|
-
def reset
|
|
143
|
-
nil
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
private
|
|
79
|
+
private
|
|
147
80
|
|
|
148
81
|
# Internally used page iterator
|
|
149
82
|
def page_iterator # :nodoc:
|
|
150
|
-
|
|
83
|
+
@page_iterator = Github::PageIterator.new(links, current_api)
|
|
151
84
|
end
|
|
152
85
|
|
|
153
|
-
end #
|
|
86
|
+
end # Pagination
|
|
154
87
|
end # Github
|
|
@@ -23,14 +23,9 @@ module Github
|
|
|
23
23
|
'state' => %w[ open closed ]
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
# Creates new Gists API
|
|
27
|
-
def initialize(options = {})
|
|
28
|
-
super(options)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
26
|
# Access to PullRequests::Comments API
|
|
32
|
-
def comments
|
|
33
|
-
@comments ||= ApiFactory.new
|
|
27
|
+
def comments(options={}, &block)
|
|
28
|
+
@comments ||= ApiFactory.new('PullRequests::Comments', current_options.merge(options), &block)
|
|
34
29
|
end
|
|
35
30
|
|
|
36
31
|
# List pull requests
|
data/lib/github_api/repos.rb
CHANGED
|
@@ -41,64 +41,59 @@ module Github
|
|
|
41
41
|
|
|
42
42
|
VALID_REPO_TYPES = %w[ all public private member ].freeze
|
|
43
43
|
|
|
44
|
-
# Creates new Repositories API
|
|
45
|
-
def initialize(options = {})
|
|
46
|
-
super(options)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
44
|
# Access to Repos::Collaborators API
|
|
50
|
-
def collaborators
|
|
51
|
-
@collaborators ||= ApiFactory.new
|
|
45
|
+
def collaborators(options={}, &block)
|
|
46
|
+
@collaborators ||= ApiFactory.new('Repos::Collaborators', current_options.merge(options), &block)
|
|
52
47
|
end
|
|
53
48
|
|
|
54
49
|
# Access to Repos::Comments API
|
|
55
|
-
def comments
|
|
56
|
-
@commits ||= ApiFactory.new
|
|
50
|
+
def comments(options={}, &block)
|
|
51
|
+
@commits ||= ApiFactory.new('Repos::Comments', current_options.merge(options), &block)
|
|
57
52
|
end
|
|
58
53
|
|
|
59
54
|
# Access to Repos::Commits API
|
|
60
|
-
def commits
|
|
61
|
-
@commits ||= ApiFactory.new
|
|
55
|
+
def commits(options={}, &block)
|
|
56
|
+
@commits ||= ApiFactory.new('Repos::Commits', current_options.merge(options), &block)
|
|
62
57
|
end
|
|
63
58
|
|
|
64
59
|
# Access to Repos::Contents API
|
|
65
|
-
def contents
|
|
66
|
-
@contents ||= ApiFactory.new
|
|
60
|
+
def contents(options={}, &block)
|
|
61
|
+
@contents ||= ApiFactory.new('Repos::Contents', current_options.merge(options), &block)
|
|
67
62
|
end
|
|
68
63
|
|
|
69
64
|
# Access to Repos::Downloads API
|
|
70
|
-
def downloads
|
|
71
|
-
@downloads ||= ApiFactory.new
|
|
65
|
+
def downloads(options={}, &block)
|
|
66
|
+
@downloads ||= ApiFactory.new('Repos::Downloads', current_options.merge(options), &block)
|
|
72
67
|
end
|
|
73
68
|
|
|
74
69
|
# Access to Repos::Forks API
|
|
75
|
-
def forks
|
|
76
|
-
@forks ||= ApiFactory.new
|
|
70
|
+
def forks(options={}, &block)
|
|
71
|
+
@forks ||= ApiFactory.new('Repos::Forks', current_options.merge(options), &block)
|
|
77
72
|
end
|
|
78
73
|
|
|
79
74
|
# Access to Repos::Hooks API
|
|
80
|
-
def hooks
|
|
81
|
-
@hooks ||= ApiFactory.new
|
|
75
|
+
def hooks(options={}, &block)
|
|
76
|
+
@hooks ||= ApiFactory.new('Repos::Hooks', current_options.merge(options), &block)
|
|
82
77
|
end
|
|
83
78
|
|
|
84
79
|
# Access to Repos::Keys API
|
|
85
|
-
def keys
|
|
86
|
-
@keys ||= ApiFactory.new
|
|
80
|
+
def keys(options={}, &block)
|
|
81
|
+
@keys ||= ApiFactory.new('Repos::Keys', current_options.merge(options), &block)
|
|
87
82
|
end
|
|
88
83
|
|
|
89
84
|
# Access to Repos::Merging API
|
|
90
|
-
def merging
|
|
91
|
-
@mergin ||= ApiFactory.new
|
|
85
|
+
def merging(options={}, &block)
|
|
86
|
+
@mergin ||= ApiFactory.new('Repos::Merging', current_options.merge(options), &block)
|
|
92
87
|
end
|
|
93
88
|
|
|
94
89
|
# Access to Repos::Watchin API
|
|
95
|
-
def pubsubhubbub
|
|
96
|
-
@pubsubhubbub ||= ApiFactory.new
|
|
90
|
+
def pubsubhubbub(options={}, &block)
|
|
91
|
+
@pubsubhubbub ||= ApiFactory.new('Repos::PubSubHubbub', current_options.merge(options), &block)
|
|
97
92
|
end
|
|
98
93
|
|
|
99
94
|
# Access to Repos::Statuses API
|
|
100
|
-
def statuses
|
|
101
|
-
@statuses ||= ApiFactory.new
|
|
95
|
+
def statuses(options={}, &block)
|
|
96
|
+
@statuses ||= ApiFactory.new('Repos::Statuses', current_options.merge(options), &block)
|
|
102
97
|
end
|
|
103
98
|
|
|
104
99
|
# List branches
|
data/lib/github_api/request.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
module Github
|
|
4
|
+
|
|
4
5
|
# Defines HTTP verbs
|
|
5
6
|
module Request
|
|
6
7
|
|
|
@@ -27,7 +28,7 @@ module Github
|
|
|
27
28
|
request(:delete, path, params, options)
|
|
28
29
|
end
|
|
29
30
|
|
|
30
|
-
def request(method, path, params, options)
|
|
31
|
+
def request(method, path, params, options) # :nodoc:
|
|
31
32
|
if !METHODS.include?(method)
|
|
32
33
|
raise ArgumentError, "unkown http method: #{method}"
|
|
33
34
|
end
|
|
@@ -35,8 +36,10 @@ module Github
|
|
|
35
36
|
|
|
36
37
|
puts "EXECUTED: #{method} - #{path} with #{params} and #{options}" if ENV['DEBUG']
|
|
37
38
|
|
|
38
|
-
conn = connection(options)
|
|
39
|
-
|
|
39
|
+
conn = connection(options.merge(current_options))
|
|
40
|
+
if conn.path_prefix != '/' && path.index(conn.path_prefix) != 0
|
|
41
|
+
path = (conn.path_prefix + path).gsub(/\/(\/)*/, '/')
|
|
42
|
+
end
|
|
40
43
|
|
|
41
44
|
response = conn.send(method) do |request|
|
|
42
45
|
case method.to_sym
|
|
@@ -48,7 +51,7 @@ module Github
|
|
|
48
51
|
request.body = extract_data_from_params(params) unless params.empty?
|
|
49
52
|
end
|
|
50
53
|
end
|
|
51
|
-
response
|
|
54
|
+
ResponseWrapper.new(response, self)
|
|
52
55
|
end
|
|
53
56
|
|
|
54
57
|
private
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Github
|
|
4
|
+
class Response
|
|
5
|
+
|
|
6
|
+
# Represents http response header
|
|
7
|
+
class Header < Struct.new(:env)
|
|
8
|
+
include Github::Constants
|
|
9
|
+
|
|
10
|
+
SUCCESSFUL_STATUSES = 200..299
|
|
11
|
+
|
|
12
|
+
def loaded?
|
|
13
|
+
!!env
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def oauth_scopes
|
|
17
|
+
loaded? ? env[:response_headers][OAUTH_SCOPES] : nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def accepted_oauth_scopes
|
|
21
|
+
loaded? ? env[:response_headers][ACCEPTED_OAUTH_SCOPES] : nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Requests are limited to API v3 to 5000 per hour.
|
|
25
|
+
def ratelimit_limit
|
|
26
|
+
loaded? ? env[:response_headers][RATELIMIT_LIMIT] : nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def ratelimit_remaining
|
|
30
|
+
loaded? ? env[:response_headers][RATELIMIT_REMAINING] : nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def cache_control
|
|
34
|
+
loaded? ? env[:response_headers][CACHE_CONTROL] : nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def content_type
|
|
38
|
+
loaded? ? env[:response_headers][CONTENT_TYPE] : nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def content_length
|
|
42
|
+
loaded? ? env[:response_headers][CONTENT_LENGTH] : nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def etag
|
|
46
|
+
loaded? ? env[:response_headers][ETAG] : nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def date
|
|
50
|
+
loaded? ? env[:response_headers][DATE] : nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def location
|
|
54
|
+
loaded? ? env[:response_headers][LOCATION] : nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def server
|
|
58
|
+
loaded? ? env[:response_headers][SERVER] : nil
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def status
|
|
62
|
+
loaded? ? env[:status] : nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def success?
|
|
66
|
+
SUCCESSFUL_STATUSES.include? status
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Returns raw body
|
|
70
|
+
def body
|
|
71
|
+
loaded? ? env[:body] : nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end # Header
|
|
75
|
+
end # Response
|
|
76
|
+
end # Github
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Github
|
|
4
|
+
|
|
5
|
+
# A class responsible for proxing to faraday response
|
|
6
|
+
class ResponseWrapper
|
|
7
|
+
extend Forwardable
|
|
8
|
+
include Pagination
|
|
9
|
+
include Enumerable
|
|
10
|
+
|
|
11
|
+
attr_reader :response
|
|
12
|
+
|
|
13
|
+
attr_reader :current_api
|
|
14
|
+
|
|
15
|
+
attr_reader :env
|
|
16
|
+
|
|
17
|
+
def_delegators :body, :empty?, :size, :include?, :length, :to_a, :first, :flatten, :include?, :keys, :[]
|
|
18
|
+
|
|
19
|
+
def initialize(response, current_api)
|
|
20
|
+
@response = response
|
|
21
|
+
@current_api = current_api
|
|
22
|
+
@env = response.env
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Request url
|
|
26
|
+
#
|
|
27
|
+
def url
|
|
28
|
+
response.env[:url].to_s
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Response raw body
|
|
32
|
+
#
|
|
33
|
+
def body
|
|
34
|
+
response.body
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Response status
|
|
38
|
+
#
|
|
39
|
+
def status
|
|
40
|
+
response.status
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def success?
|
|
44
|
+
response.success?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Return response headers
|
|
48
|
+
#
|
|
49
|
+
def headers
|
|
50
|
+
Github::Response::Header.new(env)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Lookup an attribute from the body.
|
|
54
|
+
# Convert any key to string before calling.
|
|
55
|
+
#
|
|
56
|
+
def [](key)
|
|
57
|
+
self.body.send(:"#{key}")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Return response body as string
|
|
61
|
+
#
|
|
62
|
+
def to_s
|
|
63
|
+
body.to_s
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Convert the ResponseWrapper into a Hash
|
|
67
|
+
#
|
|
68
|
+
def to_hash
|
|
69
|
+
body.to_hash
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Convert the ResponseWrapper into an Array
|
|
73
|
+
#
|
|
74
|
+
def to_ary
|
|
75
|
+
body.to_ary
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Iterate over each resource inside the body
|
|
79
|
+
#
|
|
80
|
+
def each
|
|
81
|
+
body_parts = self.body.respond_to?(:each) ? self.body : [self.body]
|
|
82
|
+
return body_parts.to_enum unless block_given?
|
|
83
|
+
body_parts.each { |part| yield(part) }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Check if body has an attribute
|
|
87
|
+
#
|
|
88
|
+
def has_key?(key)
|
|
89
|
+
!self.body.is_a?(Array) && self.body.has_key?(key)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Coerce any method calls for body attributes
|
|
93
|
+
#
|
|
94
|
+
def method_missing(method_name, *args, &block)
|
|
95
|
+
if self.has_key?(method_name.to_s)
|
|
96
|
+
self.[](method_name, &block)
|
|
97
|
+
else
|
|
98
|
+
super
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Check if method is defined on the body
|
|
103
|
+
#
|
|
104
|
+
def respond_to?(method_name)
|
|
105
|
+
if self.has_key?(method_name.to_s)
|
|
106
|
+
true
|
|
107
|
+
else
|
|
108
|
+
super
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Print only response body
|
|
113
|
+
#
|
|
114
|
+
def inspect
|
|
115
|
+
"#<#{self.class.name} @body=\"#{self.body}\">"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Compare the wrapper with other wrapper for equality
|
|
119
|
+
#
|
|
120
|
+
def ==(other)
|
|
121
|
+
self.env == other.env &&
|
|
122
|
+
self.body == other.body
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end # ResponseWrapper
|
|
126
|
+
end # Github
|