Compare commits

..

78 Commits

Author SHA1 Message Date
Olle Jonsson
a863e0e83c v1.14.0 2016-11-05 10:09:31 +01:00
Olle Jonsson
fef7a5d02f Merge pull request #441 from thorsteneckel/bugfix-params_file_multi_hyphen
Fixed issue #440 - broken multi hyphen options in param file.
2016-11-05 08:49:35 +01:00
Thorsten
d551c3a198 Fixed issue #442 - broken issue-line-labels in log. (#443) 2016-11-05 08:44:28 +01:00
Thorsten Eckel
56f91cc8f4 Fixed issue #440 - broken multi hyphen options in param file. 2016-11-05 00:15:35 +01:00
Olle Jonsson
eaf7cd9447 Merge pull request #439 from olleolleolle/fix/issue-374-options-paste-error
Option --unreleased-label explained
2016-11-04 22:57:41 +01:00
Olle Jonsson
1dc33e3005 Option --unreleased-label explained 2016-11-04 22:53:49 +01:00
Olle Jonsson
bcacabcf5f Merge pull request #438 from thorsteneckel/feature-skip-prev-tags
Fixed issue #304 - entries of previous tags are included.
2016-11-04 22:40:00 +01:00
Olle Jonsson
ca91c0bbba Merge pull request #437 from olleolleolle/fix/man-page-with-all-toptions
man page: Add undescribed options
2016-11-04 22:28:04 +01:00
Thorsten Eckel
014da21bf5 Fixed bug: Last entries get lost. 2016-11-04 20:18:09 +01:00
Thorsten Eckel
83dcb3cdf9 Fixed issue #304 - entries of previous tags are included. 2016-11-04 19:51:58 +01:00
Olle Jonsson
ed3e771902 man page: Add undescribed options 2016-11-01 21:39:50 +01:00
Olle Jonsson
9b0d41713d Merge pull request #418 from aih/showlabel
Add option to show selected labels in the issue line
2016-10-26 20:49:41 +02:00
aih
1fd341d9bf Add option to show selected labels in the issue line: --issue-line-labels 2016-10-26 09:50:54 -07:00
Olle Jonsson
9eb8c93019 Merge pull request #434 from retentionscience/aw/exp-backoff
On OctoKit::Forbidden error: retry with exponential backoff
2016-10-20 21:52:29 +02:00
Andrew Waage
134d10bab0 some rubocop updates 2016-10-20 11:49:02 -07:00
Andrew Waage
15d0b63b45 assert exactly x times 2016-10-19 14:33:05 -07:00
Andrew Waage
77ecafa978 using retriable gem 2016-10-19 14:30:43 -07:00
Andrew Waage
4f9cfdd337 spacing 2016-10-07 18:50:58 -07:00
Andrew Waage
7b8c667447 style 2016-10-07 18:37:36 -07:00
Andrew Waage
074b467251 added specs and refactor a bit 2016-10-07 16:58:38 -07:00
Andrew Waage
aa0d7e8d17 exponentially back off sleep if the Octokit::Forbidden error is seen 2016-10-07 16:28:02 -07:00
Andrew Waage
72dc650b0e Merge pull request #3 from skywinder/master
merging skywinder
2016-10-07 15:58:12 -07:00
Olle Jonsson
e72edb0d83 Merge pull request #433 from olleolleolle/fix/reinstate-max-thread-at-25
On GitHub MAX_THREAD_NUMBER is 25
2016-10-06 00:36:16 +02:00
Olle Jonsson
9f08e3b014 Merge pull request #432 from olleolleolle/refactor/octo-fetcher-and-options
OctoFetcher, Options: Refactoring
2016-10-06 00:33:06 +02:00
Olle Jonsson
8632bcf254 On GitHub MAX_THREAD_NUMBER is 25 2016-10-06 00:23:11 +02:00
Olle Jonsson
e123466b82 Linting 2016-10-05 23:31:19 +02:00
Olle Jonsson
c1f6fce86c Options: add error class, refactor
- improve readability of specs
  - extract methods
