Compare commits

...

85 Commits

Author SHA1 Message Date
Petr Korolev
8941eb8280 Merge branch 'master' into abonas-fixComparingPRByMergedAtField 2015-08-24 12:57:59 +03:00
Petr Korolev
905a04fb75 update changelog 2015-08-24 12:57:33 +03:00
Alissa Bonas
30b7f39c40 Fix comparing pull requests between tags by merged_at field instead of actual_date field 2015-08-23 18:08:07 +03:00
Petr Korolev
4aa9c61520 Merge pull request #259 from raphink/dev/release_url
Add release_url option
2015-08-09 17:08:52 +03:00
Petr Korolev
f49949147c Merge pull request #260 from raphink/dev/rake_task
Add a rake task
2015-08-09 17:06:32 +03:00
Raphaël Pinson
4856a3c8e9 Add release_url option 2015-08-05 10:31:16 +02:00
Raphaël Pinson
5d9b44eac3 Add a rake task 2015-08-05 10:26:29 +02:00
Petr Korolev
295cfbc767 Merge pull request #257 from raphink/dev/since_tag
Add --since-tag, close
2015-08-04 18:42:03 +03:00
Raphaël Pinson
32f4df5742 Add --since-tag option
Fix #254
2015-08-04 16:15:33 +02:00
Raphaël Pinson
0190d417c2 Typo 2015-08-04 14:56:39 +02:00
Petr Korolev
b74b457ad0 Merge branch 'hotfix/update-changelog' 2015-07-16 17:26:52 +03:00
Petr Korolev
83cc36959a update 2015-07-16 17:25:32 +03:00
Petr Korolev
2dbf975c06 Update changelog for version 1.7.0 2015-07-16 17:23:52 +03:00
Petr Korolev
d081130e3e Merge branch 'release/1.7.0' 2015-07-16 17:22:58 +03:00
Petr Korolev
016f5e690c Update gemspec to version 1.7.0 2015-07-16 17:22:56 +03:00
Petr Korolev
925012049f bundle update 2015-07-16 17:18:36 +03:00
Petr Korolev
b9593f7c70 update versions 2015-07-16 17:18:03 +03:00
Petr Korolev
e6d80b0cf0 update gemfile 2015-07-16 17:04:50 +03:00
Petr Korolev
a4a6e6dedb bundler update 2015-07-16 16:37:50 +03:00
Petr Korolev
f215694ffb update chanhelog 2015-07-16 15:32:02 +03:00
Petr Korolev
68a045da22 fix: fix help message 2015-07-16 15:29:17 +03:00
Petr Korolev
e274f9992a fix #251 2015-07-16 14:47:01 +03:00
Petr Korolev
4de98a7d16 fix #242 2015-07-16 14:36:25 +03:00
Petr Korolev
d21651776c fix for #242 2015-07-16 14:32:11 +03:00
Petr Korolev
77d86b1e91 Merge branch 'hotfix/update-changelog' into develop 2015-07-16 12:30:15 +03:00
Petr Korolev
cb4533abf7 Merge branch 'hotfix/update-changelog' 2015-07-16 12:30:14 +03:00
Petr Korolev
df47a88b47 Update changelog for version 1.6.2 2015-07-16 12:30:13 +03:00
Petr Korolev
8c6b783d6c Merge branch 'release/1.6.2' into develop 2015-07-16 12:29:27 +03:00
Petr Korolev
9e84bfbabf Merge branch 'release/1.6.2' 2015-07-16 12:29:26 +03:00
Petr Korolev
57b33ae6b9 Update gemspec to version 1.6.2 2015-07-16 12:29:24 +03:00
Petr Korolev
36346b5fc6 Fix #250 2015-07-16 12:24:43 +03:00
Petr Korolev
f24780eb19 add direct link for token generation 2015-06-15 16:56:48 +03:00
Petr Korolev
f77f90a750 Merge branch 'hotfix/update-changelog' into develop 2015-06-12 11:42:58 +03:00
Petr Korolev
d33994d595 Merge branch 'hotfix/update-changelog' 2015-06-12 11:42:57 +03:00
Petr Korolev
b6f86a8cb6 Update changelog for version 1.6.1 2015-06-12 11:42:56 +03:00
Petr Korolev
5cd87a44a6 Merge branch 'release/1.6.1' into develop 2015-06-12 11:42:04 +03:00
Petr Korolev
243f0cf292 Merge branch 'release/1.6.1' 2015-06-12 11:42:04 +03:00
Petr Korolev
fee976df22 Update gemspec to version 1.6.1 2015-06-12 11:42:02 +03:00
Petr Korolev
e735683eaf Merge branch 'feature/fix-241' into develop 2015-06-12 11:37:43 +03:00
Petr Korolev
4f21ae7768 Add 3 new options. Fix #241. 2015-06-12 11:37:25 +03:00
Petr Korolev
c480075e8e Merge branch 'develop' into feature/fix-241 2015-06-12 11:09:49 +03:00
Petr Korolev
268a8f39b6 update readme move params explanation to Wiki page 2015-06-12 11:08:45 +03:00
Petr Korolev
1fa1cccd2a update change log 2015-06-12 10:04:14 +03:00
Petr Korolev
adab012de4 fix: fix crash when github api rate exceeded 2015-06-12 10:03:47 +03:00
Petr Korolev
e114901157 Merge branch 'master' into develop 2015-06-12 09:39:03 +03:00
Petr Korolev
6c6116381b add < to encaprulated characters. fix #249 2015-06-12 09:34:27 +03:00
Petr Korolev
f527cfff67 fix: multiple printing of "Fetching closed dates for issues: Done!"
string
2015-06-12 09:16:23 +03:00
Petr Korolev
92496f7c72 Merge branch 'hotfix/update-changelog' into develop 2015-06-11 16:49:29 +03:00
Petr Korolev
082210f49b Merge branch 'hotfix/update-changelog' 2015-06-11 16:49:26 +03:00
Petr Korolev
dc67089c21 Update changelog for version 1.6.0 2015-06-11 16:49:25 +03:00
Petr Korolev
865ddbcacd Merge branch 'release/1.6.0' into develop 2015-06-11 16:44:45 +03:00
Petr Korolev
9f2fb5f56c Merge branch 'release/1.6.0' 2015-06-11 16:44:45 +03:00
Petr Korolev
44ce94d7a8 Update gemspec to version 1.6.0 2015-06-11 16:44:43 +03:00
Petr Korolev
67ea3159cd add capital words for exclude labels 2015-06-11 16:44:33 +03:00
Petr Korolev
80a5fdef0c This fixes #54. And fix #240 also. 2015-06-11 16:44:33 +03:00
Petr Korolev
f7e9199841 Fix #246 2015-06-11 16:10:13 +03:00
Petr Korolev
19eb03c54e Add tests to verify sorting algorithm #244 2015-06-11 15:57:32 +03:00
Petr Korolev
22d1657fd4 Merge branch 'master' into develop 2015-06-11 13:09:59 +03:00
Petr Korolev
6fdcc0c61d fix #245 2015-06-11 13:09:26 +03:00
Petr Korolev
dac3be9f7d update test, between tags. 2015-06-11 13:09:26 +03:00
Petr Korolev
9f1537ab34 add test case 2015-06-11 13:09:04 +03:00
Petr Korolev
9055792021 Merge pull request #248 from dasilvacontin/master
fix guidlines typo in README.md
2015-06-11 12:18:36 +03:00
David da Silva Contin
9720c96b8c fix guidlines typo in README.md 2015-06-11 11:08:24 +02:00
Petr Korolev
8906fe5022 refactoring 2015-06-10 16:49:06 +03:00
Petr Korolev
a415010e86 change internal logic 2015-06-10 14:37:26 +03:00
Petr Korolev
67fbb04b31 add documentation 2015-06-10 14:19:53 +03:00
Petr Korolev
ff6115247e Move logging to separate class, disable logging during test execution. 2015-06-10 13:27:27 +03:00
Petr Korolev
a0cf2f54ee Merge branch 'master' into develop 2015-06-10 13:26:58 +03:00
Petr Korolev
0c8010d854 Merge branch 'hotfix/245' 2015-06-10 13:26:13 +03:00
Petr Korolev
9b46d56a9e fix #245 2015-06-10 13:23:46 +03:00
Petr Korolev
c3867a89f1 update test, between tags. 2015-06-10 10:24:39 +03:00
Petr Korolev
5cc3a7c8fd Merge branch 'hotfix/update-changelog' into develop 2015-05-26 16:08:00 +03:00
Petr Korolev
160cda50bc Merge branch 'hotfix/update-changelog' 2015-05-26 16:07:59 +03:00
Petr Korolev
8e090022f0 Update changelog for version 1.5.0 2015-05-26 16:07:57 +03:00
Petr Korolev
a94834d57e Merge branch 'release/1.5.0' into develop 2015-05-26 16:06:55 +03:00
Petr Korolev
a2b23e0f69 Merge branch 'release/1.5.0' 2015-05-26 16:06:54 +03:00
Petr Korolev
f0a22f0378 Update gemspec to version 1.5.0 2015-05-26 16:06:51 +03:00
Petr Korolev
28c81fa487 update readme 2015-05-26 16:06:37 +03:00
Petr Korolev
783d8f306e Resolved #214. Added tests for this case. small refacroting 2015-05-26 16:06:37 +03:00
Petr Korolev
957fa0d3a3 refuct 2015-05-26 16:06:37 +03:00
Petr Korolev
f498e673d1 cleanup 2015-05-26 16:06:37 +03:00
Petr Korolev
7e941990c4 fix tests 2015-05-26 16:06:37 +03:00
Petr Korolev
6f82741154 add tests 2015-05-26 16:06:37 +03:00
Petr Korolev
b9e7463c3e fix #172 2015-05-26 16:06:37 +03:00
Petr Korolev
b06bb635ed fix log 2015-05-26 16:06:37 +03:00
23 changed files with 750 additions and 502 deletions

View File

@@ -6,3 +6,11 @@ Metrics/LineLength:
#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
# Configuration parameters: CountComments.
Metrics/ClassLength:
Enabled: false
# Configuration parameters: CountComments.
Metrics/MethodLength:
Enabled: false

View File

@@ -1,37 +1,27 @@
# This configuration was generated by `rubocop --auto-gen-config` # This configuration was generated by `rubocop --auto-gen-config`
# on 2015-05-25 12:59:32 +0300 using RuboCop version 0.31.0. # on 2015-07-16 14:46:25 +0300 using RuboCop version 0.31.0.
# The point is for the user to remove these configuration records # The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base. # one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again. # versions of RuboCop, may require this file to be generated again.
# Offense count: 16 # Offense count: 13
Metrics/AbcSize: Metrics/AbcSize:
Max: 68
# Offense count: 4
# Configuration parameters: CountComments.
Metrics/ClassLength:
Enabled: false Enabled: false
# Offense count: 3 # Offense count: 1
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Max: 9 Max: 7
# Offense count: 22 # Offense count: 1
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 117
# Offense count: 4
Metrics/PerceivedComplexity: Metrics/PerceivedComplexity:
Max: 12 Max: 8
# Offense count: 2 # Offense count: 2
Style/AccessorMethodName: Style/AccessorMethodName:
Enabled: false Enabled: false
# Offense count: 6 # Offense count: 10
Style/Documentation: Style/Documentation:
Enabled: false Enabled: false

View File

