Compare commits

..

70 Commits

Author SHA1 Message Date
Olle Jonsson
4de6f52572 v1.13.2 2016-09-29 23:27:14 +02:00
Olle Jonsson
e3f7e27a63 Add bump gem to development deps (#423)
- in Gemfile
2016-09-29 23:08:23 +02:00
Petr Korolev
b027884a68 Merge pull request #420 from olleolleolle/feature/travis-with-2.4.0
Travis: Test on 2.4.0-preview2
2016-09-29 18:51:10 +03:00
Olle Jonsson
963e18820a README: Add Gitter badge (#413) 2016-09-27 22:25:35 +02:00
Olle Jonsson
dcd15d1f5d Merge pull request #421 from olleolleolle/fix/coverage-skip-logger-helper
Skip logger helper in coverage
2016-09-27 22:24:17 +02:00
Olle Jonsson
e2020bbab3 Skip logger helper in coverage 2016-09-27 22:08:18 +02:00
Olle Jonsson
725194acc0 SimpleCov config: Ignore gemfiles folder 2016-09-27 21:40:23 +02:00
Olle Jonsson
30ffc0e945 Travis: Get rid of Gemfile.lock 2016-09-27 21:31:17 +02:00
Olle Jonsson
3ab802ae7a Travis: Test on 2.4.0-preview2 2016-09-27 21:25:44 +02:00
Olle Jonsson
fac944786b Merge pull request #417 from skywinder/fix/move-deps-about
Travis: Collecting the config, gemspec: extract development deps to Gemfile
2016-09-26 16:23:37 +02:00
Olle Jonsson
88cad51b06 Travis: The bare test can not work on 2.1. Try 2.2.2 2016-09-22 19:35:52 +02:00
Olle Jonsson
f57dcd5be4 README: Explain the use of Gemfiles for older rubies 2016-09-22 19:35:31 +02:00
Olle Jonsson
7f8131d5cd Lint: avoid multi-line ternary operator 2016-09-22 19:17:23 +02:00
Olle Jonsson
04215618a2 Lint: frozen-string-literal 2016-09-22 19:16:29 +02:00
Olle Jonsson
f226343233 Rubocop rule: Disable too-modern ones 2016-09-22 19:16:00 +02:00
Olle Jonsson
5c21fc980f Rubocop setting: avoid copping the universe 2016-09-22 19:04:35 +02:00
Olle Jonsson
334fd3497a Travis: Introduce gemfiles 2016-09-22 18:50:19 +02:00
Olle Jonsson
443d59769f Ruby version file for the CircleCI tests 2016-09-22 18:41:26 +02:00
Olle Jonsson
b9c0a2f736 Travis: Give up 2016-09-22 18:37:05 +02:00
Olle Jonsson
9bd44b010f Gemfile: Try to keep rack runnable on 2.1 again again again 2016-09-22 18:33:31 +02:00
Olle Jonsson
98ddde0094 Gemfile: Try to keep rack runnable on 2.1 again again 2016-09-22 18:30:20 +02:00
Olle Jonsson
22d8113ade Gemfile: Try to keep rack runnable on 2.1 again 2016-09-22 18:29:14 +02:00
Olle Jonsson
1c69994c8a Gemfile: Try to keep rack runnable on 2.1 2016-09-22 18:27:13 +02:00
Olle Jonsson
99c58d3b94 Travis: Collecting the config
- comment
  - tighter matrix
  - pull out development dependencies into the Gemfile
2016-09-22 18:20:58 +02:00
Olle Jonsson
cdd4b7f201 Merge pull request #415 from dijonkitchen/patch-1
Update README.md
2016-09-18 13:55:04 +02:00
Jonathan Chen
94820df2f4 Update README.md 2016-09-18 06:48:52 -04:00
Olle Jonsson
e402eae344 Merge pull request #411 from olleolleolle/feature/community-gitter
CircleCI hook for Gitter notification
2016-09-08 14:10:42 +02:00
Olle Jonsson
7f3ef24b3f circle.yml: Notify chat room as well as Lobby 2016-09-05 21:48:21 +02:00
Olle Jonsson
74c752c3ce CircleCI hook for Gitter notification 2016-09-01 22:02:01 +02:00
Olle Jonsson
d4140f05c9 Merge pull request #409 from olleolleolle/specs/avoid-a-warning-by-using-stub-const
Spec: avoid Ruby warning about already-defined constant
2016-09-01 21:24:48 +02:00
Olle Jonsson
96491a21e0 Merge pull request #408 from jamesc/jc/remove-colorize
Replace GPL'd colorize gem with MIT-licensed rainbow
2016-09-01 21:15:42 +02:00
Olle Jonsson
b259b186a7 Rainbow library: do not extend String
- do not include all the rainbow presenter methods directly in the
    String class
2016-09-01 11:51:53 -07:00
Olle Jonsson
7e77fd6c57 Drop all local color method calls
- The central logging method decides the color of the output
  - pass Rubocop complaints
2016-09-01 11:50:17 -07:00
Olle Jonsson
91b5abc477 Spec: avoid warning when stubbing ARGV 2016-09-01 20:47:31 +02:00
James Casey
f647dc0d98 Change to use Rainbow instead of colorize
colorize is licensed under GPL-2 which conflicts with the MIT license of
github_changelog_generator.  This changes all usage of colorize to
rainbow which does have a compatible license (MIT)
2016-08-31 14:27:39 -07:00
Olle Jonsson
d23375f5ac Merge pull request #405 from jkeiser/jk/error2
Report actual github error when rate limit exceeded
2016-08-11 00:19:35 +02:00
Olle Jonsson
cbb435511b Merge pull request #407 from jkeiser/jk/thread-cap
Limit number of simultaneous requests to 25
2016-08-10 09:19:42 +02:00
John Keiser
27f2536a0e Limit number of simultaneous requests to 25 2016-08-09 18:42:58 -07:00
John Keiser
07f4e530a4 Report actual github error when rate limit exceeded
Also, don't report rate limit exceeded error unless the rate limit was exceeded.
2016-08-09 13:28:52 -07:00
Olle Jonsson
15de60e1d1 Merge pull request #404 from jkeiser/jk/error-message
Make error messages print on error
2016-08-09 00:26:08 +02:00
John Keiser
c66b0f9aff Make error messages print on error 2016-08-08 12:49:02 -07:00
Petr Korolev
b02e8402b3 Merge branch 'hotfix/update-changelog' 2016-07-22 11:17:55 +03:00
Petr Korolev
7388ca8581 Update changelog for version 1.13.1 2016-07-22 11:17:53 +03:00
Petr Korolev
059e4d4bc3 Merge branch 'release/1.13.1' 2016-07-22 11:16:54 +03:00
Petr Korolev
6c2ef97f63 Update gemspec to version 1.13.1 2016-07-22 11:16:51 +03:00
Olle Jonsson
226748d8ff Merge pull request #401 from skywinder/fix-397
Ability to implicity set user and project from command line
2016-07-22 09:06:44 +02:00
Petr Korolev
74882ef900 fix quote escape 2016-07-22 09:28:06 +03:00
Petr Korolev
37a7430d81 add test 2016-07-21 17:48:47 +03:00
Petr Korolev
939f6fd768 THis fix #397 2016-07-21 17:48:46 +03:00
Petr Korolev
f32a02a75b remove unused puts 2016-07-21 17:47:53 +03:00
Petr Korolev
430d6f5bd9 add missing test 2016-07-21 17:47:53 +03:00
Petr Korolev
4f57845465 rename methods to match of it's actions 2016-07-21 17:47:52 +03:00
John Keiser
4969108eca Constrain JSON to < 2.0 so we can test on ruby 1.9 2016-07-21 17:47:52 +03:00
John Keiser
c0c8bb5653 Don't constrain runtime deps.
Since we are a development dependency of many projects,
constraining our runtime deps can cause their Gemfiles to downgrade
dependencies they share with us, which is never desirable.
2016-07-21 17:47:52 +03:00
Petr Korolev
fdd41a22f6 Merge branch 'master' into develop 2016-07-20 16:55:49 +03:00
Olle Jonsson
08c3d9f913 Merge pull request #399 from edusantana/raketask
Show how to use it with Rakefile
2016-07-18 19:02:34 +02:00
Eduardo de Santana Medeiros Alexandre
1c48f633d8 Show how to use it with Rakefile
It was missing the require statement.
2016-07-18 13:58:26 -03:00
Olle Jonsson
f6fcac7aff README: Formatting detail 2016-07-14 16:47:26 +02:00
Olle Jonsson
074320d925 Merge pull request #396 from cormacmccarthy/patch-2
Adds documentation on using a GHE endpoint
2016-07-14 16:38:17 +02:00
Christopher McCulloh
bb87462e3a Addresses some formatting issues 2016-07-13 20:56:41 -04:00
Olle Jonsson
9acfcf103c Merge pull request #391 from olleolleolle/feature/parser-docstrings
Parser: YARD docstrings and a rename, and RegExp named capture groups
2016-07-14 00:34:44 +02:00
Christopher McCulloh
25c7856e19 Adds documentation on using a GHE endpoint 2016-07-12 16:03:02 -04:00
Olle Jonsson
49f8df24aa Merge pull request #393 from perlun/patch-1
Added a missing OPTION
2016-07-06 14:19:51 +02:00
Per Lundberg
408b12111d Added a missing OPTION
I noted that this was missing when trying to use it. 😄
2016-07-06 15:12:22 +03:00
Petr Korolev
f169ea688e Merge branch 'hotfix/update-changelog' into develop 2016-07-04 11:12:44 +03:00
Petr Korolev
a3b32ca2df Merge branch 'hotfix/update-changelog' 2016-07-04 11:12:44 +03:00
Petr Korolev
55fba0f479 Update changelog for version 1.13.0 2016-07-04 11:12:42 +03:00
Petr Korolev
d13d22eb01 Merge branch 'release/1.13.0' into develop 2016-07-04 11:11:46 +03:00
Olle Jonsson
b63d9d623e Parser: RegExp with named capture groups 2016-07-02 10:49:49 +02:00
Olle Jonsson
d9e2cdeeac Parser: YARD docstrings and a rename 2016-07-02 10:33:15 +02:00
37 changed files with 307 additions and 229 deletions

4
.gitignore vendored
View File

@@ -5,3 +5,7 @@ pkg/
coverage/
.bundle
spec/*.lock
doc
.yardoc
Gemfile.lock
gemfiles/Gemfile.2_4_0.lock

View File

@@ -1,5 +1,12 @@
inherit_from: .rubocop_todo.yml
AllCops:
DisplayCopNames: true
DisplayStyleGuide: true
Exclude:
- 'vendor/**/*'
- 'gemfiles/**/*'
Metrics/LineLength:
Enabled: false
@@ -53,4 +60,10 @@ Style/RegexpLiteral:
Style/MutableConstant:
Enabled: false
# "Use idx.positive? instead of idx > 0."
Style/NumericPredicate:
Enabled: false
Style/SafeNavigation:
Enabled: false

1
.ruby-version Normal file
View File

@@ -0,0 +1 @@
2.3.1

View File

@@ -1,23 +1,25 @@
language: ruby
cache:
- bundler
language: ruby
before_install:
- gem update --system
- gem install bundler
rvm:
- 2.1
script: bundle exec rake checks
matrix:
include:
# Test install on clean system
- install: true
script:
- gem build github_changelog_generator
- gem install *.gem
- install: true
script:
- gem build github_changelog_generator
- bundle install --gemfile spec/install-gem-in-bundler.gemfile
- rvm: 2.2.2
install: true # This skips 'bundle install'
script: gem build github_changelog_generator && gem install *.gem
- rvm: 2.2.2
install: true # This skips 'bundle install'
script: gem build github_changelog_generator && bundle install
gemfile: spec/install-gem-in-bundler.gemfile
- rvm: 2.1
gemfile: gemfiles/Gemfile.with_rack16
- rvm: 2.3.1
gemfile: gemfiles/Gemfile.with_rack2
- rvm: 2.4.0-preview2
gemfile: gemfiles/Gemfile.2_4_0
notifications:
email:
recipients:

2
.yardopts Normal file
View File

@@ -0,0 +1,2 @@
--markup=markdown

View File

@@ -1,5 +1,36 @@
# Change Log
## [1.13.1](https://github.com/skywinder/github-changelog-generator/tree/1.13.1) (2016-07-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.0...1.13.1)
**Implemented enhancements:**
- Don't constrain runtime deps. [\#400](https://github.com/skywinder/github-changelog-generator/pull/400) ([jkeiser](https://github.com/jkeiser))
**Fixed bugs:**
- `--user` flag should not be ignored [\#397](https://github.com/skywinder/github-changelog-generator/issues/397)
- GHE not working with --github-site set to an enterprise site [\#395](https://github.com/skywinder/github-changelog-generator/issues/395)
**Closed issues:**
- Contributors Section [\#398](https://github.com/skywinder/github-changelog-generator/issues/398)
**Merged pull requests:**
- Ability to implicity set user and project from command line [\#401](https://github.com/skywinder/github-changelog-generator/pull/401) ([skywinder](https://github.com/skywinder))
- Show how to use it with Rakefile [\#399](https://github.com/skywinder/github-changelog-generator/pull/399) ([edusantana](https://github.com/edusantana))
- Adds documentation on using a GHE endpoint [\#396](https://github.com/skywinder/github-changelog-generator/pull/396) ([cormacmccarthy](https://github.com/cormacmccarthy))
- Rake task usage: Added a missing option exclude\_tags\_regex [\#393](https://github.com/skywinder/github-changelog-generator/pull/393) ([perlun](https://github.com/perlun))
- Parser: YARD docstrings and a rename, and RegExp named capture groups [\#391](https://github.com/skywinder/github-changelog-generator/pull/391) ([olleolleolle](https://github.com/olleolleolle))
## [1.13.0](https://github.com/skywinder/github-changelog-generator/tree/1.13.0) (2016-07-04)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.12.1...1.13.0)
**Merged pull requests:**
- Carry PR \#301: usernames\_as\_github\_logins [\#392](https://github.com/skywinder/github-changelog-generator/pull/392) ([olleolleolle](https://github.com/olleolleolle))
## [1.12.1](https://github.com/skywinder/github-changelog-generator/tree/1.12.1) (2016-05-09)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.12.0...1.12.1)
@@ -509,10 +540,6 @@
- Encapsulate \[ \> \* \_ \ \] signs in issues names [\#34](https://github.com/skywinder/github-changelog-generator/issues/34)
**Merged pull requests:**
- 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)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.0...1.2.1)

20
Gemfile
View File

@@ -1,13 +1,27 @@
# frozen_string_literal: true
source "https://rubygems.org"
gemspec
group :test do
group :development, :test do
gem "rake"
gem "bundler"
gem "rubocop"
gem "overcommit"
gem "overcommit", ">= 0.31"
gem "rubocop", ">= 0.43"
end
group :development do
gem "bump"
end
group :test do
gem "coveralls", "~>0.8", require: false
gem "simplecov", "~>0.10", require: false
gem "codeclimate-test-reporter", "~>0.4"
if RUBY_VERSION > "2"
gem "json", "~> 2.0", ">= 2.0.2"
else
gem "json"
end
gem "rspec", "< 4"
end

View File

@@ -1,108 +0,0 @@
PATH
remote: .
specs:
github_changelog_generator (1.12.1)
colorize (~> 0.7)
github_api (~> 0.12)
rake (>= 10.0)
GEM
remote: https://rubygems.org/
specs:
addressable (2.4.0)
ast (2.2.0)
childprocess (0.5.9)
ffi (~> 1.0, >= 1.0.11)
codeclimate-test-reporter (0.5.0)
simplecov (>= 0.7.1, < 1.0.0)
colorize (0.7.7)
coveralls (0.8.13)
json (~> 1.8)
simplecov (~> 0.11.0)
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
tins (~> 1.6.0)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
diff-lcs (1.2.5)
docile (1.1.5)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.10)
github_api (0.13.1)
addressable (~> 2.4.0)
descendants_tracker (~> 0.0.4)
faraday (~> 0.8, < 0.10)
hashie (>= 3.4)
multi_json (>= 1.7.5, < 2.0)
oauth2
hashie (3.4.4)
iniparse (1.4.2)
json (1.8.3)
jwt (1.5.1)
multi_json (1.12.0)
multi_xml (0.5.5)
multipart-post (2.0.0)
oauth2 (1.1.0)
faraday (>= 0.8, < 0.10)
jwt (~> 1.0, < 1.5.2)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
overcommit (0.33.0)
childprocess (~> 0.5.8)
iniparse (~> 1.4)
parser (2.3.1.0)
ast (~> 2.2)
powerpack (0.1.1)
rack (1.6.4)
rainbow (2.1.0)
rake (11.1.2)
rspec (3.4.0)
rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0)
rspec-mocks (~> 3.4.0)
rspec-core (3.4.4)
rspec-support (~> 3.4.0)
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-mocks (3.4.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-support (3.4.1)
rubocop (0.39.0)
parser (>= 2.3.0.7, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.0)
simplecov (0.11.2)
docile (~> 1.1.0)
json (~> 1.8)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
term-ansicolor (1.3.2)
tins (~> 1.0)
thor (0.19.1)
thread_safe (0.3.5)
tins (1.6.0)
unicode-display_width (1.0.5)
PLATFORMS
ruby
DEPENDENCIES
bundler
codeclimate-test-reporter (~> 0.4)
coveralls (~> 0.8)
github_changelog_generator!
overcommit
rake
rspec (>= 3.2)
rubocop
simplecov (~> 0.10)
BUNDLED WITH
1.12.0.rc.2

View File

@@ -4,6 +4,7 @@
[![Inline docs](http://inch-ci.org/github/skywinder/github-changelog-generator.svg)](http://inch-ci.org/github/skywinder/github-changelog-generator)
[![Code Climate](https://codeclimate.com/github/skywinder/github-changelog-generator/badges/gpa.svg)](https://codeclimate.com/github/skywinder/github-changelog-generator)
[![Test Coverage](https://codeclimate.com/github/skywinder/github-changelog-generator/badges/coverage.svg)](https://codeclimate.com/github/skywinder/github-changelog-generator)
[![Join the chat at https://gitter.im/github-changelog-generator/chat](https://badges.gitter.im/github-changelog-generator/chat.svg)](https://gitter.im/github-changelog-generator/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
GitHub Changelog Generator ![GitHub Logo](../master/images/logo.jpg)
==================
@@ -23,7 +24,7 @@ GitHub Changelog Generator ![GitHub Logo](../master/images/logo.jpg)
### Changelog generation has never been so easy
**Fully automate changelog generation** - This gem generates change log file based on **tags**, **issues** and merged **pull requests** (and splits them into separate lists according labels) from :octocat: GitHub Issue Tracker.
**Fully automate changelog generation** - This gem generates change log file based on **tags**, **issues** and merged **pull requests** (and splits them into separate lists according to labels) from :octocat: GitHub Issue Tracker.
Since now you don't have to fill your `CHANGELOG.md` manually: just run the script, relax and take a cup of :coffee: before your next release! :tada:
@@ -36,7 +37,9 @@ Because software tools are for people. If you dont care, why are you contribu
## Installation
[sudo] gem install github_changelog_generator
gem install github_changelog_generator
See also Troubleshooting.
## Output example
@@ -77,6 +80,11 @@ Because software tools are for people. If you dont care, why are you contribu
- `github_changelog_generator -u github_username -p github_project`
- `github_changelog_generator github_username/github_project`
- If you are running it against a repository on a Github Enterprise install, you must specify *both* `--github-site` and `--github-api` command line options:
github_changelog_generator --github-site="https://github.yoursite.com" \
--github-api="https://github.yoursite.com/api/v3/"
This generates a changelog to the `CHANGELOG.md` file, with pretty markdown formatting.
### Params
@@ -133,6 +141,8 @@ we've provided a `rake` task library for your changelog generation.
Just put something like this in your `Rakefile`:
```ruby
require 'github_changelog_generator/task'
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
config.since_tag = '0.1.14'
config.future_release = '0.2.0'
@@ -216,6 +226,31 @@ If you're seeing this warning, please do the following:
1. Make sure you're providing an OAuth token, so you're not making requests anonymously. Using an OAuth token increases your hourly request maximum from 60 to 5000.
2. If you have a large repo with lots of issues/PRs, you can use `--max-issues NUM` to limit the number of issues that are pulled back. For example: `--max-issues 1000`
- ***My Ruby version is very old, can I use this?***
When your Ruby is old, and you don't want to upgrade, and your want to
control which libraries you use, you can use Bundler.
In a Gemfile, perhaps in a non-deployed `:development` group, add this
gem:
```ruby
group :development do
gem 'github_changelog_generator', require: false
end
```
Then you can keep back dependencies like rack, which currently is only
compatible with Ruby >= 2.2.2. So, use an older version for your app by
adding a line like this to the Gemfile:
```
gem 'rack', '~> 1.6'
```
This way, you can keep on using github_changelog_generator, even if you
can't get the latest version of Ruby installed.
## Contributing
1. Create an issue and describe your idea

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
require "bundler"
require "bundler/gem_tasks"
require "rubocop/rake_task"
@@ -36,4 +37,4 @@ task :copy_man_page_to_manpath do |_t|
end
task checks: [:rubocop, :rspec]
task default: [:copy_man_page_to_manpath]
task default: [:rubocop, :rspec]

View File

@@ -1,4 +1,5 @@
#! /usr/bin/env ruby
# frozen_string_literal: true
require_relative "../lib/github_changelog_generator"
GitHubChangelogGenerator::ChangelogGenerator.new.run

View File

@@ -1,4 +1,5 @@
#! /usr/bin/env ruby
# frozen_string_literal: true
require_relative "../lib/github_changelog_generator"
GitHubChangelogGenerator::ChangelogGenerator.new.run

8
circle.yml Normal file
View File

@@ -0,0 +1,8 @@
notify:
webhooks:
# A list of hook hashes, containing the url field
# gitter hook
- url: https://webhooks.gitter.im/e/2d81eb1ae7695fdc82c4
- url: https://webhooks.gitter.im/e/3ec6a35fad7e9991058e

3
gemfiles/Gemfile.2_4_0 Normal file
View File

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

View File

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

View File

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

View File

@@ -1,4 +1,5 @@
# coding: utf-8
# frozen_string_literal: true
lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "github_changelog_generator/version"
@@ -24,11 +25,6 @@ Gem::Specification.new do |spec|
spec.require_paths = ["lib"]
spec.add_runtime_dependency "rake", ">= 10.0"
spec.add_runtime_dependency("github_api", ["~> 0.12"])
spec.add_runtime_dependency("colorize", ["~> 0.7"])
spec.add_development_dependency("overcommit", ">= 0.31")
spec.add_development_dependency("rspec", ">= 3.2")
spec.add_development_dependency "bundler", ">= 1.7"
spec.add_development_dependency("rubocop", ">= 0.31")
spec.add_runtime_dependency "github_api", ">= 0.14"
spec.add_runtime_dependency "rainbow", ">= 2.1"
end

View File

@@ -1,8 +1,8 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require "github_api"
require "json"
require "colorize"
require "benchmark"
require_relative "github_changelog_generator/helper"

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
# A Fetcher responsible for all requests to GitHub and all basic manipulation with related data
# (such as filtering, validating, e.t.c)
@@ -7,6 +8,7 @@ module GitHubChangelogGenerator
class Fetcher
PER_PAGE_NUMBER = 30
MAX_SIMULTANEOUS_REQUESTS = 25
CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN"
GH_RATE_LIMIT_EXCEEDED_MSG = "Warning: Can't finish operation: GitHub API rate limit exceeded, change log may be " \
"missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument."
@@ -33,7 +35,7 @@ module GitHubChangelogGenerator
def fetch_github_token
env_var = @options[:token] ? @options[:token] : (ENV.fetch CHANGELOG_GITHUB_TOKEN, nil)
Helper.log.warn NO_TOKEN_PROVIDED.yellow unless env_var
Helper.log.warn NO_TOKEN_PROVIDED unless env_var
env_var
end
@@ -52,11 +54,11 @@ module GitHubChangelogGenerator
begin
value = yield
rescue Github::Error::Unauthorized => e
Helper.log.error e.body.red
Helper.log.error e.response_message
abort "Error: wrong GitHub token"
rescue Github::Error::Forbidden => e
Helper.log.warn e.body.red
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
Helper.log.warn e.response_message
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
end
value
end
@@ -75,9 +77,9 @@ module GitHubChangelogGenerator
end
print_empty_line
if tags.count == 0
if tags.empty?
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'"
else
Helper.log.info "Found #{tags.count} tags"
end
@@ -108,8 +110,9 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
print_empty_line
Helper.log.info "Received issues: #{issues.count}"
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
end
# separate arrays of issues and pull requests:
@@ -142,8 +145,9 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
pull_requests.concat(page)
end
print_empty_line
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
end
Helper.log.info "Fetching merged dates: #{pull_requests.count}"
@@ -166,9 +170,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
# @return [Void]
def fetch_events_async(issues)
i = 0
max_thread_number = 50
threads = []
issues.each_slice(max_thread_number) do |issues_slice|
issues.each_slice(MAX_SIMULTANEOUS_REQUESTS) do |issues_slice|
issues_slice.each do |issue|
threads << Thread.new do
begin
@@ -179,8 +182,9 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
response.each_page do |page|
issue[:events].concat(page)
end
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
end
print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}")
i += 1
@@ -205,8 +209,9 @@ Make sure, that you push tags to remote repo via 'git push --tags'".yellow
commit_data = @github.git_data.commits.get @options[:user],
@options[:project],
tag["commit"]["sha"]
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
end
time_string = commit_data["committer"]["date"]
Time.parse(time_string)

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
require_relative "../fetcher"
require_relative "generator_generation"
require_relative "generator_fetcher"

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# Fetch event for issues and pull requests
@@ -74,7 +75,7 @@ module GitHubChangelogGenerator
commit = @fetcher.fetch_commit(event)
issue[:actual_date] = commit[:author][:date]
rescue
puts "Warning: Can't fetch commit #{event[:commit_id]}. It is probably referenced from another repo.".yellow
puts "Warning: Can't fetch commit #{event[:commit_id]}. It is probably referenced from another repo."
issue[:actual_date] = issue[:closed_at]
end
end

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# Main function to start change log generation
@@ -39,10 +40,10 @@ module GitHubChangelogGenerator
index2 = hash[tag2]
log += generate_log_between_tags(all_tags[index1], all_tags[index2])
else
raise ChangelogGeneratorError, "Can't find tag #{tag2} -> exit".red
raise ChangelogGeneratorError, "Can't find tag #{tag2} -> exit"
end
else
raise ChangelogGeneratorError, "Can't find tag #{tag1} -> exit".red
raise ChangelogGeneratorError, "Can't find tag #{tag1} -> exit"
end
log
end
@@ -141,7 +142,7 @@ module GitHubChangelogGenerator
(1...filtered_tags.size).each do |index|
log += generate_log_between_tags(filtered_tags[index], filtered_tags[index - 1])
end
if @filtered_tags.count != 0
if filtered_tags.any?
log += generate_log_between_tags(nil, filtered_tags.last)
end

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# delete all labels with labels from @options[:exclude_labels] array
@@ -130,11 +131,14 @@ module GitHubChangelogGenerator
end
def filter_by_include_labels(issues)
filtered_issues = @options[:include_labels].nil? ? issues : issues.select do |issue|
labels = issue.labels.map(&:name) & @options[:include_labels]
labels.any?
if @options[:include_labels].nil?
issues
else
issues.select do |issue|
labels = issue.labels.map(&:name) & @options[:include_labels]
labels.any?
end
end
filtered_issues
end
# General filtered function

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# fetch, filter tags, fetch dates and sort them in time order
@@ -19,7 +20,7 @@ module GitHubChangelogGenerator
# @param [Hash] tag_name name of the tag
# @return [Time] time of specified tag
def get_time_of_tag(tag_name)
raise ChangelogGeneratorError, "tag_name is nil".red if tag_name.nil?
raise ChangelogGeneratorError, "tag_name is nil" if tag_name.nil?
name_of_tag = tag_name["name"]
time_for_name = @tag_times_hash[name_of_tag]
@@ -99,7 +100,7 @@ module GitHubChangelogGenerator
filtered_tags = all_tags
tag = @options[:due_tag]
if tag
if (all_tags.count > 0) && (all_tags.map(&:name).include? tag)
if all_tags.any? && all_tags.map(&:name).include?(tag)
idx = all_tags.index { |t| t.name == tag }
last_index = all_tags.count - 1
filtered_tags = if idx > 0 && idx < last_index

View File

@@ -1,4 +1,7 @@
# frozen_string_literal: true
require "logger"
require "rainbow"
module GitHubChangelogGenerator
module Helper
# @return true if the currently running program is a unit test
@@ -6,6 +9,7 @@ module GitHubChangelogGenerator
defined? SpecHelper
end
# :nocov:
@log ||= if test?
Logger.new(nil) # don't show any logs when running tests
else
@@ -13,21 +17,16 @@ module GitHubChangelogGenerator
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
case severity
when "DEBUG" then Rainbow(string).magenta
when "INFO" then Rainbow(string).white
when "WARN" then Rainbow(string).yellow
when "ERROR" then Rainbow(string).red
when "FATAL" then Rainbow(string).red.bright
else string
end
string
end
# :nocov:
# Logging happens using this method
class << self

118
lib/github_changelog_generator/parser.rb Normal file → Executable file
View File

@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require "optparse"
require "pp"
require_relative "version"
@@ -14,7 +15,7 @@ module GitHubChangelogGenerator
parser = setup_parser(options)
parser.parse!
user_and_project_from_git(options)
fetch_user_and_project(options)
abort(parser.banner) unless options[:user] && options[:project]
@@ -23,7 +24,12 @@ module GitHubChangelogGenerator
options
end
# @param [Hash] options to display
# If options set to verbose, print the parsed options.
#
# The GitHub `:token` key is censored in the output.
#
# @param options [Hash] The options to display
# @option options [Boolean] :verbose If false this method does nothing
def self.print_options(options)
if options[:verbose]
Helper.log.info "Performing task with options:"
@@ -56,7 +62,7 @@ module GitHubChangelogGenerator
opts.on("-b", "--base [NAME]", "Optional base file to append generated changes to.") do |last|
options[:base] = last
end
opts.on("--bugs-label [LABEL]", "Setup custom label for bug-fixes section. Default is \"**Fixed bugs:**""") do |v|
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|
@@ -170,7 +176,7 @@ module GitHubChangelogGenerator
parser
end
# just get default options
# @return [Hash] Default options
def self.default_options
{
tag1: nil,
@@ -202,37 +208,54 @@ module GitHubChangelogGenerator
}
end
def self.user_and_project_from_git(options)
# If `:user` or `:project` not set in options, try setting them
# Valid unnamed parameters:
# 1) in 1 param: repo_name/project
# 2) in 2 params: repo name project
def self.fetch_user_and_project(options)
if options[:user].nil? || options[:project].nil?
detect_user_and_project(options, ARGV[0], ARGV[1])
user, project = user_and_project_from_git(options, ARGV[0], ARGV[1])
options[:user] ||= user
options[:project] ||= project
end
end
# Detects user and project from git
def self.detect_user_and_project(options, arg0 = nil, arg1 = nil)
options[:user], options[:project] = user_project_from_option(arg0, arg1, options[:github_site])
return if options[:user] && options[:project]
if ENV["RUBYLIB"] =~ /ruby-debug-ide/
options[:user] = "skywinder"
options[:project] = "changelog_test"
else
remote = `git config --get remote.#{options[:git_remote]}.url`
options[:user], options[:project] = user_project_from_remote(remote)
# Sets `:user` and `:project` in `options` from CLI arguments or `git remote`
# @param [String] arg0 first argument in cli
# @param [String] arg1 second argument in cli
# @return [Array<String>] user and project, or nil if unsuccessful
def self.user_and_project_from_git(options, arg0 = nil, arg1 = nil)
user, project = user_project_from_option(arg0, arg1, options[:github_site])
unless user && project
if ENV["RUBYLIB"] =~ /ruby-debug-ide/
user = "skywinder"
project = "changelog_test"
else
remote = `git config --get remote.#{options[:git_remote]}.url`
user, project = user_project_from_remote(remote)
end
end
[user, project]
end
# Try to find user and project name from git remote output
# Returns GitHub username and project from CLI arguments
#
# @param [String] output of git remote command
# @return [Array] user and project
# @param arg0 [String] This parameter takes two forms: Either a full
# GitHub URL, or a 'username/projectname', or
# simply a GitHub username
# @param arg1 [String] If arg0 is given as a username,
# then arg1 can given as a projectname
# @param github_site [String] Domain name of GitHub site
#
# @return [Array, nil] user and project, or nil if unsuccessful
def self.user_project_from_option(arg0, arg1, github_site)
user = nil
project = nil
github_site ||= "github.com"
if arg0 && !arg1
# this match should parse strings such "https://github.com/skywinder/Github-Changelog-Generator" or "skywinder/Github-Changelog-Generator" to user and name
puts arg0
# this match should parse strings such "https://github.com/skywinder/Github-Changelog-Generator" or
# "skywinder/Github-Changelog-Generator" to user and name
match = /(?:.+#{Regexp.escape(github_site)}\/)?(.+)\/(.+)/.match(arg0)
begin
@@ -251,35 +274,40 @@ module GitHubChangelogGenerator
[user, project]
end
# Try to find user and project name from git remote output
# These patterns match these formats:
#
# ```
# origin git@github.com:skywinder/Github-Changelog-Generator.git (fetch)
# git@github.com:skywinder/Github-Changelog-Generator.git
# ```
#
# and
#
# ```
# origin https://github.com/skywinder/ChangelogMerger (fetch)
# https://github.com/skywinder/ChangelogMerger
# ```
GIT_REMOTE_PATTERNS = [
/.*(?:[:\/])(?<user>(?:-|\w|\.)*)\/(?<project>(?:-|\w|\.)*)(?:\.git).*/,
/.*\/(?<user>(?:-|\w|\.)*)\/(?<project>(?:-|\w|\.)*).*/
]
# Returns GitHub username and project from git remote output
#
# @param git_remote_output [String] Output of git remote command
#
# @param [String] output of git remote command
# @return [Array] user and project
def self.user_project_from_remote(remote)
# try to find repo in format:
# origin git@github.com:skywinder/Github-Changelog-Generator.git (fetch)
# git@github.com:skywinder/Github-Changelog-Generator.git
regex1 = /.*(?:[:\/])((?:-|\w|\.)*)\/((?:-|\w|\.)*)(?:\.git).*/
# try to find repo in format:
# origin https://github.com/skywinder/ChangelogMerger (fetch)
# https://github.com/skywinder/ChangelogMerger
regex2 = /.*\/((?:-|\w|\.)*)\/((?:-|\w|\.)*).*/
remote_structures = [regex1, regex2]
def self.user_project_from_remote(git_remote_output)
user = nil
project = nil
remote_structures.each do |regex|
matches = Regexp.new(regex).match(remote)
GIT_REMOTE_PATTERNS.each do |git_remote_pattern|
git_remote_pattern =~ git_remote_output
if matches && matches[1] && matches[2]
puts "Detected user:#{matches[1]}, project:#{matches[2]}"
user = matches[1]
project = matches[2]
if Regexp.last_match
user = Regexp.last_match(:user)
project = Regexp.last_match(:project)
break
end
break unless matches.nil?
end
[user, project]

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
require "pathname"
module GitHubChangelogGenerator

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
require "rake"
require "rake/tasklib"
require "github_changelog_generator"
@@ -14,7 +15,7 @@ module GitHubChangelogGenerator
unreleased_only unreleased unreleased_label
compare_link include_labels exclude_labels
bug_labels enhancement_labels
between_tags exclude_tags since_tag max_issues
between_tags exclude_tags exclude_tags_regex since_tag max_issues
github_site github_endpoint simple_list
future_release release_branch verbose release_url
base )
@@ -46,7 +47,7 @@ module GitHubChangelogGenerator
# mimick parse_options
options = Parser.default_options
Parser.user_and_project_from_git(options)
Parser.fetch_user_and_project(options)
OPTIONS.each do |o|
v = instance_variable_get("@#{o}")

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
VERSION = "1.13.0"
VERSION = "1.13.2"
end

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#
@@ -28,7 +29,9 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::HTMLFormatter,
CodeClimate::TestReporter::Formatter
])
SimpleCov.start
SimpleCov.start do
add_filter "gemfiles/"
end
require "github_changelog_generator"
require "github_changelog_generator/task"

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
VALID_TOKEN = "0123456789abcdef"
INVALID_TOKEN = "0000000000000000"

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
describe Generator do
context "#exclude_issues_by_labels" do

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::Generator do
def tag_mash_with_name(tag)
Hashie::Mash.new.tap { |mash_tag| mash_tag.name = tag }

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::ParserFile do
describe ".github_changelog_generator" do
let(:options) { {} }
@@ -48,7 +49,7 @@ describe GitHubChangelogGenerator::ParserFile do
header: "=== Changelog ==="))
end
context "turns exclude-labels into an Array", bug: '#327' do
context "turns exclude-labels into an Array", bug: "#327" do
let(:file) do
StringIO.new(<<EOF
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::Parser do
describe ".user_project_from_remote" do
context "when remote is type 1" do
@@ -56,5 +57,26 @@ describe GitHubChangelogGenerator::Parser do
it { is_expected.to be_a(Array) }
it { is_expected.to match_array([nil, nil]) }
end
context "when all args is not nil" do
subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", "blah", "https://codeclimate.com") }
it { is_expected.to be_a(Array) }
it { is_expected.to match_array([nil, nil]) }
end
end
describe ".fetch_user_and_project" do
before do
stub_const("ARGV", ["https://github.com/skywinder/github-changelog-generator"])
end
context do
let(:valid_user) { "initialized_user" }
let(:options) { { user: valid_user } }
let(:options_before_change) { options.dup }
it "should leave user unchanged" do
expect { GitHubChangelogGenerator::Parser.fetch_user_and_project(options) }.to change { options }
.from(options_before_change)
.to(options_before_change.merge(project: "github-changelog-generator"))
end
end
end
end

View File

@@ -1,3 +1,4 @@
# frozen_string_literal: true
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#