diff --git a/README.md b/README.md index 13a09230..cc33996c 100644 --- a/README.md +++ b/README.md @@ -621,7 +621,7 @@ In order to be able to create/update/remove files you need to use Contents API l contents = Github::Client::Repos::Contents.new oauth_token: '...' ``` -Having instantiaed the contents, to create a file do: +Having instantiated the contents, to create a file do: ```ruby contents.create 'username', 'repo_name', 'full_path_to/file.ext', diff --git a/lib/github_api/client/repos.rb b/lib/github_api/client/repos.rb index b3786623..6af035da 100644 --- a/lib/github_api/client/repos.rb +++ b/lib/github_api/client/repos.rb @@ -132,6 +132,9 @@ def list(*args) permit %w[ user org type sort direction since ] end params = arguments.params + unless params.symbolize_keys[:per_page] + params.merge!(Pagination.per_page_as_param(current_options[:per_page])) + end response = if (user_name = params.delete('user') || user) get_request("/users/#{user_name}/repos", params) diff --git a/lib/github_api/pagination.rb b/lib/github_api/pagination.rb index 945224b9..14d843b1 100644 --- a/lib/github_api/pagination.rb +++ b/lib/github_api/pagination.rb @@ -91,6 +91,16 @@ def has_next_page? page_iterator.next? end + # Handle pagination params when they are not passed directly + # + def self.per_page_as_param(per_page_config) + params = {} + if (per_page_config != Github::Configuration.property_set[:per_page]) + params[:per_page] = per_page_config unless per_page_config.nil? + end + params + end + private # Internally used page iterator diff --git a/spec/integration/arguments_spec.rb b/spec/integration/arguments_spec.rb index 102182ae..ac255241 100644 --- a/spec/integration/arguments_spec.rb +++ b/spec/integration/arguments_spec.rb @@ -71,4 +71,54 @@ subject.get user, repo, milestone_id, :auto_pagination => true end end + + context 'handling per_page as a parameter' do + let(:per_page) { 2 } + + before :each do + stub_request(:get, url). + to_return(:status => 200, :body => '', :headers => {}) + end + + context 'when per_page is passed on Github init' do + let(:token) { [*('a'..'z')].sample(30).join } + let(:instance) { Github.new(oauth_token: token, per_page: per_page) } + let(:response) { instance.repos.list } + let(:url) { "https://api.github.com/user/repos?access_token=#{token}&per_page=#{per_page}" } + + it 'passes per_page params to url' do + expect(response.status).to eq 200 + end + end + + context 'when per_page is passed on Repos initialize only' do + let(:repos) { Github::Client::Repos.new(per_page: per_page) } + let(:response) { repos.list(user: 'fpgentil') } + let(:url) { "https://api.github.com/users/fpgentil/repos?per_page=#{per_page}" } + + it 'passes per_page params to url' do + expect(response.status).to eq 200 + end + end + + context 'when per_page is passed on Repos initialize and list method' do + let(:repos) { Github::Client::Repos.new(per_page: per_page + 5) } + let(:response) { repos.list(user: 'fpgentil', per_page: per_page) } + let(:url) { "https://api.github.com/users/fpgentil/repos?per_page=#{per_page}" } + + it 'passes per_page params to url' do + expect(response.status).to eq 200 + end + end + + context 'when per_page is not passed as params' do + let(:repos) { Github::Client::Repos.new } + let(:response) { repos.list(user: 'fpgentil') } + let(:url) { "https://api.github.com/users/fpgentil/repos" } + + it 'does not pass per_page params to url' do + expect(response.status).to eq 200 + end + end + end end