Compare commits

...

34 Commits

Author SHA1 Message Date
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
20 changed files with 512 additions and 382 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-06-11 16:35:14 +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 Max: 63
# Offense count: 4 # Offense count: 1
# Configuration parameters: CountComments.
Metrics/ClassLength:
Enabled: false
# Offense count: 3
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,5 +1,29 @@
# Change Log # Change Log
## [Unreleased](https://github.com/skywinder/github-changelog-generator/tree/HEAD)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.5.0...HEAD)
**Fixed bugs:**
- 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)
**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) ## [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)

View File

@@ -82,30 +82,35 @@ As output you will get `CHANGELOG.md` file with pretty *Markdown-formatted* chan
### Params ### Params
Type `github_changelog_generator --help` for detailed usage. Type `github_changelog_generator --help` for detailed usage.
Usage: changelog_generator [options] Usage: github_changelog_generator [options]
-u, --user [USER] Username of the owner of target GitHub repo -u, --user [USER] Username of the owner of target GitHub repo
-p, --project [PROJECT] Name of project on GitHub -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 -t, --token [TOKEN] To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y -f, --date-format [FORMAT] Date format. Default is %Y-%m-%d
-o, --output [NAME] Output file. Default is CHANGELOG.md -o, --output [NAME] Output file. Default is CHANGELOG.md
--[no-]verbose Run verbosely. Default is true --[no-]issues Include closed issues in changelog. Default is true
--[no-]issues Include closed issues to changelog. Default is true --[no-]issues-wo-labels Include closed issues without labels in 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 in changelog. Default is true
--[no-]pr-wo-labels Include pull requests without labels to changelog. Default is true --[no-]pull-requests Include pull-requests in 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-]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
--[no-]author Add author of pull-request in the end. Default is true --unreleased-only Generate log from unreleased closed issues only.
--unreleased-only Generate log from unreleased closed issues only. --[no-]unreleased Add to log unreleased closed issues. Default is true
--[no-]unreleased Add to log unreleased closed issues. Default is true --unreleased-label [label] Add to log unreleased closed issues. Default is true
--[no-]compare-link Include compare link between older version and newer version. Default is true --[no-]compare-link Include compare link (Full Changelog) 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' --include-labels x,y,z Only issues with the specified labels will be included in the 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' --exclude-labels x,y,z Issues with the specified 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. --between-tags x,y,z Change log will be filled only between specified tags
--github-site [URL] The Enterprise Github site on which your project is hosted. --exclude-tags x,y,z Change log will be exclude specified tags
--github-api [URL] The enterprise endpoint to use for your Github API. --max-issues [NUMBER] Max number of issues to fetch from GitHub. Default is unlimited
--future-release [RELEASE-VERSION] Put the unreleased changes in the specified release number. --github-site [URL] The Enterprise Github site on which your project is hosted.
-v, --version Print version number --github-api [URL] The enterprise endpoint to use for your Github API.
-h, --help Displays Help --simple-list Create simple list from issues and pull requests. Default is false.
--future-release [RELEASE-VERSION]
Put the unreleased changes in the specified release number.
--[no-]verbose Run verbosely. Default is true
-v, --version Print version number
-h, --help Displays Help
### GitHub token ### GitHub token
@@ -129,7 +134,7 @@ 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.
##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,182 +1,34 @@
# Change Log # Change Log
## [Unreleased](https://github.com/sindresorhus/awesome/tree/HEAD) ## [0.0.4](https://github.com/skywinder/changelog_test/tree/0.0.4) (2015-05-22)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.3...0.0.4)
**Closed issues:** **Closed issues:**
- Suggestion [\#151](https://github.com/sindresorhus/awesome/issues/151) - Test issue, that should appear in 0.0.4 [\#3](https://github.com/skywinder/changelog_test/issues/3)
- ta bugando [\#149](https://github.com/sindresorhus/awesome/issues/149)
- 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)) - Add automatically generated change log file. [\#5](https://github.com/skywinder/changelog_test/pull/5) ([skywinder](https://github.com/skywinder))
- Add Elm [\#146](https://github.com/sindresorhus/awesome/pull/146) ([isRuslan](https://github.com/isRuslan)) ## [v0.0.3](https://github.com/skywinder/changelog_test/tree/v0.0.3) (2015-03-04)
- Add Awesome Sketch list [\#141](https://github.com/sindresorhus/awesome/pull/141) ([diessica](https://github.com/diessica)) [Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.2...v0.0.3)
- Add "Maintenance Modules" [\#139](https://github.com/sindresorhus/awesome/pull/139) ([feross](https://github.com/feross)) **Merged pull requests:**
- Added awesome-delphi [\#137](https://github.com/sindresorhus/awesome/pull/137) ([Teloah](https://github.com/Teloah)) - fix \#3. hotfix. Should appear in v0.0.3 [\#4](https://github.com/skywinder/changelog_test/pull/4) ([skywinder](https://github.com/skywinder))
- adds BEM resources page [\#136](https://github.com/sindresorhus/awesome/pull/136) ([sturobson](https://github.com/sturobson)) ## [v0.0.2](https://github.com/skywinder/changelog_test/tree/v0.0.2) (2015-03-04)
- Added Rails to "Back-end development" [\#135](https://github.com/sindresorhus/awesome/pull/135) ([jpsilvashy](https://github.com/jpsilvashy)) [Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.1...v0.0.2)
- 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)) - 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))
- Changed link to Awesome Laravel [\#127](https://github.com/sindresorhus/awesome/pull/127) ([chiraggude](https://github.com/chiraggude)) ## [v0.0.1](https://github.com/skywinder/changelog_test/tree/v0.0.1) (2015-03-02)
- Add Pyramid framework [\#124](https://github.com/sindresorhus/awesome/pull/124) ([uralbash](https://github.com/uralbash))
- Added Malware Analysis [\#123](https://github.com/sindresorhus/awesome/pull/123) ([leoruhland](https://github.com/leoruhland))
- 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))

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
@@ -170,7 +167,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
repo: @options[:project], repo: @options[:project],
issue_number: issue["number"] issue_number: issue["number"]
rescue rescue
@logger.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end end
issue[:events] = obj.body issue[:events] = obj.body
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}")
@@ -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
@@ -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

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
fetch_and_filter_tags
sort_tags_by_date(@filtered_tags)
fetch_issues_and_pr
log = "# Change Log\n\n" log = "# Change Log\n\n"
if @options[:unreleased_only] if @options[:unreleased_only]
log += generate_log_between_tags(all_tags[0], nil) log += generate_log_between_tags(all_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)
@@ -127,11 +129,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 +142,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,89 @@
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_between_tags(all_tags)
filter_excluded_tags(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)
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|
@@ -86,6 +86,18 @@ module GitHubChangelogGenerator
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 be exclude specified tags") do |list|
options[:exclude_tags] = list
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
@@ -113,25 +125,42 @@ module GitHubChangelogGenerator
exit exit
end end
end end
parser
end
parser.parse! # just get default options
def self.get_default_options
detect_user_and_project(options) options = {
tag1: nil,
if !options[:user] || !options[:project] tag2: nil,
puts parser.banner date_format: "%Y-%m-%d",
exit output: "CHANGELOG.md",
end issues: true,
add_issues_wo_labels: true,
if options[:verbose] add_pr_wo_labels: true,
puts "Performing task with options:" pulls: true,
pp options filter_issues_by_milestone: true,
puts "" author: true,
end 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,
merge_prefix: "**Merged pull requests:**",
issue_prefix: "**Closed issues:**",
bug_prefix: "**Fixed bugs:**",
enhancement_prefix: "**Implemented enhancements:**",
git_remote: "origin"
}
options options
end end
# Detects user and project from git
def self.detect_user_and_project(options) def self.detect_user_and_project(options)
options[:user], options[:project] = user_project_from_option(ARGV[0], ARGV[1], options[:github_site]) options[:user], options[:project] = user_project_from_option(ARGV[0], ARGV[1], options[:github_site])
if !options[:user] || !options[:project] if !options[:user] || !options[:project]

View File

@@ -1,3 +1,3 @@
module GitHubChangelogGenerator module GitHubChangelogGenerator
VERSION = "1.4.1" VERSION = "1.6.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,151 @@
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 "#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) }