Compare commits

..

2 Commits

Author SHA1 Message Date
Petr Korolev
b08f881fb1 Merge branch 'hotfix/update-changelog' into develop 2016-07-22 11:17:55 +03:00
Petr Korolev
4c7df83a4c Merge branch 'release/1.13.1' into develop 2016-07-22 11:16:54 +03:00
35 changed files with 181 additions and 172 deletions

2
.gitignore vendored
View File

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

View File

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

View File

@@ -1 +0,0 @@
2.3.1

View File

@@ -1,25 +1,23 @@
language: ruby
cache:
- bundler
language: ruby
before_install:
- gem update --system
- gem install bundler
rvm:
- 2.1
script: bundle exec rake checks
matrix:
include:
- 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
# 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
notifications:
email:
recipients:

22
Gemfile
View File

@@ -1,27 +1,15 @@
# frozen_string_literal: true
source "https://rubygems.org"
gemspec
group :development, :test do
group :test do
gem "rake"
gem "bundler"
gem "overcommit", ">= 0.31"
gem "rubocop", ">= 0.43"
end
group :development do
gem "bump"
end
group :test do
gem "rubocop"
gem "overcommit"
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"
# JSON 2.0.1 is ruby 2.0+
gem "json", "< 2.0"
end

108
Gemfile.lock Normal file
View File