@@ -1,7 +1,69 @@
# Change Log # Change Log
## [1.4.1](https://github.com/skywinder/github-changelog-generator/tree/1.4.1) (2015-05-19) ## [Unreleased](https://github.com/skywinder/github-changelog-generator/tree/HEAD)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.7.0...HEAD)
**Merged pull requests:**
- Add a rake task [\#260](https://github.com/skywinder/github-changelog-generator/pull/260) ([raphink](https://github.com/raphink))
- Add release\_url option [\#259](https://github.com/skywinder/github-changelog-generator/pull/259) ([raphink](https://github.com/raphink))
- Add --since-tag, close [\#257](https://github.com/skywinder/github-changelog-generator/pull/257) ([raphink](https://github.com/raphink))
## [1.7.0](https://github.com/skywinder/github-changelog-generator/tree/1.7.0) (2015-07-16)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.6.2...1.7.0)
**Implemented enhancements:**
- Custom header [\#251](https://github.com/skywinder/github-changelog-generator/issues/251)
- Arbitrary templates [\#242](https://github.com/skywinder/github-changelog-generator/issues/242)
## [1.6.2](https://github.com/skywinder/github-changelog-generator/tree/1.6.2) (2015-07-16)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.6.1...1.6.2)
**Fixed bugs:**
- --unreleased-only broken [\#250](https://github.com/skywinder/github-changelog-generator/issues/250)
## [1.6.1](https://github.com/skywinder/github-changelog-generator/tree/1.6.1) (2015-06-12)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.6.0...1.6.1)
**Implemented enhancements:**
- Ability to specify custom section header [\#241](https://github.com/skywinder/github-changelog-generator/issues/241)
**Fixed bugs:**
- not encapsulated character `\<` [\#249](https://github.com/skywinder/github-changelog-generator/issues/249)
## [1.6.0](https://github.com/skywinder/github-changelog-generator/tree/1.6.0) (2015-06-11)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.5.0...1.6.0)
**Implemented enhancements:**
- Issues with any label except "bug", "enhancement" should not be excluded by default. [\#240](https://github.com/skywinder/github-changelog-generator/issues/240)
- Add ability to specify custom labels for enhancements & bugfixes [\#54](https://github.com/skywinder/github-changelog-generator/issues/54)
**Fixed bugs:**
- --user and --project options are broken [\#246](https://github.com/skywinder/github-changelog-generator/issues/246)
- Exclude and Include tags is broken [\#245](https://github.com/skywinder/github-changelog-generator/issues/245)
## [1.5.0](https://github.com/skywinder/github-changelog-generator/tree/1.5.0) (2015-05-26)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.4.1...1.5.0)
**Implemented enhancements:**
- Show `Unreleased` section even when there is no tags in repo. [\#228](https://github.com/skywinder/github-changelog-generator/issues/228)
- Add option `--exclude-tags x,y,z` [\#214](https://github.com/skywinder/github-changelog-generator/issues/214)
- Generate change log between 2 specific tags [\#172](https://github.com/skywinder/github-changelog-generator/issues/172)
- Yanked releases support [\#53](https://github.com/skywinder/github-changelog-generator/issues/53)
**Merged pull requests:**
- Big refactoring [\#243](https://github.com/skywinder/github-changelog-generator/pull/243) ([skywinder](https://github.com/skywinder))
## [1.4.1](https://github.com/skywinder/github-changelog-generator/tree/1.4.1) (2015-05-19)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.4.0...1.4.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.4.0...1.4.1)
**Implemented enhancements:** **Implemented enhancements:**
@@ -11,27 +73,21 @@
**Fixed bugs:** **Fixed bugs:**
- github\_changelog\_generator.rb:220:in ``': No such file or directory - pwd \(Errno::ENOENT\) [\#237](https://github.com/skywinder/github-changelog-generator/issues/237) - github\_changelog\_generator.rb:220:in ``': No such file or directory - pwd \(Errno::ENOENT\) [\#237](https://github.com/skywinder/github-changelog-generator/issues/237)
- Doesnot generator changelog [\#235](https://github.com/skywinder/github-changelog-generator/issues/235) - Doesnot generator changelog [\#235](https://github.com/skywinder/github-changelog-generator/issues/235)
- Exclude closed \(not merged\) PR's from changelog. [\#69](https://github.com/skywinder/github-changelog-generator/issues/69) - Exclude closed \(not merged\) PR's from changelog. [\#69](https://github.com/skywinder/github-changelog-generator/issues/69)
**Merged pull requests:** **Merged pull requests:**
- Wrap GitHub requests in function check\_github\_response [\#238](https://github.com/skywinder/github-changelog-generator/pull/238) ([skywinder](https://github.com/skywinder)) - Wrap GitHub requests in function check\_github\_response [\#238](https://github.com/skywinder/github-changelog-generator/pull/238) ([skywinder](https://github.com/skywinder))
- Add fetch token tests [\#236](https://github.com/skywinder/github-changelog-generator/pull/236) ([skywinder](https://github.com/skywinder)) - Add fetch token tests [\#236](https://github.com/skywinder/github-changelog-generator/pull/236) ([skywinder](https://github.com/skywinder))
- Add future release option [\#231](https://github.com/skywinder/github-changelog-generator/pull/231) ([sildur](https://github.com/sildur)) - Add future release option [\#231](https://github.com/skywinder/github-changelog-generator/pull/231) ([sildur](https://github.com/sildur))
## [1.4.0](https://github.com/skywinder/github-changelog-generator/tree/1.4.0) (2015-05-07) ## [1.4.0](https://github.com/skywinder/github-changelog-generator/tree/1.4.0) (2015-05-07)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.11...1.4.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.11...1.4.0)
**Implemented enhancements:** **Implemented enhancements:**
- Parsing of existing Change Log file [\#212](https://github.com/skywinder/github-changelog-generator/issues/212) - Parsing of existing Change Log file [\#212](https://github.com/skywinder/github-changelog-generator/issues/212)
- Warn users about 0 tags in repo. [\#208](https://github.com/skywinder/github-changelog-generator/issues/208) - Warn users about 0 tags in repo. [\#208](https://github.com/skywinder/github-changelog-generator/issues/208)
**Closed issues:** **Closed issues:**
@@ -40,22 +96,15 @@
**Merged pull requests:** **Merged pull requests:**
- Cleanup [\#220](https://github.com/skywinder/github-changelog-generator/pull/220) ([tuexss](https://github.com/tuexss))
- Implement fetcher class [\#227](https://github.com/skywinder/github-changelog-generator/pull/227) ([skywinder](https://github.com/skywinder)) - Implement fetcher class [\#227](https://github.com/skywinder/github-changelog-generator/pull/227) ([skywinder](https://github.com/skywinder))
- Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) ([skywinder](https://github.com/skywinder)) - Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) ([skywinder](https://github.com/skywinder))
- Cleanup [\#220](https://github.com/skywinder/github-changelog-generator/pull/220) ([tuexss](https://github.com/tuexss))
- Rspec & rubocop integration [\#217](https://github.com/skywinder/github-changelog-generator/pull/217) ([skywinder](https://github.com/skywinder)) - Rspec & rubocop integration [\#217](https://github.com/skywinder/github-changelog-generator/pull/217) ([skywinder](https://github.com/skywinder))
- Implement Reader class to parse ChangeLog.md [\#216](https://github.com/skywinder/github-changelog-generator/pull/216) ([estahn](https://github.com/estahn)) - Implement Reader class to parse ChangeLog.md [\#216](https://github.com/skywinder/github-changelog-generator/pull/216) ([estahn](https://github.com/estahn))
- Relatively require github\_changelog\_generator library [\#207](https://github.com/skywinder/github-changelog-generator/pull/207) ([sneal](https://github.com/sneal)) - Relatively require github\_changelog\_generator library [\#207](https://github.com/skywinder/github-changelog-generator/pull/207) ([sneal](https://github.com/sneal))
- Add --max-issues argument to limit requests [\#76](https://github.com/skywinder/github-changelog-generator/pull/76) ([sneal](https://github.com/sneal)) - Add --max-issues argument to limit requests [\#76](https://github.com/skywinder/github-changelog-generator/pull/76) ([sneal](https://github.com/sneal))
## [1.3.11](https://github.com/skywinder/github-changelog-generator/tree/1.3.11) (2015-03-21) ## [1.3.11](https://github.com/skywinder/github-changelog-generator/tree/1.3.11) (2015-03-21)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.10...1.3.11) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.10...1.3.11)
**Merged pull requests:** **Merged pull requests:**
@@ -63,7 +112,6 @@
- Add fallback with warning message to prevent crash in case of exceed API Rate Limit \(temporary workaround for \#71\) [\#75](https://github.com/skywinder/github-changelog-generator/pull/75) ([skywinder](https://github.com/skywinder)) - Add fallback with warning message to prevent crash in case of exceed API Rate Limit \(temporary workaround for \#71\) [\#75](https://github.com/skywinder/github-changelog-generator/pull/75) ([skywinder](https://github.com/skywinder))
## [1.3.10](https://github.com/skywinder/github-changelog-generator/tree/1.3.10) (2015-03-18) ## [1.3.10](https://github.com/skywinder/github-changelog-generator/tree/1.3.10) (2015-03-18)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.9...1.3.10) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.9...1.3.10)
**Merged pull requests:** **Merged pull requests:**
@@ -71,7 +119,6 @@
- Fix termination in case of empty unreleased section with `--unreleased-only` option. [\#70](https://github.com/skywinder/github-changelog-generator/pull/70) ([skywinder](https://github.com/skywinder)) - Fix termination in case of empty unreleased section with `--unreleased-only` option. [\#70](https://github.com/skywinder/github-changelog-generator/pull/70) ([skywinder](https://github.com/skywinder))
## [1.3.9](https://github.com/skywinder/github-changelog-generator/tree/1.3.9) (2015-03-06) ## [1.3.9](https://github.com/skywinder/github-changelog-generator/tree/1.3.9) (2015-03-06)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.8...1.3.9) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.8...1.3.9)
**Implemented enhancements:** **Implemented enhancements:**
@@ -83,15 +130,12 @@
- Resolved concurrency problem in case of issues \> 2048 [\#65](https://github.com/skywinder/github-changelog-generator/pull/65) ([skywinder](https://github.com/skywinder)) - Resolved concurrency problem in case of issues \> 2048 [\#65](https://github.com/skywinder/github-changelog-generator/pull/65) ([skywinder](https://github.com/skywinder))
## [1.3.8](https://github.com/skywinder/github-changelog-generator/tree/1.3.8) (2015-03-05) ## [1.3.8](https://github.com/skywinder/github-changelog-generator/tree/1.3.8) (2015-03-05)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.6...1.3.8) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.6...1.3.8)
## [1.3.6](https://github.com/skywinder/github-changelog-generator/tree/1.3.6) (2015-03-05) ## [1.3.6](https://github.com/skywinder/github-changelog-generator/tree/1.3.6) (2015-03-05)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.5...1.3.6) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.5...1.3.6)
## [1.3.5](https://github.com/skywinder/github-changelog-generator/tree/1.3.5) (2015-03-04) ## [1.3.5](https://github.com/skywinder/github-changelog-generator/tree/1.3.5) (2015-03-04)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.4...1.3.5) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.4...1.3.5)
**Fixed bugs:** **Fixed bugs:**
@@ -99,7 +143,6 @@
- Pull Requests in Wrong Tag [\#60](https://github.com/skywinder/github-changelog-generator/issues/60) - Pull Requests in Wrong Tag [\#60](https://github.com/skywinder/github-changelog-generator/issues/60)
## [1.3.4](https://github.com/skywinder/github-changelog-generator/tree/1.3.4) (2015-03-03) ## [1.3.4](https://github.com/skywinder/github-changelog-generator/tree/1.3.4) (2015-03-03)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.3...1.3.4) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.3...1.3.4)
**Fixed bugs:** **Fixed bugs:**
@@ -107,7 +150,6 @@
- --no-issues appears to break PRs [\#59](https://github.com/skywinder/github-changelog-generator/issues/59) - --no-issues appears to break PRs [\#59](https://github.com/skywinder/github-changelog-generator/issues/59)
## [1.3.3](https://github.com/skywinder/github-changelog-generator/tree/1.3.3) (2015-03-03) ## [1.3.3](https://github.com/skywinder/github-changelog-generator/tree/1.3.3) (2015-03-03)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.2...1.3.3) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.2...1.3.3)
**Closed issues:** **Closed issues:**
@@ -115,7 +157,6 @@
- Add \# character to encapsulate list. [\#58](https://github.com/skywinder/github-changelog-generator/issues/58) - Add \# character to encapsulate list. [\#58](https://github.com/skywinder/github-changelog-generator/issues/58)
## [1.3.2](https://github.com/skywinder/github-changelog-generator/tree/1.3.2) (2015-03-03) ## [1.3.2](https://github.com/skywinder/github-changelog-generator/tree/1.3.2) (2015-03-03)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.1...1.3.2) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.1...1.3.2)
**Fixed bugs:** **Fixed bugs:**
@@ -123,21 +164,16 @@
- generation failed if github commit api return `404 Not Found` [\#57](https://github.com/skywinder/github-changelog-generator/issues/57) - generation failed if github commit api return `404 Not Found` [\#57](https://github.com/skywinder/github-changelog-generator/issues/57)
## [1.3.1](https://github.com/skywinder/github-changelog-generator/tree/1.3.1) (2015-02-27) ## [1.3.1](https://github.com/skywinder/github-changelog-generator/tree/1.3.1) (2015-02-27)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.0...1.3.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.3.0...1.3.1)
## [1.3.0](https://github.com/skywinder/github-changelog-generator/tree/1.3.0) (2015-02-26) ## [1.3.0](https://github.com/skywinder/github-changelog-generator/tree/1.3.0) (2015-02-26)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.8...1.3.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.8...1.3.0)
**Implemented enhancements:** **Implemented enhancements:**
- Do not show `Unreleased` section, when it's empty. [\#55](https://github.com/skywinder/github-changelog-generator/issues/55) - Do not show `Unreleased` section, when it's empty. [\#55](https://github.com/skywinder/github-changelog-generator/issues/55)
- Separate list exclude and include labels [\#52](https://github.com/skywinder/github-changelog-generator/issues/52) - Separate list exclude and include labels [\#52](https://github.com/skywinder/github-changelog-generator/issues/52)
- Unreleased issues in separate section [\#47](https://github.com/skywinder/github-changelog-generator/issues/47) - Unreleased issues in separate section [\#47](https://github.com/skywinder/github-changelog-generator/issues/47)
- Separate by lists: Enhancements, Bugs, Pull requests. [\#31](https://github.com/skywinder/github-changelog-generator/issues/31) - Separate by lists: Enhancements, Bugs, Pull requests. [\#31](https://github.com/skywinder/github-changelog-generator/issues/31)
**Fixed bugs:** **Fixed bugs:**
@@ -149,7 +185,6 @@
- Implement filtering of Pull Requests by milestones [\#50](https://github.com/skywinder/github-changelog-generator/pull/50) ([skywinder](https://github.com/skywinder)) - Implement filtering of Pull Requests by milestones [\#50](https://github.com/skywinder/github-changelog-generator/pull/50) ([skywinder](https://github.com/skywinder))
## [1.2.8](https://github.com/skywinder/github-changelog-generator/tree/1.2.8) (2015-02-17) ## [1.2.8](https://github.com/skywinder/github-changelog-generator/tree/1.2.8) (2015-02-17)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.7...1.2.8) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.7...1.2.8)
**Closed issues:** **Closed issues:**
@@ -159,11 +194,9 @@
**Merged pull requests:** **Merged pull requests:**
- Feature/fix 37 [\#49](https://github.com/skywinder/github-changelog-generator/pull/49) ([skywinder](https://github.com/skywinder)) - Feature/fix 37 [\#49](https://github.com/skywinder/github-changelog-generator/pull/49) ([skywinder](https://github.com/skywinder))
- Prettify output [\#48](https://github.com/skywinder/github-changelog-generator/pull/48) ([skywinder](https://github.com/skywinder)) - Prettify output [\#48](https://github.com/skywinder/github-changelog-generator/pull/48) ([skywinder](https://github.com/skywinder))
## [1.2.7](https://github.com/skywinder/github-changelog-generator/tree/1.2.7) (2015-01-26) ## [1.2.7](https://github.com/skywinder/github-changelog-generator/tree/1.2.7) (2015-01-26)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.6...1.2.7) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.6...1.2.7)
**Merged pull requests:** **Merged pull requests:**
@@ -171,7 +204,6 @@
- Add compare link between older version and newer version [\#46](https://github.com/skywinder/github-changelog-generator/pull/46) ([sue445](https://github.com/sue445)) - Add compare link between older version and newer version [\#46](https://github.com/skywinder/github-changelog-generator/pull/46) ([sue445](https://github.com/sue445))
## [1.2.6](https://github.com/skywinder/github-changelog-generator/tree/1.2.6) (2015-01-21) ## [1.2.6](https://github.com/skywinder/github-changelog-generator/tree/1.2.6) (2015-01-21)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.5...1.2.6) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.5...1.2.6)
**Merged pull requests:** **Merged pull requests:**
@@ -179,7 +211,6 @@
- fix link tag format [\#45](https://github.com/skywinder/github-changelog-generator/pull/45) ([sugamasao](https://github.com/sugamasao)) - fix link tag format [\#45](https://github.com/skywinder/github-changelog-generator/pull/45) ([sugamasao](https://github.com/sugamasao))
## [1.2.5](https://github.com/skywinder/github-changelog-generator/tree/1.2.5) (2015-01-15) ## [1.2.5](https://github.com/skywinder/github-changelog-generator/tree/1.2.5) (2015-01-15)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.4...1.2.5) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.4...1.2.5)
**Implemented enhancements:** **Implemented enhancements:**
@@ -193,27 +224,22 @@
**Merged pull requests:** **Merged pull requests:**
- PrettyPrint class is included using lowercase 'pp' [\#43](https://github.com/skywinder/github-changelog-generator/pull/43) ([schwing](https://github.com/schwing)) - PrettyPrint class is included using lowercase 'pp' [\#43](https://github.com/skywinder/github-changelog-generator/pull/43) ([schwing](https://github.com/schwing))
- support enterprise github via command line options [\#42](https://github.com/skywinder/github-changelog-generator/pull/42) ([glenlovett](https://github.com/glenlovett)) - support enterprise github via command line options [\#42](https://github.com/skywinder/github-changelog-generator/pull/42) ([glenlovett](https://github.com/glenlovett))
## [1.2.4](https://github.com/skywinder/github-changelog-generator/tree/1.2.4) (2014-12-16) ## [1.2.4](https://github.com/skywinder/github-changelog-generator/tree/1.2.4) (2014-12-16)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.3...1.2.4) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.3...1.2.4)
**Fixed bugs:** **Fixed bugs:**
- Sometimes user is NULL during merges [\#41](https://github.com/skywinder/github-changelog-generator/issues/41) - Sometimes user is NULL during merges [\#41](https://github.com/skywinder/github-changelog-generator/issues/41)
- Crash when try generate log for rails [\#35](https://github.com/skywinder/github-changelog-generator/issues/35) - Crash when try generate log for rails [\#35](https://github.com/skywinder/github-changelog-generator/issues/35)
## [1.2.3](https://github.com/skywinder/github-changelog-generator/tree/1.2.3) (2014-12-16) ## [1.2.3](https://github.com/skywinder/github-changelog-generator/tree/1.2.3) (2014-12-16)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.2...1.2.3) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.2...1.2.3)
**Implemented enhancements:** **Implemented enhancements:**
- Add ability to run with one parameter instead -u -p [\#38](https://github.com/skywinder/github-changelog-generator/issues/38) - Add ability to run with one parameter instead -u -p [\#38](https://github.com/skywinder/github-changelog-generator/issues/38)
- Detailed output [\#33](https://github.com/skywinder/github-changelog-generator/issues/33) - Detailed output [\#33](https://github.com/skywinder/github-changelog-generator/issues/33)
**Fixed bugs:** **Fixed bugs:**
@@ -223,11 +249,9 @@
**Merged pull requests:** **Merged pull requests:**
- Implement async fetching [\#39](https://github.com/skywinder/github-changelog-generator/pull/39) ([skywinder](https://github.com/skywinder)) - Implement async fetching [\#39](https://github.com/skywinder/github-changelog-generator/pull/39) ([skywinder](https://github.com/skywinder))
- Fix crash when user is NULL [\#40](https://github.com/skywinder/github-changelog-generator/pull/40) ([skywinder](https://github.com/skywinder)) - Fix crash when user is NULL [\#40](https://github.com/skywinder/github-changelog-generator/pull/40) ([skywinder](https://github.com/skywinder))
## [1.2.2](https://github.com/skywinder/github-changelog-generator/tree/1.2.2) (2014-12-10) ## [1.2.2](https://github.com/skywinder/github-changelog-generator/tree/1.2.2) (2014-12-10)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.1...1.2.2) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.1...1.2.2)
**Fixed bugs:** **Fixed bugs:**
@@ -239,7 +263,6 @@
- Add a Bitdeli Badge to README [\#36](https://github.com/skywinder/github-changelog-generator/pull/36) ([bitdeli-chef](https://github.com/bitdeli-chef)) - Add a Bitdeli Badge to README [\#36](https://github.com/skywinder/github-changelog-generator/pull/36) ([bitdeli-chef](https://github.com/bitdeli-chef))
## [1.2.1](https://github.com/skywinder/github-changelog-generator/tree/1.2.1) (2014-11-22) ## [1.2.1](https://github.com/skywinder/github-changelog-generator/tree/1.2.1) (2014-11-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.0...1.2.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.0...1.2.1)
**Fixed bugs:** **Fixed bugs:**
@@ -249,23 +272,18 @@
**Merged pull requests:** **Merged pull requests:**
- Issues for last tag not in list [\#29](https://github.com/skywinder/github-changelog-generator/pull/29) ([skywinder](https://github.com/skywinder)) - Issues for last tag not in list [\#29](https://github.com/skywinder/github-changelog-generator/pull/29) ([skywinder](https://github.com/skywinder))
- Disable default --filter-pull-requests option. [\#28](https://github.com/skywinder/github-changelog-generator/pull/28) ([skywinder](https://github.com/skywinder)) - Disable default --filter-pull-requests option. [\#28](https://github.com/skywinder/github-changelog-generator/pull/28) ([skywinder](https://github.com/skywinder))
## [1.2.0](https://github.com/skywinder/github-changelog-generator/tree/1.2.0) (2014-11-19) ## [1.2.0](https://github.com/skywinder/github-changelog-generator/tree/1.2.0) (2014-11-19)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.4...1.2.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.4...1.2.0)
**Merged pull requests:** **Merged pull requests:**
- Add filter for pull-requests labels. \(option --filter-pull-requests\) [\#27](https://github.com/skywinder/github-changelog-generator/pull/27) ([skywinder](https://github.com/skywinder)) - Add filter for pull-requests labels. \(option --filter-pull-requests\) [\#27](https://github.com/skywinder/github-changelog-generator/pull/27) ([skywinder](https://github.com/skywinder))
- Add ability to insert authors of pull-requests \(--\[no-\]author option\) [\#25](https://github.com/skywinder/github-changelog-generator/pull/25) ([skywinder](https://github.com/skywinder)) - Add ability to insert authors of pull-requests \(--\[no-\]author option\) [\#25](https://github.com/skywinder/github-changelog-generator/pull/25) ([skywinder](https://github.com/skywinder))
- Don't receive issues in case of --no-isses flag specied [\#24](https://github.com/skywinder/github-changelog-generator/pull/24) ([skywinder](https://github.com/skywinder)) - Don't receive issues in case of --no-isses flag specied [\#24](https://github.com/skywinder/github-changelog-generator/pull/24) ([skywinder](https://github.com/skywinder))
## [1.1.4](https://github.com/skywinder/github-changelog-generator/tree/1.1.4) (2014-11-18) ## [1.1.4](https://github.com/skywinder/github-changelog-generator/tree/1.1.4) (2014-11-18)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.2...1.1.4) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.2...1.1.4)
**Implemented enhancements:** **Implemented enhancements:**
@@ -277,29 +295,23 @@
- Sort tags by date [\#23](https://github.com/skywinder/github-changelog-generator/pull/23) ([skywinder](https://github.com/skywinder)) - Sort tags by date [\#23](https://github.com/skywinder/github-changelog-generator/pull/23) ([skywinder](https://github.com/skywinder))
## [1.1.2](https://github.com/skywinder/github-changelog-generator/tree/1.1.2) (2014-11-12) ## [1.1.2](https://github.com/skywinder/github-changelog-generator/tree/1.1.2) (2014-11-12)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.1...1.1.2) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.1...1.1.2)
**Merged pull requests:** **Merged pull requests:**
- Fix bug with dot signs in project name [\#18](https://github.com/skywinder/github-changelog-generator/pull/18) ([skywinder](https://github.com/skywinder)) - Fix bug with dot signs in project name [\#18](https://github.com/skywinder/github-changelog-generator/pull/18) ([skywinder](https://github.com/skywinder))
- Fix bug with dot signs in user name [\#17](https://github.com/skywinder/github-changelog-generator/pull/17) ([skywinder](https://github.com/skywinder)) - Fix bug with dot signs in user name [\#17](https://github.com/skywinder/github-changelog-generator/pull/17) ([skywinder](https://github.com/skywinder))
## [1.1.1](https://github.com/skywinder/github-changelog-generator/tree/1.1.1) (2014-11-10) ## [1.1.1](https://github.com/skywinder/github-changelog-generator/tree/1.1.1) (2014-11-10)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.0...1.1.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.1.0...1.1.1)
**Merged pull requests:** **Merged pull requests:**
- Remove duplicates of issues and pull-requests with same number [\#15](https://github.com/skywinder/github-changelog-generator/pull/15) ([skywinder](https://github.com/skywinder)) - Remove duplicates of issues and pull-requests with same number [\#15](https://github.com/skywinder/github-changelog-generator/pull/15) ([skywinder](https://github.com/skywinder))
- Sort issues by tags [\#14](https://github.com/skywinder/github-changelog-generator/pull/14) ([skywinder](https://github.com/skywinder)) - Sort issues by tags [\#14](https://github.com/skywinder/github-changelog-generator/pull/14) ([skywinder](https://github.com/skywinder))
- Add ability to add or exclude issues without any labels [\#13](https://github.com/skywinder/github-changelog-generator/pull/13) ([skywinder](https://github.com/skywinder)) - Add ability to add or exclude issues without any labels [\#13](https://github.com/skywinder/github-changelog-generator/pull/13) ([skywinder](https://github.com/skywinder))
## [1.1.0](https://github.com/skywinder/github-changelog-generator/tree/1.1.0) (2014-11-10) ## [1.1.0](https://github.com/skywinder/github-changelog-generator/tree/1.1.0) (2014-11-10)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.0.1...1.1.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.0.1...1.1.0)
**Implemented enhancements:** **Implemented enhancements:**
@@ -309,21 +321,17 @@
**Fixed bugs:** **Fixed bugs:**
- Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/github-changelog-generator/issues/12) - Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/github-changelog-generator/issues/12)
- Markdown formating in the last line wrong [\#9](https://github.com/skywinder/github-changelog-generator/issues/9) - Markdown formating in the last line wrong [\#9](https://github.com/skywinder/github-changelog-generator/issues/9)
## [1.0.1](https://github.com/skywinder/github-changelog-generator/tree/1.0.1) (2014-11-10) ## [1.0.1](https://github.com/skywinder/github-changelog-generator/tree/1.0.1) (2014-11-10)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.0.0...1.0.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.0.0...1.0.1)
## [1.0.0](https://github.com/skywinder/github-changelog-generator/tree/1.0.0) (2014-11-07) ## [1.0.0](https://github.com/skywinder/github-changelog-generator/tree/1.0.0) (2014-11-07)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.1.0...1.0.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.1.0...1.0.0)
**Implemented enhancements:** **Implemented enhancements:**
- Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/github-changelog-generator/issues/6) - Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/github-changelog-generator/issues/6)
- Implement option to specify output filename [\#4](https://github.com/skywinder/github-changelog-generator/issues/4) - Implement option to specify output filename [\#4](https://github.com/skywinder/github-changelog-generator/issues/4)
**Fixed bugs:** **Fixed bugs:**
@@ -333,27 +341,21 @@
**Merged pull requests:** **Merged pull requests:**
- Implement support of different tags. [\#8](https://github.com/skywinder/github-changelog-generator/pull/8) ([skywinder](https://github.com/skywinder)) - Implement support of different tags. [\#8](https://github.com/skywinder/github-changelog-generator/pull/8) ([skywinder](https://github.com/skywinder))
- Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/github-changelog-generator/pull/7) ([skywinder](https://github.com/skywinder)) - Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/github-changelog-generator/pull/7) ([skywinder](https://github.com/skywinder))
## [0.1.0](https://github.com/skywinder/github-changelog-generator/tree/0.1.0) (2014-11-07) ## [0.1.0](https://github.com/skywinder/github-changelog-generator/tree/0.1.0) (2014-11-07)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.0.2...0.1.0) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.0.2...0.1.0)
**Merged pull requests:** **Merged pull requests:**
- Fix parsing date of pull request [\#3](https://github.com/skywinder/github-changelog-generator/pull/3) ([skywinder](https://github.com/skywinder)) - Fix parsing date of pull request [\#3](https://github.com/skywinder/github-changelog-generator/pull/3) ([skywinder](https://github.com/skywinder))
- Add changelog generation for last tag [\#2](https://github.com/skywinder/github-changelog-generator/pull/2) ([skywinder](https://github.com/skywinder)) - Add changelog generation for last tag [\#2](https://github.com/skywinder/github-changelog-generator/pull/2) ([skywinder](https://github.com/skywinder))
- Add option \(-o --output\) to specify name of the output file. [\#1](https://github.com/skywinder/github-changelog-generator/pull/1) ([skywinder](https://github.com/skywinder)) - Add option \(-o --output\) to specify name of the output file. [\#1](https://github.com/skywinder/github-changelog-generator/pull/1) ([skywinder](https://github.com/skywinder))
## [0.0.2](https://github.com/skywinder/github-changelog-generator/tree/0.0.2) (2014-11-06) ## [0.0.2](https://github.com/skywinder/github-changelog-generator/tree/0.0.2) (2014-11-06)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.0.1...0.0.2) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/0.0.1...0.0.2)
## [0.0.1](https://github.com/skywinder/github-changelog-generator/tree/0.0.1) (2014-11-06) ## [0.0.1](https://github.com/skywinder/github-changelog-generator/tree/0.0.1) (2014-11-06)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

15
Gemfile
View File

@@ -1,14 +1,11 @@
source "https://rubygems.org" source "https://rubygems.org"
gem "rake", ">=10.4.2" gemspec
gem "github_api", ">=0.12.3"
gem "colorize", ">=0.7.7"
group :test do group :test do
gem "rspec" gem "rspec", "~>3.2"
gem "rubocop" gem "rubocop", "~>0.31"
gem "coveralls", require: false gem "coveralls", "~>0.8", require: false
gem "simplecov", require: false gem "simplecov", "~>0.10", require: false
gem "codeclimate-test-reporter" gem "codeclimate-test-reporter", "~>0.4"
end end

View File

@@ -1,14 +1,21 @@
PATH
remote: .
specs:
github_changelog_generator (1.7.0)
colorize (~> 0.7)
github_api (~> 0.12)
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
addressable (2.3.8) addressable (2.3.8)
ast (2.0.0) ast (2.0.0)
astrolabe (1.3.0) astrolabe (1.3.1)
parser (>= 2.2.0.pre.3, < 3.0) parser (~> 2.2)
codeclimate-test-reporter (0.4.7) codeclimate-test-reporter (0.4.7)
simplecov (>= 0.7.1, < 1.0.0) simplecov (>= 0.7.1, < 1.0.0)
colorize (0.7.7) colorize (0.7.7)
coveralls (0.8.1) coveralls (0.8.2)
json (~> 1.8) json (~> 1.8)
rest-client (>= 1.6.8, < 2) rest-client (>= 1.6.8, < 2)
simplecov (~> 0.10.0) simplecov (~> 0.10.0)
@@ -30,14 +37,14 @@ GEM
multi_json (>= 1.7.5, < 2.0) multi_json (>= 1.7.5, < 2.0)
nokogiri (~> 1.6.3) nokogiri (~> 1.6.3)
oauth2 oauth2
hashie (3.4.1) hashie (3.4.2)
http-cookie (1.0.2) http-cookie (1.0.2)
domain_name (~> 0.5) domain_name (~> 0.5)
json (1.8.2) json (1.8.3)
jwt (1.5.0) jwt (1.5.1)
mime-types (2.5) mime-types (2.6.1)
mini_portile (0.6.2) mini_portile (0.6.2)
multi_json (1.11.0) multi_json (1.11.2)
multi_xml (0.5.5) multi_xml (0.5.5)
multipart-post (2.0.0) multipart-post (2.0.0)
netrc (0.10.3) netrc (0.10.3)
@@ -49,32 +56,32 @@ GEM
multi_json (~> 1.3) multi_json (~> 1.3)
multi_xml (~> 0.5) multi_xml (~> 0.5)
rack (~> 1.2) rack (~> 1.2)
parser (2.2.2.2) parser (2.2.2.6)
ast (>= 1.1, < 3.0) ast (>= 1.1, < 3.0)
powerpack (0.1.1) powerpack (0.1.1)
rack (1.6.1) rack (1.6.4)
rainbow (2.0.0) rainbow (2.0.0)
rake (10.4.2) rake (10.4.2)
rest-client (1.8.0) rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0) http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0) mime-types (>= 1.16, < 3.0)
netrc (~> 0.7) netrc (~> 0.7)
rspec (3.2.0) rspec (3.3.0)
rspec-core (~> 3.2.0) rspec-core (~> 3.3.0)
rspec-expectations (~> 3.2.0) rspec-expectations (~> 3.3.0)
rspec-mocks (~> 3.2.0) rspec-mocks (~> 3.3.0)
rspec-core (3.2.3) rspec-core (3.3.2)
rspec-support (~> 3.2.0) rspec-support (~> 3.3.0)
rspec-expectations (3.2.1) rspec-expectations (3.3.1)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0) rspec-support (~> 3.3.0)
rspec-mocks (3.2.1) rspec-mocks (3.3.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0) rspec-support (~> 3.3.0)
rspec-support (3.2.2) rspec-support (3.3.0)
rubocop (0.31.0) rubocop (0.32.1)
astrolabe (~> 1.3) astrolabe (~> 1.3)
parser (>= 2.2.2.1, < 3.0) parser (>= 2.2.2.5, < 3.0)
powerpack (~> 0.1) powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0) rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
@@ -84,11 +91,11 @@ GEM
json (~> 1.8) json (~> 1.8)
simplecov-html (~> 0.10.0) simplecov-html (~> 0.10.0)
simplecov-html (0.10.0) simplecov-html (0.10.0)
term-ansicolor (1.3.0) term-ansicolor (1.3.2)
tins (~> 1.0) tins (~> 1.0)
thor (0.19.1) thor (0.19.1)
thread_safe (0.3.5) thread_safe (0.3.5)
tins (1.5.1) tins (1.5.4)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.1) unf_ext (0.0.7.1)
@@ -97,11 +104,11 @@ PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
codeclimate-test-reporter bundler (~> 1.7)
colorize (>= 0.7.7) codeclimate-test-reporter (~> 0.4)
coveralls coveralls (~> 0.8)
github_api (>= 0.12.3) github_changelog_generator!
rake (>= 10.4.2) rake (~> 10.0)
rspec rspec (~> 3.2)
rubocop rubocop (~> 0.31)
simplecov simplecov (~> 0.10)

View File

@@ -80,39 +80,15 @@ Because software tools are for people. If you dont care, why are you contribu
As output you will get `CHANGELOG.md` file with pretty *Markdown-formatted* changelog. As output you will get `CHANGELOG.md` file with pretty *Markdown-formatted* changelog.
### Params ### Params
Type `github_changelog_generator --help` for detailed usage. Type `github_changelog_generator --help` for details.
Usage: changelog_generator [options]
-u, --user [USER] Username of the owner of target GitHub repo
-p, --project [PROJECT] Name of project on GitHub
-t, --token [TOKEN] To make more than 50 requests per hour your GitHub token required. You can generate it here: https://github.com/settings/tokens/new
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y
-o, --output [NAME] Output file. Default is CHANGELOG.md
--[no-]verbose Run verbosely. Default is true
--[no-]issues Include closed issues to changelog. Default is true
--[no-]issues-wo-labels Include closed issues without labels to changelog. Default is true
--[no-]pr-wo-labels Include pull requests without labels to changelog. Default is true
--[no-]pull-requests Include pull-requests to changelog. Default is true
--[no-]filter-by-milestone Use milestone to detect when issue was resolved. Default is true
--[no-]author Add author of pull-request in the end. Default is true
--unreleased-only Generate log from unreleased closed issues only.
--[no-]unreleased Add to log unreleased closed issues. Default is true
--[no-]compare-link Include compare link between older version and newer version. Default is true
--include-labels x,y,z Issues only with that labels will be included to changelog. Default is 'bug,enhancement'
--exclude-labels x,y,z Issues with that labels will be always excluded from changelog. Default is 'duplicate,question,invalid,wontfix'
--max-issues [NUMBER] Max number of issues to fetch from GitHub. Default is unlimited.
--github-site [URL] The Enterprise Github site on which your project is hosted.
--github-api [URL] The enterprise endpoint to use for your Github API.
--future-release [RELEASE-VERSION] Put the unreleased changes in the specified release number.
-v, --version Print version number
-h, --help Displays Help
More detailed info about params you can find in Wiki page: [**Advanced change log generation examples**](https://github.com/skywinder/github-changelog-generator/wiki/Advanced-change-log-generation-examples)
### GitHub token ### GitHub token
Since GitHub allows you to make only 50 requests without authentication it's recommended to run this script with a token (`-t, --token` option) Since GitHub allows you to make only 50 requests without authentication it's recommended to run this script with a token (`-t, --token` option)
**You can easily [generate it here](https://github.com/settings/tokens)**. **You can easily [generate it here](https://github.com/settings/tokens/new?description=GitHub%20Changelog%20Generator%20token)**.
And: And:
@@ -128,8 +104,22 @@ So, if you got error like this:
It's time to create this token or wait for 1 hour before GitHub reset the counter for your IP. It's time to create this token or wait for 1 hour before GitHub reset the counter for your IP.
### Rake task
You love Rake? So do we! And so we've made it easier for you by providing a Rake task library for your Change log generation. In your Rakefile, use:
```ruby
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
config.since_tag = '0.1.14'
config.future_release = '0.2.0'
end
```
All command line options can be passed to the Rake task as `config` parameters. Since you're naming the Rake task yourself, you can create as many as you want, too.
##Features and advantages of this project ##Features and advantages of this project
- Generate canonical, neat change log file, followed by [basic change log guidlines](http://keepachangelog.com/) :gem: - Generate canonical, neat change log file, followed by [basic change log guidelines](http://keepachangelog.com/) :gem:
- Possible to generate **Unreleased** changes (closed issues that have not released yet) :dizzy: - Possible to generate **Unreleased** changes (closed issues that have not released yet) :dizzy:
- **GitHub Enterprise support** via command line options! :factory: - **GitHub Enterprise support** via command line options! :factory:
- Flexible format **customisation**: - Flexible format **customisation**:

View File

@@ -23,9 +23,10 @@ Gem::Specification.new do |spec|
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_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_runtime_dependency("github_api", ["~> 0.12"]) spec.add_runtime_dependency("github_api", ["~> 0.12"])
spec.add_runtime_dependency("colorize", ["~> 0.7"]) spec.add_runtime_dependency("colorize", ["~> 0.7"])
# Development only
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
end end

View File

@@ -1,183 +1,55 @@
# Change Log # Change Log
## [Unreleased](https://github.com/sindresorhus/awesome/tree/HEAD) ## [Unreleased](https://github.com/skywinder/changelog_test/tree/HEAD)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/0.0.4...HEAD)
**Implemented enhancements:**
- Enchancment [\#9](https://github.com/skywinder/changelog_test/issues/9)
**Fixed bugs:**
- BugFix [\#11](https://github.com/skywinder/changelog_test/issues/11)
**Closed issues:** **Closed issues:**
- Suggestion [\#151](https://github.com/sindresorhus/awesome/issues/151) - Issue closed from commit from PR [\#14](https://github.com/skywinder/changelog_test/issues/14)
- Issue, closed by PR [\#12](https://github.com/skywinder/changelog_test/issues/12)
- ta bugando [\#149](https://github.com/sindresorhus/awesome/issues/149) - Issue [\#10](https://github.com/skywinder/changelog_test/issues/10)
- Issue with some other label - Should be in closed issues [\#8](https://github.com/skywinder/changelog_test/issues/8)
- Add Regex [\#147](https://github.com/sindresorhus/awesome/issues/147)
- Add "Mad Science Modules" [\#138](https://github.com/sindresorhus/awesome/issues/138)
- you dont know js [\#130](https://github.com/sindresorhus/awesome/issues/130)
- O'Reilly Media Inc [\#129](https://github.com/sindresorhus/awesome/issues/129)
- List of useful Git Hook and .gitignore files [\#128](https://github.com/sindresorhus/awesome/issues/128)
- Please add the list of "Open Source Clones of Popular Games" [\#118](https://github.com/sindresorhus/awesome/issues/118)
- Underscore character in front of the "Basics" section under Haskell [\#114](https://github.com/sindresorhus/awesome/issues/114)
- Arrange the lists in alphabetical Order. [\#112](https://github.com/sindresorhus/awesome/issues/112)
- AwesomeOpenSource [\#107](https://github.com/sindresorhus/awesome/issues/107)
- Suggestion. [\#73](https://github.com/sindresorhus/awesome/issues/73)
- Suggestion [\#51](https://github.com/sindresorhus/awesome/issues/51)
- Awesome Radio [\#33](https://github.com/sindresorhus/awesome/issues/33)
- Have you considered breaking + regrouping Miscellaneous section? [\#20](https://github.com/sindresorhus/awesome/issues/20)
- Node.js a programming language? [\#5](https://github.com/sindresorhus/awesome/issues/5)
**Merged pull requests:** **Merged pull requests:**
- Add awesome-slack [\#156](https://github.com/sindresorhus/awesome/pull/156) ([filipelinhares](https://github.com/filipelinhares)) - This PR closes 14 from commit [\#15](https://github.com/skywinder/changelog_test/pull/15) ([skywinder](https://github.com/skywinder))
- This PR to close \#12 from body [\#13](https://github.com/skywinder/changelog_test/pull/13) ([skywinder](https://github.com/skywinder))
- Add Elm [\#146](https://github.com/sindresorhus/awesome/pull/146) ([isRuslan](https://github.com/isRuslan)) ## [0.0.4](https://github.com/skywinder/changelog_test/tree/0.0.4) (2015-05-22)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.3...0.0.4)
- Add Awesome Sketch list [\#141](https://github.com/sindresorhus/awesome/pull/141) ([diessica](https://github.com/diessica)) **Closed issues:**
- Add "Maintenance Modules" [\#139](https://github.com/sindresorhus/awesome/pull/139) ([feross](https://github.com/feross)) - Test issue, that should appear in 0.0.4 [\#3](https://github.com/skywinder/changelog_test/issues/3)
- Added awesome-delphi [\#137](https://github.com/sindresorhus/awesome/pull/137) ([Teloah](https://github.com/Teloah)) **Merged pull requests:**
- adds BEM resources page [\#136](https://github.com/sindresorhus/awesome/pull/136) ([sturobson](https://github.com/sturobson)) - Add automatically generated change log file. [\#5](https://github.com/skywinder/changelog_test/pull/5) ([skywinder](https://github.com/skywinder))
- Added Rails to "Back-end development" [\#135](https://github.com/sindresorhus/awesome/pull/135) ([jpsilvashy](https://github.com/jpsilvashy)) ## [v0.0.3](https://github.com/skywinder/changelog_test/tree/v0.0.3) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.2...v0.0.3)
- added meteor-awesome [\#132](https://github.com/sindresorhus/awesome/pull/132) ([kefirchik](https://github.com/kefirchik)) **Merged pull requests:**
- Scalable CSS [\#131](https://github.com/sindresorhus/awesome/pull/131) ([h-nazzal](https://github.com/h-nazzal)) - fix \#3. hotfix. Should appear in v0.0.3 [\#4](https://github.com/skywinder/changelog_test/pull/4) ([skywinder](https://github.com/skywinder))
- Changed link to Awesome Laravel [\#127](https://github.com/sindresorhus/awesome/pull/127) ([chiraggude](https://github.com/chiraggude)) ## [v0.0.2](https://github.com/skywinder/changelog_test/tree/v0.0.2) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.1...v0.0.2)
- Add Pyramid framework [\#124](https://github.com/sindresorhus/awesome/pull/124) ([uralbash](https://github.com/uralbash)) **Merged pull requests:**
- Added Malware Analysis [\#123](https://github.com/sindresorhus/awesome/pull/123) ([leoruhland](https://github.com/leoruhland)) - Here is a test hotfix should appear in v.0.0.2 [\#2](https://github.com/skywinder/changelog_test/pull/2) ([skywinder](https://github.com/skywinder))
- Added Awesome-REST [\#122](https://github.com/sindresorhus/awesome/pull/122) ([leoruhland](https://github.com/leoruhland))
- Added Awesome Material [\#121](https://github.com/sindresorhus/awesome/pull/121) ([sachin1092](https://github.com/sachin1092))
- Adding Flask [\#120](https://github.com/sindresorhus/awesome/pull/120) ([yashmehrotra](https://github.com/yashmehrotra))
- Add GoBooks [\#119](https://github.com/sindresorhus/awesome/pull/119) ([dariubs](https://github.com/dariubs))
- Added android-ui and ios-ui [\#117](https://github.com/sindresorhus/awesome/pull/117) ([leoruhland](https://github.com/leoruhland))
- Added the discount for student dev list. [\#113](https://github.com/sindresorhus/awesome/pull/113) ([najela](https://github.com/najela))
- Add awesome-ctf [\#111](https://github.com/sindresorhus/awesome/pull/111) ([apsdehal](https://github.com/apsdehal))
- Added awesome-fantasy [\#110](https://github.com/sindresorhus/awesome/pull/110) ([RichardLitt](https://github.com/RichardLitt))
- Adds awesome-security [\#105](https://github.com/sindresorhus/awesome/pull/105) ([TjWallas](https://github.com/TjWallas))
- Add awesome-json. [\#102](https://github.com/sindresorhus/awesome/pull/102) ([burningtree](https://github.com/burningtree))
- Added endangered languages [\#101](https://github.com/sindresorhus/awesome/pull/101) ([RichardLitt](https://github.com/RichardLitt))
- Add awesome-slack [\#99](https://github.com/sindresorhus/awesome/pull/99) ([matiassingers](https://github.com/matiassingers))
- add seo repository [\#93](https://github.com/sindresorhus/awesome/pull/93) ([marcobiedermann](https://github.com/marcobiedermann))
- add 'design and development guides' [\#89](https://github.com/sindresorhus/awesome/pull/89) ([NARKOZ](https://github.com/NARKOZ))
- Update awesome-cakephp link [\#88](https://github.com/sindresorhus/awesome/pull/88) ([jadb](https://github.com/jadb))
- Add awesome-ember [\#85](https://github.com/sindresorhus/awesome/pull/85) ([arthurvr](https://github.com/arthurvr))
- Added awesome boilerplates and projects . [\#84](https://github.com/sindresorhus/awesome/pull/84) ([melvin0008](https://github.com/melvin0008))
- Move misc frameworks to new back-end dev section [\#83](https://github.com/sindresorhus/awesome/pull/83) ([karlhorky](https://github.com/karlhorky))
- Add Learn to Program to Misc [\#82](https://github.com/sindresorhus/awesome/pull/82) ([karlhorky](https://github.com/karlhorky))
- Add browser extensions for GitHub [\#79](https://github.com/sindresorhus/awesome/pull/79) ([stefanbuck](https://github.com/stefanbuck))
- add computer vision awesome list [\#78](https://github.com/sindresorhus/awesome/pull/78) ([yhsa678](https://github.com/yhsa678))
- Added Fonts [\#72](https://github.com/sindresorhus/awesome/pull/72) ([brabadu](https://github.com/brabadu))
- Add awesome-gametalks [\#69](https://github.com/sindresorhus/awesome/pull/69) ([hzoo](https://github.com/hzoo))
- Add "Cryptography" [\#66](https://github.com/sindresorhus/awesome/pull/66) ([maciejczyzewski](https://github.com/maciejczyzewski))
- docs\(readme\): include awesome-courses [\#65](https://github.com/sindresorhus/awesome/pull/65) ([gdi2290](https://github.com/gdi2290))
- Adding awesome-c to the list [\#59](https://github.com/sindresorhus/awesome/pull/59) ([kozross](https://github.com/kozross))
- Rename 'web development' to 'front end development' [\#58](https://github.com/sindresorhus/awesome/pull/58) ([arthurvr](https://github.com/arthurvr))
- Add awesome-vagrant [\#57](https://github.com/sindresorhus/awesome/pull/57) ([arthurvr](https://github.com/arthurvr))
- Add awesome-backbone [\#56](https://github.com/sindresorhus/awesome/pull/56) ([arthurvr](https://github.com/arthurvr))
- Add continuous integration tools [\#50](https://github.com/sindresorhus/awesome/pull/50) ([itech001](https://github.com/itech001))
- Add public datasets repository. [\#49](https://github.com/sindresorhus/awesome/pull/49) ([caesar0301](https://github.com/caesar0301))
- added awesome machine learning [\#47](https://github.com/sindresorhus/awesome/pull/47) ([7c00](https://github.com/7c00))
- Added awesome Symfony2 [\#45](https://github.com/sindresorhus/awesome/pull/45) ([eriwin](https://github.com/eriwin))
- awesome-pcaptools for network traffic processing added to awesome list. [\#44](https://github.com/sindresorhus/awesome/pull/44) ([caesar0301](https://github.com/caesar0301))
- awesome-dojo added to the web platforms [\#43](https://github.com/sindresorhus/awesome/pull/43) ([peterkokot](https://github.com/peterkokot))
- adding knockoutJS [\#40](https://github.com/sindresorhus/awesome/pull/40) ([dnbard](https://github.com/dnbard))
- Awesome SQLAlchemy [\#39](https://github.com/sindresorhus/awesome/pull/39) ([dahlia](https://github.com/dahlia))
- Awesome Docker [\#38](https://github.com/sindresorhus/awesome/pull/38) ([veggiemonk](https://github.com/veggiemonk))
- Add awesome-svg link to the list [\#36](https://github.com/sindresorhus/awesome/pull/36) ([willianjusten](https://github.com/willianjusten))
- Added awesome radio [\#35](https://github.com/sindresorhus/awesome/pull/35) ([niclashoyer](https://github.com/niclashoyer))
- Added Awesome-Styleguides [\#30](https://github.com/sindresorhus/awesome/pull/30) ([RichardLitt](https://github.com/RichardLitt))
- Added an awesome-conferences link [\#26](https://github.com/sindresorhus/awesome/pull/26) ([RichardLitt](https://github.com/RichardLitt))
- Add Dart [\#25](https://github.com/sindresorhus/awesome/pull/25) ([yissachar](https://github.com/yissachar))
- Add Lua [\#24](https://github.com/sindresorhus/awesome/pull/24) ([LewisJEllis](https://github.com/LewisJEllis))
- Add CakePHP PHP Framework. [\#22](https://github.com/sindresorhus/awesome/pull/22) ([dereuromark](https://github.com/dereuromark))
- Reorganized Miscellaneous section [\#21](https://github.com/sindresorhus/awesome/pull/21) ([tuwannu](https://github.com/tuwannu))
- Added Git Cheat Sheet [\#19](https://github.com/sindresorhus/awesome/pull/19) ([ArslanBilal](https://github.com/ArslanBilal))
- Add awesome selenium list [\#16](https://github.com/sindresorhus/awesome/pull/16) ([christian-bromann](https://github.com/christian-bromann))
- Add Magictools for Game Development [\#15](https://github.com/sindresorhus/awesome/pull/15) ([passy](https://github.com/passy))
- Add Haskell [\#14](https://github.com/sindresorhus/awesome/pull/14) ([csu](https://github.com/csu))
- Added Play1 java web framework [\#13](https://github.com/sindresorhus/awesome/pull/13) ([PerfectCarl](https://github.com/PerfectCarl))
- Added awesome-algorithms [\#10](https://github.com/sindresorhus/awesome/pull/10) ([tayllan](https://github.com/tayllan))
- Add C/C++ [\#8](https://github.com/sindresorhus/awesome/pull/8) ([fffaraz](https://github.com/fffaraz))
- Add "Awesome dotfiles" [\#6](https://github.com/sindresorhus/awesome/pull/6) ([webpro](https://github.com/webpro))
- Added Awesome Android list [\#4](https://github.com/sindresorhus/awesome/pull/4) ([JStumpp](https://github.com/JStumpp))
- added awesome web tool [\#3](https://github.com/sindresorhus/awesome/pull/3) ([necenzurat](https://github.com/necenzurat))
- Awesome cobol is probably a joke [\#2](https://github.com/sindresorhus/awesome/pull/2) ([dimlev](https://github.com/dimlev))
- Added awesome Scala lists [\#1](https://github.com/sindresorhus/awesome/pull/1) ([SkyRocknRoll](https://github.com/SkyRocknRoll))
## [v0.0.1](https://github.com/skywinder/changelog_test/tree/v0.0.1) (2015-03-02)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

View File

@@ -5,6 +5,7 @@ require "json"
require "colorize" require "colorize"
require "benchmark" require "benchmark"
require_relative "github_changelog_generator/helper"
require_relative "github_changelog_generator/parser" require_relative "github_changelog_generator/parser"
require_relative "github_changelog_generator/generator/generator" require_relative "github_changelog_generator/generator/generator"
require_relative "github_changelog_generator/version" require_relative "github_changelog_generator/version"

View File

@@ -1,11 +1,10 @@
require "logger"
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
# (such as filtering, validating, e.t.c) # (such as filtering, validating, e.t.c)
# #
# Example: # Example:
# fetcher = GitHubChangelogGenerator::Fetcher.new options # fetcher = GitHubChangelogGenerator::Fetcher.new options
class Fetcher class Fetcher
PER_PAGE_NUMBER = 30 PER_PAGE_NUMBER = 30
CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN" CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN"
@@ -15,21 +14,14 @@ module GitHubChangelogGenerator
"This script can make only 50 requests to GitHub API per hour without token!" "This script can make only 50 requests to GitHub API per hour without token!"
def initialize(options = {}) def initialize(options = {})
@options = options @options = options || {}
@logger = Logger.new(STDOUT)
@logger.formatter = proc do |_severity, _datetime, _progname, msg|
"#{msg}\n"
end
@user = @options[:user] @user = @options[:user]
@project = @options[:project] @project = @options[:project]
@github_token = fetch_github_token @github_token = fetch_github_token
@tag_times_hash = {}
github_options = { per_page: PER_PAGE_NUMBER } github_options = { per_page: PER_PAGE_NUMBER }
github_options[:oauth_token] = @github_token unless @github_token.nil? github_options[:oauth_token] = @github_token unless @github_token.nil?
github_options[:endpoint] = options[:github_endpoint] unless options[:github_endpoint].nil? github_options[:endpoint] = @options[:github_endpoint] unless @options[:github_endpoint].nil?
github_options[:site] = options[:github_endpoint] unless options[:github_site].nil? github_options[:site] = @options[:github_endpoint] unless @options[:github_site].nil?
@github = check_github_response { Github.new github_options } @github = check_github_response { Github.new github_options }
end end
@@ -41,7 +33,7 @@ module GitHubChangelogGenerator
def fetch_github_token def fetch_github_token
env_var = @options[:token] ? @options[:token] : (ENV.fetch CHANGELOG_GITHUB_TOKEN, nil) env_var = @options[:token] ? @options[:token] : (ENV.fetch CHANGELOG_GITHUB_TOKEN, nil)
@logger.warn NO_TOKEN_PROVIDED.yellow unless env_var Helper.log.warn NO_TOKEN_PROVIDED.yellow unless env_var
env_var env_var
end end
@@ -51,27 +43,28 @@ module GitHubChangelogGenerator
def get_all_tags def get_all_tags
print "Fetching tags...\r" if @options[:verbose] print "Fetching tags...\r" if @options[:verbose]
tags = [] check_github_response { github_fetch_tags }
check_github_response { github_fetch_tags(tags) }
tags
end end
# This is wrapper with rescue block
# @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block
def check_github_response def check_github_response
begin begin
value = yield value = yield
rescue Github::Error::Unauthorized => e rescue Github::Error::Unauthorized => e
@logger.error e.body.red Helper.log.error e.body.red
abort "Error: wrong GitHub token" abort "Error: wrong GitHub token"
rescue Github::Error::Forbidden => e rescue Github::Error::Forbidden => e
@logger.warn e.body.red Helper.log.warn e.body.red
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end end
value value
end end
def github_fetch_tags(tags) # Fill input array with tags
# @return [Array] array of tags in repo
def github_fetch_tags
tags = []
response = @github.repos.tags @options[:user], @options[:project] response = @github.repos.tags @options[:user], @options[:project]
page_i = 0 page_i = 0
count_pages = response.count_pages count_pages = response.count_pages
@@ -83,11 +76,12 @@ module GitHubChangelogGenerator
print_empty_line print_empty_line
if tags.count == 0 if tags.count == 0
@logger.warn "Warning: Can't find any tags in repo.\ Helper.log.warn "Warning: Can't find any tags in repo.\
Make sure, that you push tags to remote repo via 'git push --tags'".yellow Make sure, that you push tags to remote repo via 'git push --tags'".yellow
else else
@logger.info "Found #{tags.count} tags" Helper.log.info "Found #{tags.count} tags"
end end
tags
end end
# This method fetch all closed issues and separate them to pull requests and pure issues # This method fetch all closed issues and separate them to pull requests and pure issues
@@ -112,10 +106,10 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
break if @options[:max_issues] && issues.length >= @options[:max_issues] break if @options[:max_issues] && issues.length >= @options[:max_issues]
end end
print_empty_line print_empty_line
@logger.info "Received issues: #{issues.count}" Helper.log.info "Received issues: #{issues.count}"
rescue rescue
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end end
# separate arrays of issues and pull requests: # separate arrays of issues and pull requests:
@@ -140,17 +134,20 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
end end
print_empty_line print_empty_line
rescue rescue
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end end
@logger.info "Fetching merged dates: #{pull_requests.count}" Helper.log.info "Fetching merged dates: #{pull_requests.count}"
pull_requests pull_requests
end end
# Print specified line on the same string
# @param [String] log_string
def print_in_same_line(log_string) def print_in_same_line(log_string)
print log_string + "\r" print log_string + "\r"
end end
# Print long line with spaces on same line to clear prev message
def print_empty_line def print_empty_line
print_in_same_line(" ") print_in_same_line(" ")
end end
@@ -169,10 +166,10 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
obj = @github.issues.events.list user: @options[:user], obj = @github.issues.events.list user: @options[:user],
repo: @options[:project], repo: @options[:project],
issue_number: issue["number"] issue_number: issue["number"]
rescue
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
issue[:events] = obj.body issue[:events] = obj.body
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}") print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}")
i += 1 i += 1
end end
@@ -184,32 +181,26 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
# to clear line from prev print # to clear line from prev print
print_empty_line print_empty_line
@logger.info "Fetching events for issues and PR: #{i}" Helper.log.info "Fetching events for issues and PR: #{i}"
end end
# Try to find tag date in local hash. # Fetch tag time from repo
# Otherwise fFetch tag time and put it to local hash file. #
# @param [String] tag_name name of the tag # @param [Hash] tag
# @return [Time] time of specified tag # @return [Time] time of specified tag
def get_time_of_tag(tag_name) def fetch_date_of_tag(tag)
fail ChangelogGeneratorError, "tag_name is nil".red if tag_name.nil?
if @tag_times_hash[tag_name["name"]]
return @tag_times_hash[tag_name["name"]]
end
begin begin
github_git_data_commits_get = @github.git_data.commits.get @options[:user], commit_data = @github.git_data.commits.get @options[:user],
@options[:project], @options[:project],
tag_name["commit"]["sha"] tag["commit"]["sha"]
rescue rescue
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end end
time_string = github_git_data_commits_get["committer"]["date"] time_string = commit_data["committer"]["date"]
@tag_times_hash[tag_name["name"]] = Time.parse(time_string) Time.parse(time_string)
end end
# Fetch commit for specifed event # Fetch commit for specified event
# @return [Hash] # @return [Hash]
def fetch_commit(event) def fetch_commit(event)
@github.git_data.commits.get @options[:user], @options[:project], event[:commit_id] @github.git_data.commits.get @options[:user], @options[:project], event[:commit_id]

View File

@@ -1,7 +1,8 @@
require "github_changelog_generator/fetcher" require_relative "../fetcher"
require_relative "generator_generation" require_relative "generator_generation"
require_relative "generator_fetcher" require_relative "generator_fetcher"
require_relative "generator_processor" require_relative "generator_processor"
require_relative "generator_tags"
module GitHubChangelogGenerator module GitHubChangelogGenerator
# Default error for ChangelogGenerator # Default error for ChangelogGenerator
@@ -9,7 +10,7 @@ module GitHubChangelogGenerator
end end
class Generator class Generator
attr_accessor :options, :all_tags, :github attr_accessor :options, :filtered_tags, :github
# A Generator responsible for all logic, related with change log generation from ready-to-parse issues # A Generator responsible for all logic, related with change log generation from ready-to-parse issues
# #
@@ -17,13 +18,9 @@ module GitHubChangelogGenerator
# generator = GitHubChangelogGenerator::Generator.new # generator = GitHubChangelogGenerator::Generator.new
# content = generator.compound_changelog # content = generator.compound_changelog
def initialize(options = nil) def initialize(options = nil)
@options = options @options = options || {}
@tag_times_hash = {}
@fetcher = GitHubChangelogGenerator::Fetcher.new @options @fetcher = GitHubChangelogGenerator::Fetcher.new @options
fetch_tags
fetch_issues_and_pr
end end
def fetch_issues_and_pr def fetch_issues_and_pr
@@ -37,20 +34,6 @@ module GitHubChangelogGenerator
detect_actual_closed_dates(@issues + @pull_requests) detect_actual_closed_dates(@issues + @pull_requests)
end end
def fetch_tags
# @all_tags = get_filtered_tags
@all_tags = @fetcher.get_all_tags
fetch_tags_dates
sort_tags_by_date
end
# Sort all tags by date
def sort_tags_by_date
puts "Sorting tags..." if @options[:verbose]
@all_tags.sort_by! { |x| @fetcher.get_time_of_tag(x) }.reverse!
end
# Encapsulate characters to make markdown look as expected. # Encapsulate characters to make markdown look as expected.
# #
# @param [String] string # @param [String] string
@@ -58,7 +41,7 @@ module GitHubChangelogGenerator
def encapsulate_string(string) def encapsulate_string(string)
string.gsub! '\\', '\\\\' string.gsub! '\\', '\\\\'
encpas_chars = %w(> * _ \( \) [ ] #) encpas_chars = %w(< > * _ \( \) [ ] #)
encpas_chars.each do |char| encpas_chars.each do |char|
string.gsub! char, "\\#{char}" string.gsub! char, "\\#{char}"
end end
@@ -73,7 +56,7 @@ module GitHubChangelogGenerator
# @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 [String] older_tag_name 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(pull_requests, issues, newer_tag, older_tag_name = nil) def create_log_for_tag(pull_requests, issues, newer_tag, older_tag_name = 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"
@@ -94,26 +77,6 @@ module GitHubChangelogGenerator
log log
end end
# Detect link, name and time for specified tag.
#
# @param [Hash] newer_tag newer tag. Can be nil, if it's Unreleased section.
# @return [Array] link, name and time of the tag
def detect_link_tag_time(newer_tag)
# if tag is nil - set current time
newer_tag_time = newer_tag.nil? ? Time.new : @fetcher.get_time_of_tag(newer_tag)
# if it's future release tag - set this value
if newer_tag.nil? && @options[:future_release]
newer_tag_name = @options[:future_release]
newer_tag_link = @options[:future_release]
else
# put unreleased label if there is no name for the tag
newer_tag_name = newer_tag.nil? ? @options[:unreleased_label] : newer_tag["name"]
newer_tag_link = newer_tag.nil? ? "HEAD" : newer_tag_name
end
[newer_tag_link, newer_tag_name, newer_tag_time]
end
# Generate ready-to-paste log from list of issues. # Generate ready-to-paste log from list of issues.
# #
# @param [Array] issues # @param [Array] issues
@@ -141,12 +104,12 @@ module GitHubChangelogGenerator
issues.each do |dict| issues.each do |dict|
added = false added = false
dict.labels.each do |label| dict.labels.each do |label|
if label.name == "bug" if @options[:bug_labels].include? label.name
bugs_a.push dict bugs_a.push dict
added = true added = true
next next
end end
if label.name == "enhancement" if @options[:enhancement_labels].include? label.name
enhancement_a.push dict enhancement_a.push dict
added = true added = true
next next

View File

@@ -17,11 +17,11 @@ module GitHubChangelogGenerator
# Async fetching tags: # Async fetching tags:
threads = [] threads = []
i = 0 i = 0
all = @all_tags.count all = @filtered_tags.count
@all_tags.each do |tag| @filtered_tags.each do |tag|
print " \r" print " \r"
threads << Thread.new do threads << Thread.new do
@fetcher.get_time_of_tag(tag) get_time_of_tag(tag)
print "Fetching tags dates: #{i + 1}/#{all}\r" if @options[:verbose] print "Fetching tags dates: #{i + 1}/#{all}\r" if @options[:verbose]
i += 1 i += 1
end end
@@ -41,8 +41,8 @@ module GitHubChangelogGenerator
threads << Thread.new { find_closed_date_by_commit(issue) } threads << Thread.new { find_closed_date_by_commit(issue) }
end end
threads.each(&:join) threads.each(&:join)
puts "Fetching closed dates for issues: Done!" if @options[:verbose]
end end
puts "Fetching closed dates for issues: Done!" if @options[:verbose]
end end
# Fill :actual_date parameter of specified issue by closed date of the commit, if it was closed by commit. # Fill :actual_date parameter of specified issue by closed date of the commit, if it was closed by commit.

View File

@@ -4,12 +4,14 @@ module GitHubChangelogGenerator
# #
# @return [String] Generated change log file # @return [String] Generated change log file
def compound_changelog def compound_changelog
log = "# Change Log\n\n" fetch_and_filter_tags
sort_tags_by_date(@filtered_tags)
fetch_issues_and_pr
log = "#{@options[:header]}\n\n"
if @options[:unreleased_only] if @options[:unreleased_only]
log += generate_log_between_tags(all_tags[0], nil) log += generate_log_between_tags(filtered_tags[0], nil)
elsif @options[:tag1] && @options[:tag2]
log = generate_for_2_tags(log)
else else
log += generate_log_for_all_tags log += generate_log_for_all_tags
end end
@@ -23,7 +25,7 @@ module GitHubChangelogGenerator
tag1 = @options[:tag1] tag1 = @options[:tag1]
tag2 = @options[:tag2] tag2 = @options[:tag2]
tags_strings = [] tags_strings = []
all_tags.each { |x| tags_strings.push(x["name"]) } filtered_tags.each { |x| tags_strings.push(x["name"]) }
if tags_strings.include?(tag1) if tags_strings.include?(tag1)
if tags_strings.include?(tag2) if tags_strings.include?(tag2)
@@ -52,8 +54,9 @@ module GitHubChangelogGenerator
if issues.any? if issues.any?
issues.each do |issue| issues.each do |issue|
merge_string = get_string_for_issue(issue) merge_string = get_string_for_issue(issue)
log += "- #{merge_string}\n\n" log += "- #{merge_string}\n"
end end
log += "\n"
end end
log log
end end
@@ -73,10 +76,15 @@ module GitHubChangelogGenerator
time_string = newer_tag_time.strftime @options[:date_format] time_string = newer_tag_time.strftime @options[:date_format]
# Generate tag name and link # Generate tag name and link
if newer_tag_name.equal? @options[:unreleased_label] if @options[:release_url]
log += "## [#{newer_tag_name}](#{project_url}/tree/#{newer_tag_link})\n\n" release_url = format(@options[:release_url], newer_tag_link)
else else
log += "## [#{newer_tag_name}](#{project_url}/tree/#{newer_tag_link}) (#{time_string})\n\n" release_url = "#{project_url}/tree/#{newer_tag_link}"
end
if newer_tag_name.equal? @options[:unreleased_label]
log += "## [#{newer_tag_name}](#{release_url})\n\n"
else
log += "## [#{newer_tag_name}](#{release_url}) (#{time_string})\n"
end end
if @options[:compare_link] && older_tag_link if @options[:compare_link] && older_tag_link
@@ -100,14 +108,14 @@ module GitHubChangelogGenerator
return "" return ""
end end
create_log(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name) create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name)
end end
# Apply all filters to issues and pull requests # Apply all filters to issues and pull requests
# #
# @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, :actual_date, older_tag, newer_tag)
newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"] newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"]
@@ -127,11 +135,11 @@ module GitHubChangelogGenerator
log = generate_unreleased_section log = generate_unreleased_section
(1...all_tags.size).each do |index| (1...filtered_tags.size).each do |index|
log += generate_log_between_tags(all_tags[index], all_tags[index - 1]) log += generate_log_between_tags(filtered_tags[index], filtered_tags[index - 1])
end end
if @all_tags.count != 0 if @filtered_tags.count != 0
log += generate_log_between_tags(nil, all_tags.last) log += generate_log_between_tags(nil, filtered_tags.last)
end end
log log
@@ -140,7 +148,7 @@ module GitHubChangelogGenerator
def generate_unreleased_section def generate_unreleased_section
log = "" log = ""
if @options[:unreleased] if @options[:unreleased]
unreleased_log = generate_log_between_tags(all_tags[0], nil) unreleased_log = generate_log_between_tags(filtered_tags[0], nil)
log += unreleased_log if unreleased_log log += unreleased_log if unreleased_log
end end
log log

View File

@@ -36,7 +36,7 @@ module GitHubChangelogGenerator
false false
else else
# check, that this milestone in tag list: # check, that this milestone in tag list:
milestone_is_tag = @all_tags.find do |tag| milestone_is_tag = @filtered_tags.find do |tag|
tag.name == issue.milestone.title tag.name == issue.milestone.title
end end
@@ -57,7 +57,7 @@ module GitHubChangelogGenerator
true true
else else
# check, that this milestone in tag list: # check, that this milestone in tag list:
@all_tags.find { |tag| tag.name == issue.milestone.title }.nil? @filtered_tags.find { |tag| tag.name == issue.milestone.title }.nil?
end end
end end
end end
@@ -72,8 +72,8 @@ module GitHubChangelogGenerator
# in case if not tags specified - return unchanged array # in case if not tags specified - return unchanged array
return array if older_tag.nil? && newer_tag.nil? return array if older_tag.nil? && newer_tag.nil?
newer_tag_time = newer_tag && @fetcher.get_time_of_tag(newer_tag) newer_tag_time = newer_tag && get_time_of_tag(newer_tag)
older_tag_time = older_tag && @fetcher.get_time_of_tag(older_tag) older_tag_time = older_tag && get_time_of_tag(older_tag)
array.select do |req| array.select do |req|
if req[hash_key] if req[hash_key]
@@ -138,23 +138,6 @@ module GitHubChangelogGenerator
filtered_issues filtered_issues
end end
# Return tags after filtering tags in lists provided by option: --between-tags & --exclude-tags
#
# @return [Array]
def get_filtered_tags
all_tags = @fetcher.get_all_tags
filtered_tags = []
if @options[:between_tags]
@options[:between_tags].each do |tag|
unless all_tags.include? tag
puts "Warning: can't find tag #{tag}, specified with --between-tags option.".yellow
end
end
filtered_tags = all_tags.select { |tag| @options[:between_tags].include? tag }
end
filtered_tags
end
# General filtered function # General filtered function
# #
# @param [Array] all_issues # @param [Array] all_issues

View File

@@ -0,0 +1,108 @@
module GitHubChangelogGenerator
class Generator
# fetch, filter tags, fetch dates and sort them in time order
def fetch_and_filter_tags
@filtered_tags = get_filtered_tags(@fetcher.get_all_tags)
fetch_tags_dates
end
# Sort all tags by date
def sort_tags_by_date(tags)
puts "Sorting tags..." if @options[:verbose]
tags.sort_by! do |x|
get_time_of_tag(x)
end.reverse!
end
# Try to find tag date in local hash.
# Otherwise fFetch tag time and put it to local hash file.
# @param [Hash] tag_name name of the tag
# @return [Time] time of specified tag
def get_time_of_tag(tag_name)
fail ChangelogGeneratorError, "tag_name is nil".red if tag_name.nil?
name_of_tag = tag_name["name"]
time_for_name = @tag_times_hash[name_of_tag]
if !time_for_name.nil?
time_for_name
else
time_string = @fetcher.fetch_date_of_tag tag_name
@tag_times_hash[name_of_tag] = time_string
time_string
end
end
# Detect link, name and time for specified tag.
#
# @param [Hash] newer_tag newer tag. Can be nil, if it's Unreleased section.
# @return [Array] link, name and time of the tag
def detect_link_tag_time(newer_tag)
# if tag is nil - set current time
newer_tag_time = newer_tag.nil? ? Time.new : get_time_of_tag(newer_tag)
# if it's future release tag - set this value
if newer_tag.nil? && @options[:future_release]
newer_tag_name = @options[:future_release]
newer_tag_link = @options[:future_release]
else
# put unreleased label if there is no name for the tag
newer_tag_name = newer_tag.nil? ? @options[:unreleased_label] : newer_tag["name"]
newer_tag_link = newer_tag.nil? ? "HEAD" : newer_tag_name
end
[newer_tag_link, newer_tag_name, newer_tag_time]
end
# Return tags after filtering tags in lists provided by option: --between-tags & --exclude-tags
#
# @return [Array]
def get_filtered_tags(all_tags)
filtered_tags = filter_since_tag(all_tags)
filtered_tags = filter_between_tags(filtered_tags)
filter_excluded_tags(filtered_tags)
end
def filter_since_tag(all_tags)
filtered_tags = all_tags
tag = @options[:since_tag]
if tag
if all_tags.map(&:name).include? tag
idx = all_tags.index { |t| t.name == tag }
if idx > 0
filtered_tags = all_tags[0..idx - 1]
else
filtered_tags = []
end
else
Helper.log.warn "Warning: can't find tag #{tag}, specified with --since-tag option."
end
end
filtered_tags
end
def filter_between_tags(all_tags)
filtered_tags = all_tags
if @options[:between_tags]
@options[:between_tags].each do |tag|
unless all_tags.map(&:name).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
def filter_excluded_tags(all_tags)
filtered_tags = all_tags
if @options[:exclude_tags]
@options[:exclude_tags].each do |tag|
unless all_tags.map(&:name).include? tag
Helper.log.warn "Warning: can't find tag #{tag}, specified with --exclude-tags option."
end
end
filtered_tags = all_tags.reject { |tag| @options[:exclude_tags].include? tag.name }
end
filtered_tags
end
end
end

View File

@@ -0,0 +1,37 @@
require "logger"
module GitHubChangelogGenerator
module Helper
# @return true if the currently running program is a unit test
def self.test?
defined?SpecHelper
end
if test?
@log ||= Logger.new(nil) # don't show any logs when running tests
else
@log ||= Logger.new(STDOUT)
end
@log.formatter = proc do |severity, _datetime, _progname, msg|
string = "#{msg}\n"
if severity == "DEBUG"
string = string.magenta
elsif severity == "INFO"
string = string.white
elsif severity == "WARN"
string = string.yellow
elsif severity == "ERROR"
string = string.red
elsif severity == "FATAL"
string = string.red.bold
end
string
end
# Logging happens using this method
class << self
attr_reader :log
end
end
end

View File

@@ -2,37 +2,37 @@
require "optparse" require "optparse"
require "pp" require "pp"
require_relative "version" require_relative "version"
require_relative "helper"
module GitHubChangelogGenerator module GitHubChangelogGenerator
class Parser class Parser
# parse options with optparse
def self.parse_options def self.parse_options
options = { options = get_default_options
tag1: nil,
tag2: nil,
date_format: "%Y-%m-%d",
output: "CHANGELOG.md",
issues: true,
add_issues_wo_labels: true,
add_pr_wo_labels: true,
pulls: true,
filter_issues_by_milestone: true,
author: true,
unreleased: true,
unreleased_label: "Unreleased",
compare_link: true,
include_labels: %w(bug enhancement),
exclude_labels: %w(duplicate question invalid wontfix),
max_issues: nil,
simple_list: false,
verbose: true,
merge_prefix: "**Merged pull requests:**", parser = setup_parser(options)
issue_prefix: "**Closed issues:**",
bug_prefix: "**Fixed bugs:**",
enhancement_prefix: "**Implemented enhancements:**",
git_remote: "origin"
}
parser.parse!
if options[:user].nil? || options[:project].nil?
detect_user_and_project(options, ARGV[0], ARGV[1])
end
if !options[:user] || !options[:project]
puts parser.banner
exit
end
if options[:verbose]
Helper.log.info "Performing task with options:"
pp options
puts ""
end
options
end
# setup parsing options
def self.setup_parser(options)
parser = OptionParser.new do |opts| parser = OptionParser.new do |opts|
opts.banner = "Usage: github_changelog_generator [options]" opts.banner = "Usage: github_changelog_generator [options]"
opts.on("-u", "--user [USER]", "Username of the owner of target GitHub repo") do |last| opts.on("-u", "--user [USER]", "Username of the owner of target GitHub repo") do |last|
@@ -50,6 +50,21 @@ module GitHubChangelogGenerator
opts.on("-o", "--output [NAME]", "Output file. Default is CHANGELOG.md") do |last| opts.on("-o", "--output [NAME]", "Output file. Default is CHANGELOG.md") do |last|
options[:output] = last options[:output] = last
end end
opts.on("--bugs-label [LABEL]", "Setup custom label for bug-fixes section. Default is \"**Fixed bugs:**""") do |v|
options[:bug_prefix] = v
end
opts.on("--enhancement-label [LABEL]", "Setup custom label for enhancements section. Default is \"**Implemented enhancements:**\"") do |v|
options[:enhancement_prefix] = v
end
opts.on("--issues-label [LABEL]", "Setup custom label for closed-issues section. Default is \"**Closed issues:**\"") do |v|
options[:issue_prefix] = v
end
opts.on("--header-label [LABEL]", "Setup custom header label. Default is \"# Change Log\"") do |v|
options[:header] = v
end
opts.on("--pr-label [LABEL]", "Setup custom label for pull requests section. Default is \"**Merged pull requests:**\"") do |v|
options[:merge_prefix] = v
end
opts.on("--[no-]issues", "Include closed issues in changelog. Default is true") do |v| opts.on("--[no-]issues", "Include closed issues in changelog. Default is true") do |v|
options[:issues] = v options[:issues] = v
end end
@@ -80,15 +95,33 @@ module GitHubChangelogGenerator
opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true") do |v| opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true") do |v|
options[:compare_link] = v options[:compare_link] = v
end end
opts.on("--include-labels x,y,z", Array, 'Only issues with the specified labels will be included in the changelog. Default is \'bug,enhancement\'') do |list| opts.on("--include-labels x,y,z", Array, "Only issues with the specified labels will be included in the changelog.") do |list|
options[:include_labels] = list options[:include_labels] = list
end end
opts.on("--exclude-labels x,y,z", Array, 'Issues with the specified labels will be always excluded from changelog. Default is \'duplicate,question,invalid,wontfix\'') do |list| opts.on("--exclude-labels x,y,z", Array, 'Issues with the specified labels will be always excluded from changelog. Default is \'duplicate,question,invalid,wontfix\'') do |list|
options[:exclude_labels] = list options[:exclude_labels] = list
end end
opts.on("--bug-labels x,y,z", Array, 'Issues with the specified labels will be always added to "Fixed bugs" section. Default is \'bug,Bug\'') do |list|
options[:bug_labels] = list
end
opts.on("--enhancement-labels x,y,z", Array, 'Issues with the specified labels will be always added to "Implemented enhancements" section. Default is \'enhancement,Enhancement\'') do |list|
options[:enhancement_labels] = list
end
opts.on("--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|
options[:exclude_tags] = list
end
opts.on("--since-tag x", "Change log will start after specified tag") do |v|
options[:since_tag] = v
end
opts.on("--max-issues [NUMBER]", Integer, "Max number of issues to fetch from GitHub. Default is unlimited") do |max| opts.on("--max-issues [NUMBER]", Integer, "Max number of issues to fetch from GitHub. Default is unlimited") do |max|
options[:max_issues] = max options[:max_issues] = max
end end
opts.on("--release-url [URL]", "The URL to point to for release links, in printf format (with the tag as variable).") do |url|
options[:release_url] = url
end
opts.on("--github-site [URL]", "The Enterprise Github site on which your project is hosted.") do |last| opts.on("--github-site [URL]", "The Enterprise Github site on which your project is hosted.") do |last|
options[:github_site] = last options[:github_site] = last
end end
@@ -113,27 +146,45 @@ module GitHubChangelogGenerator
exit exit
end end
end end
parser
parser.parse!
detect_user_and_project(options)
if !options[:user] || !options[:project]
puts parser.banner
exit
end end
if options[:verbose] # just get default options
puts "Performing task with options:" def self.get_default_options
pp options options = {
puts "" tag1: nil,
end tag2: nil,
date_format: "%Y-%m-%d",
output: "CHANGELOG.md",
issues: true,
add_issues_wo_labels: true,
add_pr_wo_labels: true,
pulls: true,
filter_issues_by_milestone: true,
author: true,
unreleased: true,
unreleased_label: "Unreleased",
compare_link: true,
enhancement_labels: %w(enhancement Enhancement),
bug_labels: %w(bug Bug),
exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix),
max_issues: nil,
simple_list: false,
verbose: true,
header: "# Change Log",
merge_prefix: "**Merged pull requests:**",
issue_prefix: "**Closed issues:**",
bug_prefix: "**Fixed bugs:**",
enhancement_prefix: "**Implemented enhancements:**",
git_remote: "origin"
}
options options
end end
def self.detect_user_and_project(options) # Detects user and project from git
options[:user], options[:project] = user_project_from_option(ARGV[0], ARGV[1], options[:github_site]) def self.detect_user_and_project(options, arg0 = nil, arg1 = nil)
options[:user], options[:project] = user_project_from_option(arg0, arg1, options[:github_site])
if !options[:user] || !options[:project] if !options[:user] || !options[:project]
if ENV["RUBYLIB"] =~ /ruby-debug-ide/ if ENV["RUBYLIB"] =~ /ruby-debug-ide/
options[:user] = "skywinder" options[:user] = "skywinder"

View File

@@ -0,0 +1,68 @@
require "rake"
require "rake/tasklib"
require "github_changelog_generator"
module GitHubChangelogGenerator
class RakeTask < ::Rake::TaskLib
include ::Rake::DSL if defined?(::Rake::DSL)
OPTIONS = %w( user project token date_format output
bug_prefix enhancement_prefix issue_prefix
header merge_prefix issues
add_issues_wo_labels add_pr_wo_labels
pulls filter_issues_by_milestone author
unreleased_only unreleased unreleased_label
compare_link include_labels exclude_labels
bug_labels enhancement_labels
between_tags exclude_tags since_tag max_issues
github_site github_endpoint simple_list
future_release verbose )
OPTIONS.each do |o|
attr_accessor o.to_sym
end
# Public: Initialise a new GitHubChangelogGenerator::RakeTask.
#
# Example
#
# GitHubChangelogGenerator::RakeTask.new
def initialize(*args, &task_block)
@name = args.shift || :changelog
define(args, &task_block)
end
def define(args, &task_block)
desc "Generate a Change log from GitHub"
task_block.call(*[self, args].slice(0, task_block.arity)) if task_block
# clear any (auto-)pre-existing task
Rake::Task[@name].clear if Rake::Task.task_defined?(@name)
task @name do
# mimick parse_options
options = Parser.get_default_options
if options[:user].nil? || options[:project].nil?
Parser.detect_user_and_project(options)
end
OPTIONS.each do |o|
v = instance_variable_get("@#{o}")
options[o.to_sym] = v if v
end
generator = Generator.new options
log = generator.compound_changelog
output_filename = "#{options[:output]}"
File.open(output_filename, "w") { |file| file.write(log) }
puts "Done!"
puts "Generated log placed in #{Dir.pwd}/#{output_filename}"
end
end
end
end

View File

@@ -1,3 +1,3 @@
module GitHubChangelogGenerator module GitHubChangelogGenerator
VERSION = "1.4.1" VERSION = "1.7.0"
end end

View File

@@ -19,6 +19,10 @@ require "codeclimate-test-reporter"
require "simplecov" require "simplecov"
require "coveralls" require "coveralls"
# This module is only used to check the environment is currently a testing env
module SpecHelper
end
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
Coveralls::SimpleCov::Formatter, Coveralls::SimpleCov::Formatter,
SimpleCov::Formatter::HTMLFormatter, SimpleCov::Formatter::HTMLFormatter,

View File

@@ -52,7 +52,7 @@ describe GitHubChangelogGenerator::Fetcher do
@fetcher = GitHubChangelogGenerator::Fetcher.new(options) @fetcher = GitHubChangelogGenerator::Fetcher.new(options)
end end
it "should raise Unauthorized error" do it "should raise Unauthorized error" do
expect { @fetcher.github_fetch_tags [] }.to raise_error Github::Error::Unauthorized expect { @fetcher.github_fetch_tags }.to raise_error Github::Error::Unauthorized
end end
end end
end end

View File

@@ -0,0 +1,167 @@
def tag_mash_with_name(tag)
mash_tag = Hashie::Mash.new
mash_tag.name = tag
mash_tag
end
def tags_mash_from_strings(tags_strings)
mash_array = []
tags_strings.each do |tag|
mash_tag = tag_mash_with_name(tag)
mash_array << mash_tag
end
mash_array
end
describe GitHubChangelogGenerator::Generator do
describe "#filter_between_tags" do
context "when between_tags nil" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: nil)
end
subject do
@generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
context "when between_tags same as input array" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3))
end
subject do
@generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
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_mash_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_mash_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_mash_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
end
end
describe "#get_filtered_tags" do
subject do
generator.get_filtered_tags(tags_mash_from_strings(%w(1 2 3 4 5)))
end
context "with excluded and between tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3), exclude_tags: %w(2)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 3))) }
end
end
describe "#filter_excluded_tags" do
subject { generator.filter_excluded_tags(tags_mash_from_strings(%w(1 2 3))) }
context "with valid excluded tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(3)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2))) }
end
context "with invalid excluded tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(invalid tags)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
end
describe "#filter_since_tag" do
subject { generator.filter_since_tag(tags_mash_from_strings(%w(1 2 3))) }
context "with valid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
end
context "with invalid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: %w(invalid tags)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
end
describe "#get_time_of_tag" do
current_time = Time.now
before(:all) { @generator = GitHubChangelogGenerator::Generator.new }
context "run with nil parameter" do
it "should raise ChangelogGeneratorError" do
expect { @generator.get_time_of_tag nil }.to raise_error(GitHubChangelogGenerator::ChangelogGeneratorError)
end
end
context "fetch already filled tag" do
before { @generator.instance_variable_set :@tag_times_hash, "valid_tag" => current_time }
subject { @generator.get_time_of_tag tag_mash_with_name("valid_tag") }
it { is_expected.to be_a_kind_of(Time) }
it { is_expected.to eq(current_time) }
end
context "fetch not filled tag" do
before do
mock = double("fake fetcher")
allow(mock).to receive_messages(fetch_date_of_tag: current_time)
@generator.instance_variable_set :@fetcher, mock
end
subject do
of_tag = @generator.get_time_of_tag tag_mash_with_name("valid_tag")
of_tag
end
it { is_expected.to be_a_kind_of(Time) }
it { is_expected.to eq(current_time) }
end
end
describe "#sort_tags_by_date" do
time1 = Time.now
time2 = Time.now
time3 = Time.now
before(:all) do
@generator = GitHubChangelogGenerator::Generator.new
end
context "sort unsorted tags" do
tags = tags_mash_from_strings %w(valid_tag1 valid_tag2 valid_tag3)
before do
@generator.instance_variable_set :@tag_times_hash, "valid_tag1" => time1, "valid_tag2" => time2, "valid_tag3" => time3
end
subject do
@generator.sort_tags_by_date tags
end
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags.reverse!) }
end
context "sort sorted tags" do
tags = tags_mash_from_strings %w(valid_tag3 valid_tag2 valid_tag1)
before do
@generator.instance_variable_set :@tag_times_hash, "valid_tag1" => time1, "valid_tag2" => time2, "valid_tag3" => time3
end
subject do
@generator.sort_tags_by_date tags
end
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags) }
end
end
end

View File

@@ -1,21 +1,21 @@
describe GitHubChangelogGenerator::Parser do describe GitHubChangelogGenerator::Parser do
describe "#self.user_project_from_remote" do describe ".user_project_from_remote" do
context "when remote is 1" do context "when remote is type 1" do
subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin https://github.com/skywinder/ActionSheetPicker-3.0 (fetch)") } subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin https://github.com/skywinder/ActionSheetPicker-3.0 (fetch)") }
it { is_expected.to be_a(Array) } it { is_expected.to be_a(Array) }
it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) } it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
end end
context "when remote is 2" do context "when remote is type 2" do
subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") } subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") }
it { is_expected.to be_a(Array) } it { is_expected.to be_a(Array) }
it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) } it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
end end
context "when remote is 3" do context "when remote is type 3" do
subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") } subject { GitHubChangelogGenerator::Parser.user_project_from_remote("https://github.com/skywinder/ActionSheetPicker-3.0") }
it { is_expected.to be_a(Array) } it { is_expected.to be_a(Array) }
it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) } it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
end end
context "when remote is 4" do context "when remote is type 4" do
subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin git@github.com:skywinder/ActionSheetPicker-3.0.git (fetch)") } subject { GitHubChangelogGenerator::Parser.user_project_from_remote("origin git@github.com:skywinder/ActionSheetPicker-3.0.git (fetch)") }
it { is_expected.to be_a(Array) } it { is_expected.to be_a(Array) }
it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) } it { is_expected.to match_array(["skywinder", "ActionSheetPicker-3.0"]) }
@@ -26,10 +26,10 @@ describe GitHubChangelogGenerator::Parser do
it { is_expected.to match_array([nil, nil]) } it { is_expected.to match_array([nil, nil]) }
end end
end end
describe "#self.user_project_from_option" do describe ".user_project_from_option" do
# context "when option is invalid" do context "when option is invalid" do
# it("should exit") { expect { GitHubChangelogGenerator::Parser.user_project_from_option("blah", nil) }.to raise_error(SystemExit) } it("should exit") { expect { GitHubChangelogGenerator::Parser.user_project_from_option("blah", nil) }.to raise_error(SystemExit) }
# end end
context "when option is valid" do context "when option is valid" do
subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", nil) } subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", nil) }