Skip to content

Commit

Permalink
Refactors url building to handle per_page
Browse files Browse the repository at this point in the history
  • Loading branch information
swilliams committed Dec 8, 2017
1 parent b42d5f7 commit ee3f496
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 21 deletions.
24 changes: 21 additions & 3 deletions lib/issue_exporter/export.rb
Expand Up @@ -7,7 +7,7 @@ class Exporter

attr_accessor :outputter

def initialize(owner, repo, token = nil, options = {})
def initialize(owner, repo, token = nil, options = { page_size: true })
@owner = owner
@repo = repo
@token = token
Expand All @@ -19,7 +19,8 @@ def initialize(owner, repo, token = nil, options = {})

def export
error_handler = ErrorHandler.new
url = IssueExporting.make_uri @owner, @repo, @token, @options
url = IssueExporting.make_uri @owner, @repo, @token
url.query += build_query_string @options
response = Net::HTTP::get url
if err = error_handler.error_message(response)
error_handler.handle_error err
Expand All @@ -28,7 +29,24 @@ def export
end
end

private
def build_query_string(options)
values = {
include_closed_issues: 'state=all',
page_size: 'per_page=100'
}
qs = options.reduce([]) do |arr, kv|
key, val = kv
query_value = values[key] if val
if query_value.nil?
arr
else
arr.push(query_value) unless query_value.nil?
end
end
if qs == [] then return '' end
return '&' + qs.join('&')
end

def build_outputter(outputter_options)
output_type = outputter_options[:output_type] || 'file'
case output_type
Expand Down
9 changes: 4 additions & 5 deletions lib/issue_exporter/github.rb
Expand Up @@ -3,15 +3,14 @@ def self.api_url
"https://api.github.com/repos/%s/%s/issues?access_token=%s"
end

def self.make_url(owner, repo, token, options = {})
def self.make_url(owner, repo, token)
url_format = IssueExporting.api_url
root_url = url_format % [owner, repo, token]
return root_url unless options[:include_closed_issues] == true
root_url + "&state=all"
return root_url
end

def self.make_uri(owner, repo, token, options = {})
URI(IssueExporting.make_url(owner, repo, token, options))
def self.make_uri(owner, repo, token)
URI(IssueExporting.make_url(owner, repo, token))
end

def self.turn_options_into_querystring(options)
Expand Down
17 changes: 15 additions & 2 deletions spec/export_spec.rb
Expand Up @@ -5,6 +5,7 @@
let (:repo) { "test-repo" }
let (:token) { "abcdef" }


describe 'file output' do
let (:output_filename) {
File.expand_path('../../issues.json', __FILE__)
Expand Down Expand Up @@ -32,9 +33,21 @@
end
end

it 'builds URLs' do
exporter = IssueExporting::Exporter.new(owner, repo, token)
qs = exporter.build_query_string({})
expect(qs).to eq ''
qs = exporter.build_query_string({ include_closed_issues: true })
expect(qs).to eq '&state=all'
qs = exporter.build_query_string({ page_size: true })
expect(qs).to eq '&per_page=100'
qs = exporter.build_query_string({ include_closed_issues: true, page_size: true })
expect(qs).to eq '&state=all&per_page=100'
end

it 'puts it all in one file by default' do
exporter = IssueExporting::Exporter.new(owner, repo, token)
stub_request(:any, "https://api.github.com/repos/swilliams/test-repo/issues?access_token=abcdef").to_return(body: mock_data)
stub_request(:any, "https://api.github.com/repos/swilliams/test-repo/issues?access_token=abcdef&per_page=100").to_return(body: mock_data)
exporter.export()
expect(File.exists? output_filename).to eq true
expect(File.read(output_filename)).to eq mock_data
Expand All @@ -43,7 +56,7 @@
it 'handles errors gracefully' do
exporter = IssueExporting::Exporter.new(owner, repo, token)
error_hash = {"message" => "Bad credentials","documentation_url" => "https://developer.github.com/v3"}
stub_request(:any, "https://api.github.com/repos/swilliams/test-repo/issues?access_token=abcdef").to_return(body: error_hash.to_json)
stub_request(:any, "https://api.github.com/repos/swilliams/test-repo/issues?access_token=abcdef&per_page=100").to_return(body: error_hash.to_json)
expect { exporter.export() }.to raise_error SystemExit
expect(File.exists? output_filename).to eq false
end
Expand Down
12 changes: 1 addition & 11 deletions spec/github_url_spec.rb
@@ -1,17 +1,7 @@
require 'spec_helper'

describe 'URL Building' do
it 'builds a URL with the closed flag when present' do
url = IssueExporting.make_url 'herp', 'derp', 'TOKEN', { include_closed_issues: true }
expect(url).to eq "https://api.github.com/repos/herp/derp/issues?access_token=TOKEN&state=all"
end

it 'builds a URL without the closed flag when it is false' do
url = IssueExporting.make_url 'herp', 'derp', 'TOKEN', { include_closed_issues: false }
expect(url).to eq "https://api.github.com/repos/herp/derp/issues?access_token=TOKEN"
end

it 'builds a URL without the closed flag when it\'s missing' do
it 'builds a URL' do
url = IssueExporting.make_url 'herp', 'derp', 'TOKEN'
expect(url).to eq "https://api.github.com/repos/herp/derp/issues?access_token=TOKEN"
end
Expand Down

0 comments on commit ee3f496

Please sign in to comment.