github_api 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ module Github
2
+ class PageUriProcessor
3
+ include Github::Constants
4
+ include Github::Utils::Url
5
+
6
+ attr_reader :link, :query_string
7
+
8
+ def initialize(uri)
9
+ @link = uri.split(QUERY_STR_SEP).first
10
+ @query_string = uri.split(QUERY_STR_SEP).last
11
+ end
12
+
13
+ def resource_link
14
+ query_string
15
+ end
16
+
17
+ def query_hash
18
+
19
+ end
20
+ end
21
+ end
@@ -26,7 +26,7 @@ module Github
26
26
  if params[PARAM_PER_PAGE] == NOT_FOUND
27
27
  params[PARAM_PER_PAGE] = default_page_size
28
28
  end
29
- if !params[PARAM_PAGE] || params[PARAM_PAGE] == NOT_FOUND
29
+ if params[PARAM_PAGE] && params[PARAM_PAGE] == NOT_FOUND
30
30
  params[PARAM_PAGE] = default_page
31
31
  end
32
32
 
@@ -11,7 +11,7 @@ module Github
11
11
  # @github.repos.watchers
12
12
  # @github.repos.watchers { |watcher| ... }
13
13
  #
14
- def watchers(user_name=nil, repo_name=nil, params={})
14
+ def watchers(user_name, repo_name, params={})
15
15
  _update_user_repo_params(user_name, repo_name)
16
16
  _validate_user_repo_params(user, repo) unless user? && repo?
17
17
  _normalize_params_keys(params)
@@ -24,8 +24,8 @@ module Github
24
24
  # List repos being watched by a user
25
25
  #
26
26
  # = Examples
27
- # @github = Github.new :user => 'user-name'
28
- # @github.repos.watched
27
+ # @github = Github.new
28
+ # @github.repos.watched :user => 'user-name'
29
29
  #
30
30
  # List repos being watched by the authenticated user
31
31
  #
@@ -33,12 +33,13 @@ module Github
33
33
  # @github = Github.new :oauth_token => '...'
34
34
  # @github.repos.watched
35
35
  #
36
- def watched(user_name=nil, params={})
37
- _update_user_repo_params(user_name)
36
+ def watched(*args)
37
+ params = args.last.is_a?(Hash) ? args.pop : {}
38
38
  _normalize_params_keys(params)
39
+ _merge_user_into_params!(params) unless params.has_key?('user')
39
40
 
40
- response = if user
41
- get("/users/#{user}/watched", params)
41
+ response = if (user_name = params.delete('user'))
42
+ get("/users/#{user_name}/watched", params)
42
43
  else
43
44
  get("/user/watched", params)
44
45
  end
@@ -63,8 +63,8 @@ module Github
63
63
  end
64
64
 
65
65
  def _extract_mime_type(params, options) # :nodoc:
66
- options['resource'] = params.delete('resource') || ''
67
- options['mime_type'] = params.delete('mime_type')
66
+ options['resource'] = params['resource'] ? params.delete('resource') : ''
67
+ options['mime_type'] = params['resource'] ? params.delete('mime_type') : ''
68
68
  end
69
69
 
70
70
  # no need for this smizzle
@@ -23,6 +23,14 @@ module Github
23
23
  loaded? ? @env[:response_headers][CONTENT_LENGTH] : nil
24
24
  end
25
25
 
26
+ def etag
27
+ loaded? ? @env[:response_headers][ETAG] : nil
28
+ end
29
+
30
+ def server
31
+ loaded? ? @env[:response_headers][SERVER] : nil
32
+ end
33
+
26
34
  def status
27
35
  loaded? ? @env[:status] : nil
28
36
  end
@@ -59,7 +67,7 @@ module Github
59
67
  def first_page
60
68
  first_request = page_iterator.first
61
69
  self.instance_eval { @env = first_request.env } if first_request
62
- first_request
70
+ self.body
63
71
  end
64
72
 
65
73
  # Retrives the result of the next page. Returns <tt>nil</tt> if there is
@@ -67,7 +75,7 @@ module Github
67
75
  def next_page
68
76
  next_request = page_iterator.next
69
77
  self.instance_eval { @env = next_request.env } if next_request
70
- next_request
78
+ self.body
71
79
  end
72
80
 
73
81
  # Retrives the result of the previous page. Returns <tt>nil</tt> if there is