@@ -0,0 +1,108 @@
PATH
remote: .
specs:
github_changelog_generator (1.13.1)
colorize (>= 0.7)
github_api (>= 0.12)
rake (>= 10.0)
GEM
remote: https://rubygems.org/
specs:
addressable (2.4.0)
ast (2.3.0)
childprocess (0.5.9)
ffi (~> 1.0, >= 1.0.11)
codeclimate-test-reporter (0.6.0)
simplecov (>= 0.7.1, < 1.0.0)
colorize (0.8.1)
coveralls (0.8.14)
json (>= 1.8, < 3)
simplecov (~> 0.12.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.14)
github_api (0.14.4)
addressable (~> 2.4.0)
descendants_tracker (~> 0.0.4)
faraday (~> 0.8, < 0.10)
hashie (>= 3.4)
oauth2 (~> 1.0.0)
hashie (3.4.4)
iniparse (1.4.2)
json (1.8.3)
jwt (1.5.4)
multi_json (1.12.1)
multi_xml (0.5.5)
multipart-post (2.0.0)
oauth2 (1.0.0)
faraday (>= 0.8, < 0.10)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
overcommit (0.34.2)
childprocess (~> 0.5.8)
iniparse (~> 1.4)
parser (2.3.1.2)
ast (~> 2.2)
powerpack (0.1.1)
rack (1.6.4)
rainbow (2.1.0)
rake (11.2.2)
rspec (3.5.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
rspec-core (3.5.1)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-mocks (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rubocop (0.41.2)
parser (>= 2.3.1.1, < 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.1)
simplecov (0.12.0)
docile (~> 1.1.0)
json (>= 1.8, < 3)
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.1.0)
PLATFORMS
ruby
DEPENDENCIES
bundler
codeclimate-test-reporter (~> 0.4)
coveralls (~> 0.8)
github_changelog_generator!
json (< 2.0)
overcommit
rake
rspec (>= 3.2)
rubocop
simplecov (~> 0.10)
BUNDLED WITH
1.12.5

View File

@@ -4,7 +4,6 @@
[![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)
==================
@@ -24,7 +23,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 to 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 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:
@@ -37,9 +36,7 @@ Because software tools are for people. If you dont care, why are you contribu
## Installation
gem install github_changelog_generator
See also Troubleshooting.
[sudo] gem install github_changelog_generator
## Output example
@@ -226,31 +223,6 @@ 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,4 +1,3 @@
# frozen_string_literal: true
require "bundler"
require "bundler/gem_tasks"
require "rubocop/rake_task"
@@ -37,4 +36,4 @@ task :copy_man_page_to_manpath do |_t|
end
task checks: [:rubocop, :rspec]
task default: [:rubocop, :rspec]
task default: [:copy_man_page_to_manpath]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,4 @@
# 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"
@@ -25,6 +24,11 @@ Gem::Specification.new do |spec|
spec.require_paths = ["lib"]
spec.add_runtime_dependency "rake", ">= 10.0"
spec.add_runtime_dependency "github_api", ">= 0.14"
spec.add_runtime_dependency "rainbow", ">= 2.1"
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"
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,4 +1,3 @@
# 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)
@@ -8,7 +7,6 @@ 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."
@@ -35,7 +33,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 unless env_var
Helper.log.warn NO_TOKEN_PROVIDED.yellow unless env_var
env_var
end
@@ -54,11 +52,11 @@ module GitHubChangelogGenerator
begin
value = yield
rescue Github::Error::Unauthorized => e
Helper.log.error e.response_message
Helper.log.error e.body.red
abort "Error: wrong GitHub token"
rescue Github::Error::Forbidden => e
Helper.log.warn e.response_message
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
Helper.log.warn e.body.red
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
value
end
@@ -77,9 +75,9 @@ module GitHubChangelogGenerator
end
print_empty_line
if tags.empty?
if tags.count == 0
Helper.log.warn "Warning: Can't find any tags in repo.\
Make sure, that you push tags to remote repo via 'git push --tags'"
Make sure, that you push tags to remote repo via 'git push --tags'".yellow
else
Helper.log.info "Found #{tags.count} tags"
end
@@ -110,9 +108,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
print_empty_line
Helper.log.info "Received issues: #{issues.count}"
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
# separate arrays of issues and pull requests:
@@ -145,9 +142,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
pull_requests.concat(page)
end
print_empty_line
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
Helper.log.info "Fetching merged dates: #{pull_requests.count}"
@@ -170,8 +166,9 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
# @return [Void]
def fetch_events_async(issues)
i = 0
max_thread_number = 50
threads = []
issues.each_slice(MAX_SIMULTANEOUS_REQUESTS) do |issues_slice|
issues.each_slice(max_thread_number) do |issues_slice|
issues_slice.each do |issue|
threads << Thread.new do
begin
@@ -182,9 +179,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
response.each_page do |page|
issue[:events].concat(page)
end
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}")
i += 1
@@ -209,9 +205,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
commit_data = @github.git_data.commits.get @options[:user],
@options[:project],
tag["commit"]["sha"]
rescue Github::Error::Forbidden => e
Helper.log.warn e.error_messages.map { |m| m[:message] }.join(", ")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
rescue
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
time_string = commit_data["committer"]["date"]
Time.parse(time_string)

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,3 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# fetch, filter tags, fetch dates and sort them in time order
@@ -20,7 +19,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" if tag_name.nil?
raise 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]
@@ -100,7 +99,7 @@ module GitHubChangelogGenerator
filtered_tags = all_tags
tag = @options[:due_tag]
if tag
if all_tags.any? && all_tags.map(&:name).include?(tag)
if (all_tags.count > 0) && (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,7 +1,4 @@
# frozen_string_literal: true
require "logger"
require "rainbow"
module GitHubChangelogGenerator
module Helper
# @return true if the currently running program is a unit test
@@ -9,7 +6,6 @@ module GitHubChangelogGenerator
defined? SpecHelper
end
# :nocov:
@log ||= if test?
Logger.new(nil) # don't show any logs when running tests
else
@@ -17,16 +13,21 @@ module GitHubChangelogGenerator
end
@log.formatter = proc do |severity, _datetime, _progname, msg|
string = "#{msg}\n"
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
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
# :nocov:
# Logging happens using this method
class << self

View File

@@ -1,5 +1,4 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require "optparse"
require "pp"
require_relative "version"

View File

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

View File

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

View File

@@ -1,4 +1,3 @@
# frozen_string_literal: true
require "rake"
require "rake/tasklib"
require "github_changelog_generator"

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,3 @@
# 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,4 +1,3 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::ParserFile do
describe ".github_changelog_generator" do
let(:options) { {} }

View File

@@ -1,4 +1,3 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::Parser do
describe ".user_project_from_remote" do
context "when remote is type 1" do
@@ -64,10 +63,9 @@ describe GitHubChangelogGenerator::Parser do
end
end
describe ".fetch_user_and_project" do
before do
stub_const("ARGV", ["https://github.com/skywinder/github-changelog-generator"])
before :each do
ARGV = ["https://github.com/skywinder/github-changelog-generator"]
end
context do
let(:valid_user) { "initialized_user" }
let(:options) { { user: valid_user } }

View File

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