Compare commits
77 Commits
v1.14.2
...
v1.15.0.pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07a665d800 | ||
|
|
1f68ef8bad | ||
|
|
efa960ce1c | ||
|
|
ba086bbf07 | ||
|
|
ada39f9735 | ||
|
|
bf2436037f | ||
|
|
9662c935c3 | ||
|
|
7f12a55ae8 | ||
|
|
b94fb7f839 | ||
|
|
519cd5b136 | ||
|
|
d2a8dc3977 | ||
|
|
33f89614d4 | ||
|
|
c805da1886 | ||
|
|
a287bd872b | ||
|
|
b1121cb1ee | ||
|
|
0ca7371306 | ||
|
|
ce63f648ac | ||
|
|
5932cb730b | ||
|
|
726f8f79fb | ||
|
|
b91609283e | ||
|
|
174baec266 | ||
|
|
f57b4c283d | ||
|
|
ee5a507f76 | ||
|
|
66177c58e3 | ||
|
|
d6c26ef4a9 | ||
|
|
c718930fb1 | ||
|
|
4c26bbd7c0 | ||
|
|
8dd91f6f10 | ||
|
|
87f65faffc | ||
|
|
e5f0a55304 | ||
|
|
b21e7eaaf7 | ||
|
|
ee4c72c7aa | ||
|
|
e37ce502ea | ||
|
|
e77202163c | ||
|
|
d0e7593e98 | ||
|
|
fb7e21f9f8 | ||
|
|
3798d0637c | ||
|
|
f643b3e44e | ||
|
|
0be0631320 | ||
|
|
5bbeb93869 | ||
|
|
3d27670053 | ||
|
|
2cc15f7be0 | ||
|
|
a26bcc326b | ||
|
|
20d059b78e | ||
|
|
6ad5aa106d | ||
|
|
e9ee9556ce | ||
|
|
6707927c1e | ||
|
|
1093c75250 | ||
|
|
874c23c64f | ||
|
|
26b124a67c | ||
|
|
4798a8a3d8 | ||
|
|
9bbfa3add5 | ||
|
|
1492c406e9 | ||
|
|
f72d8d9912 | ||
|
|
bf20ab7543 | ||
|
|
9cb6306b47 | ||
|
|
d334aa01f2 | ||
|
|
1e9e72f1a5 | ||
|
|
acf1c1604a | ||
|
|
d29c117454 | ||
|
|
8d74965019 | ||
|
|
17702543ef | ||
|
|
4ec3ad4a54 | ||
|
|
08e7a954ff | ||
|
|
8ea623fd81 | ||
|
|
6e61dfb378 | ||
|
|
3fee4fca75 | ||
|
|
9fc00f3dc3 | ||
|
|
132ecf255c | ||
|
|
238f779d38 | ||
|
|
0b88c3bd54 | ||
|
|
9c0f7c723f | ||
|
|
881ecc161c | ||
|
|
88cbcd22ed | ||
|
|
07081ccf46 | ||
|
|
a9b49927ee | ||
|
|
4a74bd0ba6 |
12
.codeclimate.yml
Normal file
12
.codeclimate.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
engines:
|
||||||
|
duplication:
|
||||||
|
enabled: true
|
||||||
|
config:
|
||||||
|
languages:
|
||||||
|
- ruby
|
||||||
|
rubocop:
|
||||||
|
enabled: true
|
||||||
|
ratings:
|
||||||
|
paths:
|
||||||
|
- "**.rb"
|
||||||
|
exclude_paths:
|
||||||
17
.rubocop.yml
17
.rubocop.yml
@@ -1,6 +1,7 @@
|
|||||||
inherit_from: .rubocop_todo.yml
|
inherit_from: .rubocop_todo.yml
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
|
TargetRubyVersion: 2.2
|
||||||
DisplayCopNames: true
|
DisplayCopNames: true
|
||||||
DisplayStyleGuide: true
|
DisplayStyleGuide: true
|
||||||
Exclude:
|
Exclude:
|
||||||
@@ -10,6 +11,9 @@ AllCops:
|
|||||||
Metrics/LineLength:
|
Metrics/LineLength:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Performance/RegexpMatch:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
#http://viget.com/extend/just-use-double-quoted-ruby-strings
|
#http://viget.com/extend/just-use-double-quoted-ruby-strings
|
||||||
Style/StringLiterals:
|
Style/StringLiterals:
|
||||||
EnforcedStyle: double_quotes
|
EnforcedStyle: double_quotes
|
||||||
@@ -22,7 +26,7 @@ Metrics/ClassLength:
|
|||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/FileName:
|
Naming/FileName:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'bin/git-generate-changelog'
|
- 'bin/git-generate-changelog'
|
||||||
|
|
||||||
@@ -32,7 +36,7 @@ Metrics/AbcSize:
|
|||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
# Offense count: 1
|
# Offense count: 1
|
||||||
Style/AccessorMethodName:
|
Naming/AccessorMethodName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
# Offense count: 10
|
# Offense count: 10
|
||||||
@@ -67,3 +71,12 @@ Style/NumericPredicate:
|
|||||||
|
|
||||||
Style/SafeNavigation:
|
Style/SafeNavigation:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/BlockLength:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/**/*'
|
||||||
|
|
||||||
|
# Re-enable when merged; https://github.com/bbatsov/rubocop/pull/4756
|
||||||
|
Lint/InterpolationCheck:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.3.1
|
2.4.0
|
||||||
34
.travis.yml
34
.travis.yml
@@ -1,37 +1,35 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
cache:
|
cache:
|
||||||
- bundler
|
bundler: true
|
||||||
before_install:
|
before_install:
|
||||||
- gem update --system
|
|
||||||
- gem install bundler
|
- gem install bundler
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- rvm: 2.2.2
|
- rvm: 2.2.8
|
||||||
install: true # This skips 'bundle install'
|
install: true # This skips 'bundle install'
|
||||||
script: gem build github_changelog_generator && gem install *.gem
|
script: gem build github_changelog_generator && gem install *.gem
|
||||||
- rvm: 2.2.2
|
- rvm: 2.2.8
|
||||||
install: true # This skips 'bundle install'
|
install: true # This skips 'bundle install'
|
||||||
script: gem build github_changelog_generator && bundle install
|
script: gem build github_changelog_generator && bundle install
|
||||||
gemfile: spec/install-gem-in-bundler.gemfile
|
gemfile: spec/install-gem-in-bundler.gemfile
|
||||||
- rvm: 2.1
|
- rvm: 2.3.5
|
||||||
gemfile: gemfiles/Gemfile.2_1
|
- rvm: 2.4.2
|
||||||
- rvm: 2.3.1
|
- rvm: jruby-9.1.13.0
|
||||||
gemfile: gemfiles/Gemfile.2_3_1
|
|
||||||
- rvm: 2.4.0-preview3
|
|
||||||
gemfile: gemfiles/Gemfile.2_4_0
|
|
||||||
- rvm: jruby-9.1.6.0
|
|
||||||
jdk: oraclejdk8
|
jdk: oraclejdk8
|
||||||
gemfile: gemfiles/Gemfile.jruby-9.1
|
|
||||||
env:
|
env:
|
||||||
- JRUBY_OPTS=--debug
|
- JRUBY_OPTS=--debug
|
||||||
|
- rvm: jruby-head
|
||||||
|
jdk: oraclejdk8
|
||||||
|
env:
|
||||||
|
- JRUBY_OPTS=--debug
|
||||||
|
- DEBUG=1
|
||||||
|
allow_failures:
|
||||||
|
- rvm: jruby-head
|
||||||
|
fast_finish: true
|
||||||
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
recipients:
|
|
||||||
- sky4winder+githubchangeloggenerator@gmail.com
|
|
||||||
on_success: never
|
|
||||||
on_failure: change
|
|
||||||
addons:
|
addons:
|
||||||
code_climate:
|
code_climate:
|
||||||
repo_token:
|
repo_token:
|
||||||
secure: iMpV5IAvH+/EVGZrpWnt2BnmNFzSbsRcIumsr4ZyLC8N5nrCSXyjCSy0g48btL3Sj0bSgK9hcrJsmrFd2bkqFleyAcPAzNyUQzBuIRZx47O8yFmbZ+Pj+l3+KOlmcbzJNHfDfxkxuWTmTAcSDfsiyApin721T/ey3SUuwKpZNUc=
|
secure: iMpV5IAvH+/EVGZrpWnt2BnmNFzSbsRcIumsr4ZyLC8N5nrCSXyjCSy0g48btL3Sj0bSgK9hcrJsmrFd2bkqFleyAcPAzNyUQzBuIRZx47O8yFmbZ+Pj+l3+KOlmcbzJNHfDfxkxuWTmTAcSDfsiyApin721T/ey3SUuwKpZNUc=
|
||||||
|
after_success:
|
||||||
|
- bundle exec codeclimate-test-reporter
|
||||||
|
|||||||
54
CHANGELOG.md
54
CHANGELOG.md
@@ -1,7 +1,50 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## [v1.14.3](https://github.com/skywinder/github-changelog-generator/tree/v1.14.3) (2016-12-31)
|
||||||
|
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/v1.14.2...v1.14.3)
|
||||||
|
|
||||||
|
**Fixed bugs:**
|
||||||
|
|
||||||
|
- Use Octokit::Client for both .com and Enterprise [\#455](https://github.com/skywinder/github-changelog-generator/pull/455) ([eliperkins](https://github.com/eliperkins))
|
||||||
|
|
||||||
|
**Closed issues:**
|
||||||
|
|
||||||
|
- Last tag contains too many PRs [\#291](https://github.com/skywinder/github-changelog-generator/issues/291)
|
||||||
|
|
||||||
|
**Merged pull requests:**
|
||||||
|
|
||||||
|
- CodeClimate configuration file [\#465](https://github.com/skywinder/github-changelog-generator/pull/465) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
- Travis: Build against 2.4.0 [\#464](https://github.com/skywinder/github-changelog-generator/pull/464) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
- Travis: add jruby-head, 2.4.0-rc1 [\#463](https://github.com/skywinder/github-changelog-generator/pull/463) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
- Gemfiles for building versions separately dropped [\#461](https://github.com/skywinder/github-changelog-generator/pull/461) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
- Order Gemfile gems A-Z; add ruby version marker [\#460](https://github.com/skywinder/github-changelog-generator/pull/460) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
- README: Documentation update about RakeTask params and how to translate labels [\#454](https://github.com/skywinder/github-changelog-generator/pull/454) ([edusantana](https://github.com/edusantana))
|
||||||
|
- Travis: Use ruby 2.3.3 and 2.2.6 [\#452](https://github.com/skywinder/github-changelog-generator/pull/452) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
|
||||||
|
## [v1.14.2](https://github.com/skywinder/github-changelog-generator/tree/v1.14.2) (2016-11-12)
|
||||||
|
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/v1.14.1...v1.14.2)
|
||||||
|
|
||||||
|
**Implemented enhancements:**
|
||||||
|
|
||||||
|
- OctoFetcher: Moved repositories fail explicitly [\#449](https://github.com/skywinder/github-changelog-generator/pull/449) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
|
||||||
|
**Closed issues:**
|
||||||
|
|
||||||
|
- Error: can't convert Sawyer::Resource to Array when iterating over a 301 Moved Permanently [\#448](https://github.com/skywinder/github-changelog-generator/issues/448)
|
||||||
|
|
||||||
|
## [v1.14.1](https://github.com/skywinder/github-changelog-generator/tree/v1.14.1) (2016-11-06)
|
||||||
|
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/v1.14.0...v1.14.1)
|
||||||
|
|
||||||
|
**Closed issues:**
|
||||||
|
|
||||||
|
- multi\_json is required but is listed as a test dependency [\#444](https://github.com/skywinder/github-changelog-generator/issues/444)
|
||||||
|
|
||||||
|
**Merged pull requests:**
|
||||||
|
|
||||||
|
- Add multi\_json as a runtime dependency [\#445](https://github.com/skywinder/github-changelog-generator/pull/445) ([rnelson0](https://github.com/rnelson0))
|
||||||
|
|
||||||
## [v1.14.0](https://github.com/skywinder/github-changelog-generator/tree/v1.14.0) (2016-11-05)
|
## [v1.14.0](https://github.com/skywinder/github-changelog-generator/tree/v1.14.0) (2016-11-05)
|
||||||
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.2...v1.14.0)
|
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/v1.13.2...v1.14.0)
|
||||||
|
|
||||||
**Implemented enhancements:**
|
**Implemented enhancements:**
|
||||||
|
|
||||||
@@ -37,11 +80,11 @@
|
|||||||
- Drop a stray Markdown file [\#426](https://github.com/skywinder/github-changelog-generator/pull/426) ([olleolleolle](https://github.com/olleolleolle))
|
- Drop a stray Markdown file [\#426](https://github.com/skywinder/github-changelog-generator/pull/426) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
- Travis: Add JRuby 9.1.5.0 to matrix [\#424](https://github.com/skywinder/github-changelog-generator/pull/424) ([olleolleolle](https://github.com/olleolleolle))
|
- Travis: Add JRuby 9.1.5.0 to matrix [\#424](https://github.com/skywinder/github-changelog-generator/pull/424) ([olleolleolle](https://github.com/olleolleolle))
|
||||||
|
|
||||||
## [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/v1.13.2...1.13.2)
|
|
||||||
|
|
||||||
## [v1.13.2](https://github.com/skywinder/github-changelog-generator/tree/v1.13.2) (2016-09-29)
|
## [v1.13.2](https://github.com/skywinder/github-changelog-generator/tree/v1.13.2) (2016-09-29)
|
||||||
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.1...v1.13.2)
|
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.2...v1.13.2)
|
||||||
|
|
||||||
|
## [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:**
|
**Implemented enhancements:**
|
||||||
|
|
||||||
@@ -251,6 +294,7 @@
|
|||||||
|
|
||||||
**Implemented enhancements:**
|
**Implemented enhancements:**
|
||||||
|
|
||||||
|
- We should add a git-generate-changelog command. [\#255](https://github.com/skywinder/github-changelog-generator/issues/255)
|
||||||
- YAML front matter [\#322](https://github.com/skywinder/github-changelog-generator/pull/322) ([retorquere](https://github.com/retorquere))
|
- YAML front matter [\#322](https://github.com/skywinder/github-changelog-generator/pull/322) ([retorquere](https://github.com/retorquere))
|
||||||
- Git Subcommand [\#288](https://github.com/skywinder/github-changelog-generator/pull/288) ([dlanileonardo](https://github.com/dlanileonardo))
|
- Git Subcommand [\#288](https://github.com/skywinder/github-changelog-generator/pull/288) ([dlanileonardo](https://github.com/dlanileonardo))
|
||||||
|
|
||||||
|
|||||||
23
Gemfile
23
Gemfile
@@ -1,13 +1,16 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
ruby RUBY_VERSION
|
||||||
|
|
||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem "rake"
|
|
||||||
gem "bundler"
|
gem "bundler"
|
||||||
gem "overcommit", ">= 0.31"
|
gem "overcommit", ">= 0.31"
|
||||||
gem "rubocop", ">= 0.43"
|
gem "rake"
|
||||||
|
gem "rubocop", ">= 0.50"
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
@@ -15,16 +18,12 @@ group :development do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem "vcr"
|
gem "codeclimate-test-reporter", "~> 1.0"
|
||||||
gem "multi_json"
|
|
||||||
gem "webmock"
|
|
||||||
gem "coveralls", "~>0.8", require: false
|
gem "coveralls", "~>0.8", require: false
|
||||||
gem "simplecov", "~>0.10", require: false
|
gem "json"
|
||||||
gem "codeclimate-test-reporter", "~>0.4"
|
gem "multi_json"
|
||||||
if RUBY_VERSION > "2"
|
|
||||||
gem "json", "~> 2.0", ">= 2.0.2"
|
|
||||||
else
|
|
||||||
gem "json"
|
|
||||||
end
|
|
||||||
gem "rspec", "< 4"
|
gem "rspec", "< 4"
|
||||||
|
gem "simplecov", "~>0.10", require: false
|
||||||
|
gem "vcr"
|
||||||
|
gem "webmock"
|
||||||
end
|
end
|
||||||
|
|||||||
49
README.md
49
README.md
@@ -1,6 +1,7 @@
|
|||||||
[](http://badge.fury.io/rb/github_changelog_generator)
|
[](http://badge.fury.io/rb/github_changelog_generator)
|
||||||
[](https://gemnasium.com/skywinder/github-changelog-generator)
|
[](https://gemnasium.com/skywinder/github-changelog-generator)
|
||||||
[](https://travis-ci.org/skywinder/github-changelog-generator)
|
[](https://travis-ci.org/skywinder/github-changelog-generator)
|
||||||
|
[](https://ci.appveyor.com/project/olleolleolle/github-changelog-generator)
|
||||||
[](http://inch-ci.org/github/skywinder/github-changelog-generator)
|
[](http://inch-ci.org/github/skywinder/github-changelog-generator)
|
||||||
[](https://codeclimate.com/github/skywinder/github-changelog-generator)
|
[](https://codeclimate.com/github/skywinder/github-changelog-generator)
|
||||||
[](https://codeclimate.com/github/skywinder/github-changelog-generator)
|
[](https://codeclimate.com/github/skywinder/github-changelog-generator)
|
||||||
@@ -24,20 +25,20 @@ GitHub Changelog Generator 
|
|||||||
|
|
||||||
### Changelog generation has never been so easy
|
### Changelog generation has never been so easy
|
||||||
|
|
||||||
**Fully automate changelog generation** - This gem generates change log file based on **tags**, **issues** and merged **pull requests** (and splits them into separate lists according to labels) from :octocat: GitHub Issue Tracker.
|
**Fully automated changelog generation** - This gem generates a change log file based on **tags**, **issues** and merged **pull requests** (and splits them into separate lists according to labels) from :octocat: GitHub Issue Tracker.
|
||||||
|
|
||||||
Since now you don't have to fill your `CHANGELOG.md` manually: just run the script, relax and take a cup of :coffee: before your next release! :tada:
|
Since you don't have to fill your `CHANGELOG.md` manually now: just run the script, relax and take a cup of :coffee: before your next release! :tada:
|
||||||
|
|
||||||
>### *What’s the point of a change log?*
|
### *What’s the point of a change log?*
|
||||||
To make it easier for users and contributors to see precisely what notable changes have been made between each release (or version) of the project.
|
To make it easier for users and contributors to see precisely what notable changes have been made between each release (or version) of the project.
|
||||||
### *Why should I care?*
|
### *Why should I care?*
|
||||||
Because software tools are for people. If you don’t care, why are you contributing to open source? Surely, there must be a kernel (ha!) of care somewhere in that lovely little brain of yours.
|
Because software tools are for people. If you don’t care, why are you contributing to open source? Surely, there must be a kernel (ha!) of care somewhere in that lovely little brain of yours.
|
||||||
|
|
||||||
> :arrow_right: *[http://keepachangelog.com](http://keepachangelog.com)*
|
:arrow_right: *[http://keepachangelog.com](http://keepachangelog.com)*
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
gem install github_changelog_generator
|
gem install github_changelog_generator
|
||||||
|
|
||||||
See also Troubleshooting.
|
See also Troubleshooting.
|
||||||
|
|
||||||
@@ -46,7 +47,7 @@ See also Troubleshooting.
|
|||||||
- Look at **[CHANGELOG.md](https://github.com/skywinder/Github-Changelog-Generator/blob/master/CHANGELOG.md)** for this project
|
- Look at **[CHANGELOG.md](https://github.com/skywinder/Github-Changelog-Generator/blob/master/CHANGELOG.md)** for this project
|
||||||
- [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by command:
|
- [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by command:
|
||||||
|
|
||||||
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
|
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
|
||||||
|
|
||||||
- In general, it looks like this:
|
- In general, it looks like this:
|
||||||
|
|
||||||
@@ -74,16 +75,16 @@ See also Troubleshooting.
|
|||||||
|
|
||||||
- If your **`git remote`** `origin` refers to your GitHub repo, just go to your project folder and run:
|
- If your **`git remote`** `origin` refers to your GitHub repo, just go to your project folder and run:
|
||||||
|
|
||||||
github_changelog_generator
|
github_changelog_generator
|
||||||
|
|
||||||
- Or, run this from anywhere:
|
- Or, run this from anywhere:
|
||||||
- `github_changelog_generator -u github_username -p github_project`
|
`github_changelog_generator -u github_username -p github_project`
|
||||||
- `github_changelog_generator github_username/github_project`
|
`github_changelog_generator github_username/github_project`
|
||||||
|
|
||||||
- If you are running it against a repository on a Github Enterprise install, you must specify *both* `--github-site` and `--github-api` command line options:
|
- If you are running it against a repository on a Github Enterprise install, you must specify *both* `--github-site` and `--github-api` command line options:
|
||||||
|
|
||||||
github_changelog_generator --github-site="https://github.yoursite.com" \
|
github_changelog_generator --github-site="https://github.yoursite.com" \
|
||||||
--github-api="https://github.yoursite.com/api/v3/"
|
--github-api="https://github.yoursite.com/api/v3/"
|
||||||
|
|
||||||
This generates a changelog to the `CHANGELOG.md` file, with pretty markdown formatting.
|
This generates a changelog to the `CHANGELOG.md` file, with pretty markdown formatting.
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ since-tag=1.0.0
|
|||||||
|
|
||||||
### GitHub token
|
### GitHub token
|
||||||
|
|
||||||
GitHub only allows only 50 unauthenticated requests per hour.
|
GitHub only allows 50 unauthenticated requests per hour.
|
||||||
Therefore, it's recommended to run this script with authentication by using a **token**.
|
Therefore, it's recommended to run this script with authentication by using a **token**.
|
||||||
|
|
||||||
Here's how:
|
Here's how:
|
||||||
@@ -116,10 +117,14 @@ Here's how:
|
|||||||
|
|
||||||
You can set an environment variable by running the following command at the prompt, or by adding it to your shell profile (e.g., `~/.bash_profile` or `~/.zshrc`):
|
You can set an environment variable by running the following command at the prompt, or by adding it to your shell profile (e.g., `~/.bash_profile` or `~/.zshrc`):
|
||||||
|
|
||||||
export CHANGELOG_GITHUB_TOKEN="«your-40-digit-github-token»"
|
export CHANGELOG_GITHUB_TOKEN="«your-40-digit-github-token»"
|
||||||
|
|
||||||
So, if you got an error like this:
|
So, if you get a message like this:
|
||||||
>! /Library/Ruby/Gems/2.0.0/gems/github_api-0.12.2/lib/github_api/response/raise_error.rb:14:in `on_complete'
|
|
||||||
|
``` markdown
|
||||||
|
API rate limit exceeded for github_username.
|
||||||
|
See: https://developer.github.com/v3/#rate-limiting
|
||||||
|
```
|
||||||
|
|
||||||
It's time to create this token! (Or, wait an hour for GitHub to reset your unauthenticated request limit.)
|
It's time to create this token! (Or, wait an hour for GitHub to reset your unauthenticated request limit.)
|
||||||
|
|
||||||
@@ -151,6 +156,8 @@ end
|
|||||||
|
|
||||||
All command line options can be passed to the `rake` task as `config` parameters. And since you're naming the `rake` task yourself, you can create as many as you want.
|
All command line options can be passed to the `rake` task as `config` parameters. And since you're naming the `rake` task yourself, you can create as many as you want.
|
||||||
|
|
||||||
|
You can look for params names from the [parser source code (#setup_parser)](https://github.com/skywinder/github-changelog-generator/blob/master/lib/github_changelog_generator/parser.rb). For example, to translate the bugs label to Portuguese, instead of setting `config.bugs_label`, you have to set `config.bug_prefix`, and so on.
|
||||||
|
|
||||||
## Features and advantages of this project
|
## Features and advantages of this project
|
||||||
- Generate canonical, neat change log file, followed by [basic change log guidelines](http://keepachangelog.com) :gem:
|
- Generate canonical, neat change log file, followed by [basic change log guidelines](http://keepachangelog.com) :gem:
|
||||||
- Optionally generate **Unreleased** changes (closed issues that have not released yet) :dizzy:
|
- Optionally generate **Unreleased** changes (closed issues that have not released yet) :dizzy:
|
||||||
@@ -171,7 +178,7 @@ All command line options can be passed to the `rake` task as `config` parameters
|
|||||||
(*See `github_changelog_generator --help` for details)*
|
(*See `github_changelog_generator --help` for details)*
|
||||||
|
|
||||||
|
|
||||||
###Alternatives
|
### Alternatives
|
||||||
Here is a [wikipage list of alternatives](https://github.com/skywinder/Github-Changelog-Generator/wiki/Alternatives) that I found. But none satisfied my requirements.
|
Here is a [wikipage list of alternatives](https://github.com/skywinder/Github-Changelog-Generator/wiki/Alternatives) that I found. But none satisfied my requirements.
|
||||||
|
|
||||||
*If you know other projects, feel free to edit this Wiki page!*
|
*If you know other projects, feel free to edit this Wiki page!*
|
||||||
@@ -206,14 +213,14 @@ An auto-generated changelog really helps, even if you manually fill in the relea
|
|||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
When I found a closed bug, it's very useful know which release fixed it.
|
When you find a closed bug, it is very useful to know which release fixed it.
|
||||||
In this case, you can easily find the issue by \# in `CHANGELOG.md`.
|
So that you can easily find the issue by \# in `CHANGELOG.md`.
|
||||||
|
|
||||||
- it's not quite as easy to find this in handwritten releases notes
|
- it's not quite as easy to find this in handwritten releases notes
|
||||||
- a generated file saves you the trouble of remembering everything;
|
- a generated file saves you the trouble of remembering everything;
|
||||||
sometimes people forget to add things to a handwritten file
|
sometimes people forget to add things to a handwritten file
|
||||||
|
|
||||||
Ultimately, I think GitHub Releases is ideal for end-users.
|
Ultimately, I think GitHub Releases are ideal for end-users.
|
||||||
Meanwhile, `CHANGELOG.md` lives right in the repository, with its detailed list of changes, which is handy for developers.
|
Meanwhile, `CHANGELOG.md` lives right in the repository, with its detailed list of changes, which is handy for developers.
|
||||||
Finally, there's nothing wrong with using GitHub Releases alongside `CHANGELOG.md` in this combination.
|
Finally, there's nothing wrong with using GitHub Releases alongside `CHANGELOG.md` in this combination.
|
||||||
|
|
||||||
@@ -254,14 +261,14 @@ can't get the latest version of Ruby installed.
|
|||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
1. Create an issue and describe your idea
|
1. Create an issue and describe your idea
|
||||||
2. [Fork it] (https://github.com/skywinder/Github-Changelog-Generator/fork)
|
2. [Fork it](https://github.com/skywinder/github-changelog-generator/fork)
|
||||||
3. Create your feature branch (`git checkout -b my-new-feature`)
|
3. Create your feature branch (`git checkout -b my-new-feature`)
|
||||||
4. Commit your changes (`git commit -am 'Add some feature'`)
|
4. Commit your changes (`git commit -am 'Add some feature'`)
|
||||||
5. Publish the branch (`git push origin my-new-feature`)
|
5. Publish the branch (`git push origin my-new-feature`)
|
||||||
6. Create a new Pull Request
|
6. Create a new Pull Request
|
||||||
7. Profit! :white_check_mark:
|
7. Profit! :white_check_mark:
|
||||||
|
|
||||||
*To test your workflow with changelog generator, you can use [test repo](https://github.com/skywinder/changelog_test/)*
|
You can test your workflow with changelog generator with [the skywinder/changelog_test repo](https://github.com/skywinder/changelog_test/).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
32
Rakefile
32
Rakefile
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "bundler"
|
require "bundler"
|
||||||
require "bundler/gem_tasks"
|
require "bundler/gem_tasks"
|
||||||
require "rubocop/rake_task"
|
require "rubocop/rake_task"
|
||||||
@@ -10,31 +11,10 @@ require "overcommit"
|
|||||||
RuboCop::RakeTask.new
|
RuboCop::RakeTask.new
|
||||||
RSpec::Core::RakeTask.new(:rspec)
|
RSpec::Core::RakeTask.new(:rspec)
|
||||||
|
|
||||||
task :copy_man_page_to_manpath do |_t|
|
desc "When releasing the gem, re-fetch latest cacert.pem from curl.haxx.se. Developer task."
|
||||||
known_manpath_paths = %w(/etc/manpath.config /etc/manpaths)
|
task :update_ssl_ca_file do
|
||||||
manpath = known_manpath_paths.find do |f|
|
`pushd lib/github_changelog_generator/ssl_certs && curl --remote-name --time-cond cacert.pem https://curl.haxx.se/ca/cacert.pem && popd`
|
||||||
path = Pathname(f)
|
|
||||||
path.file? && path.readable?
|
|
||||||
end
|
|
||||||
|
|
||||||
next unless manpath
|
|
||||||
|
|
||||||
writable_man_path = Pathname(manpath).each_line.find do |line|
|
|
||||||
path = Pathname(line.chomp)
|
|
||||||
path.directory? && path.writable?
|
|
||||||
end
|
|
||||||
|
|
||||||
next unless writable_man_path
|
|
||||||
|
|
||||||
man_prefix = Pathname("#{writable_man_path.chomp}/man1")
|
|
||||||
man_pages = "man/git-*.1"
|
|
||||||
|
|
||||||
Pathname.glob(man_pages) do |path|
|
|
||||||
if path.exist? && man_prefix.exist? && man_prefix.writable?
|
|
||||||
FileUtils.cp(path, man_prefix + path.basename)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
task checks: [:rubocop, :rspec]
|
task checks: %i[rubocop rspec]
|
||||||
task default: [:rubocop, :rspec]
|
task default: %i[rubocop rspec]
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ environment:
|
|||||||
- ruby_version: "21" # Older version, but matches Travis-CI
|
- ruby_version: "21" # Older version, but matches Travis-CI
|
||||||
- ruby_version: "21-x64"
|
- ruby_version: "21-x64"
|
||||||
|
|
||||||
|
init:
|
||||||
|
- git config --global core.autocrlf true
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
||||||
|
|
||||||
@@ -48,3 +51,8 @@ notifications:
|
|||||||
- sky4winder+githubchangeloggenerator@gmail.com
|
- sky4winder+githubchangeloggenerator@gmail.com
|
||||||
on_build_success: false
|
on_build_success: false
|
||||||
on_build_status_changed: true
|
on_build_status_changed: true
|
||||||
|
- provider: GitHubPullRequest
|
||||||
|
on_build_success: true
|
||||||
|
on_build_failure: true
|
||||||
|
on_build_status_changed: true
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
notify:
|
|
||||||
webhooks:
|
|
||||||
# A list of hook hashes, containing the url field
|
|
||||||
# gitter hook
|
|
||||||
- url: https://webhooks.gitter.im/e/2d81eb1ae7695fdc82c4
|
|
||||||
- url: https://webhooks.gitter.im/e/3ec6a35fad7e9991058e
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
|
||||||
gem 'rack', '~> 1.6'
|
|
||||||
gem 'activesupport', '~> 4'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
|
||||||
gem 'rack', '>= 2'
|
|
||||||
gem 'activesupport', '>= 4'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
|
||||||
gem 'rack', '>= 2'
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
|
||||||
gem 'rack', '>= 2'
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# coding: utf-8
|
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
lib = File.expand_path("../lib", __FILE__)
|
lib = File.expand_path("../lib", __FILE__)
|
||||||
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||||
require "github_changelog_generator/version"
|
require "github_changelog_generator/version"
|
||||||
@@ -18,17 +18,17 @@ Gem::Specification.new do |spec|
|
|||||||
spec.homepage = "https://github.com/skywinder/Github-Changelog-Generator"
|
spec.homepage = "https://github.com/skywinder/Github-Changelog-Generator"
|
||||||
spec.license = "MIT"
|
spec.license = "MIT"
|
||||||
|
|
||||||
spec.files = Dir["{bin,lib,man,spec}/**/*"] + %w(LICENSE Rakefile README.md)
|
spec.files = Dir["{bin,lib,man,spec}/**/*"] + %w[LICENSE Rakefile README.md]
|
||||||
|
|
||||||
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
||||||
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
||||||
spec.require_paths = ["lib"]
|
spec.require_paths = ["lib"]
|
||||||
|
|
||||||
spec.add_runtime_dependency "rake", ">= 10.0"
|
spec.add_runtime_dependency "rake", ">= 10.0"
|
||||||
spec.add_runtime_dependency "rainbow", ">= 2.1"
|
spec.add_runtime_dependency "rainbow", ">= 2.2.1"
|
||||||
spec.add_runtime_dependency("octokit", ["~> 4.6"])
|
spec.add_runtime_dependency("octokit", ["~> 4.6"])
|
||||||
spec.add_runtime_dependency("faraday-http-cache")
|
spec.add_runtime_dependency("faraday-http-cache")
|
||||||
spec.add_runtime_dependency("activesupport")
|
spec.add_runtime_dependency("activesupport")
|
||||||
spec.add_runtime_dependency("retriable", ["~> 2.1"])
|
spec.add_runtime_dependency("retriable", ["~> 3.0"])
|
||||||
spec.add_runtime_dependency("multi_json")
|
spec.add_runtime_dependency("multi_json")
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,17 +5,18 @@ require "octokit"
|
|||||||
require "faraday-http-cache"
|
require "faraday-http-cache"
|
||||||
require "logger"
|
require "logger"
|
||||||
require "active_support"
|
require "active_support"
|
||||||
|
require "active_support/core_ext/object/blank"
|
||||||
require "json"
|
require "json"
|
||||||
require "multi_json"
|
require "multi_json"
|
||||||
require "benchmark"
|
require "benchmark"
|
||||||
|
|
||||||
require_relative "github_changelog_generator/helper"
|
require "github_changelog_generator/helper"
|
||||||
require_relative "github_changelog_generator/options"
|
require "github_changelog_generator/options"
|
||||||
require_relative "github_changelog_generator/parser"
|
require "github_changelog_generator/parser"
|
||||||
require_relative "github_changelog_generator/parser_file"
|
require "github_changelog_generator/parser_file"
|
||||||
require_relative "github_changelog_generator/generator/generator"
|
require "github_changelog_generator/generator/generator"
|
||||||
require_relative "github_changelog_generator/version"
|
require "github_changelog_generator/version"
|
||||||
require_relative "github_changelog_generator/reader"
|
require "github_changelog_generator/reader"
|
||||||
|
|
||||||
# The main module, where placed all classes (now, at least)
|
# The main module, where placed all classes (now, at least)
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
@@ -33,14 +34,10 @@ module GitHubChangelogGenerator
|
|||||||
def run
|
def run
|
||||||
log = @generator.compound_changelog
|
log = @generator.compound_changelog
|
||||||
|
|
||||||
output_filename = (@options[:output]).to_s
|
output_filename = @options[:output].to_s
|
||||||
File.open(output_filename, "w") { |file| file.write(log) }
|
File.open(output_filename, "wb") { |file| file.write(log) }
|
||||||
puts "Done!"
|
puts "Done!"
|
||||||
puts "Generated log placed in #{Dir.pwd}/#{output_filename}"
|
puts "Generated log placed in #{Dir.pwd}/#{output_filename}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if __FILE__ == $PROGRAM_NAME
|
|
||||||
GitHubChangelogGenerator::ChangelogGenerator.new.run
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative "../octo_fetcher"
|
require_relative "../octo_fetcher"
|
||||||
require_relative "generator_generation"
|
require_relative "generator_generation"
|
||||||
require_relative "generator_fetcher"
|
require_relative "generator_fetcher"
|
||||||
@@ -35,16 +36,17 @@ module GitHubChangelogGenerator
|
|||||||
detect_actual_closed_dates(@issues + @pull_requests)
|
detect_actual_closed_dates(@issues + @pull_requests)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Encapsulate characters to make markdown look as expected.
|
ENCAPSULATED_CHARACTERS = %w(< > * _ \( \) [ ] #)
|
||||||
|
|
||||||
|
# Encapsulate characters to make Markdown look as expected.
|
||||||
#
|
#
|
||||||
# @param [String] string
|
# @param [String] string
|
||||||
# @return [String] encapsulated input string
|
# @return [String] encapsulated input string
|
||||||
def encapsulate_string(string)
|
def encapsulate_string(string)
|
||||||
string.gsub! '\\', '\\\\'
|
string = string.gsub('\\', '\\\\')
|
||||||
|
|
||||||
encpas_chars = %w(< > * _ \( \) [ ] #)
|
ENCAPSULATED_CHARACTERS.each do |char|
|
||||||
encpas_chars.each do |char|
|
string = string.gsub(char, "\\#{char}")
|
||||||
string.gsub! char, "\\#{char}"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
string
|
string
|
||||||
@@ -55,14 +57,23 @@ module GitHubChangelogGenerator
|
|||||||
# @param [Array] pull_requests List or PR's in new section
|
# @param [Array] pull_requests List or PR's in new section
|
||||||
# @param [Array] issues List of issues in new section
|
# @param [Array] issues List of issues in new section
|
||||||
# @param [String] newer_tag Name of the newer tag. Could be nil for `Unreleased` section
|
# @param [String] newer_tag Name of the newer tag. Could be nil for `Unreleased` section
|
||||||
# @param [String] older_tag_name Older tag, used for the links. Could be nil for last tag.
|
# @param [Hash, nil] older_tag Older tag, used for the links. Could be nil for last tag.
|
||||||
# @return [String] Ready and parsed section
|
# @return [String] Ready and parsed section
|
||||||
def create_log_for_tag(pull_requests, issues, newer_tag, older_tag_name = nil)
|
def create_log_for_tag(pull_requests, issues, newer_tag, older_tag = nil)
|
||||||
newer_tag_link, newer_tag_name, newer_tag_time = detect_link_tag_time(newer_tag)
|
newer_tag_link, newer_tag_name, newer_tag_time = detect_link_tag_time(newer_tag)
|
||||||
|
|
||||||
github_site = options[:github_site] || "https://github.com"
|
github_site = options[:github_site] || "https://github.com"
|
||||||
project_url = "#{github_site}/#{options[:user]}/#{options[:project]}"
|
project_url = "#{github_site}/#{options[:user]}/#{options[:project]}"
|
||||||
|
|
||||||
|
# If the older tag is nil, go back in time from the latest tag and find
|
||||||
|
# the SHA for the first commit.
|
||||||
|
older_tag_name =
|
||||||
|
if older_tag.nil?
|
||||||
|
@fetcher.commits_before(newer_tag_time).last["sha"]
|
||||||
|
else
|
||||||
|
older_tag["name"]
|
||||||
|
end
|
||||||
|
|
||||||
log = generate_header(newer_tag_name, newer_tag_link, newer_tag_time, older_tag_name, project_url)
|
log = generate_header(newer_tag_name, newer_tag_link, newer_tag_time, older_tag_name, project_url)
|
||||||
|
|
||||||
if options[:issues]
|
if options[:issues]
|
||||||
@@ -70,7 +81,7 @@ module GitHubChangelogGenerator
|
|||||||
log += issues_to_log(issues, pull_requests)
|
log += issues_to_log(issues, pull_requests)
|
||||||
end
|
end
|
||||||
|
|
||||||
if options[:pulls]
|
if options[:pulls] && options[:add_pr_wo_labels]
|
||||||
# Generate pull requests:
|
# Generate pull requests:
|
||||||
log += generate_sub_section(pull_requests, options[:merge_prefix])
|
log += generate_sub_section(pull_requests, options[:merge_prefix])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
class Generator
|
class Generator
|
||||||
MAX_THREAD_NUMBER = 25
|
MAX_THREAD_NUMBER = 25
|
||||||
@@ -77,7 +78,7 @@ module GitHubChangelogGenerator
|
|||||||
issue["actual_date"] = commit["commit"]["author"]["date"]
|
issue["actual_date"] = commit["commit"]["author"]["date"]
|
||||||
|
|
||||||
# issue['actual_date'] = commit['author']['date']
|
# issue['actual_date'] = commit['author']['date']
|
||||||
rescue
|
rescue StandardError
|
||||||
puts "Warning: Can't fetch commit #{event['commit_id']}. It is probably referenced from another repo."
|
puts "Warning: Can't fetch commit #{event['commit_id']}. It is probably referenced from another repo."
|
||||||
issue["actual_date"] = issue["closed_at"]
|
issue["actual_date"] = issue["closed_at"]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
class Generator
|
class Generator
|
||||||
# Main function to start change log generation
|
# Main function to start change log generation
|
||||||
@@ -20,7 +21,10 @@ module GitHubChangelogGenerator
|
|||||||
|
|
||||||
log += File.read(options[:base]) if File.file?(options[:base])
|
log += File.read(options[:base]) if File.file?(options[:base])
|
||||||
|
|
||||||
log += "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
|
credit_line = "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
|
||||||
|
log.gsub!(credit_line, "") # Remove old credit lines
|
||||||
|
log += credit_line
|
||||||
|
|
||||||
@log = log
|
@log = log
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -64,7 +68,7 @@ module GitHubChangelogGenerator
|
|||||||
log += if newer_tag_name.equal?(options[:unreleased_label])
|
log += if newer_tag_name.equal?(options[:unreleased_label])
|
||||||
"## [#{newer_tag_name}](#{release_url})\n\n"
|
"## [#{newer_tag_name}](#{release_url})\n\n"
|
||||||
else
|
else
|
||||||
"## [#{newer_tag_name}](#{release_url}) (#{time_string})\n"
|
"## [#{newer_tag_name}](#{release_url}) (#{time_string})\n\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
if options[:compare_link] && older_tag_link
|
if options[:compare_link] && older_tag_link
|
||||||
@@ -81,22 +85,21 @@ module GitHubChangelogGenerator
|
|||||||
def generate_log_between_tags(older_tag, newer_tag)
|
def generate_log_between_tags(older_tag, newer_tag)
|
||||||
filtered_issues, filtered_pull_requests = filter_issues_for_tags(newer_tag, older_tag)
|
filtered_issues, filtered_pull_requests = filter_issues_for_tags(newer_tag, older_tag)
|
||||||
|
|
||||||
older_tag_name = older_tag.nil? ? detect_since_tag : older_tag["name"]
|
|
||||||
|
|
||||||
if newer_tag.nil? && filtered_issues.empty? && filtered_pull_requests.empty?
|
if newer_tag.nil? && filtered_issues.empty? && filtered_pull_requests.empty?
|
||||||
# do not generate empty unreleased section
|
# do not generate empty unreleased section
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name)
|
create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Apply all filters to issues and pull requests
|
# Filters issues and pull requests based on, respectively, `closed_at` and `merged_at`
|
||||||
|
# timestamp fields.
|
||||||
#
|
#
|
||||||
# @return [Array] filtered issues and pull requests
|
# @return [Array] filtered issues and pull requests
|
||||||
def filter_issues_for_tags(newer_tag, older_tag)
|
def filter_issues_for_tags(newer_tag, older_tag)
|
||||||
filtered_pull_requests = delete_by_time(@pull_requests, "actual_date", older_tag, newer_tag)
|
filtered_pull_requests = delete_by_time(@pull_requests, "merged_at", older_tag, newer_tag)
|
||||||
filtered_issues = delete_by_time(@issues, "actual_date", older_tag, newer_tag)
|
filtered_issues = delete_by_time(@issues, "closed_at", older_tag, newer_tag)
|
||||||
|
|
||||||
newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"]
|
newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
class Generator
|
class Generator
|
||||||
# delete all labels with labels from options[:exclude_labels] array
|
# delete all labels with labels from options[:exclude_labels] array
|
||||||
@@ -125,19 +126,17 @@ module GitHubChangelogGenerator
|
|||||||
# @return [Array] filtered array of issues
|
# @return [Array] filtered array of issues
|
||||||
def include_issues_by_labels(issues)
|
def include_issues_by_labels(issues)
|
||||||
filtered_issues = filter_by_include_labels(issues)
|
filtered_issues = filter_by_include_labels(issues)
|
||||||
filtered_issues |= filter_wo_labels(issues)
|
filtered_issues = filter_wo_labels(filtered_issues)
|
||||||
filtered_issues
|
filtered_issues
|
||||||
end
|
end
|
||||||
|
|
||||||
# @return [Array] issues without labels or empty array if add_issues_wo_labels is false
|
# @return [Array] issues without labels or empty array if add_issues_wo_labels is false
|
||||||
def filter_wo_labels(issues)
|
def filter_wo_labels(issues)
|
||||||
if options[:add_issues_wo_labels]
|
if options[:add_issues_wo_labels]
|
||||||
issues_wo_labels = issues.select do |issue|
|
issues
|
||||||
!issue["labels"].map { |l| l["name"] }.any?
|
else
|
||||||
end
|
issues.select { |issue| issue["labels"].map { |l| l["name"] }.any? }
|
||||||
return issues_wo_labels
|
|
||||||
end
|
end
|
||||||
[]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_by_include_labels(issues)
|
def filter_by_include_labels(issues)
|
||||||
@@ -197,8 +196,8 @@ module GitHubChangelogGenerator
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
pull_requests.select! do |pr|
|
pull_requests.reject! do |pr|
|
||||||
!pr["merged_at"].nil?
|
pr["merged_at"].nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
pull_requests
|
pull_requests
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
class Generator
|
class Generator
|
||||||
# fetch, filter tags, fetch dates and sort them in time order
|
# fetch, filter tags, fetch dates and sort them in time order
|
||||||
@@ -6,31 +7,48 @@ module GitHubChangelogGenerator
|
|||||||
detect_since_tag
|
detect_since_tag
|
||||||
detect_due_tag
|
detect_due_tag
|
||||||
|
|
||||||
all_tags = @fetcher.get_all_tags
|
all_tags = @fetcher.get_all_tags
|
||||||
included_tags = filter_excluded_tags(all_tags)
|
|
||||||
|
|
||||||
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
|
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
|
||||||
@sorted_tags = sort_tags_by_date(included_tags)
|
all_sorted_tags = sort_tags_by_date(all_tags)
|
||||||
@filtered_tags = get_filtered_tags(included_tags)
|
|
||||||
|
|
||||||
@tag_section_mapping = build_tag_section_mapping(@filtered_tags, sorted_tags)
|
@sorted_tags = filter_excluded_tags(all_sorted_tags)
|
||||||
|
@filtered_tags = get_filtered_tags(@sorted_tags)
|
||||||
|
|
||||||
|
# Because we need to properly create compare links, we need a sorted list
|
||||||
|
# of all filtered tags (including the excluded ones). We'll exclude those
|
||||||
|
# tags from section headers inside the mapping function.
|
||||||
|
section_tags = get_filtered_tags(all_sorted_tags)
|
||||||
|
|
||||||
|
@tag_section_mapping = build_tag_section_mapping(section_tags, @filtered_tags)
|
||||||
|
|
||||||
@filtered_tags
|
@filtered_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
# @param [Array] filtered_tags are the tags that need a subsection output
|
# @param [Array] section_tags are the tags that need a subsection output
|
||||||
# @param [Array] all_tags is the list of all tags ordered from newest -> oldest
|
# @param [Array] filtered_tags is the list of filtered tags ordered from newest -> oldest
|
||||||
# @return [Hash] key is the tag to output, value is an array of [Left Tag, Right Tag]
|
# @return [Hash] key is the tag to output, value is an array of [Left Tag, Right Tag]
|
||||||
# PRs to include in this section will be >= [Left Tag Date] and <= [Right Tag Date]
|
# PRs to include in this section will be >= [Left Tag Date] and <= [Right Tag Date]
|
||||||
def build_tag_section_mapping(filtered_tags, all_tags)
|
# rubocop:disable Style/For - for allows us to be more concise
|
||||||
|
def build_tag_section_mapping(section_tags, filtered_tags)
|
||||||
tag_mapping = {}
|
tag_mapping = {}
|
||||||
filtered_tags.each do |tag|
|
for i in 0..(section_tags.length - 1)
|
||||||
older_tag_idx = all_tags.index(tag) + 1
|
tag = section_tags[i]
|
||||||
older_tag = all_tags[older_tag_idx]
|
|
||||||
|
# Don't create section header for the "since" tag
|
||||||
|
next if @since_tag && tag["name"] == @since_tag
|
||||||
|
|
||||||
|
# Don't create a section header for the first tag in between_tags
|
||||||
|
next if options[:between_tags] && tag == section_tags.last
|
||||||
|
|
||||||
|
# Don't create a section header for excluded tags
|
||||||
|
next unless filtered_tags.include?(tag)
|
||||||
|
|
||||||
|
older_tag = section_tags[i + 1]
|
||||||
tag_mapping[tag] = [older_tag, tag]
|
tag_mapping[tag] = [older_tag, tag]
|
||||||
end
|
end
|
||||||
tag_mapping
|
tag_mapping
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Style/For
|
||||||
|
|
||||||
# Sort all tags by date, newest to oldest
|
# Sort all tags by date, newest to oldest
|
||||||
def sort_tags_by_date(tags)
|
def sort_tags_by_date(tags)
|
||||||
@@ -95,13 +113,12 @@ module GitHubChangelogGenerator
|
|||||||
sections.first["version"] if sections && sections.any?
|
sections.first["version"] if sections && sections.any?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return tags after filtering tags in lists provided by option: --between-tags & --exclude-tags
|
# Return tags after filtering tags in lists provided by option: --exclude-tags
|
||||||
#
|
#
|
||||||
# @return [Array]
|
# @return [Array]
|
||||||
def get_filtered_tags(all_tags)
|
def get_filtered_tags(all_tags)
|
||||||
filtered_tags = filter_since_tag(all_tags)
|
filtered_tags = filter_since_tag(all_tags)
|
||||||
filtered_tags = filter_due_tag(filtered_tags)
|
filter_due_tag(filtered_tags)
|
||||||
filter_between_tags(filtered_tags)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# @param [Array] all_tags all tags
|
# @param [Array] all_tags all tags
|
||||||
@@ -113,7 +130,7 @@ module GitHubChangelogGenerator
|
|||||||
if all_tags.map { |t| t["name"] }.include? tag
|
if all_tags.map { |t| t["name"] }.include? tag
|
||||||
idx = all_tags.index { |t| t["name"] == tag }
|
idx = all_tags.index { |t| t["name"] == tag }
|
||||||
filtered_tags = if idx > 0
|
filtered_tags = if idx > 0
|
||||||
all_tags[0..idx - 1]
|
all_tags[0..idx]
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
@@ -144,23 +161,6 @@ module GitHubChangelogGenerator
|
|||||||
filtered_tags
|
filtered_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
# @param [Array] all_tags all tags
|
|
||||||
# @return [Array] filtered tags according :between_tags option
|
|
||||||
def filter_between_tags(all_tags)
|
|
||||||
filtered_tags = all_tags
|
|
||||||
tag_names = filtered_tags.map { |ft| ft["name"] }
|
|
||||||
|
|
||||||
if options[:between_tags]
|
|
||||||
options[:between_tags].each do |tag|
|
|
||||||
unless tag_names.include?(tag)
|
|
||||||
Helper.log.warn "Warning: can't find tag #{tag}, specified with --between-tags option."
|
|
||||||
end
|
|
||||||
end
|
|
||||||
filtered_tags = all_tags.select { |tag| options[:between_tags].include?(tag["name"]) }
|
|
||||||
end
|
|
||||||
filtered_tags
|
|
||||||
end
|
|
||||||
|
|
||||||
# @param [Array] all_tags all tags
|
# @param [Array] all_tags all tags
|
||||||
# @return [Array] filtered tags according :exclude_tags or :exclude_tags_regex option
|
# @return [Array] filtered tags according :exclude_tags or :exclude_tags_regex option
|
||||||
def filter_excluded_tags(all_tags)
|
def filter_excluded_tags(all_tags)
|
||||||
@@ -177,18 +177,19 @@ module GitHubChangelogGenerator
|
|||||||
|
|
||||||
def apply_exclude_tags(all_tags)
|
def apply_exclude_tags(all_tags)
|
||||||
if options[:exclude_tags].is_a?(Regexp)
|
if options[:exclude_tags].is_a?(Regexp)
|
||||||
filter_tags_with_regex(all_tags, options[:exclude_tags])
|
filter_tags_with_regex(all_tags, options[:exclude_tags], "--exclude-tags")
|
||||||
else
|
else
|
||||||
filter_exact_tags(all_tags)
|
filter_exact_tags(all_tags)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def apply_exclude_tags_regex(all_tags)
|
def apply_exclude_tags_regex(all_tags)
|
||||||
filter_tags_with_regex(all_tags, Regexp.new(options[:exclude_tags_regex]))
|
regex = Regexp.new(options[:exclude_tags_regex])
|
||||||
|
filter_tags_with_regex(all_tags, regex, "--exclude-tags-regex")
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_tags_with_regex(all_tags, regex)
|
def filter_tags_with_regex(all_tags, regex, regex_option_name)
|
||||||
warn_if_nonmatching_regex(all_tags)
|
warn_if_nonmatching_regex(all_tags, regex, regex_option_name)
|
||||||
all_tags.reject { |tag| regex =~ tag["name"] }
|
all_tags.reject { |tag| regex =~ tag["name"] }
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -199,11 +200,10 @@ module GitHubChangelogGenerator
|
|||||||
all_tags.reject { |tag| options[:exclude_tags].include?(tag["name"]) }
|
all_tags.reject { |tag| options[:exclude_tags].include?(tag["name"]) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def warn_if_nonmatching_regex(all_tags)
|
def warn_if_nonmatching_regex(all_tags, regex, regex_option_name)
|
||||||
unless all_tags.map { |t| t["name"] }.any? { |t| options[:exclude_tags] =~ t }
|
unless all_tags.map { |t| t["name"] }.any? { |t| regex =~ t }
|
||||||
Helper.log.warn "Warning: unable to reject any tag, using regex "\
|
Helper.log.warn "Warning: unable to reject any tag, using regex "\
|
||||||
"#{options[:exclude_tags].inspect} in --exclude-tags "\
|
"#{regex.inspect} in #{regex_option_name} option."
|
||||||
"option."
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "logger"
|
require "logger"
|
||||||
require "rainbow"
|
require "rainbow"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "tmpdir"
|
||||||
require "retriable"
|
require "retriable"
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
# A Fetcher responsible for all requests to GitHub and all basic manipulation with related data
|
# A Fetcher responsible for all requests to GitHub and all basic manipulation with related data
|
||||||
@@ -23,16 +25,17 @@ module GitHubChangelogGenerator
|
|||||||
# @option options [Boolean] :http_cache Use ActiveSupport::Cache::FileStore to cache http requests
|
# @option options [Boolean] :http_cache Use ActiveSupport::Cache::FileStore to cache http requests
|
||||||
# @option options [Boolean] :cache_file If using http_cache, this is the cache file path
|
# @option options [Boolean] :cache_file If using http_cache, this is the cache file path
|
||||||
# @option options [Boolean] :cache_log If using http_cache, this is the cache log file path
|
# @option options [Boolean] :cache_log If using http_cache, this is the cache log file path
|
||||||
def initialize(options = {}) # rubocop:disable Metrics/CyclomaticComplexity
|
def initialize(options = {})
|
||||||
@options = options || {}
|
@options = options || {}
|
||||||
@user = @options[:user]
|
@user = @options[:user]
|
||||||
@project = @options[:project]
|
@project = @options[:project]
|
||||||
@since = @options[:since]
|
@since = @options[:since]
|
||||||
@http_cache = @options[:http_cache]
|
@http_cache = @options[:http_cache]
|
||||||
@cache_file = @options.fetch(:cache_file, "/tmp/github-changelog-http-cache") if @http_cache
|
if @http_cache
|
||||||
@cache_log = @options.fetch(:cache_log, "/tmp/github-changelog-logger.log") if @http_cache
|
@cache_file = @options.fetch(:cache_file) { File.join(Dir.tmpdir, "github-changelog-http-cache") }
|
||||||
init_cache if @http_cache
|
@cache_log = @options.fetch(:cache_log) { File.join(Dir.tmpdir, "github-changelog-logger.log") }
|
||||||
|
init_cache
|
||||||
|
end
|
||||||
@github_token = fetch_github_token
|
@github_token = fetch_github_token
|
||||||
|
|
||||||
@request_options = { per_page: PER_PAGE_NUMBER }
|
@request_options = { per_page: PER_PAGE_NUMBER }
|
||||||
@@ -40,8 +43,14 @@ module GitHubChangelogGenerator
|
|||||||
@github_options[:access_token] = @github_token unless @github_token.nil?
|
@github_options[:access_token] = @github_token unless @github_token.nil?
|
||||||
@github_options[:api_endpoint] = @options[:github_endpoint] unless @options[:github_endpoint].nil?
|
@github_options[:api_endpoint] = @options[:github_endpoint] unless @options[:github_endpoint].nil?
|
||||||
|
|
||||||
client_type = @options[:github_endpoint].nil? ? Octokit::Client : Octokit::EnterpriseAdminClient
|
configure_octokit_ssl
|
||||||
@client = client_type.new(@github_options)
|
|
||||||
|
@client = Octokit::Client.new(@github_options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def configure_octokit_ssl
|
||||||
|
ca_file = @options[:ssl_ca_file] || ENV["SSL_CA_FILE"] || File.expand_path("../ssl_certs/cacert.pem", __FILE__)
|
||||||
|
Octokit.connection_options = { ssl: { ca_file: ca_file } }
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_cache
|
def init_cache
|
||||||
@@ -227,6 +236,17 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Fetch all commits before certain point
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
def commits_before(start_time)
|
||||||
|
commits = []
|
||||||
|
iterate_pages(@client, "commits_before", start_time.to_datetime.to_s) do |new_commits|
|
||||||
|
commits.concat(new_commits)
|
||||||
|
end
|
||||||
|
commits
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def stringify_keys_deep(indata)
|
def stringify_keys_deep(indata)
|
||||||
|
|||||||
@@ -1,60 +1,57 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "delegate"
|
require "delegate"
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
class Options < SimpleDelegator
|
class Options < SimpleDelegator
|
||||||
UnsupportedOptionError = Class.new(ArgumentError)
|
UnsupportedOptionError = Class.new(ArgumentError)
|
||||||
|
|
||||||
KNOWN_OPTIONS = [
|
KNOWN_OPTIONS = %i[
|
||||||
:add_issues_wo_labels,
|
add_issues_wo_labels
|
||||||
:add_pr_wo_labels,
|
add_pr_wo_labels
|
||||||
:author,
|
author
|
||||||
:base,
|
base
|
||||||
:between_tags,
|
between_tags
|
||||||
:bug_labels,
|
bug_labels
|
||||||
:bug_prefix,
|
bug_prefix
|
||||||
:cache_file,
|
cache_file
|
||||||
:cache_log,
|
cache_log
|
||||||
:compare_link,
|
compare_link
|
||||||
:date_format,
|
date_format
|
||||||
:due_tag,
|
due_tag
|
||||||
:enhancement_labels,
|
enhancement_labels
|
||||||
:enhancement_prefix,
|
enhancement_prefix
|
||||||
:exclude_labels,
|
exclude_labels
|
||||||
:exclude_tags,
|
exclude_tags
|
||||||
:exclude_tags_regex,
|
exclude_tags_regex
|
||||||
:filter_issues_by_milestone,
|
filter_issues_by_milestone
|
||||||
:frontmatter,
|
frontmatter
|
||||||
:future_release,
|
future_release
|
||||||
:git_remote,
|
git_remote
|
||||||
:github_endpoint,
|
github_endpoint
|
||||||
:github_site,
|
github_site
|
||||||
:header,
|
header
|
||||||
:http_cache,
|
http_cache
|
||||||
:include_labels,
|
include_labels
|
||||||
:issue_prefix,
|
issue_prefix
|
||||||
:issue_line_labels,
|
issue_line_labels
|
||||||
:issues,
|
issues
|
||||||
:max_issues,
|
max_issues
|
||||||
:merge_prefix,
|
merge_prefix
|
||||||
:output,
|
output
|
||||||
:project,
|
project
|
||||||
:pulls,
|
pulls
|
||||||
:release_branch,
|
release_branch
|
||||||
:release_url,
|
release_url
|
||||||
:simple_list,
|
simple_list
|
||||||
:since_tag,
|
since_tag
|
||||||
:token,
|
ssl_ca_file
|
||||||
:unreleased,
|
token
|
||||||
:unreleased_label,
|
unreleased
|
||||||
:unreleased_only,
|
unreleased_label
|
||||||
:user,
|
unreleased_only
|
||||||
:usernames_as_github_logins,
|
user
|
||||||
:verbose
|
usernames_as_github_logins
|
||||||
]
|
verbose
|
||||||
|
|
||||||
THESE_ARE_DIFFERENT = [
|
|
||||||
:tag1,
|
|
||||||
:tag2
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def initialize(values)
|
def initialize(values)
|
||||||
@@ -78,15 +75,11 @@ module GitHubChangelogGenerator
|
|||||||
end
|
end
|
||||||
|
|
||||||
def unsupported_options
|
def unsupported_options
|
||||||
values.keys - supported_options
|
values.keys - KNOWN_OPTIONS
|
||||||
end
|
end
|
||||||
|
|
||||||
def supported_option?(key)
|
def supported_option?(key)
|
||||||
supported_options.include?(key)
|
KNOWN_OPTIONS.include?(key)
|
||||||
end
|
|
||||||
|
|
||||||
def supported_options
|
|
||||||
KNOWN_OPTIONS + THESE_ARE_DIFFERENT
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "optparse"
|
require "optparse"
|
||||||
require "pp"
|
require "pp"
|
||||||
require_relative "version"
|
require_relative "version"
|
||||||
@@ -13,7 +14,10 @@ module GitHubChangelogGenerator
|
|||||||
ParserFile.new(options).parse!
|
ParserFile.new(options).parse!
|
||||||
|
|
||||||
parser = setup_parser(options)
|
parser = setup_parser(options)
|
||||||
parser.parse!
|
begin parser.parse!
|
||||||
|
rescue OptionParser::InvalidOption => e
|
||||||
|
abort [e, parser].join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
fetch_user_and_project(options)
|
fetch_user_and_project(options)
|
||||||
|
|
||||||
@@ -128,9 +132,6 @@ module GitHubChangelogGenerator
|
|||||||
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|
|
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
|
options[:issue_line_labels] = list
|
||||||
end
|
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
|
|
||||||
opts.on("--exclude-tags x,y,z", Array, "Change log will exclude specified tags") do |list|
|
opts.on("--exclude-tags x,y,z", Array, "Change log will exclude specified tags") do |list|
|
||||||
options[:exclude_tags] = list
|
options[:exclude_tags] = list
|
||||||
end
|
end
|
||||||
@@ -167,12 +168,15 @@ module GitHubChangelogGenerator
|
|||||||
opts.on("--[no-]http-cache", "Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.") do |http_cache|
|
opts.on("--[no-]http-cache", "Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.") do |http_cache|
|
||||||
options[:http_cache] = http_cache
|
options[:http_cache] = http_cache
|
||||||
end
|
end
|
||||||
opts.on("--cache-file [CACHE-FILE]", "Filename to use for cache. Default is /tmp/github-changelog-http-cache") do |cache_file|
|
opts.on("--cache-file [CACHE-FILE]", "Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.") do |cache_file|
|
||||||
options[:cache_file] = cache_file
|
options[:cache_file] = cache_file
|
||||||
end
|
end
|
||||||
opts.on("--cache-log [CACHE-LOG]", "Filename to use for cache log. Default is /tmp/github-changelog-logger.log") do |cache_log|
|
opts.on("--cache-log [CACHE-LOG]", "Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.") do |cache_log|
|
||||||
options[:cache_log] = cache_log
|
options[:cache_log] = cache_log
|
||||||
end
|
end
|
||||||
|
opts.on("--ssl-ca-file [PATH]", "Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH.") do |ssl_ca_file|
|
||||||
|
options[:ssl_ca_file] = ssl_ca_file
|
||||||
|
end
|
||||||
opts.on("--[no-]verbose", "Run verbosely. Default is true") do |v|
|
opts.on("--[no-]verbose", "Run verbosely. Default is true") do |v|
|
||||||
options[:verbose] = v
|
options[:verbose] = v
|
||||||
end
|
end
|
||||||
@@ -191,8 +195,6 @@ module GitHubChangelogGenerator
|
|||||||
# @return [Hash] Default options
|
# @return [Hash] Default options
|
||||||
def self.default_options
|
def self.default_options
|
||||||
Options.new(
|
Options.new(
|
||||||
tag1: nil,
|
|
||||||
tag2: nil,
|
|
||||||
date_format: "%Y-%m-%d",
|
date_format: "%Y-%m-%d",
|
||||||
output: "CHANGELOG.md",
|
output: "CHANGELOG.md",
|
||||||
base: "HISTORY.md",
|
base: "HISTORY.md",
|
||||||
@@ -205,12 +207,13 @@ module GitHubChangelogGenerator
|
|||||||
unreleased: true,
|
unreleased: true,
|
||||||
unreleased_label: "Unreleased",
|
unreleased_label: "Unreleased",
|
||||||
compare_link: true,
|
compare_link: true,
|
||||||
enhancement_labels: %w(enhancement Enhancement),
|
enhancement_labels: ["enhancement", "Enhancement", "Type: Enhancement"],
|
||||||
bug_labels: %w(bug Bug),
|
bug_labels: ["bug", "Bug", "Type: Bug"],
|
||||||
exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix),
|
exclude_labels: ["duplicate", "question", "invalid", "wontfix", "Duplicate", "Question", "Invalid", "Wontfix", "Meta: Exclude From Changelog"],
|
||||||
issue_line_labels: [],
|
issue_line_labels: [],
|
||||||
max_issues: nil,
|
max_issues: nil,
|
||||||
simple_list: false,
|
simple_list: false,
|
||||||
|
ssl_ca_file: nil,
|
||||||
verbose: true,
|
verbose: true,
|
||||||
header: "# Change Log",
|
header: "# Change Log",
|
||||||
merge_prefix: "**Merged pull requests:**",
|
merge_prefix: "**Merged pull requests:**",
|
||||||
@@ -218,9 +221,7 @@ module GitHubChangelogGenerator
|
|||||||
bug_prefix: "**Fixed bugs:**",
|
bug_prefix: "**Fixed bugs:**",
|
||||||
enhancement_prefix: "**Implemented enhancements:**",
|
enhancement_prefix: "**Implemented enhancements:**",
|
||||||
git_remote: "origin",
|
git_remote: "origin",
|
||||||
http_cache: true,
|
http_cache: true
|
||||||
cache_file: "/tmp/github-changelog-http-cache",
|
|
||||||
cache_log: "/tmp/github-changelog-logger.log"
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -276,7 +277,7 @@ module GitHubChangelogGenerator
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
param = match[2].nil?
|
param = match[2].nil?
|
||||||
rescue
|
rescue StandardError
|
||||||
puts "Can't detect user and name from first parameter: '#{arg0}' -> exit'"
|
puts "Can't detect user and name from first parameter: '#{arg0}' -> exit'"
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "pathname"
|
require "pathname"
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
@@ -47,7 +48,7 @@ module GitHubChangelogGenerator
|
|||||||
return if non_configuration_line?(line)
|
return if non_configuration_line?(line)
|
||||||
option_name, value = extract_pair(line)
|
option_name, value = extract_pair(line)
|
||||||
@options[option_key_for(option_name)] = convert_value(value, option_name)
|
@options[option_key_for(option_name)] = convert_value(value, option_name)
|
||||||
rescue
|
rescue StandardError
|
||||||
raise ParserError, "Failed on line ##{line_number}: \"#{line.gsub(/[\n\r]+/, '')}\""
|
raise ParserError, "Failed on line ##{line_number}: \"#{line.gsub(/[\n\r]+/, '')}\""
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -65,8 +66,8 @@ module GitHubChangelogGenerator
|
|||||||
[key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
|
[key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
|
||||||
end
|
end
|
||||||
|
|
||||||
KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels,
|
KNOWN_ARRAY_KEYS = %i[exclude_labels include_labels bug_labels
|
||||||
:enhancement_labels, :issue_line_labels, :between_tags, :exclude_tags]
|
enhancement_labels issue_line_labels between_tags exclude_tags]
|
||||||
KNOWN_INTEGER_KEYS = [:max_issues]
|
KNOWN_INTEGER_KEYS = [:max_issues]
|
||||||
|
|
||||||
def convert_value(value, option_name)
|
def convert_value(value, option_name)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
#
|
#
|
||||||
# Author:: Enrico Stahn <mail@enricostahn.com>
|
# Author:: Enrico Stahn <mail@enricostahn.com>
|
||||||
#
|
#
|
||||||
|
|||||||
4043
lib/github_changelog_generator/ssl_certs/cacert.pem
Normal file
4043
lib/github_changelog_generator/ssl_certs/cacert.pem
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "rake"
|
require "rake"
|
||||||
require "rake/tasklib"
|
require "rake/tasklib"
|
||||||
require "github_changelog_generator"
|
require "github_changelog_generator"
|
||||||
@@ -7,7 +8,7 @@ module GitHubChangelogGenerator
|
|||||||
class RakeTask < ::Rake::TaskLib
|
class RakeTask < ::Rake::TaskLib
|
||||||
include ::Rake::DSL if defined?(::Rake::DSL)
|
include ::Rake::DSL if defined?(::Rake::DSL)
|
||||||
|
|
||||||
OPTIONS = %w( user project token date_format output
|
OPTIONS = %w[ user project token date_format output
|
||||||
bug_prefix enhancement_prefix issue_prefix
|
bug_prefix enhancement_prefix issue_prefix
|
||||||
header merge_prefix issues
|
header merge_prefix issues
|
||||||
add_issues_wo_labels add_pr_wo_labels
|
add_issues_wo_labels add_pr_wo_labels
|
||||||
@@ -18,7 +19,7 @@ module GitHubChangelogGenerator
|
|||||||
between_tags exclude_tags exclude_tags_regex since_tag max_issues
|
between_tags exclude_tags exclude_tags_regex since_tag max_issues
|
||||||
github_site github_endpoint simple_list
|
github_site github_endpoint simple_list
|
||||||
future_release release_branch verbose release_url
|
future_release release_branch verbose release_url
|
||||||
base )
|
base ]
|
||||||
|
|
||||||
OPTIONS.each do |o|
|
OPTIONS.each do |o|
|
||||||
attr_accessor o.to_sym
|
attr_accessor o.to_sym
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
VERSION = "1.14.2"
|
VERSION = "1.15.0-alpha"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "GIT\-GENERATE\-CHANGELOG" "1" "November 2016" "" ""
|
.TH "GIT\-GENERATE\-CHANGELOG" "1" "December 2016" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBgit\-generate\-changelog\fR \- Generate changelog from github
|
\fBgit\-generate\-changelog\fR \- Generate changelog from github
|
||||||
@@ -256,13 +256,13 @@ Use HTTP Cache to cache Github API requests (useful for large repos) Default is
|
|||||||
\-\-[no\-]cache\-file [CACHE\-FILE]
|
\-\-[no\-]cache\-file [CACHE\-FILE]
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
Filename to use for cache\. Default is /tmp/github\-changelog\-http\-cache
|
Filename to use for cache\. Default is github\-changelog\-http\-cache in a temporary directory\.
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
\-\-cache\-log [CACHE\-LOG]
|
\-\-cache\-log [CACHE\-LOG]
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
Filename to use for cache log\. Default is /tmp/github\-changelog\-logger\.log
|
Filename to use for cache log\. Default is github\-changelog\-logger\.log in a temporary directory\.
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
\-\-[no\-]verbose
|
\-\-[no\-]verbose
|
||||||
|
|||||||
@@ -192,10 +192,6 @@
|
|||||||
|
|
||||||
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</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> --exclude-tags x,y,z</p>
|
||||||
|
|
||||||
<p> Change log will exclude specified tags</p>
|
<p> Change log will exclude specified tags</p>
|
||||||
@@ -246,11 +242,11 @@
|
|||||||
|
|
||||||
<p> --[no-]cache-file [CACHE-FILE]</p>
|
<p> --[no-]cache-file [CACHE-FILE]</p>
|
||||||
|
|
||||||
<p> Filename to use for cache. Default is /tmp/github-changelog-http-cache</p>
|
<p> Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.</p>
|
||||||
|
|
||||||
<p> --cache-log [CACHE-LOG]</p>
|
<p> --cache-log [CACHE-LOG]</p>
|
||||||
|
|
||||||
<p> Filename to use for cache log. Default is /tmp/github-changelog-logger.log</p>
|
<p> Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.</p>
|
||||||
|
|
||||||
<p> --[no-]verbose</p>
|
<p> --[no-]verbose</p>
|
||||||
|
|
||||||
@@ -281,7 +277,7 @@
|
|||||||
|
|
||||||
<ol class='man-decor man-foot man foot'>
|
<ol class='man-decor man-foot man foot'>
|
||||||
<li class='tl'></li>
|
<li class='tl'></li>
|
||||||
<li class='tc'>November 2016</li>
|
<li class='tc'>December 2016</li>
|
||||||
<li class='tr'>git-generate-changelog(1)</li>
|
<li class='tr'>git-generate-changelog(1)</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
|||||||
@@ -184,10 +184,6 @@
|
|||||||
|
|
||||||
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</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> --exclude-tags x,y,z</p>
|
||||||
|
|
||||||
<p> Change log will exclude specified tags</p>
|
<p> Change log will exclude specified tags</p>
|
||||||
|
|||||||
@@ -119,10 +119,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
|
|||||||
|
|
||||||
Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'
|
Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'
|
||||||
|
|
||||||
--between-tags x,y,z
|
|
||||||
|
|
||||||
Change log will be filled only between specified tags
|
|
||||||
|
|
||||||
--exclude-tags x,y,z
|
--exclude-tags x,y,z
|
||||||
|
|
||||||
Change log will exclude specified tags
|
Change log will exclude specified tags
|
||||||
@@ -173,11 +169,15 @@ Automatically generate change log from your tags, issues, labels and pull reques
|
|||||||
|
|
||||||
--[no-]cache-file [CACHE-FILE]
|
--[no-]cache-file [CACHE-FILE]
|
||||||
|
|
||||||
Filename to use for cache. Default is /tmp/github-changelog-http-cache
|
Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.
|
||||||
|
|
||||||
--cache-log [CACHE-LOG]
|
--cache-log [CACHE-LOG]
|
||||||
|
|
||||||
Filename to use for cache log. Default is /tmp/github-changelog-logger.log
|
Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.
|
||||||
|
|
||||||
|
--ssl-ca-file [PATH]
|
||||||
|
|
||||||
|
Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH.
|
||||||
|
|
||||||
--[no-]verbose
|
--[no-]verbose
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
#
|
#
|
||||||
# Author:: Enrico Stahn <mail@enricostahn.com>
|
# Author:: Enrico Stahn <mail@enricostahn.com>
|
||||||
#
|
#
|
||||||
@@ -16,7 +17,6 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
require "codeclimate-test-reporter"
|
|
||||||
require "simplecov"
|
require "simplecov"
|
||||||
require "coveralls"
|
require "coveralls"
|
||||||
require "vcr"
|
require "vcr"
|
||||||
@@ -28,8 +28,7 @@ end
|
|||||||
|
|
||||||
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
||||||
Coveralls::SimpleCov::Formatter,
|
Coveralls::SimpleCov::Formatter,
|
||||||
SimpleCov::Formatter::HTMLFormatter,
|
SimpleCov::Formatter::HTMLFormatter
|
||||||
CodeClimate::TestReporter::Formatter
|
|
||||||
])
|
])
|
||||||
SimpleCov.start do
|
SimpleCov.start do
|
||||||
add_filter "gemfiles/"
|
add_filter "gemfiles/"
|
||||||
|
|||||||
17
spec/unit/generator/generator_generation_spec.rb
Normal file
17
spec/unit/generator/generator_generation_spec.rb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module GitHubChangelogGenerator
|
||||||
|
describe Generator do
|
||||||
|
describe "#get_string_for_issue" do
|
||||||
|
let(:issue) do
|
||||||
|
{ "title" => "Bug in code" }
|
||||||
|
end
|
||||||
|
|
||||||
|
it "formats an issue according to options" do
|
||||||
|
expect do
|
||||||
|
described_class.new.get_string_for_issue(issue)
|
||||||
|
end.not_to raise_error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,19 +1,32 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
describe Generator do
|
describe Generator do
|
||||||
context "#exclude_issues_by_labels" do
|
let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
|
||||||
let(:label) { { "name" => "BAD" } }
|
let(:options) { {} }
|
||||||
let(:issue) { { "labels" => [label] } }
|
let(:generator) { described_class.new(default_options.merge(options)) }
|
||||||
let(:good_label) { { "name" => "GOOD" } }
|
|
||||||
let(:good_issue) { { "labels" => [good_label] } }
|
|
||||||
let(:issues) { [issue, good_issue] }
|
|
||||||
subject(:generator) { described_class.new(exclude_labels: %w(BAD BOO)) }
|
|
||||||
|
|
||||||
it "removes issues with labels in the exclude_label list" do
|
let(:bad_label) { { "name" => "BAD" } }
|
||||||
result = generator.exclude_issues_by_labels(issues)
|
let(:bad_issue) { { "labels" => [bad_label] } }
|
||||||
|
let(:good_label) { { "name" => "GOOD" } }
|
||||||
|
let(:good_issue) { { "labels" => [good_label] } }
|
||||||
|
let(:unlabeled_issue) { { "labels" => [] } }
|
||||||
|
let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
|
||||||
|
|
||||||
expect(result).to include(good_issue)
|
describe "#exclude_issues_by_labels" do
|
||||||
expect(result).not_to include(issue)
|
subject do
|
||||||
|
generator.exclude_issues_by_labels(issues)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:expected_issues) { issues }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
|
||||||
|
context "when 'exclude_lables' is provided" do
|
||||||
|
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
||||||
|
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with no option given" do
|
context "with no option given" do
|
||||||
@@ -25,5 +38,43 @@ module GitHubChangelogGenerator
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#get_filtered_issues" do
|
||||||
|
subject do
|
||||||
|
generator.get_filtered_issues(issues)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:expected_issues) { issues }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
|
||||||
|
context "when 'exclude_labels' is provided" do
|
||||||
|
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
||||||
|
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when 'add_issues_wo_labels' is false" do
|
||||||
|
let(:options) { { add_issues_wo_labels: false } }
|
||||||
|
let(:expected_issues) { [bad_issue, good_issue] }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
|
||||||
|
context "with 'exclude_labels'" do
|
||||||
|
let(:options) { { add_issues_wo_labels: false, exclude_labels: %w[GOOD] } }
|
||||||
|
let(:expected_issues) { [bad_issue] }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when 'include_labels' is specified" do
|
||||||
|
let(:options) { { include_labels: %w[GOOD] } }
|
||||||
|
let(:expected_issues) { [good_issue] }
|
||||||
|
|
||||||
|
it { is_expected.to eq(expected_issues) }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
describe GitHubChangelogGenerator::Generator do
|
describe GitHubChangelogGenerator::Generator do
|
||||||
def tag_with_name(tag)
|
def tag_with_name(tag)
|
||||||
{
|
{
|
||||||
@@ -12,174 +13,231 @@ describe GitHubChangelogGenerator::Generator do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#filter_between_tags" do
|
describe "#tag_section_mapping" do
|
||||||
context "when between_tags nil" do
|
let(:all_tags) { tags_from_strings(%w[8 7 6 5 4 3 2 1]) }
|
||||||
before do
|
let(:sorted_tags) { all_tags }
|
||||||
@generator = GitHubChangelogGenerator::Generator.new(between_tags: nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
subject do
|
let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
|
||||||
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
|
let(:options) { {} }
|
||||||
end
|
let(:generator) { described_class.new(default_options.merge(options)) }
|
||||||
it { is_expected.to be_a(Array) }
|
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
before do
|
||||||
end
|
allow_any_instance_of(GitHubChangelogGenerator::OctoFetcher).to receive(:get_all_tags).and_return(all_tags)
|
||||||
context "when between_tags same as input array" do
|
allow(generator).to receive(:fetch_tags_dates).with(all_tags)
|
||||||
before do
|
allow(generator).to receive(:sort_tags_by_date).with(all_tags).and_return(sorted_tags)
|
||||||
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3))
|
generator.fetch_and_filter_tags
|
||||||
end
|
|
||||||
subject do
|
|
||||||
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
|
|
||||||
end
|
|
||||||
it { is_expected.to be_a(Array) }
|
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when between_tags filled with correct values" do
|
|
||||||
before do
|
|
||||||
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2))
|
|
||||||
end
|
|
||||||
subject do
|
|
||||||
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
|
|
||||||
end
|
|
||||||
it { is_expected.to be_a(Array) }
|
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2))) }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when between_tags filled with invalid values" do
|
|
||||||
before do
|
|
||||||
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 q w))
|
|
||||||
end
|
|
||||||
|
|
||||||
subject do
|
|
||||||
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
|
|
||||||
end
|
|
||||||
it { is_expected.to be_a(Array) }
|
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1))) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "#get_filtered_tags" do
|
|
||||||
subject do
|
subject do
|
||||||
generator.get_filtered_tags(tags_from_strings(%w(1 2 3 4 5)))
|
generator.tag_section_mapping
|
||||||
end
|
end
|
||||||
|
|
||||||
context "respects between tags" do
|
shared_examples_for "a section mapping" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3)) }
|
it { is_expected.to be_a(Hash) }
|
||||||
|
it { is_expected.to eq(expected_mapping) }
|
||||||
|
end
|
||||||
|
|
||||||
it { is_expected.to be_a Array }
|
shared_examples_for "a full changelog" do
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
let(:expected_mapping) do
|
||||||
|
{
|
||||||
|
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
|
||||||
|
tag_with_name("7") => [tag_with_name("6"), tag_with_name("7")],
|
||||||
|
tag_with_name("6") => [tag_with_name("5"), tag_with_name("6")],
|
||||||
|
tag_with_name("5") => [tag_with_name("4"), tag_with_name("5")],
|
||||||
|
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
|
||||||
|
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
|
||||||
|
tag_with_name("2") => [tag_with_name("1"), tag_with_name("2")],
|
||||||
|
tag_with_name("1") => [nil, tag_with_name("1")]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a section mapping"
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples_for "a changelog with some exclusions" do
|
||||||
|
let(:expected_mapping) do
|
||||||
|
{
|
||||||
|
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
|
||||||
|
tag_with_name("6") => [tag_with_name("5"), tag_with_name("6")],
|
||||||
|
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
|
||||||
|
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
|
||||||
|
tag_with_name("1") => [nil, tag_with_name("1")]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a section mapping"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with no constraints" do
|
||||||
|
it_behaves_like "a full changelog"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with since only" do
|
||||||
|
let(:options) { { since_tag: "6" } }
|
||||||
|
let(:expected_mapping) do
|
||||||
|
{
|
||||||
|
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
|
||||||
|
tag_with_name("7") => [tag_with_name("6"), tag_with_name("7")]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a section mapping"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with due only" do
|
||||||
|
let(:options) { { due_tag: "4" } }
|
||||||
|
let(:expected_mapping) do
|
||||||
|
{
|
||||||
|
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
|
||||||
|
tag_with_name("2") => [tag_with_name("1"), tag_with_name("2")],
|
||||||
|
tag_with_name("1") => [nil, tag_with_name("1")]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a section mapping"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with since and due" do
|
||||||
|
let(:options) { { since_tag: "2", due_tag: "5" } }
|
||||||
|
let(:expected_mapping) do
|
||||||
|
{
|
||||||
|
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
|
||||||
|
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a section mapping"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with excluded tags" do
|
||||||
|
context "as a list of strings" do
|
||||||
|
let(:options) { { exclude_tags: %w[2 5 7] } }
|
||||||
|
|
||||||
|
it_behaves_like "a changelog with some exclusions"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "as a regex" do
|
||||||
|
let(:options) { { exclude_tags: /[257]/ } }
|
||||||
|
|
||||||
|
it_behaves_like "a changelog with some exclusions"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "as a regex string" do
|
||||||
|
let(:options) { { exclude_tags_regex: "[257]" } }
|
||||||
|
|
||||||
|
it_behaves_like "a changelog with some exclusions"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#filter_excluded_tags" do
|
describe "#filter_excluded_tags" do
|
||||||
subject { generator.filter_excluded_tags(tags_from_strings(%w(1 2 3))) }
|
subject { generator.filter_excluded_tags(tags_from_strings(%w[1 2 3])) }
|
||||||
|
|
||||||
context "with matching string" do
|
context "with matching string" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(3)) }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w[3]) }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with non-matching string" do
|
context "with non-matching string" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(invalid tags)) }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w[invalid tags]) }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with matching regex" do
|
context "with matching regex" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with non-matching regex" do
|
context "with non-matching regex" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#filter_excluded_tags_regex" do
|
describe "#filter_excluded_tags_regex" do
|
||||||
subject { generator.filter_excluded_tags(tags_from_strings(%w(1 2 3))) }
|
subject { generator.filter_excluded_tags(tags_from_strings(%w[1 2 3])) }
|
||||||
|
|
||||||
context "with matching regex" do
|
context "with matching regex" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[23]") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[23]") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with non-matching regex" do
|
context "with non-matching regex" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[45]") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[45]") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#filter_since_tag" do
|
describe "#filter_since_tag" do
|
||||||
context "with filled array" do
|
context "with filled array" do
|
||||||
subject { generator.filter_since_tag(tags_from_strings(%w(1 2 3))) }
|
subject { generator.filter_since_tag(tags_from_strings(%w[1 2 3])) }
|
||||||
|
|
||||||
context "with valid since tag" do
|
context "with valid since tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with invalid since tag" do
|
context "with invalid since tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with empty array" do
|
context "with empty array" do
|
||||||
subject { generator.filter_since_tag(tags_from_strings(%w())) }
|
subject { generator.filter_since_tag(tags_from_strings(%w[])) }
|
||||||
|
|
||||||
context "with valid since tag" do
|
context "with valid since tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w())) }
|
it { is_expected.to match_array(tags_from_strings(%w[])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with invalid since tag" do
|
context "with invalid since tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w())) }
|
it { is_expected.to match_array(tags_from_strings(%w[])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#filter_due_tag" do
|
describe "#filter_due_tag" do
|
||||||
context "with filled array" do
|
context "with filled array" do
|
||||||
subject { generator.filter_due_tag(tags_from_strings(%w(1 2 3))) }
|
subject { generator.filter_due_tag(tags_from_strings(%w[1 2 3])) }
|
||||||
|
|
||||||
context "with valid due tag" do
|
context "with valid due tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[3])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with invalid due tag" do
|
context "with invalid due tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
|
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with empty array" do
|
context "with empty array" do
|
||||||
subject { generator.filter_due_tag(tags_from_strings(%w())) }
|
subject { generator.filter_due_tag(tags_from_strings(%w[])) }
|
||||||
|
|
||||||
context "with valid due tag" do
|
context "with valid due tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w())) }
|
it { is_expected.to match_array(tags_from_strings(%w[])) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with invalid due tag" do
|
context "with invalid due tag" do
|
||||||
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
|
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
|
||||||
it { is_expected.to be_a Array }
|
it { is_expected.to be_a Array }
|
||||||
it { is_expected.to match_array(tags_from_strings(%w())) }
|
it { is_expected.to match_array(tags_from_strings(%w[])) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -232,13 +290,13 @@ describe GitHubChangelogGenerator::Generator do
|
|||||||
@generator.sort_tags_by_date(tags)
|
@generator.sort_tags_by_date(tags)
|
||||||
end
|
end
|
||||||
context "sort unsorted tags" do
|
context "sort unsorted tags" do
|
||||||
let(:tags) { tags_from_strings %w(valid_tag1 valid_tag2 valid_tag3) }
|
let(:tags) { tags_from_strings %w[valid_tag1 valid_tag2 valid_tag3] }
|
||||||
|
|
||||||
it { is_expected.to be_a_kind_of(Array) }
|
it { is_expected.to be_a_kind_of(Array) }
|
||||||
it { is_expected.to match_array(tags.reverse!) }
|
it { is_expected.to match_array(tags.reverse!) }
|
||||||
end
|
end
|
||||||
context "sort sorted tags" do
|
context "sort sorted tags" do
|
||||||
let(:tags) { tags_from_strings %w(valid_tag3 valid_tag2 valid_tag1) }
|
let(:tags) { tags_from_strings %w[valid_tag3 valid_tag2 valid_tag1] }
|
||||||
|
|
||||||
it { is_expected.to be_a_kind_of(Array) }
|
it { is_expected.to be_a_kind_of(Array) }
|
||||||
it { is_expected.to match_array(tags) }
|
it { is_expected.to match_array(tags) }
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
VALID_TOKEN = "0123456789abcdef"
|
VALID_TOKEN = "0123456789abcdef"
|
||||||
INVALID_TOKEN = "0000000000000000"
|
INVALID_TOKEN = "0000000000000000"
|
||||||
|
|
||||||
@@ -299,7 +300,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
|
|||||||
pull_requests = fetcher.fetch_closed_pull_requests
|
pull_requests = fetcher.fetch_closed_pull_requests
|
||||||
|
|
||||||
pr = pull_requests.first
|
pr = pull_requests.first
|
||||||
expect(pr.keys).to eq(%w(url id html_url diff_url patch_url issue_url number state locked title user body created_at updated_at closed_at merged_at merge_commit_sha assignee assignees milestone commits_url review_comments_url review_comment_url comments_url statuses_url head base _links))
|
expect(pr.keys).to eq(%w[url id html_url diff_url patch_url issue_url number state locked title user body created_at updated_at closed_at merged_at merge_commit_sha assignee assignees milestone commits_url review_comments_url review_comment_url comments_url statuses_url head base _links])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -500,7 +501,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
|
|||||||
commit = fetcher.fetch_commit(event)
|
commit = fetcher.fetch_commit(event)
|
||||||
|
|
||||||
expectations = [
|
expectations = [
|
||||||
%w(sha decfe840d1a1b86e0c28700de5362d3365a29555),
|
%w[sha decfe840d1a1b86e0c28700de5362d3365a29555],
|
||||||
["url",
|
["url",
|
||||||
"https://api.github.com/repos/skywinder/changelog_test/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
|
"https://api.github.com/repos/skywinder/changelog_test/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
|
||||||
# OLD API: "https://api.github.com/repos/skywinder/changelog_test/git/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
|
# OLD API: "https://api.github.com/repos/skywinder/changelog_test/git/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
|
||||||
@@ -525,4 +526,18 @@ describe GitHubChangelogGenerator::OctoFetcher do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#commits_before" do
|
||||||
|
context "when API is valid", :vcr do
|
||||||
|
let(:start_time) { Time.parse("Wed Mar 4 18:47:17 2015 +0200") }
|
||||||
|
|
||||||
|
subject do
|
||||||
|
fetcher.commits_before(start_time)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns commits" do
|
||||||
|
expect(subject.last["sha"]).to eq("4c2d6d1ed58bdb24b870dcb5d9f2ceed0283d69d")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
RSpec.describe GitHubChangelogGenerator::Options do
|
RSpec.describe GitHubChangelogGenerator::Options do
|
||||||
describe "#initialize" do
|
describe "#initialize" do
|
||||||
context "with known options" do
|
context "with known options" do
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
describe GitHubChangelogGenerator::ParserFile do
|
describe GitHubChangelogGenerator::ParserFile do
|
||||||
describe ".github_changelog_generator" do
|
describe ".github_changelog_generator" do
|
||||||
let(:options) { {} }
|
let(:options) { {} }
|
||||||
@@ -13,7 +14,7 @@ describe GitHubChangelogGenerator::ParserFile do
|
|||||||
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, StringIO.new("")) }
|
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, StringIO.new("")) }
|
||||||
|
|
||||||
it "does not change the options" do
|
it "does not change the options" do
|
||||||
expect { parser.parse! }.to_not change { options }
|
expect { parser.parse! }.to_not(change { options })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -51,12 +52,11 @@ describe GitHubChangelogGenerator::ParserFile do
|
|||||||
|
|
||||||
context "turns exclude-labels into an Array", bug: "#327" do
|
context "turns exclude-labels into an Array", bug: "#327" do
|
||||||
let(:file) do
|
let(:file) do
|
||||||
StringIO.new(<<EOF
|
line1 = "exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90\n"
|
||||||
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90
|
line2 = "header_label=# My changelog\n"
|
||||||
header_label=# My changelog
|
StringIO.new(line1 + line2)
|
||||||
EOF
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "reads exclude_labels into an Array" do
|
it "reads exclude_labels into an Array" do
|
||||||
expect { parser.parse! }.to change { options[:exclude_labels] }
|
expect { parser.parse! }.to change { options[:exclude_labels] }
|
||||||
.from(default_options[:exclude_labels])
|
.from(default_options[:exclude_labels])
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
describe GitHubChangelogGenerator::Parser do
|
describe GitHubChangelogGenerator::Parser do
|
||||||
describe ".user_project_from_remote" do
|
describe ".user_project_from_remote" do
|
||||||
context "when remote is type 1" do
|
context "when remote is type 1" do
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
#
|
#
|
||||||
# Author:: Enrico Stahn <mail@enricostahn.com>
|
# Author:: Enrico Stahn <mail@enricostahn.com>
|
||||||
#
|
#
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user