@@ -75,7 +83,7 @@ module Github
75
83
  def prev_page
76
84
  prev_request = page_iterator.prev
77
85
  self.instance_eval { @env = prev_request.env } if prev_request
78
- prev_request
86
+ self.body
79
87
  end
80
88
  alias :previous_page :prev_page
81
89
 
@@ -85,7 +93,7 @@ module Github
85
93
  def last_page
86
94
  last_request = page_iterator.last
87
95
  self.instance_eval { @env = last_request.env } if last_request
88
- last_request
96
+ self.body
89
97
  end
90
98
 
91
99
  # Retrives a specific result for a page given page number.
@@ -95,7 +103,7 @@ module Github
95
103
  def page(page_number)
96
104
  request = page_iterator.get_page(page_number)
97
105
  self.instance_eval { @env = request.env } if request
98
- request
106
+ self.body
99
107
  end
100
108
 
101
109
  # Returns <tt>true</tt> if there is another page in the result set,
@@ -4,7 +4,7 @@ module Github
4
4
  module VERSION
5
5
  MAJOR = 0
6
6
  MINOR = 4
7
- PATCH = 1
7
+ PATCH = 2
8
8
  BUILD = nil
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.');
@@ -5,14 +5,23 @@ describe Github::PageIterator do
5
5
  let(:link) {
6
6
  "<https://api.github.com/users/wycats/repos?page=4&per_page=20>; rel=\"next\", <https://api.github.com/users/wycats/repos?page=6&per_page=20>; rel=\"last\", <https://api.github.com/users/wycats/repos?page=1&per_page=20>; rel=\"first\", <https://api.github.com/users/wycats/repos?page=2&per_page=20>; rel=\"prev\""
7
7
  }
8
- let(:env) { { :response_headers => {'Link' => link } } }
9
- let(:first) { "https://api.github.com/users/wycats/repos?page=1&per_page=20" }
8
+ let(:sha_link) {
9
+ "<https://api.github.com/repos/peter-murach/github/commits?last_sha=d1e503c02fa770859895dd0d12aedefa28b95723&per_page=30&sha=801d80dfd59bf1d2cb30a243799953ab683a3abd&top=801d80dfd59bf1d2cb30a243799953ab683a3abd>; rel=\"next\", <https://api.github.com/repos/peter-murach/github/commits?per_page=30&sha=801d80dfd59bf1d2cb30a243799953ab683a3abd>; rel=\"first\""
10
+ }
11
+ let(:env) { { :response_headers => {'Link' => link } } }
12
+ let(:sha_env) { { :response_headers => {'Link' => sha_link } } }
13
+ let(:first) { "https://api.github.com/users/wycats/repos?page=1&per_page=20" }
10
14
  let(:nexxt) { "https://api.github.com/users/wycats/repos?page=4&per_page=20" }
11
- let(:prev) { "https://api.github.com/users/wycats/repos?page=2&per_page=20" }
12
- let(:last) { "https://api.github.com/users/wycats/repos?page=6&per_page=20" }
13
- let(:user) { 'wycats' }
15
+ let(:prev) { "https://api.github.com/users/wycats/repos?page=2&per_page=20" }
16
+ let(:last) { "https://api.github.com/users/wycats/repos?page=6&per_page=20" }
17
+ let(:user) { 'wycats' }
18
+ let(:last_sha) { "d1e503c02fa770859895dd0d12aedefa28b95723"}
14
19
 
15
20
  let(:instance) { Github::PageIterator.new(env) }
21
+ let(:sha_instance) { Github::PageIterator.new(sha_env) }
22
+ let(:sha_links) { Github::PageLinks.new(sha_env)}
23
+ let(:sha_first) { "https://api.github.com/repos/peter-murach/github/commits?per_page=30&sha=801d80dfd59bf1d2cb30a243799953ab683a3abd" }
24
+ let(:sha_next) { "https://api.github.com/repos/peter-murach/github/commits?last_sha=d1e503c02fa770859895dd0d12aedefa28b95723&per_page=30&sha=801d80dfd59bf1d2cb30a243799953ab683a3abd&top=801d80dfd59bf1d2cb30a243799953ab683a3abd"}
16
25
 
17
26
  it { described_class::ATTRIBUTES.should_not be_nil }
18
27
 