2016-10-05 23:12:48 +02:00
Olle Jonsson
70aaba9aa2 OctoFetcher: inline helper function, drop class extensions 2016-10-05 23:12:40 +02:00
Olle Jonsson
43a6e49055 Options: a class to wrap Hash-accessing options choices
- protects against bad names
2016-10-05 23:10:21 +02:00
Robert Theis
d41a818676 Fix typo in Readme (#431) 2016-10-05 07:34:50 +02:00
Olle Jonsson
5ae7027425 Fix: Turn Sawyer method into String-keyed hash access (#429) 2016-10-01 19:46:52 +02:00
Olle Jonsson
828d639348 Spec: Test a url helper function (#428) 2016-10-01 19:23:48 +02:00
Olle Jonsson
5fde22461e Rubocop TODO file regenerated (#427) 2016-10-01 00:02:08 +02:00
Olle Jonsson
cf09735743 Remove a stray Markdown file [ci skip] (#426) 2016-09-30 23:53:15 +02:00
Olle Jonsson
c9333d1d27 Travis: Add JRuby 9.1.5.0 to matrix (#424) 2016-09-30 01:01:34 +02:00
Olle Jonsson
8cf43822c3 Merge pull request #422 from olleolleolle/aw/all-merged
Use octokit, carrying awaage commits
2016-09-30 00:09:37 +02:00
Olle Jonsson
db10ea4241 Update changelog for v1.13.2 2016-09-29 23:37:05 +02:00
Olle Jonsson
4de6f52572 v1.13.2 2016-09-29 23:27:14 +02:00
Olle Jonsson
bd024f6b63 Style: Use attr_reader for options
- prefer parentheses
2016-09-29 23:09:05 +02:00
Olle Jonsson
e23f2ff7e1 Typo: variable rename 2016-09-29 23:09:05 +02:00
Olle Jonsson
1cbd8c30dc VCR: Try to use frobnitz as default token 2016-09-29 23:09:05 +02:00
Olle Jonsson
ba825488bd Typo, renamed var 2016-09-29 23:09:05 +02:00
Olle Jonsson
a1c3f14ede Travis: Specific gemfiles 2016-09-29 23:09:05 +02:00
Olle Jonsson
d8b34169a3 Linting 2016-09-29 23:09:04 +02:00
Olle Jonsson
88bcb872a6 VCR to censor ENV['CHANGELOG_GITHUB_TOKEN'] 2016-09-29 23:09:04 +02:00
Olle Jonsson
d837f25beb Style 2016-09-29 23:09:04 +02:00
Olle Jonsson
da0024cbdf GeneratorTagsSpec: change name of a test 2016-09-29 23:09:04 +02:00
Olle Jonsson
8769ced74e OctoFetcher spec: The new assignees field 2016-09-29 23:09:04 +02:00
Olle Jonsson
49b62a9d23 Style: use the short form for RSpec metadata 2016-09-29 23:09:04 +02:00
Olle Jonsson
1177f09ca5 Drop Hashie dependency 2016-09-29 23:09:04 +02:00
Olle Jonsson
ad44c035f0 WIP Remove github_api gem, smaller dependencies
- use VCR with metadata instead of macros
  - upgrade colorize gem
2016-09-29 23:09:04 +02:00
Andrew Waage
71c337cdcf fixed a bug in fetching tags 2016-09-29 23:09:04 +02:00
Andrew Waage
42c377d285 fixed one bug in filtering excluded tags 2016-09-29 23:09:04 +02:00
Andrew Waage
b79d672424 fixed 1 bug to work with octokit api 2016-09-29 23:09:04 +02:00
Andrew Waage
dbcc1cb98d merged in the tag fixes 2016-09-29 23:09:04 +02:00
Andrew Waage
2405b4fb3c fixed bug in each_with_object 2016-09-29 23:09:04 +02:00
Andrew Waage
ef9867c122 fixing rubocop and removing original fetcher 2016-09-29 23:09:04 +02:00
Andrew Waage
0e948fb125 max thread 1 2016-09-29 23:09:04 +02:00
Andrew Waage
2cafff7abb changing max threads to 4 2016-09-29 23:09:04 +02:00
Andrew Waage
41271b1ecb cleaned up caching and added to options parser 2016-09-29 23:09:04 +02:00
Andrew Waage
10cf2a0f04 minor clean up 2016-09-29 23:09:04 +02:00
Andrew Waage
a178822c83 fixed some handling of hashes 2016-09-29 23:09:04 +02:00
Andrew Waage
71c5348bdb made old fetcher compatible 2016-09-29 23:09:04 +02:00
Andrew Waage
a17931f3d4 fixing specs 2016-09-29 23:09:04 +02:00
Andrew Waage
b523a95a5f one more place for stringify keys 2016-09-29 23:09:04 +02:00
Andrew Waage
10add50b65 stringify more keys 2016-09-29 23:09:04 +02:00
Andrew Waage
7f7a7f957c using strings instead of symbols 2016-09-29 23:09:04 +02:00
Andrew Waage
a764632dd2 reverting the old fetcher where I changed to string 2016-09-29 23:09:04 +02:00
Andrew Waage
2347cc4220 added specs for the new octo_fetcher. Also had to refactor a bit to deal with hashes and arrays instead of objects 2016-09-29 23:09:04 +02:00
Andrew Waage
8277aa4319 added VCR and specs for original fetcher 2016-09-29 23:09:04 +02:00
Andrew Waage
df64ab5ba1 first pass at caching. still WIP. Need to parameterize some things 2016-09-29 23:09:04 +02:00
Andrew Waage
df510ef183 fixed some bugs and how errors were rescued 2016-09-29 23:09:03 +02:00
Andrew Waage
d7b88a521a changed the format of how dates are fetched from commit 2016-09-29 23:09:03 +02:00
Andrew Waage
52233f44f7 changed the rescued exceptions 2016-09-29 23:09:03 +02:00
Andrew Waage
61cd09f206 moved parse_url_for_vars to private method 2016-09-29 23:09:03 +02:00
Andrew Waage
53377388ee clean up 2016-09-29 23:09:03 +02:00
Andrew Waage
a8e6c5406e created a new fetcher with octokit. functionality should remain same 2016-09-29 23:09:03 +02:00
Olle Jonsson
e3f7e27a63 Add bump gem to development deps (#423)
- in Gemfile
2016-09-29 23:08:23 +02:00
28 changed files with 684 additions and 173 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ doc
.yardoc
Gemfile.lock
gemfiles/Gemfile.2_4_0.lock
gemfiles/Gemfile.jruby-9.1.5.0.lock

View File

@@ -1,20 +1,11 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2016-02-23 17:18:27 +0200 using RuboCop version 0.37.2.
# on 2016-09-30 23:56:15 +0200 using RuboCop version 0.43.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 1
Lint/ImplicitStringConcatenation:
Exclude:
- 'lib/github_changelog_generator/parser.rb'
# Offense count: 14
Metrics/AbcSize:
Enabled: false
# Offense count: 1
Metrics/CyclomaticComplexity:
Max: 7
@@ -22,30 +13,3 @@ Metrics/CyclomaticComplexity:
# Offense count: 2
Metrics/PerceivedComplexity:
Max: 8
# Offense count: 1
Style/AccessorMethodName:
Enabled: false
# Offense count: 10
Style/Documentation:
Enabled: false
# Offense count: 1
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
Style/Next:
Enabled: false
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
Style/RegexpLiteral:
Enabled: false

View File

@@ -19,6 +19,11 @@ matrix:
gemfile: gemfiles/Gemfile.2_3_1
- rvm: 2.4.0-preview2
gemfile: gemfiles/Gemfile.2_4_0
- rvm: jruby-9.1.5.0
jdk: oraclejdk8
gemfile: gemfiles/Gemfile.jruby-9.1.5.0
env:
- JRUBY_OPTS=--debug
notifications:
email:

View File

@@ -1,5 +1,30 @@
# Change Log
## [1.13.2](https://github.com/skywinder/github-changelog-generator/tree/1.13.2) (2016-09-29)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.1...1.13.2)
**Implemented enhancements:**
- Replace GPL'd colorize gem with MIT-licensed rainbow [\#408](https://github.com/skywinder/github-changelog-generator/pull/408) ([jamesc](https://github.com/jamesc))
- Limit number of simultaneous requests to 25 [\#407](https://github.com/skywinder/github-changelog-generator/pull/407) ([jkeiser](https://github.com/jkeiser))
- Report actual github error when rate limit exceeded [\#405](https://github.com/skywinder/github-changelog-generator/pull/405) ([jkeiser](https://github.com/jkeiser))
- Make error messages print on error [\#404](https://github.com/skywinder/github-changelog-generator/pull/404) ([jkeiser](https://github.com/jkeiser))
**Fixed bugs:**
- Fetching events for issues and PRs triggers abuse rate limits [\#406](https://github.com/skywinder/github-changelog-generator/issues/406)
**Merged pull requests:**
- Add bump gem to development deps [\#423](https://github.com/skywinder/github-changelog-generator/pull/423) ([olleolleolle](https://github.com/olleolleolle))
- Skip logger helper in coverage [\#421](https://github.com/skywinder/github-changelog-generator/pull/421) ([olleolleolle](https://github.com/olleolleolle))
- Travis: Test on 2.4.0-preview2 [\#420](https://github.com/skywinder/github-changelog-generator/pull/420) ([olleolleolle](https://github.com/olleolleolle))
- Travis: Collecting the config, gemspec: extract development deps to Gemfile [\#417](https://github.com/skywinder/github-changelog-generator/pull/417) ([olleolleolle](https://github.com/olleolleolle))
- Update README.md [\#415](https://github.com/skywinder/github-changelog-generator/pull/415) ([dijonkitchen](https://github.com/dijonkitchen))
- README: Add Gitter badge [\#413](https://github.com/skywinder/github-changelog-generator/pull/413) ([olleolleolle](https://github.com/olleolleolle))
- CircleCI hook for Gitter notification [\#411](https://github.com/skywinder/github-changelog-generator/pull/411) ([olleolleolle](https://github.com/olleolleolle))
- Spec: avoid Ruby warning about already-defined constant [\#409](https://github.com/skywinder/github-changelog-generator/pull/409) ([olleolleolle](https://github.com/olleolleolle))
## [1.13.1](https://github.com/skywinder/github-changelog-generator/tree/1.13.1) (2016-07-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.0...1.13.1)

View File

@@ -10,6 +10,10 @@ group :development, :test do
gem "rubocop", ">= 0.43"
end
group :development do
gem "bump"
end
group :test do
gem "vcr"
gem "multi_json"

View File

@@ -228,7 +228,7 @@ If you're seeing this warning, please do the following:
- ***My Ruby version is very old, can I use this?***
When your Ruby is old, and you don't want to upgrade, and your want to
When your Ruby is old, and you don't want to upgrade, and you want to
control which libraries you use, you can use Bundler.
In a Gemfile, perhaps in a non-deployed `:development` group, add this

View File

@@ -0,0 +1,3 @@
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
gem 'rack', '>= 2'

View File

@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency("octokit", ["~> 4.0"])
spec.add_runtime_dependency("faraday-http-cache")
spec.add_runtime_dependency("activesupport")
spec.add_runtime_dependency("retriable", ["~> 2.1"])
end

View File

@@ -1,58 +0,0 @@
# Change Log
## [Unreleased](https://github.com/skywinder/changelog_test/tree/HEAD)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/0.0.4...HEAD)
**Implemented enhancements:**
- Enchancment [\#9](https://github.com/skywinder/changelog_test/issues/9)
- PR with enhancement label [\#16](https://github.com/skywinder/changelog_test/pull/16) ([skywinder](https://github.com/skywinder))
**Fixed bugs:**
- BugFix [\#11](https://github.com/skywinder/changelog_test/issues/11)
**Closed issues:**
- Issue closed from commit from PR [\#14](https://github.com/skywinder/changelog_test/issues/14)
- Issue, closed by PR [\#12](https://github.com/skywinder/changelog_test/issues/12)
- Issue [\#10](https://github.com/skywinder/changelog_test/issues/10)
- Issue with some other label - Should be in closed issues [\#8](https://github.com/skywinder/changelog_test/issues/8)
**Merged pull requests:**
- Merged br \(should appear in change log also\) [\#21](https://github.com/skywinder/changelog_test/pull/21) ([skywinder](https://github.com/skywinder))
- This a PR with a lot of comments and events [\#17](https://github.com/skywinder/changelog_test/pull/17) ([skywinder](https://github.com/skywinder))
- This PR closes 14 from commit [\#15](https://github.com/skywinder/changelog_test/pull/15) ([skywinder](https://github.com/skywinder))
- This PR to close \#12 from body [\#13](https://github.com/skywinder/changelog_test/pull/13) ([skywinder](https://github.com/skywinder))
## [0.0.4](https://github.com/skywinder/changelog_test/tree/0.0.4) (2015-05-22)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.3...0.0.4)
**Closed issues:**
- Test issue, that should appear in 0.0.4 [\#3](https://github.com/skywinder/changelog_test/issues/3)
**Merged pull requests:**
- Add automatically generated change log file. [\#5](https://github.com/skywinder/changelog_test/pull/5) ([skywinder](https://github.com/skywinder))
## [v0.0.3](https://github.com/skywinder/changelog_test/tree/v0.0.3) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.2...v0.0.3)
**Merged pull requests:**
- fix \#3. hotfix. Should appear in v0.0.3 [\#4](https://github.com/skywinder/changelog_test/pull/4) ([skywinder](https://github.com/skywinder))
## [v0.0.2](https://github.com/skywinder/changelog_test/tree/v0.0.2) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.1...v0.0.2)
**Merged pull requests:**
- Here is a test hotfix should appear in v.0.0.2 [\#2](https://github.com/skywinder/changelog_test/pull/2) ([skywinder](https://github.com/skywinder))
## [v0.0.1](https://github.com/skywinder/changelog_test/tree/v0.0.1) (2015-03-02)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

View File

@@ -10,13 +10,12 @@ require "multi_json"
require "benchmark"
require_relative "github_changelog_generator/helper"
require_relative "github_changelog_generator/options"
require_relative "github_changelog_generator/parser"
require_relative "github_changelog_generator/parser_file"
require_relative "github_changelog_generator/generator/generator"
require_relative "github_changelog_generator/version"
require_relative "github_changelog_generator/reader"
require_relative "github_changelog_generator/hash"
require_relative "github_changelog_generator/array"
# The main module, where placed all classes (now, at least)
module GitHubChangelogGenerator

View File

@@ -1,14 +0,0 @@
# frozen_string_literal: true
class Array
def stringify_keys_deep!
new_ar = []
each do |value|
new_value = value
if value.is_a?(Hash) || value.is_a?(Array)
new_value = value.stringify_keys_deep!
end
new_ar << new_value
end
new_ar
end
end

View File

@@ -11,7 +11,7 @@ module GitHubChangelogGenerator
end
class Generator
attr_accessor :options, :filtered_tags, :github, :tag_section_mapping
attr_accessor :options, :filtered_tags, :github, :tag_section_mapping, :sorted_tags
# A Generator responsible for all logic, related with change log generation from ready-to-parse issues
#

View File

@@ -1,7 +1,7 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
MAX_THREAD_NUMBER = 1
MAX_THREAD_NUMBER = 25
# Fetch event for issues and pull requests
# @return [Array] array of fetched issues

View File

@@ -25,7 +25,7 @@ module GitHubChangelogGenerator
end
# @param [Array] issues List of issues on sub-section
# @param [String] prefix Nae of sub-section
# @param [String] prefix Name of sub-section
# @return [String] Generate ready-to-go sub-section
def generate_sub_section(issues, prefix)
log = ""
@@ -126,7 +126,8 @@ module GitHubChangelogGenerator
def generate_unreleased_section
log = ""
if options[:unreleased]
unreleased_log = generate_log_between_tags(filtered_tags[0], nil)
start_tag = filtered_tags[0] || sorted_tags.last
unreleased_log = generate_log_between_tags(start_tag, nil)
log += unreleased_log if unreleased_log
end
log
@@ -143,13 +144,25 @@ module GitHubChangelogGenerator
encapsulated_title = encapsulate_string issue["title"]
title_with_number = "#{encapsulated_title} [\\##{issue['number']}](#{issue['html_url']})"
if options[:issue_line_labels].present?
title_with_number = "#{title_with_number}#{line_labels_for(issue)}"
end
issue_line_with_user(title_with_number, issue)
end
private
def line_labels_for(issue)
labels = if options[:issue_line_labels] == ["ALL"]
issue["labels"]
else
issue["labels"].select { |label| options[:issue_line_labels].include?(label["name"]) }
end
labels.map { |label| " \[[#{label['name']}](#{label['url'].sub('api.github.com/repos', 'github.com')})\]" }.join("")
end
def issue_line_with_user(line, issue)
return line if !options[:author] || issue.pull_request.nil?
return line if !options[:author] || issue["pull_request"].nil?
user = issue["user"]
return "#{line} ({Null user})" unless user

View File

@@ -72,6 +72,8 @@ module GitHubChangelogGenerator
# in case if not tags specified - return unchanged array
return issues if older_tag.nil? && newer_tag.nil?
older_tag = ensure_older_tag(older_tag, newer_tag)
newer_tag_time = newer_tag && get_time_of_tag(newer_tag)
older_tag_time = older_tag && get_time_of_tag(older_tag)
@@ -92,6 +94,14 @@ module GitHubChangelogGenerator
end
end
def ensure_older_tag(older_tag, newer_tag)
return older_tag if older_tag
idx = sorted_tags.index { |t| t["name"] == newer_tag["name"] }
# skip if we are already at the oldest element
return if idx == sorted_tags.size - 1
sorted_tags[idx - 1]
end
def tag_older_new_tag?(newer_tag_time, time)
tag_in_range_new = if newer_tag_time.nil?
true

View File

@@ -10,7 +10,7 @@ module GitHubChangelogGenerator
included_tags = filter_excluded_tags(all_tags)
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
sorted_tags = sort_tags_by_date(included_tags)
@sorted_tags = sort_tags_by_date(included_tags)
@filtered_tags = get_filtered_tags(included_tags)
@tag_section_mapping = build_tag_section_mapping(@filtered_tags, sorted_tags)

View File

@@ -1,16 +0,0 @@
# frozen_string_literal: true
class Hash
def stringify_keys_deep!
new_hash = {}
keys.each do |k|
ks = k.respond_to?(:to_s) ? k.to_s : k
new_hash[ks] = if values_at(k).first.is_a?(Hash) || values_at(k).first.is_a?(Array)
values_at(k).first.send(:stringify_keys_deep!)
else
values_at(k).first
end
end
new_hash
end
end

View File

@@ -1,4 +1,5 @@
# frozen_string_literal: true
require "retriable"
module GitHubChangelogGenerator
# A Fetcher responsible for all requests to GitHub and all basic manipulation with related data
# (such as filtering, validating, e.t.c)
@@ -7,7 +8,8 @@ module GitHubChangelogGenerator
# fetcher = GitHubChangelogGenerator::OctoFetcher.new(options)
class OctoFetcher
PER_PAGE_NUMBER = 100
MAX_THREAD_NUMBER = 1
MAX_THREAD_NUMBER = 25
MAX_FORBIDDEN_RETRIES = 100
CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN"
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."
@@ -79,7 +81,7 @@ module GitHubChangelogGenerator
last_response = client.last_response
if (last_pg = last_response.rels[:last])
parse_url_for_vars(last_pg.href)["page"].to_i
querystring_as_hash(last_pg.href)["page"].to_i
else
1
end
@@ -107,7 +109,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
Helper.log.info "Found #{tags.count} tags"
end
# tags are a Sawyer::Resource. Convert to hash
tags = tags.map { |h| h.to_hash.stringify_keys_deep! }
tags = tags.map { |h| stringify_keys_deep(h.to_hash) }
tags
end
@@ -137,7 +139,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
print_empty_line
Helper.log.info "Received issues: #{issues.count}"
issues = issues.map { |h| h.to_hash.stringify_keys_deep! }
issues = issues.map { |h| stringify_keys_deep(h.to_hash) }
# separate arrays of issues and pull requests:
issues.partition do |x|
@@ -168,7 +170,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
print_empty_line
Helper.log.info "Pull Request count: #{pull_requests.count}"
pull_requests = pull_requests.map { |h| h.to_hash.stringify_keys_deep! }
pull_requests = pull_requests.map { |h| stringify_keys_deep(h.to_hash) }
pull_requests
end
@@ -187,7 +189,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
iterate_pages(@client, "issue_events", issue["number"], {}) do |new_event|
issue["events"].concat(new_event)
end
issue["events"] = issue["events"].map { |h| h.to_hash.stringify_keys_deep! }
issue["events"] = issue["events"].map { |h| stringify_keys_deep(h.to_hash) }
print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}")
i += 1
end
@@ -209,7 +211,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
# @return [Time] time of specified tag
def fetch_date_of_tag(tag)
commit_data = check_github_response { @client.commit(user_project, tag["commit"]["sha"]) }
commit_data = commit_data.to_hash.stringify_keys_deep!
commit_data = stringify_keys_deep(commit_data.to_hash)
commit_data["commit"]["committer"]["date"]
end
@@ -220,13 +222,28 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
def fetch_commit(event)
check_github_response do
commit = @client.commit(user_project, event["commit_id"])
commit = commit.to_hash.stringify_keys_deep!
commit = stringify_keys_deep(commit.to_hash)
commit
end
end
private
def stringify_keys_deep(indata)
case indata
when Array
indata.map do |value|
stringify_keys_deep(value)
end
when Hash
indata.each_with_object({}) do |(k, v), output|
output[k.to_s] = stringify_keys_deep(v)
end
else
indata
end
end
# Iterates through all pages until there are no more :next pages to follow
# yields the result per page
#
@@ -265,17 +282,45 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
#
# @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block
def check_github_response
begin
value = yield
rescue Octokit::Unauthorized => e
Helper.log.error e.message
abort "Error: wrong GitHub token"
Retriable.retriable(retry_options) do
yield
end
rescue Octokit::Forbidden => e
Helper.log.warn e.message
Helper.log.error("#{e.class}: #{e.message}")
sys_abort("Exceeded retry limit")
rescue Octokit::Unauthorized => e
Helper.log.error("#{e.class}: #{e.message}")
sys_abort("Error: wrong GitHub token")
end
# Exponential backoff
def retry_options
{
on: [Octokit::Forbidden],
tries: MAX_FORBIDDEN_RETRIES,
base_interval: sleep_base_interval,
multiplier: 1.0,
rand_factor: 0.0,
on_retry: retry_callback
}
end
def sleep_base_interval
1.0
end
def retry_callback
proc do |exception, try, elapsed_time, next_interval|
Helper.log.warn("RETRY - #{exception.class}: '#{exception.message}'")
Helper.log.warn("#{try} tries in #{elapsed_time} seconds and #{next_interval} seconds until the next try")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
Helper.log.warn @client.rate_limit
end
value
end
def sys_abort(msg)
abort(msg)
end
# Print specified line on the same string
@@ -307,16 +352,12 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
"#{@options[:user]}/#{@options[:project]}"
end
# Parses a URI and returns a hash of all GET variables
# Returns Hash of all querystring variables in given URI.
#
# @param [String] uri eg. https://api.github.com/repositories/43914960/tags?page=37&foo=1
# @return [Hash] of all GET variables. eg. { 'page' => 37, 'foo' => 1 }
def parse_url_for_vars(uri)
URI(uri).query.split("&").each_with_object({}) do |get_var, params|
k, v = get_var.split("=")
params[k] = v
params
end
def querystring_as_hash(uri)
Hash[URI.decode_www_form(URI(uri).query || "")]
end
end
end

View File

@@ -0,0 +1,92 @@
# frozen_string_literal: true
require "delegate"
module GitHubChangelogGenerator
class Options < SimpleDelegator
UnsupportedOptionError = Class.new(ArgumentError)
KNOWN_OPTIONS = [
:add_issues_wo_labels,
:add_pr_wo_labels,
:author,
:base,
:between_tags,
:bug_labels,
:bug_prefix,
:cache_file,
:cache_log,
:compare_link,
:date_format,
:due_tag,
:enhancement_labels,
:enhancement_prefix,
:exclude_labels,
:exclude_tags,
:exclude_tags_regex,
:filter_issues_by_milestone,
:frontmatter,
:future_release,
:git_remote,
:github_endpoint,
:github_site,
:header,
:http_cache,
:include_labels,
:issue_prefix,
:issue_line_labels,
:issues,
:max_issues,
:merge_prefix,
:output,
:project,
:pulls,
:release_branch,
:release_url,
:simple_list,
:since_tag,
:token,
:unreleased,
:unreleased_label,
:unreleased_only,
:user,
:usernames_as_github_logins,
:verbose
]
THESE_ARE_DIFFERENT = [
:tag1,
:tag2
]
def initialize(values)
super(values)
unsupported_options.any? && raise(UnsupportedOptionError, unsupported_options.inspect)
end
def []=(key, val)
supported_option?(key) || raise(UnsupportedOptionError, key.inspect)
values[key] = val
end
def to_hash
values
end
private
def values
__getobj__
end
def unsupported_options
values.keys - supported_options
end
def supported_option?(key)
supported_options.include?(key)
end
def supported_options
KNOWN_OPTIONS + THESE_ARE_DIFFERENT
end
end
end

View File

@@ -42,7 +42,7 @@ module GitHubChangelogGenerator
# setup parsing options
def self.setup_parser(options)
parser = OptionParser.new do |opts|
parser = OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength
opts.banner = "Usage: github_changelog_generator [options]"
opts.on("-u", "--user [USER]", "Username of the owner of target GitHub repo") do |last|
options[:user] = last
@@ -107,7 +107,7 @@ module GitHubChangelogGenerator
opts.on("--[no-]unreleased", "Add to log unreleased closed issues. Default is true") do |v|
options[:unreleased] = v
end
opts.on("--unreleased-label [label]", "Add to log unreleased closed issues. Default is true") do |v|
opts.on("--unreleased-label [label]", "Setup custom label for unreleased closed issues section. Default is \"**Unreleased:**\"") do |v|
options[:unreleased_label] = v
end
opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true") do |v|
@@ -125,6 +125,9 @@ module GitHubChangelogGenerator
opts.on("--enhancement-labels x,y,z", Array, 'Issues with the specified labels will be always added to "Implemented enhancements" section. Default is \'enhancement,Enhancement\'') do |list|
options[:enhancement_labels] = list
end
opts.on("--issue-line-labels x,y,z", Array, 'The specified labels will be shown in brackets next to each matching issue. Use "ALL" to show all labels. Default is [].') do |list|
options[:issue_line_labels] = list
end
opts.on("--between-tags x,y,z", Array, "Change log will be filled only between specified tags") do |list|
options[:between_tags] = list
end
@@ -187,7 +190,7 @@ module GitHubChangelogGenerator
# @return [Hash] Default options
def self.default_options
{
Options.new(
tag1: nil,
tag2: nil,
date_format: "%Y-%m-%d",
@@ -205,6 +208,7 @@ module GitHubChangelogGenerator
enhancement_labels: %w(enhancement Enhancement),
bug_labels: %w(bug Bug),
exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix),
issue_line_labels: [],
max_issues: nil,
simple_list: false,
verbose: true,
@@ -217,7 +221,7 @@ module GitHubChangelogGenerator
http_cache: true,
cache_file: "/tmp/github-changelog-http-cache",
cache_log: "/tmp/github-changelog-logger.log"
}
)
end
# If `:user` or `:project` not set in options, try setting them

View File

@@ -62,11 +62,11 @@ module GitHubChangelogGenerator
# @return [Array<Symbol, String>]
def extract_pair(line)
key, value = line.split("=", 2)
[key.sub("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
[key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
end
KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels,
:enhancement_labels, :between_tags, :exclude_tags]
:enhancement_labels, :issue_line_labels, :between_tags, :exclude_tags]
KNOWN_INTEGER_KEYS = [:max_issues]
def convert_value(value, option_name)

View File

@@ -1,4 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
VERSION = "1.13.1"
VERSION = "1.14.0"
end

View File

@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GIT\-GENERATE\-CHANGELOG" "1" "October 2015" "" ""
.TH "GIT\-GENERATE\-CHANGELOG" "1" "November 2016" "" ""
.
.SH "NAME"
\fBgit\-generate\-changelog\fR \- Generate changelog from github
@@ -73,6 +73,12 @@ Setup custom label for closed\-issues section\. Default is "\fBClosed issues:\fR
Setup custom header label\. Default is "# Change Log"
.
.P
\-\-front\-matter [JSON]
.
.P
Add YAML front matter\. Formatted as JSON because it\'s easier to add on the command line
.
.P
\-\-pr\-label [LABEL]
.
.P
@@ -115,6 +121,12 @@ Use milestone to detect when issue was resolved\. Default is true
Add author of pull\-request in the end\. Default is true
.
.P
\-\-usernames\-as\-github\-logins
.
.P
Use GitHub tags instead of Markdown links for the author of an issue or pull\-request\.
.
.P
\-\-unreleased\-only
.
.P
@@ -130,7 +142,7 @@ Add to log unreleased closed issues\. Default is true
\-\-unreleased\-label [label]
.
.P
Add to log unreleased closed issues\. Default is true
Setup custom label for unreleased closed issues section\. Default is "\fBUnreleased:\fR"
.
.P
\-\-[no\-]compare\-link
@@ -175,6 +187,12 @@ Change log will be filled only between specified tags
Change log will exclude specified tags
.
.P
\-\-exclude\-tags\-regex [REGEX]
.
.P
Apply a regular expression on tag names so that they can be excluded, for example: \-\-exclude\-tags\-regex "\.*+\ed{1,}"
.
.P
\-\-since\-tag x
.
.P
@@ -223,6 +241,30 @@ Create simple list from issues and pull requests\. Default is false\.
Put the unreleased changes in the specified release number\.
.
.P
\-\-release\-branch [RELEASE\-BRANCH]
.
.P
Limit pull requests to the release branch, such as master or release
.
.P
\-\-http\-cache
.
.P
Use HTTP Cache to cache Github API requests (useful for large repos) Default is true\.
.
.P
\-\-[no\-]cache\-file [CACHE\-FILE]
.
.P
Filename to use for cache\. Default is /tmp/github\-changelog\-http\-cache
.
.P
\-\-cache\-log [CACHE\-LOG]
.
.P
Filename to use for cache log\. Default is /tmp/github\-changelog\-logger\.log
.
.P
\-\-[no\-]verbose
.
.P

View File

@@ -0,0 +1,290 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-generate-changelog(1) - Generate changelog from github</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-generate-changelog(1)</li>
<li class='tc'></li>
<li class='tr'>git-generate-changelog(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-generate-changelog</code> - <span class="man-whatis">Generate changelog from github</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git generate-changelog</code> [-h|--help] [-u|--user] [-p|--project]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>Automatically generate change log from your tags, issues, labels and pull requests on GitHub.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -u, --user [USER]</p>
<p> Username of the owner of target GitHub repo</p>
<p> -p, --project [PROJECT]</p>
<p> Name of project on GitHub</p>
<p> -t, --token [TOKEN]</p>
<p> To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new</p>
<p> -f, --date-format [FORMAT]</p>
<p> Date format. Default is %Y-%m-%d</p>
<p> -o, --output [NAME]</p>
<p> Output file. Default is CHANGELOG.md</p>
<p> -b, --base [NAME]</p>
<p> Optional base file to append generated changes to.</p>
<p> --bugs-label [LABEL]</p>
<p> Setup custom label for bug-fixes section. Default is "<strong>Fixed bugs:</strong></p>
<p> --enhancement-label [LABEL]</p>
<p> Setup custom label for enhancements section. Default is "<strong>Implemented enhancements:</strong>"</p>
<p> --issues-label [LABEL]</p>
<p> Setup custom label for closed-issues section. Default is "<strong>Closed issues:</strong>"</p>
<p> --header-label [LABEL]</p>
<p> Setup custom header label. Default is "# Change Log"</p>
<p> --front-matter [JSON]</p>
<p> Add YAML front matter. Formatted as JSON because it's easier to add on the command line</p>
<p> --pr-label [LABEL]</p>
<p> Setup custom label for pull requests section. Default is "<strong>Merged pull requests:</strong>"</p>
<p> --[no-]issues</p>
<p> Include closed issues in changelog. Default is true</p>
<p> --[no-]issues-wo-labels</p>
<p> Include closed issues without labels in changelog. Default is true</p>
<p> --[no-]pr-wo-labels</p>
<p> Include pull requests without labels in changelog. Default is true</p>
<p> --[no-]pull-requests</p>
<p> Include pull-requests in changelog. Default is true</p>
<p> --[no-]filter-by-milestone</p>
<p> Use milestone to detect when issue was resolved. Default is true</p>
<p> --[no-]author</p>
<p> Add author of pull-request in the end. Default is true</p>
<p> --usernames-as-github-logins</p>
<p> Use GitHub tags instead of Markdown links for the author of an issue or pull-request.</p>
<p> --unreleased-only</p>
<p> Generate log from unreleased closed issues only.</p>
<p> --[no-]unreleased</p>
<p> Add to log unreleased closed issues. Default is true</p>
<p> --unreleased-label [label]</p>
<p> Setup custom label for unreleased closed issues section. Default is "<strong>Unreleased:</strong>"</p>
<p> --[no-]compare-link</p>
<p> Include compare link (Full Changelog) between older version and newer version. Default is true</p>
<p> --include-labels x,y,z</p>
<p> Only issues with the specified labels will be included in the changelog.</p>
<p> --exclude-labels x,y,z</p>
<p> Issues with the specified labels will be always excluded from changelog. Default is 'duplicate,question,invalid,wontfix'</p>
<p> --bug-labels x,y,z</p>
<p> Issues with the specified labels will be always added to "Fixed bugs" section. Default is 'bug,Bug'</p>
<p> --enhancement-labels x,y,z</p>
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</p>
<p> --between-tags x,y,z</p>
<p> Change log will be filled only between specified tags</p>
<p> --exclude-tags x,y,z</p>
<p> Change log will exclude specified tags</p>
<p> --exclude-tags-regex [REGEX]</p>
<p> Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex ".*+\d{1,}"</p>
<p> --since-tag x</p>
<p> Change log will start after specified tag</p>
<p> --due-tag x</p>
<p> Change log will end before specified tag</p>
<p> --max-issues [NUMBER]</p>
<p> Max number of issues to fetch from GitHub. Default is unlimited</p>
<p> --release-url [URL]</p>
<p> The URL to point to for release links, in printf format (with the tag as variable).</p>
<p> --github-site [URL]</p>
<p> The Enterprise Github site on which your project is hosted.</p>
<p> --github-api [URL]</p>
<p> The enterprise endpoint to use for your Github API.</p>
<p> --simple-list</p>
<p> Create simple list from issues and pull requests. Default is false.</p>
<p> --future-release [RELEASE-VERSION]</p>
<p> Put the unreleased changes in the specified release number.</p>
<p> --release-branch [RELEASE-BRANCH]</p>
<p> Limit pull requests to the release branch, such as master or release</p>
<p> --http-cache</p>
<p> Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.</p>
<p> --[no-]cache-file [CACHE-FILE]</p>
<p> Filename to use for cache. Default is /tmp/github-changelog-http-cache</p>
<p> --cache-log [CACHE-LOG]</p>
<p> Filename to use for cache log. Default is /tmp/github-changelog-logger.log</p>
<p> --[no-]verbose</p>
<p> Run verbosely. Default is true</p>
<p> -v, --version</p>
<p> Print version number</p>
<p> -h, --help</p>
<p> Displays Help</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Petr Korolev sky4winder@gmail.com</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;<a href="https://github.com/skywinder/github-changelog-generator/issues" data-bare-link="true">https://github.com/skywinder/github-changelog-generator/issues</a>&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/skywinder/github-changelog-generator/" data-bare-link="true">https://github.com/skywinder/github-changelog-generator/</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>November 2016</li>
<li class='tr'>git-generate-changelog(1)</li>
</ol>
</div>
</body>
</html>

View File

@@ -51,6 +51,10 @@ Automatically generate change log from your tags, issues, labels and pull reques
Setup custom header label. Default is "# Change Log"
--front-matter [JSON]
Add YAML front matter. Formatted as JSON because it's easier to add on the command line
--pr-label [LABEL]
Setup custom label for pull requests section. Default is "**Merged pull requests:**"
@@ -79,6 +83,10 @@ Automatically generate change log from your tags, issues, labels and pull reques
Add author of pull-request in the end. Default is true
--usernames-as-github-logins
Use GitHub tags instead of Markdown links for the author of an issue or pull-request.
--unreleased-only
Generate log from unreleased closed issues only.
@@ -89,7 +97,7 @@ Automatically generate change log from your tags, issues, labels and pull reques
--unreleased-label [label]
Add to log unreleased closed issues. Default is true
Setup custom label for unreleased closed issues section. Default is "**Unreleased:**"
--[no-]compare-link
@@ -119,6 +127,10 @@ Automatically generate change log from your tags, issues, labels and pull reques
Change log will exclude specified tags
--exclude-tags-regex [REGEX]
Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex ".*\+\d{1,}"
--since-tag x
Change log will start after specified tag
@@ -151,6 +163,22 @@ Automatically generate change log from your tags, issues, labels and pull reques
Put the unreleased changes in the specified release number.
--release-branch [RELEASE-BRANCH]
Limit pull requests to the release branch, such as master or release
--http-cache
Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.
--[no-]cache-file [CACHE-FILE]
Filename to use for cache. Default is /tmp/github-changelog-http-cache
--cache-log [CACHE-LOG]
Filename to use for cache log. Default is /tmp/github-changelog-logger.log
--[no-]verbose
Run verbosely. Default is true

View File

@@ -12,6 +12,31 @@ describe GitHubChangelogGenerator::OctoFetcher do
let(:fetcher) { GitHubChangelogGenerator::OctoFetcher.new(options) }
describe "#check_github_response" do
context "when returns successfully" do
it "returns block value" do
expect(fetcher.send(:check_github_response) { 1 + 1 }).to eq(2)
end
end
context "when raises Octokit::Unauthorized" do
it "aborts" do
expect(fetcher).to receive(:sys_abort).with("Error: wrong GitHub token")
fetcher.send(:check_github_response) { raise(Octokit::Unauthorized) }
end
end
context "when raises Octokit::Forbidden" do
it "sleeps and retries and then aborts" do
retry_limit = GitHubChangelogGenerator::OctoFetcher::MAX_FORBIDDEN_RETRIES - 1
allow(fetcher).to receive(:sleep_base_interval).exactly(retry_limit).times.and_return(0)
expect(fetcher).to receive(:sys_abort).with("Exceeded retry limit")
fetcher.send(:check_github_response) { raise(Octokit::Forbidden) }
end
end
end
describe "#fetch_github_token" do
token = GitHubChangelogGenerator::OctoFetcher::CHANGELOG_GITHUB_TOKEN
context "when token in ENV exist" do
@@ -426,6 +451,20 @@ describe GitHubChangelogGenerator::OctoFetcher do
end
end
describe "#querystring_as_hash" do
it "works on the blank URL" do
expect { fetcher.send(:querystring_as_hash, "") }.not_to raise_error
end
it "where there are no querystring params" do
expect { fetcher.send(:querystring_as_hash, "http://example.com") }.not_to raise_error
end
it "returns a String-keyed Hash of querystring params" do
expect(fetcher.send(:querystring_as_hash, "http://example.com/o.html?str=18&wis=12")).to include("wis" => "12", "str" => "18")
end
end
describe "#fetch_commit" do
context "when API call is valid", :vcr do
it "returns commit" do

42
spec/unit/options_spec.rb Normal file
View File

@@ -0,0 +1,42 @@
# frozen_string_literal: true
RSpec.describe GitHubChangelogGenerator::Options do
describe "#initialize" do
context "with known options" do
it "instantiates successfully" do
expect(described_class.new(user: "olle")[:user]).to eq("olle")
end
end
context "with unknown options" do
it "raises an error" do
expect do
described_class.new(
git_remote: "origin",
strength: "super-strength",
wisdom: "deep"
)
end.to raise_error("[:strength, :wisdom]")
end
end
end
describe "#[]=(key, value)" do
let(:options) { described_class.new(git_remote: "origin") }
context "with known options" do
it "sets the option value" do
expect do
options[:git_remote] = "in the cloud"
end.to change { options[:git_remote] }.to "in the cloud"
end
end
context "with unknown options" do
it "raises an error" do
expect do
options[:charisma] = 8
end.to raise_error(":charisma")
end
end
end
end

View File

@@ -85,10 +85,6 @@ describe GitHubChangelogGenerator::Reader do
context "angular.js.md" do
it { is_expected.to be_an(Array) }
it { is_expected.not_to be_empty }
it do
pending("Implement heading_level for parser.")
expect(subject.count).to eq(134)
end
# it do
# pending('Implement heading_level for parser.')
# expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation')