diff --git a/lib/CHANGELOG.md b/lib/CHANGELOG.md index 745eb59..cfdcefc 100644 --- a/lib/CHANGELOG.md +++ b/lib/CHANGELOG.md @@ -6,6 +6,8 @@ **Merged pull requests:** +- this pr will be closed and shouldn't appear in changelog [\#7](https://github.com/skywinder/changelog_test/pull/7) ([skywinder](https://github.com/skywinder)) + - This PR SHOULD NOT appear in change log! [\#6](https://github.com/skywinder/changelog_test/pull/6) ([skywinder](https://github.com/skywinder)) - Add automatically generated change log file. [\#5](https://github.com/skywinder/changelog_test/pull/5) ([skywinder](https://github.com/skywinder)) diff --git a/lib/github_changelog_generator/fetcher.rb b/lib/github_changelog_generator/fetcher.rb index e5d451c..00fbb7a 100644 --- a/lib/github_changelog_generator/fetcher.rb +++ b/lib/github_changelog_generator/fetcher.rb @@ -9,8 +9,10 @@ module GitHubChangelogGenerator class Fetcher PER_PAGE_NUMBER = 30 CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN" - GH_RATE_LIMIT_EXCEEDED_MSG = "Warning: GitHub API rate limit (5000 per hour) exceeded, change log may be " \ - "missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument." + GH_RATE_LIMIT_EXCEEDED_MSG = "Warning: Can't finish operation: GitHub API rate limit exceeded, change log may be " \ + "missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument." + NO_TOKEN_PROVIDED = "Warning: No token provided (-t option) and variable $CHANGELOG_GITHUB_TOKEN was not found. " \ + "This script can make only 50 requests to GitHub API per hour without token!" def initialize(options = {}) @options = options @@ -29,11 +31,7 @@ module GitHubChangelogGenerator github_options[:endpoint] = options[:github_endpoint] unless options[:github_endpoint].nil? github_options[:site] = options[:github_endpoint] unless options[:github_site].nil? - begin - @github = Github.new github_options - rescue - @logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow - end + @github = check_github_response { Github.new github_options } end # Returns GitHub token. First try to use variable, provided by --token option, @@ -44,8 +42,7 @@ module GitHubChangelogGenerator env_var = @options[:token] ? @options[:token] : (ENV.fetch CHANGELOG_GITHUB_TOKEN, nil) unless env_var - @logger.warn "Warning: No token provided (-t option) and variable $CHANGELOG_GITHUB_TOKEN was not found.".yellow - @logger.warn "This script can make only 50 requests to GitHub API per hour without token!".yellow + @logger.warn NO_TOKEN_PROVIDED.yellow end env_var @@ -60,31 +57,43 @@ module GitHubChangelogGenerator tags = [] - begin - response = @github.repos.tags @options[:user], @options[:project] - page_i = 0 - count_pages = response.count_pages - response.each_page do |page| - page_i += PER_PAGE_NUMBER - print "Fetching tags... #{page_i}/#{count_pages * PER_PAGE_NUMBER}\r" - tags.concat(page) - end - print " \r" - - if tags.count == 0 - @logger.warn "Warning: Can't find any tags in repo.\ -Make sure, that you push tags to remote repo via 'git push --tags'".yellow - elsif @options[:verbose] - @logger.info "Found #{tags.count} tags" - end - - rescue - @logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow - end + check_github_response { github_fetch_tags(tags) } tags end + def check_github_response + begin + value = yield + rescue Github::Error::Unauthorized => e + @logger.error e.body.red + abort "Error: wrong GitHub token" + rescue Github::Error::Forbidden => e + @logger.warn e.body.red + @logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow + end + value + end + + def github_fetch_tags(tags) + response = @github.repos.tags @options[:user], @options[:project] + page_i = 0 + count_pages = response.count_pages + response.each_page do |page| + page_i += PER_PAGE_NUMBER + print "Fetching tags... #{page_i}/#{count_pages * PER_PAGE_NUMBER}\r" + tags.concat(page) + end + print " \r" + + if tags.count == 0 + @logger.warn "Warning: Can't find any tags in repo.\ +Make sure, that you push tags to remote repo via 'git push --tags'".yellow + elsif @options[:verbose] + @logger.info "Found #{tags.count} tags" + end + end + # This method fetch all closed issues and separate them to pull requests and pure issues # (pull request is kind of issue in term of GitHub) # @return [Tuple] with issues and pull requests diff --git a/spec/unit/fetcher_spec.rb b/spec/unit/fetcher_spec.rb index 709563f..6baf815 100644 --- a/spec/unit/fetcher_spec.rb +++ b/spec/unit/fetcher_spec.rb @@ -1,5 +1,16 @@ +VALID_TOKEN = "0123456789abcdef" +INVALID_TOKEN = "0000000000000000" + +DEFAULT_OPTIONS = { user: "skywinder", + project: "changelog_test" } + +def options_with_invalid_token + options = DEFAULT_OPTIONS + options[:token] = INVALID_TOKEN + options +end + describe GitHubChangelogGenerator::Fetcher do - VALID_TOKEN = "0123456789abcdef" before(:all) do @fetcher = GitHubChangelogGenerator::Fetcher.new end @@ -33,4 +44,16 @@ describe GitHubChangelogGenerator::Fetcher do it { is_expected.to eq(VALID_TOKEN) } end end + + describe "#github_fetch_tags" do + context "when wrong token provided" do + before do + options = options_with_invalid_token + @fetcher = GitHubChangelogGenerator::Fetcher.new(options) + end + it "should raise Unauthorized error" do + expect { @fetcher.github_fetch_tags [] }.to raise_error Github::Error::Unauthorized + end + end + end end