@@ -27,6 +36,15 @@ describe Github::PageIterator do
27
36
  it { instance.last_page.should eql 6 }
28
37
  it { instance.last_page_uri.should eq last }
29
38
 
39
+ it { sha_instance.first_page.should eq -1 }
40
+ it { sha_instance.first_page_uri.should eq sha_first }
41
+ it { sha_instance.next_page.should eq -1 }
42
+ it { sha_instance.next_page_uri.should eq sha_next }
43
+ it { sha_instance.prev_page.should eq -1 }
44
+ it { sha_instance.prev_page_uri.should be_nil }
45
+ it { sha_instance.last_page.should eql -1 }
46
+ it { sha_instance.last_page_uri.should be_nil }
47
+
30
48
  end
31
49
 
32
50
  context 'has_next?' do
@@ -67,6 +85,31 @@ describe Github::PageIterator do
67
85
  and_return link
68
86
  instance.first
69
87
  end
88
+
89
+ context 'no pagination params' do
90
+ before do
91
+ Github.new
92
+ sha_instance.stub(:has_next?).and_return true
93
+ sha_instance.stub(:next_page).and_return -1
94
+
95
+ stub_get("/repos/peter-murach/github/commits").
96
+ to_return(:body => '', :status => 200,
97
+ :headers => {
98
+ :content_type => "application/json; charset=utf-8",
99
+ 'Link' => sha_link
100
+ }
101
+ )
102
+ end
103
+
104
+ it 'receives sha params' do
105
+ sha_link.stub(:links).and_return sha_links
106
+ sha_instance.stub(:udpate_page_links)
107
+ sha_instance.should_receive(:page_request).
108
+ with("https://api.github.com/repos/peter-murach/github/commits",
109
+ 'sha' => 'master', 'per_page' => 30).and_return sha_link
110
+ sha_instance.first
111
+ end
112
+ end
70
113
  end # first
71
114
 
72
115
  context 'next' do
@@ -96,6 +139,31 @@ describe Github::PageIterator do
96
139
  'page' => 4,'per_page' => 20).and_return link
97
140
  instance.next
98
141
  end
142
+
143
+ context 'no pagination params' do
144
+ before do
145
+ Github.new
146
+ sha_instance.stub(:has_next?).and_return true
147
+ sha_instance.stub(:next_page).and_return -1
148
+
149
+ stub_get("/repos/peter-murach/github/commits").
150
+ to_return(:body => '', :status => 200,
151
+ :headers => {
152
+ :content_type => "application/json; charset=utf-8",
153
+ 'Link' => sha_link
154
+ }
155
+ )
156
+ end
157
+
158
+ it 'receives sha params' do
159
+ sha_link.stub(:links).and_return sha_links
160
+ sha_instance.stub(:udpate_page_links)
161
+ sha_instance.should_receive(:page_request).
162
+ with("https://api.github.com/repos/peter-murach/github/commits",
163
+ 'sha' => last_sha, 'per_page' => 30).and_return sha_link
164
+ sha_instance.next
165
+ end
166
+ end
99
167
  end # next
100
168
 
101
169
  context 'prev' do
@@ -56,7 +56,7 @@ describe Github::Repos::Watching, :type => :base do
56
56
 
57
57
  end
58
58
 
59
- describe "watched" do
59
+ describe ":watched:" do
60
60
 
61
61
  context "if user unauthenticated" do
62
62
  before do
@@ -76,7 +76,7 @@ describe Github::Repos::Watching, :type => :base do
76
76
  it "should get the resource with username" do
77
77
  stub_get("/users/#{user}/watched").
78
78
  to_return(:body => fixture("repos/watched.json"), :status => 200, :headers => {})
79
- github.repos.watched(user)
79
+ github.repos.watched(:user => user)
80
80
  a_get("/users/#{user}/watched").should have_been_made
81
81
  end
82
82
  end
@@ -4,7 +4,7 @@ describe Github::Result do
4
4
 
5
5
  let(:github) { Github.new }
6
6
  let(:user) { 'wycats' }
7
- let(:res) { github.events.public }
7
+ let(:res) { github.events.public :per_page => 20 }
8
8
  let(:pages) { ['1', '5', '6'] }
9
9
  let(:link) {
10
10
  "<https://api.github.com/users/wycats/repos?page=6&per_page=20>; rel=\"last\", <https://api.github.com/users/wycats/repos?page=1&per_page=20>; rel=\"first\""
@@ -12,6 +12,7 @@ describe Github::Result do
12
12
 
13
13
  before do
14
14
  stub_get("/events").
15
+ with(:query => { 'per_page' => '20' }).
15
16
  to_return(:body => fixture('events/events.json'),
16
17
  :status => 200,
17
18
  :headers => {
@@ -19,12 +20,15 @@ describe Github::Result do
19
20
  'X-RateLimit-Remaining' => '4999',
20
21
  'X-RateLimit-Limit' => '5000',
21
22
  'content-length' => '344',
23
+ 'etag' => "\"d9a88f20567726e29d35c6fae87cef2f\"",
24
+ 'server' => "nginx/1.0.4",
22
25
  'Link' => link
23
26
  })
24
27
 
25
- ['1', '5', '6'].each do |page|
28
+ ['', '1', '5', '6'].each do |page|
29
+ params = page.empty? ? {'per_page'=>'20'} : {'per_page'=>'20', 'page'=>page}
26
30
  stub_get("/users/#{user}/repos").
27
- with(:query => {'per_page' => '20', 'page' => page}).
31
+ with(:query => params).
28
32
  to_return(:body => fixture('events/events.json'),
29
33
  :status => 200,
30
34
  :headers => {
@@ -57,6 +61,14 @@ describe Github::Result do
57
61
  res.status.should be 200
58
62
  end
59
63
 
64
+ it 'should read response etag' do
65
+ res.etag.should eql "\"d9a88f20567726e29d35c6fae87cef2f\""
66
+ end
67
+
68
+ it 'should read response server' do
69
+ res.server.should eql "nginx/1.0.4"
70
+ end
71
+
60
72
  it "should assess successful" do
61
73
  res.success?.should be_true
62
74
  end
@@ -80,14 +92,26 @@ describe Github::Result do
80
92
  end
81
93
 
82
94
  %w[ next prev ].each do |link|
83
- it "should return #{link} page if exists" do
84
- res.send(:"#{link}_page").should eq @items
95
+ context "#{link}_page" do
96
+ it "should return collection of resources" do
97
+ res.send(:"#{link}_page").should be_an Array
98
+ end
99
+
100
+ it 'should have no link information' do
101
+ res.links.send(:"#{link}").should be_nil
102
+ end
85
103
  end
86
104
  end
87
105
 
88
106
  %w[ first last].each do |link|
89
- it "should return #{link} page if exists" do
90
- res.send(:"#{link}_page").should_not be_empty
107
+ context "#{link}_page" do
108
+ it "should return resource if exists" do
109
+ res.send(:"#{link}_page").should_not be_empty
110
+ end
111
+
112
+ it "should have link information" do
113
+ res.send(:"#{link}_page").should_not be_nil
114
+ end
91
115
  end
92
116
  end
93
117
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: github_api
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.1
5
+ version: 0.4.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Piotr Murach
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-18 00:00:00 +00:00
13
+ date: 2012-01-21 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -177,6 +177,14 @@ extra_rdoc_files: []
177
177
 
178
178
  files:
179
179
  - Rakefile
180
+ - features/cassettes/pagination/repos/commits/next.yml
181
+ - features/cassettes/pagination/repos/commits/sha/next.yml
182
+ - features/cassettes/pagination/repos/commits/sha.yml
183
+ - features/cassettes/pagination/repos/commits.yml
184
+ - features/cassettes/pagination/repos/diff/next.yml
185
+ - features/cassettes/pagination/repos/diff.yml
186
+ - features/cassettes/pagination/repos/next.yml
187
+ - features/cassettes/pagination/repos.yml
180
188
  - features/cassettes/repos/branches.yml
181
189
  - features/cassettes/repos/tags.yml
182
190
  - features/cassettes/repos/teams.yml
@@ -222,6 +230,7 @@ files:
222
230
  - lib/github_api/orgs.rb
223
231
  - lib/github_api/page_iterator.rb
224
232
  - lib/github_api/page_links.rb
233
+ - lib/github_api/page_uri_processor.rb
225
234
  - lib/github_api/paged_request.rb
226
235
  - lib/github_api/pull_requests/comments.rb
227
236
  - lib/github_api/pull_requests.rb