Compare commits

..

93 Commits

Author SHA1 Message Date
Petr Korolev
667768ac15 Merge branch 'feature/thor' of https://github.com/estahn/github-changelog-generator into estahn-feature/thor
Conflicts:
	Gemfile.lock
2015-03-29 21:55:59 +03:00
Petr Korolev
4b0642cc6d Merge branch 'feature/simplecov-intergration' into develop 2015-03-29 21:47:16 +03:00
Petr Korolev
f9a58ae079 use with coveralls together 2015-03-29 21:31:25 +03:00
Petr Korolev
731e9904f5 replace to simplecov 2015-03-29 21:22:03 +03:00
Petr Korolev
fff7402621 add gem 2015-03-29 21:18:56 +03:00
Petr Korolev
e0cf47e027 coveralls integration 2015-03-27 16:04:35 +02:00
Petr Korolev
46d6b72d45 Merge branch 'master' into develop 2015-03-27 15:55:54 +02:00
Petr Korolev
8b5ea42e0d update gem.lock 2015-03-27 15:54:30 +02:00
Petr Korolev
2456db0847 Merge branch 'hotfix/fix-travis' into develop 2015-03-27 15:54:04 +02:00
Petr Korolev
9010c93dea Merge branch 'hotfix/fix-travis'
Conflicts:
	Gemfile.lock
2015-03-27 15:53:55 +02:00
Petr Korolev
42c1152c8b update bundle 2015-03-27 15:08:47 +02:00
Petr Korolev
6f1fa05c86 remove exclide 2015-03-27 15:02:45 +02:00
Petr Korolev
19ee2c3968 Merge branch 'master' into develop 2015-03-27 11:12:34 +02:00
Enrico Stahn
5e55ef672b Migrate all options to thor 2015-03-27 13:43:50 +11:00
Petr Korolev
c51d3ef4d0 Revert "add coveralls to gemfile and add bin folder to git"
This reverts commit 6350cdf39c.

Conflicts:
	Gemfile
2015-03-27 04:02:06 +02:00
Petr Korolev
397126c645 Revert "add coveralls yml and add it to spec_helper"
This reverts commit 48c2f26645.
2015-03-27 04:01:23 +02:00
Petr Korolev
b2e3f6a2c5 Revert "move coveralls file to root"
This reverts commit 570c1c11e8.
2015-03-27 04:01:07 +02:00
Petr Korolev
eeb92f6ae6 Revert "add codeclimate"
This reverts commit 765d995b6d.
2015-03-27 03:59:53 +02:00
Petr Korolev
c564c9018b fix deprecated syntax 2015-03-27 03:54:41 +02:00
Petr Korolev
e7aa1a2042 fix rubocop yml 2015-03-27 03:52:49 +02:00
Petr Korolev
765d995b6d add codeclimate 2015-03-27 03:47:34 +02:00
Petr Korolev
420db358bc add code climate to gemfile 2015-03-27 03:43:53 +02:00
Enrico Stahn
da8f725b2d Fix robocop issues with cli.rb 2015-03-27 12:08:53 +11:00
Petr Korolev
f7c7992a1d update rubocop file 2015-03-27 03:06:41 +02:00
Petr Korolev
591927ef6c Merge branch 'develop' 2015-03-27 03:00:28 +02:00
Petr Korolev
570c1c11e8 move coveralls file to root 2015-03-27 02:56:45 +02:00
Petr Korolev
8de0b330d0 Merge pull request #220 from tuexss/cleanup
Cleanup
2015-03-27 02:25:18 +02:00
Petr Korolev
48c2f26645 add coveralls yml and add it to spec_helper 2015-03-27 01:53:42 +02:00
tuexss
c5a01bb24f Merge branch 'cleanup' of https://github.com/tuexss/github-changelog-generator into cleanup 2015-03-27 00:46:37 +01:00
Petr Korolev
6350cdf39c add coveralls to gemfile and add bin folder to git 2015-03-27 01:29:49 +02:00
Enrico Stahn
3993eeec28 Add thor CLI binary and app class 2015-03-27 10:23:58 +11:00
tuexss
d425ae1a9a Change option name from format to dateformat 2015-03-27 00:23:28 +01:00
Enrico Stahn
8c0ebe3808 Add thor to Gemfile/gemspec 2015-03-27 10:23:12 +11:00
tuexss
fb50acca57 Sort option defaults as listed 2015-03-27 00:21:42 +01:00
tuexss
3bd3dae016 Set default for simple-list 2015-03-27 00:18:09 +01:00
tuexss
fd2beef12a Set default for include labels 2015-03-27 00:16:35 +01:00
tuexss
c088349bc3 Cleanup for parser helpmessages 2015-03-27 00:14:50 +01:00
Petr Korolev
1494fcdd8f Add CodeClimate and Inch CI. Fix #219 2015-03-27 01:09:27 +02:00
tuexss
8fa85475eb Merge pull request #1 from skywinder/tuexss-cleanup
rubocop cleanup
2015-03-26 23:36:04 +01:00
Petr Korolev
8462f017b7 rubocop cleanup 2015-03-27 00:24:55 +02:00
tuexss
57ef59d76c Don't pass log as parameter 2015-03-26 23:09:31 +01:00
tuexss
808155ee3a Slim down newer_tag initialization 2015-03-26 23:03:49 +01:00
tuexss
d80a6803be Optimize feedback when no tags found 2015-03-26 22:30:13 +01:00
tuexss
93291dde7c Remove misspelled and unused method 2015-03-26 22:12:45 +01:00
tuexss
c67909959b Consistent print/put messages and style 2015-03-26 22:01:58 +01:00
tuexss
2c8ba4965b Fix method name typo 2015-03-26 21:47:17 +01:00
Petr Korolev
eb497471b9 move all ignoring warnings to rubocop_todo 2015-03-26 22:37:23 +02:00
Petr Korolev
9d43384198 Merge branch 'develop' 2015-03-26 19:09:40 +02:00
Petr Korolev
2e5aec751f add lineLength ingore 2015-03-26 19:09:01 +02:00
Petr Korolev
92735a2fc8 modify rubocop yml by rubocop --auto-gen-config 2015-03-26 19:06:25 +02:00
Petr Korolev
8af5c4c6b0 Merge branch 'master' into develop 2015-03-26 18:44:16 +02:00
Petr Korolev
0f7fd939bf Merge branch 'estahn-feature/parse-existing-changelog-file' 2015-03-26 18:41:39 +02:00
Petr Korolev
cc6ac05254 Merge branch 'feature/parse-existing-changelog-file' of https://github.com/estahn/github-changelog-generator into estahn-feature/parse-existing-changelog-file
Conflicts:
	Gemfile
	Gemfile.lock
	Rakefile
2015-03-26 18:41:24 +02:00
Petr Korolev
fb601cf552 Merge branch 'master' into develop 2015-03-26 16:34:25 +02:00
Petr Korolev
990b32cf71 Merge branch 'feature/add-rspec' 2015-03-26 16:34:18 +02:00
Petr Korolev
c5df1c22bb add identations (rubocop fix) 2015-03-26 16:27:49 +02:00
Enrico Stahn
6ef182a1fc Add RSpec and Rubocop 2015-03-26 15:57:24 +02:00
Enrico Stahn
34cd8f75f7 Configure travis to use bundler and new rake tasks 2015-03-26 15:55:44 +02:00
Petr Korolev
9e69a1c853 add rubocop and rspec to Gemfile 2015-03-26 15:54:28 +02:00
Petr Korolev
cca8e5d810 rubocop auto-fixes 2015-03-26 15:50:56 +02:00
Petr Korolev
a09b6affd4 add rubocop and rspec to Rakefile 2015-03-26 15:33:56 +02:00
Enrico Stahn
3ca25bfff0 Merge branch 'master' into feature/parse-existing-changelog-file 2015-03-27 00:07:30 +11:00
Petr Korolev
f48236e47b change default configs 2015-03-26 12:51:04 +02:00
Petr Korolev
a9baa37c64 add rspec init files 2015-03-26 12:51:04 +02:00
Petr Korolev
2576706e9f Merge branch 'develop' 2015-03-26 12:49:41 +02:00
Petr Korolev
5a2f10a47d Merge branch 'master' into develop
Conflicts:
	lib/github_changelog_generator.rb
2015-03-26 09:31:03 +02:00
Enrico Stahn
692a4f156b Add missing RSpec gem 2015-03-26 16:10:04 +11:00
Enrico Stahn
5fd3f51d78 Update Gemfile.lock with new Gems 2015-03-26 16:05:46 +11:00
Enrico Stahn
2cf62707d7 Configure travis to use bundler and new rake tasks 2015-03-26 16:01:07 +11:00
Enrico Stahn
ea89cec43a Add RSpec and Rubocop 2015-03-26 16:00:36 +11:00
Enrico Stahn
0a3ecbb81b Add RSpec and Rubocop 2015-03-26 16:00:08 +11:00
Enrico Stahn
61a6e19417 Add RSpec Tests for Reader class 2015-03-26 15:59:48 +11:00
Enrico Stahn
6af43b63e1 Include Reader class 2015-03-26 15:58:16 +11:00
Enrico Stahn
9f06a20741 Refactor Reader class to conform with Rubocop 2015-03-26 15:57:51 +11:00
Enrico Stahn
1eee5bffd8 Implement Reader class to parse ChangeLog.md 2015-03-26 00:40:24 +11:00
Petr Korolev
0d0a37b653 fix logic of rescue. 2015-03-24 16:51:51 +02:00
Petr Korolev
5f6756e8dd Add warrning in case of 0 tags in repo. Fix #208. Reformat + prettify output. 2015-03-24 16:51:51 +02:00
Shawn Neal
a1c7ffb765 Relatively require github_changelog_generator library
During development its possible for the gem installed version of github_changelog_generator lib to get required instead of the current development version of the library. This ensures that Ruby pulls in the correct version of the lib, specifically for development without breaking production builds.
2015-03-24 16:51:51 +02:00
Shawn Neal
1456ba8913 Improved --max-issues docs and messaging
- defaulted max issues to be unlimited in number allowing user to optionally limit issues returned
- added FAQ section on rate limiting and API rate limit exceeded warning
2015-03-24 16:51:51 +02:00
Shawn Neal
90f6436af6 Add --max-issues argument to limit requests
This addresses issue 71 by providing a configurable limit on the number of issues to retrieve. By default this limits the number of issues to 500 which should help users stay under the GitHub API limit and keep change logs from growing ridiculous in size for older repos.
2015-03-24 16:51:51 +02:00
Petr Korolev
8841583c02 Merge pull request #207 from sneal/use-relative-require
Relatively require github_changelog_generator library
2015-03-24 11:33:43 +02:00
Petr Korolev
d6cbfe3c38 Merge pull request #76 from sneal/issue-71-add-max-issues-arg
Add --max-issues argument to limit requests
2015-03-24 11:26:14 +02:00
Shawn Neal
5978f35cce Relatively require github_changelog_generator library
During development its possible for the gem installed version of github_changelog_generator lib to get required instead of the current development version of the library. This ensures that Ruby pulls in the correct version of the lib, specifically for development without breaking production builds.
2015-03-23 10:39:26 -07:00
Shawn Neal
856ad3a742 Improved --max-issues docs and messaging
- defaulted max issues to be unlimited in number allowing user to optionally limit issues returned
- added FAQ section on rate limiting and API rate limit exceeded warning
2015-03-23 08:13:44 -07:00
Petr Korolev
d43ef05287 Merge branch 'master' into develop 2015-03-23 10:09:58 +02:00
Shawn Neal
643f2f9eab Add --max-issues argument to limit requests
This addresses issue 71 by providing a configurable limit on the number of issues to retrieve. By default this limits the number of issues to 500 which should help users stay under the GitHub API limit and keep change logs from growing ridiculous in size for older repos.
2015-03-20 18:45:40 -07:00
Petr Korolev
c428666106 Merge pull request #75 from skywinder/feature/fix-rate-limit-crash
Add  fallback with warning message to prevent crash in case of exceed API Rate Limit (temporary workaround for #71)
2015-03-21 02:21:37 +02:00
Petr Korolev
6370ee2997 Merge branch 'hotfix/update-changelog' 2015-03-21 02:15:11 +02:00
Petr Korolev
9f57a505cc Merge branch 'hotfix/update-changelog' into develop 2015-03-21 02:14:53 +02:00
Petr Korolev
5566f6f7f9 Update changelog for version 1.3.11 2015-03-21 02:13:31 +02:00
Petr Korolev
77939c095c Merge branch 'release/1.3.11' into develop 2015-03-21 02:13:09 +02:00
Petr Korolev
729938b85d Add rescue fallback with warning message to prevent crash in case of exceed Rate Limit (temporary workaround for #71) 2015-03-21 02:06:59 +02:00
Petr Korolev
30f429f632 Merge branch 'master' into develop 2015-03-21 00:20:04 +02:00
23 changed files with 12426 additions and 302 deletions

1
.coveralls.yml Normal file
View File

@@ -0,0 +1 @@
service_name: travis-ci

2
.rspec Normal file
View File

@@ -0,0 +1,2 @@
--color
--require spec_helper

8
.rubocop.yml Normal file
View File

@@ -0,0 +1,8 @@
inherit_from: .rubocop_todo.yml
Metrics/LineLength:
Enabled: false
#http://viget.com/extend/just-use-double-quoted-ruby-strings
#Style/StringLiterals:
# EnforcedStyle: double_quotes

81
.rubocop_todo.yml Normal file
View File

@@ -0,0 +1,81 @@
# This configuration was generated by `rubocop --auto-gen-config`
# on 2015-03-27 03:03:45 +0200 using RuboCop version 0.29.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 20
Metrics/AbcSize:
Max: 114
# Offense count: 1
Metrics/BlockNesting:
Max: 4
# Offense count: 2
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 471
# Offense count: 6
Metrics/CyclomaticComplexity:
Max: 18
# Offense count: 27
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 147
# Offense count: 6
Metrics/PerceivedComplexity:
Max: 20
# Offense count: 3
Style/AccessorMethodName:
Enabled: false
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/AndOr:
Enabled: false
# Offense count: 29
# Cop supports --auto-correct.
Style/Blocks:
Enabled: false
# Offense count: 7
# Configuration parameters: IndentWhenRelativeTo, SupportedStyles, IndentOneStep.
Style/CaseIndentation:
Enabled: false
# Offense count: 5
Style/Documentation:
Enabled: false
# Offense count: 1
# Configuration parameters: AllowedVariables.
Style/GlobalVars:
Enabled: false
# Offense count: 6
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
# Offense count: 17
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Enabled: false
# Offense count: 2
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
Style/Next:
Enabled: false
# Offense count: 5
# Configuration parameters: MaxSlashes.
Style/RegexpLiteral:
Enabled: false

View File

@@ -1,11 +1,13 @@
---
sudo: false
cache: bundler
language: ruby
before_install:
- gem update --system
- gem --version
rvm:
- 2.1.0
gemfile:
- Gemfile
script:
- bundle exec rake
notifications:
email:

12
Gemfile
View File

@@ -1,4 +1,10 @@
source 'https://rubygems.org'
gem 'github_api'
gem 'colorize'
gem 'rake'
gemspec
group :test do
gem 'rspec'
gem 'rubocop'
gem 'coveralls', require: false
gem 'simplecov', require: false
end

View File

@@ -1,13 +1,34 @@
PATH
remote: .
specs:
github_changelog_generator (1.3.11)
colorize (~> 0.7)
github_api (~> 0.12)
thor (~> 0.19)
GEM
remote: https://rubygems.org/
specs:
addressable (2.3.6)
colorize (0.7.4)
addressable (2.3.7)
ast (2.0.0)
astrolabe (1.3.0)
parser (>= 2.2.0.pre.3, < 3.0)
colorize (0.7.5)
coveralls (0.7.12)
multi_json (~> 1.10)
rest-client (>= 1.6.8, < 2)
simplecov (~> 0.9.1)
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
faraday (0.9.0)
diff-lcs (1.2.5)
docile (1.1.5)
domain_name (0.5.23)
unf (>= 0.0.5, < 1.0.0)
faraday (0.9.1)
multipart-post (>= 1.2, < 3)
github_api (0.12.2)
github_api (0.12.3)
addressable (~> 2.3)
descendants_tracker (~> 0.0.4)
faraday (~> 0.8, < 0.10)
@@ -15,13 +36,17 @@ GEM
multi_json (>= 1.7.5, < 2.0)
nokogiri (~> 1.6.3)
oauth2
hashie (3.3.2)
jwt (1.2.0)
mini_portile (0.6.1)
multi_json (1.10.1)
hashie (3.4.0)
http-cookie (1.0.2)
domain_name (~> 0.5)
jwt (1.4.1)
mime-types (2.4.3)
mini_portile (0.6.2)
multi_json (1.11.0)
multi_xml (0.5.5)
multipart-post (2.0.0)
nokogiri (1.6.5)
netrc (0.10.3)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
oauth2 (1.0.0)
faraday (>= 0.8, < 0.10)
@@ -29,14 +54,58 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
rack (1.5.2)
parser (2.2.0.3)
ast (>= 1.1, < 3.0)
powerpack (0.1.0)
rack (1.6.0)
rainbow (2.0.0)
rake (10.4.2)
thread_safe (0.3.4)
rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rspec (3.2.0)
rspec-core (~> 3.2.0)
rspec-expectations (~> 3.2.0)
rspec-mocks (~> 3.2.0)
rspec-core (3.2.2)
rspec-support (~> 3.2.0)
rspec-expectations (3.2.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0)
rspec-mocks (3.2.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.2.0)
rspec-support (3.2.2)
rubocop (0.29.1)
astrolabe (~> 1.3)
parser (>= 2.2.0.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4)
ruby-progressbar (1.7.5)
simplecov (0.9.2)
docile (~> 1.1.0)
multi_json (~> 1.0)
simplecov-html (~> 0.9.0)
simplecov-html (0.9.0)
term-ansicolor (1.3.0)
tins (~> 1.0)
thor (0.19.1)
thread_safe (0.3.5)
tins (1.3.5)
unf (0.1.4)
unf_ext
unf_ext (0.0.6)
PLATFORMS
ruby
DEPENDENCIES
colorize
github_api
rake
bundler (~> 1.7)
coveralls
github_changelog_generator!
rake (~> 10.0)
rspec
rubocop
simplecov

View File

@@ -1,5 +1,8 @@
[![Gem Version](https://badge.fury.io/rb/github_changelog_generator.svg)](http://badge.fury.io/rb/github_changelog_generator)
[![Dependency Status](https://gemnasium.com/skywinder/github-changelog-generator.svg)](https://gemnasium.com/skywinder/github-changelog-generator)
[![Build Status](https://travis-ci.org/skywinder/github-changelog-generator.svg?branch=master)](https://travis-ci.org/skywinder/github-changelog-generator)
[![Coverage Status](http://img.shields.io/coveralls/skywinder/github-changelog-generator/master.svg)](https://coveralls.io/r/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)
[![Inline docs](http://inch-ci.org/github/skywinder/github-changelog-generator.svg)](http://inch-ci.org/github/skywinder/github-changelog-generator)
GitHub Changelog Generator ![GitHub Logo](../master/images/logo.jpg)
==================
@@ -96,6 +99,7 @@ Type `github_changelog_generator --help` for detailed usage.
--[no-]compare-link Include compare link between older version and newer version. Default is true
--include-labels x,y,z Issues only with that labels will be included to changelog. Default is 'bug,enhancement'
--exclude-labels x,y,z Issues with that labels will be always excluded from changelog. Default is 'duplicate,question,invalid,wontfix'
--max-issues [NUMBER] Max number of issues to fetch from GitHub. Default is unlimited.
--github-site [URL] The Enterprise Github site on which your project is hosted.
--github-api [URL] The enterprise endpoint to use for your Github API.
-v, --version Print version number
@@ -186,6 +190,15 @@ I think, that GitHub Releases is more for end-users.
But `CHANGELOG.md` could stay in the repo for developers with detailed list of changes.
And it's nothing bad to combine GitHub Releases and `CHANGELOG.md` file together in that manner.
- ***I received a warning: GitHub API rate limit exceed, what does this mean?***
GitHub [limits the number of API requests](https://developer.github.com/v3/#rate-limiting) you can make in an hour. You can make up to 5,000 requests per hour. For unauthenticated requests, the rate limit allows you to make up to 60 requests per hour. Unauthenticated requests are associated with your IP address, and not the user making requests.
If you're seeing this warning:
1. Make sure you're providing an OAuth token so you're not anonymously making requests. This will increase the number of requests from 60 to 5000 per hour.
2. You probably have a large repo with lots of issues/PRs. You can use the `--max-issues NUM` argument to limit the number of issues that are pulled back. For example: `--max-issues 1000`
## Contributing
1. Create an issue to discuss about your idea

View File

@@ -1,9 +1,7 @@
require "rake/testtask"
require 'rubocop/rake_task'
require 'rspec/core/rake_task'
task :default => [:test]
RuboCop::RakeTask.new
RSpec::Core::RakeTask.new(:rspec)
Rake::TestTask.new do |t|
t.verbose = true
t.libs.push("demo", "test")
t.pattern = "test/**/*_test.rb"
end
task default: [:rubocop, :rspec]

3
bin/ghclgen Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env ruby -U
require 'github_changelog_generator'
GitHubChangelogGenerator::CLI.start(ARGV)

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env ruby
require 'github_changelog_generator'
GitHubChangelogGenerator::ChangelogGenerator.new.compund_changelog
require_relative '../lib/github_changelog_generator'
GitHubChangelogGenerator::ChangelogGenerator.new.compound_changelog

View File

@@ -7,7 +7,7 @@ SPEC_TYPE = 'gemspec'
:minor
:patch
@options = {:dry_run => false, :bump_number => :patch}
@options = { dry_run: false, bump_number: :patch }
OptionParser.new { |opts|
opts.banner = 'Usage: bump.rb [options]'
@@ -15,13 +15,13 @@ OptionParser.new { |opts|
opts.on('-d', '--dry-run', 'Dry run') do |v|
@options[:dry_run] = v
end
opts.on('-a', '--major', 'Bump major version') do |v|
opts.on('-a', '--major', 'Bump major version') do |_v|
@options[:bump_number] = :major
end
opts.on('-m', '--minor', 'Bump minor version') do |v|
opts.on('-m', '--minor', 'Bump minor version') do |_v|
@options[:bump_number] = :minor
end
opts.on('-p', '--patch', 'Bump patch version') do |v|
opts.on('-p', '--patch', 'Bump patch version') do |_v|
@options[:bump_number] = :patch
end
opts.on('-r', '--revert', 'Revert last bump') do |v|
@@ -32,7 +32,7 @@ OptionParser.new { |opts|
p @options
def check_repo_is_clean_or_dry_run
value =%x[#{'git status --porcelain'}]
value = `#{'git status --porcelain'}`
if value.empty?
puts 'Repo is clean -> continue'
@@ -46,7 +46,6 @@ def check_repo_is_clean_or_dry_run
end
end
def find_spec_file
list_of_specs = execute_line("find . -name '*.#{SPEC_TYPE}'")
arr = list_of_specs.split("\n")
@@ -66,13 +65,12 @@ def find_spec_file
spec_file = arr[input_index - 1]
end
if spec_file == nil
if spec_file.nil?
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_current_gem_file
@@ -94,13 +92,12 @@ def find_current_gem_file
spec_file = arr[input_index - 1]
end
if spec_file == nil
if spec_file.nil?
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_version_in_podspec(podspec)
@@ -117,12 +114,12 @@ def find_version_in_podspec(podspec)
end
puts "Found version #{match_result[0]}"
return match_result[0], match_result.captures
[match_result[0], match_result.captures]
end
def bump_version(versions_array)
bumped_result = versions_array.dup
bumped_result.map! { |x| x.to_i }
bumped_result.map!(&:to_i)
case @options[:bump_number]
when :major
@@ -135,10 +132,9 @@ def bump_version(versions_array)
when :patch
bumped_result[2] += 1
else
raise('unknown bump_number')
fail('unknown bump_number')
end
bumped_version = bumped_result.join('.')
puts "Bump version: #{versions_array.join('.')} -> #{bumped_version}"
bumped_version
@@ -157,7 +153,7 @@ def execute_line_if_not_dry_run(line)
nil
else
puts line
value = %x[#{line}]
value = `#{line}`
puts value
check_exit_status(value)
value
@@ -165,14 +161,13 @@ def execute_line_if_not_dry_run(line)
end
def check_exit_status(output)
if $?.exitstatus != 0
puts "Output:\n#{output}\nExit status = #{$?.exitstatus} ->Terminate script."
if $CHILD_STATUS.exitstatus != 0
puts "Output:\n#{output}\nExit status = #{$CHILD_STATUS.exitstatus} ->Terminate script."
exit
end
end
def run_bumping_script
check_repo_is_clean_or_dry_run
spec_file = find_spec_file
result, versions_array = find_version_in_podspec(spec_file)
@@ -198,7 +193,6 @@ def run_bumping_script
gem = find_current_gem_file
execute_line_if_not_dry_run("gem push #{gem}")
# execute_line_if_not_dry_run("pod trunk push #{spec_file}")
end
def revert_last_bump
@@ -216,7 +210,7 @@ def revert_last_bump
execute_line_if_not_dry_run("git push --delete origin #{result}")
end
if __FILE__ == $0
if __FILE__ == $PROGRAM_NAME
if @options[:revert]
revert_last_bump

View File

@@ -5,28 +5,28 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'github_changelog_generator/version'
Gem::Specification.new do |spec|
spec.name = "github_changelog_generator"
spec.name = 'github_changelog_generator'
spec.version = GitHubChangelogGenerator::VERSION
spec.default_executable = "github_changelog_generator"
spec.default_executable = 'github_changelog_generator'
spec.required_ruby_version = '>= 1.9.3'
spec.authors = ["Petr Korolev"]
spec.email = %q{sky4winder+github_changelog_generator@gmail.com}
spec.authors = ['Petr Korolev']
spec.email = 'sky4winder+github_changelog_generator@gmail.com'
spec.date = `date +"%Y-%m-%d"`.strip!
spec.summary = %q{Script, that automatically generate changelog from your tags, issues, labels and pull requests.}
spec.description = %q{Changelog generation has never been so easy. Fully automate changelog generation - this gem generate change log file based on tags, issues and merged pull requests from Github issue tracker.}
spec.homepage = %q{https://github.com/skywinder/Github-Changelog-Generator}
spec.license = "MIT"
spec.summary = 'Script, that automatically generate changelog from your tags, issues, labels and pull requests.'
spec.description = 'Changelog generation has never been so easy. Fully automate changelog generation - this gem generate change log file based on tags, issues and merged pull requests from Github issue tracker.'
spec.homepage = 'https://github.com/skywinder/Github-Changelog-Generator'
spec.license = 'MIT'
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
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(%q<github_api>, ["~> 0.12"])
spec.add_runtime_dependency(%q<colorize>, ["~> 0.7"])
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('colorize', ['~> 0.7'])
spec.add_runtime_dependency('thor', ['~> 0.19'])
end

View File

@@ -5,19 +5,21 @@ require 'json'
require 'colorize'
require 'benchmark'
require_relative 'github_changelog_generator/parser'
require_relative 'github_changelog_generator/generator'
require_relative 'github_changelog_generator/version'
require 'github_changelog_generator/parser'
require 'github_changelog_generator/generator'
require 'github_changelog_generator/version'
require 'github_changelog_generator/reader'
require 'github_changelog_generator/cli'
module GitHubChangelogGenerator
class ChangelogGenerator
attr_accessor :options, :all_tags, :github
PER_PAGE_NUMBER = 30
GH_RATE_LIMIT_EXCEEDED_MSG = 'Warning: GitHub API rate limit (5000 per hour) exceeded, change log may be ' \
'missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument.'
def initialize
@options = Parser.parse_options
fetch_github_token
@@ -30,22 +32,22 @@ module GitHubChangelogGenerator
begin
@github = Github.new github_options
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
@generator = Generator.new(@options)
@all_tags = self.get_all_tags
@issues, @pull_requests = self.fetch_issues_and_pull_requests
@all_tags = get_all_tags
@issues, @pull_requests = fetch_issues_and_pull_requests
if @options[:pulls]
@pull_requests = self.get_filtered_pull_requests
@pull_requests = get_filtered_pull_requests
else
@pull_requests = []
end
if @options[:issues]
@issues = self.get_filtered_issues
@issues = get_filtered_issues
else
@issues = []
end
@@ -56,7 +58,6 @@ rescue
end
def detect_actual_closed_dates
if @options[:verbose]
print "Fetching closed dates for issues...\r"
end
@@ -74,7 +75,7 @@ rescue
find_closed_date_by_commit(pull_request)
}
}
threads.each { |thr| thr.join }
threads.each(&:join)
if @options[:verbose]
puts 'Fetching closed dates for issues: Done!'
@@ -91,15 +92,11 @@ rescue
if event[:commit_id].nil?
issue[:actual_date] = issue[:closed_at]
else
begin
begin
commit = @github.git_data.commits.get @options[:user], @options[:project], event[:commit_id]
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
end
issue[:actual_date] = commit[:author][:date]
rescue
puts "Warning: can't fetch commit #{event[:commit_id]} probably it 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
@@ -120,7 +117,7 @@ rescue
end
pull_requests = []
begin
response = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed'
response = @github.pull_requests.list @options[:user], @options[:project], state: 'closed'
page_i = 0
response.each_page do |page|
page_i += PER_PAGE_NUMBER
@@ -129,55 +126,50 @@ begin
pull_requests.concat(page)
end
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
print " \r"
@pull_requests.each { |pr|
fetched_pr = pull_requests.find { |fpr|
fpr.number == pr.number }
fpr.number == pr.number
}
pr[:merged_at] = fetched_pr[:merged_at]
pull_requests.delete(fetched_pr)
}
if @options[:verbose]
puts 'Fetching merged dates... Done!'
puts 'Fetching merged dates: Done!'
end
end
def get_filtered_pull_requests
fetch_merged_at_pull_requests
self.fetch_merged_at_pull_requests
filtered_pull_requests = @pull_requests.select {|pr| pr[:merged_at] != nil }
filtered_pull_requests = @pull_requests.select { |pr| !pr[:merged_at].nil? }
unless @options[:include_labels].nil?
filtered_pull_requests = @pull_requests.select { |issue|
#add all labels from @options[:incluse_labels] array
(issue.labels.map { |label| label.name } & @options[:include_labels]).any?
# add all labels from @options[:include_labels] array
(issue.labels.map(&:name) & @options[:include_labels]).any?
}
end
unless @options[:exclude_labels].nil?
filtered_pull_requests = filtered_pull_requests.select { |issue|
# delete all labels from @options[:exclude_labels] array
!(issue.labels.map { |label| label.name } & @options[:exclude_labels]).any?
!(issue.labels.map(&:name) & @options[:exclude_labels]).any?
}
end
if @options[:add_issues_wo_labels]
issues_wo_labels = @pull_requests.select {
# add issues without any labels
|issue| !issue.labels.map { |label| label.name }.any?
issues_wo_labels = @pull_requests.select { |issue|
!issue.labels.map(&:name).any?
}
filtered_pull_requests |= issues_wo_labels
end
if @options[:verbose]
puts "Filtered pull requests: #{filtered_pull_requests.count}"
end
@@ -185,17 +177,16 @@ rescue
filtered_pull_requests
end
def compund_changelog
def compound_changelog
log = "# Change Log\n\n"
if @options[:unreleased_only]
log += self.generate_log_between_tags(self.all_tags[0], nil)
log += generate_log_between_tags(all_tags[0], nil)
elsif @options[:tag1] and @options[:tag2]
tag1 = @options[:tag1]
tag2 = @options[:tag2]
tags_strings = []
self.all_tags.each { |x| tags_strings.push(x['name']) }
all_tags.each { |x| tags_strings.push(x['name']) }
if tags_strings.include?(tag1)
if tags_strings.include?(tag2)
@@ -203,7 +194,7 @@ rescue
hash = Hash[to_a]
index1 = hash[tag1]
index2 = hash[tag2]
log += self.generate_log_between_tags(self.all_tags[index1], self.all_tags[index2])
log += generate_log_between_tags(all_tags[index1], all_tags[index2])
else
puts "Can't find tag #{tag2} -> exit"
exit
@@ -213,7 +204,7 @@ rescue
exit
end
else
log += self.generate_log_for_all_tags
log += generate_log_for_all_tags
end
log += "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
@@ -222,38 +213,35 @@ rescue
File.open(output_filename, 'w') { |file| file.write(log) }
puts 'Done!'
puts "Generated log placed in #{`pwd`.strip!}/#{output_filename}"
end
def generate_log_for_all_tags
fetch_tags_dates
if @options[:verbose]
puts "Sorting tags.."
puts 'Sorting tags...'
end
@all_tags.sort_by! { |x| self.get_time_of_tag(x) }.reverse!
@all_tags.sort_by! { |x| get_time_of_tag(x) }.reverse!
if @options[:verbose]
puts "Generating log.."
puts 'Generating log...'
end
log = ''
if @options[:unreleased] && @all_tags.count != 0
unreleased_log = self.generate_log_between_tags(self.all_tags[0], nil)
unreleased_log = generate_log_between_tags(all_tags[0], nil)
if unreleased_log
log += unreleased_log
end
end
(1 ... self.all_tags.size).each { |index|
log += self.generate_log_between_tags(self.all_tags[index], self.all_tags[index-1])
(1...all_tags.size).each { |index|
log += generate_log_between_tags(all_tags[index], all_tags[index - 1])
}
if @all_tags.count != 0
log += generate_log_between_tags(nil, self.all_tags.last)
log += generate_log_between_tags(nil, all_tags.last)
end
log
@@ -261,7 +249,7 @@ rescue
def fetch_tags_dates
if @options[:verbose]
print "Fetching tags dates..\r"
print "Fetching tag dates...\r"
end
# Async fetching tags:
@@ -271,34 +259,24 @@ rescue
@all_tags.each { |tag|
# explicit set @tag_times_hash to write data safety.
threads << Thread.new {
self.get_time_of_tag(tag, @tag_times_hash)
get_time_of_tag(tag, @tag_times_hash)
if @options[:verbose]
print "Fetching tags dates: #{i + 1}/#{all}\r"
i += 1
end
}
}
print " \r"
threads.each { |thr| thr.join }
threads.each(&:join)
if @options[:verbose]
puts 'Fetching tags: Done!'
end
end
def is_megred(number)
begin
@github.pull_requests.merged? @options[:user], @options[:project], number
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts "Fetching tags dates: #{i} Done!"
end
end
def get_all_tags
if @options[:verbose]
print "Fetching tags...\r"
end
@@ -315,15 +293,17 @@ rescue
tags.concat(page)
end
print " \r"
if @options[:verbose]
if tags.count == 0
puts "Warning: Can't find any tags in repo. Make sure, that you push tags to remote repo via 'git push --tags'".yellow
elsif @options[:verbose]
puts "Found #{tags.count} tags"
end
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
tags
end
@@ -331,12 +311,11 @@ rescue
env_var = @options[:token] ? @options[:token] : (ENV.fetch 'CHANGELOG_GITHUB_TOKEN', nil)
unless env_var
puts "Warning: No token provided (-t option) and variable $CHANGELOG_GITHUB_TOKEN was not found.".yellow
puts "This script can make only 50 requests to GitHub API per hour without token!".yellow
puts 'Warning: No token provided (-t option) and variable $CHANGELOG_GITHUB_TOKEN was not found.'.yellow
puts 'This script can make only 50 requests per hour to GitHub API without a token!'.yellow
end
@github_token ||= env_var
end
def generate_log_between_tags(older_tag, newer_tag)
@@ -358,7 +337,7 @@ rescue
return ''
end
self.create_log(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name)
create_log(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name)
end
def filter_by_milestone(filtered_issues, newer_tag_name, src_array)
@@ -397,11 +376,10 @@ rescue
end
def delete_by_time(array, hash_key, older_tag = nil, newer_tag = nil)
fail 'At least one of the tags should be not nil!' if older_tag.nil? && newer_tag.nil?
raise 'At least one of the tags should be not nil!' if (older_tag.nil? && newer_tag.nil?)
newer_tag_time = self.get_time_of_tag(newer_tag)
older_tag_time = self.get_time_of_tag(older_tag)
newer_tag_time = get_time_of_tag(newer_tag)
older_tag_time = get_time_of_tag(older_tag)
array.select { |req|
if req[hash_key]
@@ -419,7 +397,6 @@ rescue
tag_in_range_new = t <= newer_tag_time
end
tag_in_range = (tag_in_range_old) && (tag_in_range_new)
tag_in_range
@@ -434,24 +411,14 @@ rescue
# @param [String] older_tag_name
# @return [String]
def create_log(pull_requests, issues, newer_tag, older_tag_name = nil)
newer_tag_time = newer_tag.nil? ? nil : self.get_time_of_tag(newer_tag)
newer_tag_name = newer_tag.nil? ? nil : newer_tag['name']
newer_tag_time = newer_tag.nil? ? Time.new : get_time_of_tag(newer_tag)
newer_tag_name = newer_tag.nil? ? @options[:unreleased_label] : newer_tag['name']
newer_tag_link = newer_tag.nil? ? 'HEAD' : newer_tag_name
github_site = options[:github_site] || 'https://github.com'
project_url = "#{github_site}/#{@options[:user]}/#{@options[:project]}"
if newer_tag.nil?
newer_tag_name = @options[:unreleased_label]
newer_tag_link = 'HEAD'
newer_tag_time = Time.new
else
newer_tag_link = newer_tag_name
end
log = ''
log += generate_header(log, newer_tag_name, newer_tag_link, newer_tag_time, older_tag_name, project_url)
log = generate_header(newer_tag_name, newer_tag_link, newer_tag_time, older_tag_name, project_url)
if @options[:issues]
# Generate issues:
@@ -506,10 +473,11 @@ rescue
log
end
def generate_header(log, newer_tag_name, newer_tag_name2, newer_tag_time, older_tag_name, project_url)
def generate_header(newer_tag_name, newer_tag_name2, newer_tag_time, older_tag_name, project_url)
log = ''
# Generate date string:
time_string = newer_tag_time.strftime @options[:format]
time_string = newer_tag_time.strftime @options[:dateformat]
# Generate tag name and link
if newer_tag_name.equal? @options[:unreleased_label]
@@ -527,7 +495,6 @@ rescue
end
def get_time_of_tag(tag_name, tag_times_hash = @tag_times_hash)
if tag_name.nil?
return nil
end
@@ -539,47 +506,43 @@ rescue
begin
github_git_data_commits_get = @github.git_data.commits.get @options[:user], @options[:project], tag_name['commit']['sha']
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
time_string = github_git_data_commits_get['committer']['date']
@tag_times_hash[tag_name['name']] = Time.parse(time_string)
end
def get_filtered_issues
issues = @issues
filtered_issues = issues
unless @options[:include_labels].nil?
filtered_issues = issues.select { |issue|
#add all labels from @options[:incluse_labels] array
(issue.labels.map { |label| label.name } & @options[:include_labels]).any?
# add all labels from @options[:include_labels] array
(issue.labels.map(&:name) & @options[:include_labels]).any?
}
end
unless @options[:exclude_labels].nil?
filtered_issues = filtered_issues.select { |issue|
# delete all labels from @options[:exclude_labels] array
!(issue.labels.map { |label| label.name } & @options[:exclude_labels]).any?
!(issue.labels.map(&:name) & @options[:exclude_labels]).any?
}
end
if @options[:add_issues_wo_labels]
issues_wo_labels = issues.select {
# add issues without any labels
|issue| !issue.labels.map { |label| label.name }.any?
issues_wo_labels = issues.select { |issue|
!issue.labels.map(&:name).any?
}
filtered_issues |= issues_wo_labels
end
if @options[:verbose]
puts "Filtered issues: #{filtered_issues.count}"
end
filtered_issues
end
def fetch_issues_and_pull_requests
@@ -596,13 +559,12 @@ begin
page_i += PER_PAGE_NUMBER
print "Fetching issues... #{page_i}/#{count_pages * PER_PAGE_NUMBER}\r"
issues.concat(page)
break if @options[:max_issues] && issues.length >= @options[:max_issues]
end
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
print " \r"
if @options[:verbose]
@@ -611,12 +573,12 @@ rescue
# remove pull request from issues:
issues_wo_pr = issues.select { |x|
x.pull_request == nil
x.pull_request.nil?
}
pull_requests = issues.select { |x|
x.pull_request != nil
!x.pull_request.nil?
}
return issues_wo_pr, pull_requests
[issues_wo_pr, pull_requests]
end
def fetch_event_for_issues_and_pr
@@ -627,13 +589,6 @@ rescue
# Async fetching events:
fetch_events_async(@issues + @pull_requests)
#to clear line from prev print
print " \r"
if @options[:verbose]
puts 'Fetching events for issues and PR: Done!'
end
end
def fetch_events_async(issues)
@@ -646,22 +601,27 @@ rescue
begin
obj = @github.issues.events.list user: @options[:user], repo: @options[:project], issue_number: issue['number']
rescue
puts "Warning: GitHub API rate limit exceed (5000 per hour), change log may not contain some issues.".yellow
puts GH_RATE_LIMIT_EXCEEDED_MSG.yellow
end
issue[:events] = obj.body
print "Fetching events for issues and PR: #{i + 1}/#{@issues.count + @pull_requests.count}\r"
i += 1
}
}
threads.each { |thr| thr.join }
threads.each(&:join)
threads = []
}
# to clear line from prev print
print " \r"
if @options[:verbose]
puts "Fetching events for issues and PR: #{i} Done!"
end
end
end
if __FILE__ == $PROGRAM_NAME
GitHubChangelogGenerator::ChangelogGenerator.new.compound_changelog
end
if __FILE__ == $0
GitHubChangelogGenerator::ChangelogGenerator.new.compund_changelog
end
end

View File

@@ -0,0 +1,62 @@
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#
# Copyright 2014, Zanui, <engineering@zanui.com.au>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'thor'
module GitHubChangelogGenerator
class CLI < Thor
default_task :generate
desc 'generate', 'Generates the CHANGELOG.md based on the given options'
option :user, aliases: '-u', type: :string, desc: 'Username of the owner of target GitHub repo'
option :project, aliases: '-p', type: :string, desc: 'Username of the owner of target GitHub repo'
option :token, aliases: '-t', type: :string, desc: 'To make more than 50 requests per hour your GitHub token required. You can generate it here: https://github.com/settings/tokens/new'
option :date_format, aliases: '-f', type: :string, default: '%d/%m/%y', desc: 'Date format.'
option :output, aliases: '-o', type: :string, default: 'CHANGELOG.md', desc: 'Output file.'
# TODO: Should be "closed_issues"
option :issues, type: :boolean, default: true, desc: 'Include closed issues to changelog.'
option :issues_wo_labels, type: :boolean, default: true, desc: 'Include closed issues without labels to changelog.'
option :pr_wo_labels, type: :boolean, default: true, desc: 'Include pull requests without labels to changelog.'
option :pull_requests, type: :boolean, default: true, desc: 'Include pull-requests to changelog.'
option :filter_by_milestone, type: :boolean, default: true, desc: 'Use milestone to detect when issue was resolved.'
option :author, type: :boolean, default: true, desc: 'Add author of pull-request in the end.'
option :unreleased_only, type: :boolean, default: true, desc: 'Generate log from unreleased closed issues only.'
option :unreleased, type: :boolean, default: true, desc: 'Add to log unreleased closed issues.'
option :unreleased_label, type: :boolean, default: true, desc: 'Add to log unreleased closed issues.'
option :compare_link, type: :boolean, default: true, desc: 'Include compare link (Full Changelog) between older version and newer version.'
option :include_labels, type: :array, default: %w(bug enhancement), desc: 'Issues only with that labels will be included to changelog.'
option :exclude_labels, type: :array, default: %w(duplicate question invalid wontfix), desc: 'Issues with that labels will be always excluded from changelog.'
option :max_issues, type: :numeric, desc: 'Max number of issues to fetch from GitHub. Default is unlimited'
option :github_site, :banner => 'URL', type: :string, desc: 'The Enterprise Github site on which your project is hosted.'
option :github_api, :banner => 'URL', type: :string, desc: 'The enterprise endpoint to use for your Github API.'
option :simple_list, type: :boolean, default: false, desc: 'Create simple list from issues and pull requests.'
option :verbose, type: :boolean, default: true, desc: 'Run verbosely.'
long_desc <<-LONGDESC
Automatically generate change log from your tags, issues, labels and pull requests on GitHub.
LONGDESC
def generate
end
map %w[--version -v] => :__print_version
desc '--version, -v', 'print the version'
def __print_version
puts "Version: #{GitHubChangelogGenerator::VERSION}"
end
end
end

View File

@@ -1,19 +1,18 @@
module GitHubChangelogGenerator
class Generator
def initialize(options = nil)
@options = options
end
def get_string_for_issue(issue)
encapsulated_title = self.encapsulate_string issue[:title]
encapsulated_title = encapsulate_string issue[:title]
title_with_number = "#{encapsulated_title} [\\##{issue[:number]}](#{issue.html_url})"
unless issue.pull_request.nil?
if @options[:author]
if issue.user.nil?
title_with_number += " ({Null user})"
title_with_number += ' ({Null user})'
else
title_with_number += " ([#{issue.user.login}](#{issue.user.html_url}))"
end
@@ -23,17 +22,14 @@ module GitHubChangelogGenerator
end
def encapsulate_string(string)
string.gsub! '\\', '\\\\'
encpas_chars = %w(> * _ \( \) [ ] #)
encpas_chars.each { |char|
encpas_chars.each do |char|
string.gsub! char, "\\#{char}"
}
end
string
end
end
end

View File

@@ -6,31 +6,34 @@ require_relative 'version'
module GitHubChangelogGenerator
class Parser
def self.parse_options
options = {
:tag1 => nil,
:tag2 => nil,
:format => '%Y-%m-%d',
:output => 'CHANGELOG.md',
:exclude_labels => %w(duplicate question invalid wontfix),
:pulls => true,
:issues => true,
:verbose => true,
:add_issues_wo_labels => true,
:add_pr_wo_labels => true,
:merge_prefix => '**Merged pull requests:**',
:issue_prefix => '**Closed issues:**',
:bug_prefix => '**Fixed bugs:**',
:enhancement_prefix => '**Implemented enhancements:**',
:author => true,
:filter_issues_by_milestone => true,
:compare_link => true,
:unreleased => true,
:unreleased_label => 'Unreleased',
:branch => 'origin'
tag1: nil,
tag2: nil,
dateformat: '%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:**',
issue_prefix: '**Closed issues:**',
bug_prefix: '**Fixed bugs:**',
enhancement_prefix: '**Implemented enhancements:**',
branch: 'origin'
}
parser = OptionParser.new { |opts|
parser = OptionParser.new do |opts|
opts.banner = 'Usage: github_changelog_generator [options]'
opts.on('-u', '--user [USER]', 'Username of the owner of target GitHub repo') do |last|
options[:user] = last
@@ -38,25 +41,25 @@ module GitHubChangelogGenerator
opts.on('-p', '--project [PROJECT]', 'Name of project on GitHub') do |last|
options[:project] = last
end
opts.on('-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') do |last|
opts.on('-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') do |last|
options[:token] = last
end
opts.on('-f', '--date-format [FORMAT]', 'Date format. Default is %d/%m/%y') do |last|
options[:format] = last
opts.on('-f', '--date-format [FORMAT]', 'Date format. Default is %Y-%m-%d') do |last|
options[:dateformat] = last
end
opts.on('-o', '--output [NAME]', 'Output file. Default is CHANGELOG.md') do |last|
options[:output] = last
end
opts.on('--[no-]issues', 'Include closed issues to changelog. Default is true') do |v|
opts.on('--[no-]issues', 'Include closed issues in changelog. Default is true') do |v|
options[:issues] = v
end
opts.on('--[no-]issues-wo-labels', 'Include closed issues without labels to changelog. Default is true') do |v|
opts.on('--[no-]issues-wo-labels', 'Include closed issues without labels in changelog. Default is true') do |v|
options[:add_issues_wo_labels] = v
end
opts.on('--[no-]pr-wo-labels', 'Include pull requests without labels to changelog. Default is true') do |v|
opts.on('--[no-]pr-wo-labels', 'Include pull requests without labels in changelog. Default is true') do |v|
options[:add_pr_wo_labels] = v
end
opts.on('--[no-]pull-requests', 'Include pull-requests to changelog. Default is true') do |v|
opts.on('--[no-]pull-requests', 'Include pull-requests in changelog. Default is true') do |v|
options[:pulls] = v
end
opts.on('--[no-]filter-by-milestone', 'Use milestone to detect when issue was resolved. Default is true') do |last|
@@ -77,12 +80,15 @@ module GitHubChangelogGenerator
opts.on('--[no-]compare-link', 'Include compare link (Full Changelog) between older version and newer version. Default is true') do |v|
options[:compare_link] = v
end
opts.on('--include-labels x,y,z', Array, 'Issues only with that labels will be included to changelog. Default is \'bug,enhancement\'') do |list|
opts.on('--include-labels x,y,z', Array, 'Only issues with the specified labels will be included in the changelog. Default is \'bug,enhancement\'') do |list|
options[:include_labels] = list
end
opts.on('--exclude-labels x,y,z', Array, 'Issues with that 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
end
opts.on('--max-issues [NUMBER]', Integer, 'Max number of issues to fetch from GitHub. Default is unlimited') do |max|
options[:max_issues] = max
end
opts.on('--github-site [URL]', 'The Enterprise Github site on which your project is hosted.') do |last|
options[:github_site] = last
end
@@ -95,7 +101,7 @@ module GitHubChangelogGenerator
opts.on('--[no-]verbose', 'Run verbosely. Default is true') do |v|
options[:verbose] = v
end
opts.on('-v', '--version', 'Print version number') do |v|
opts.on('-v', '--version', 'Print version number') do |_v|
puts "Version: #{GitHubChangelogGenerator::VERSION}"
exit
end
@@ -103,7 +109,7 @@ module GitHubChangelogGenerator
puts opts
exit
end
}
end
parser.parse!
@@ -125,7 +131,6 @@ module GitHubChangelogGenerator
options[:project] = match[2]
end
end
if !options[:user] && !options[:project]
@@ -150,7 +155,6 @@ module GitHubChangelogGenerator
end
end
if !options[:user] || !options[:project]
puts parser.banner
exit

View File

@@ -0,0 +1,87 @@
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#
# Copyright 2014, Zanui, <engineering@zanui.com.au>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
module GitHubChangelogGenerator
# A Reader to read an existing ChangeLog file and return a structured object
#
# Example:
# reader = GitHubChangelogGenerator::Reader.new
# content = reader.read('./CHANGELOG.md')
class Reader
def initialize(options = {})
defaults = {
heading_level: '##',
heading_structures: [
/^## \[(?<version>.+?)\]\((?<url>.+?)\)( \((?<date>.+?)\))?$/,
/^## (?<version>.+?)( \((?<date>.+?)\))?$/
]
}
@options = options.merge(defaults)
@heading_level = @options[:heading_level]
@heading_structures = @options[:heading_structures]
end
# Parse a single heading and return a Hash
#
# The following heading structures are currently valid:
# - ## [v1.0.2](https://github.com/zanui/chef-thumbor/tree/v1.0.1) (2015-03-24)
# - ## [v1.0.2](https://github.com/zanui/chef-thumbor/tree/v1.0.1)
# - ## v1.0.2 (2015-03-24)
# - ## v1.0.2
#
# @param [String] heading Heading from the ChangeLog File
# @return [Hash] Returns a structured Hash with version, url and date
def parse_heading(heading)
captures = { 'version' => nil, 'url' => nil, 'date' => nil }
@heading_structures.each do |regexp|
matches = Regexp.new(regexp).match(heading)
captures.merge!(Hash[matches.names.map.zip(matches.captures)]) unless matches.nil?
# Try Regular Expressions until you find one that delivers results
break unless matches.nil?
end
captures
end
# Parse the given ChangeLog data into a Hash
#
# @param [String] data File data from the ChangeLog.md
# @return [Hash] Parsed data, e.g. [{ 'version' => ..., 'url' => ..., 'date' => ..., 'content' => ...}, ...]
def parse(data)
sections = data.split(/^## .+?$/)
headings = data.scan(/^## .+?$/)
changelog = []
headings.each_with_index do |heading, index|
captures = parse_heading(heading)
captures['content'] = sections.at(index + 1)
changelog.push captures
end
changelog
end
def read(file_path)
parse File.read(file_path)
end
end
end

9395
spec/files/angular.js.md Normal file

File diff suppressed because it is too large Load Diff

1911
spec/files/bundler.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,305 @@
# Change Log
## [1.3.10](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10) (2015-03-18)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.9...1.3.10)
**Fixed bugs:**
- Exclude closed PR's from changelog. [\#69](https://github.com/skywinder/Github-Changelog-Generator/issues/69)
**Merged pull requests:**
- Fix termination in case of empty unreleased section with `--unreleased-only` option. [\#70](https://github.com/skywinder/Github-Changelog-Generator/pull/70) ([skywinder](https://github.com/skywinder))
## [1.3.9](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.9) (2015-03-06)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.8...1.3.9)
**Implemented enhancements:**
- Improve method of detecting owner and repository [\#63](https://github.com/skywinder/Github-Changelog-Generator/issues/63)
**Merged pull requests:**
- Resolved concurrency problem in case of issues \> 2048 [\#65](https://github.com/skywinder/Github-Changelog-Generator/pull/65) ([skywinder](https://github.com/skywinder))
## [1.3.8](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.8) (2015-03-05)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.6...1.3.8)
**Merged pull requests:**
- Fix `git remote` parsing in case, when script running without parameters inside destination directory [\#61](https://github.com/skywinder/Github-Changelog-Generator/pull/61) ([skywinder](https://github.com/skywinder))
## [1.3.6](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.6) (2015-03-05)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.5...1.3.6)
## [1.3.5](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.5) (2015-03-04)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.4...1.3.5)
**Fixed bugs:**
- Pull Requests in Wrong Tag [\#60](https://github.com/skywinder/Github-Changelog-Generator/issues/60)
## [1.3.4](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.4) (2015-03-03)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.3...1.3.4)
**Fixed bugs:**
- --no-issues appears to break PRs [\#59](https://github.com/skywinder/Github-Changelog-Generator/issues/59)
## [1.3.3](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.3) (2015-03-03)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.2...1.3.3)
**Closed issues:**
- Add \# character to encapsulate list. [\#58](https://github.com/skywinder/Github-Changelog-Generator/issues/58)
## [1.3.2](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.2) (2015-03-03)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.1...1.3.2)
**Fixed bugs:**
- generation failed if github commit api return `404 Not Found` [\#57](https://github.com/skywinder/Github-Changelog-Generator/issues/57)
## [1.3.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.1) (2015-02-27)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.3.0...1.3.1)
## [1.3.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.0) (2015-02-26)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.8...1.3.0)
**Implemented enhancements:**
- Do not show `Unreleased` section, when it's empty. [\#55](https://github.com/skywinder/Github-Changelog-Generator/issues/55)
- Separate list exclude and include labels [\#52](https://github.com/skywinder/Github-Changelog-Generator/issues/52)
- Unreleased issues in separate section [\#47](https://github.com/skywinder/Github-Changelog-Generator/issues/47)
- Separate by lists: Enhancements, Bugs, Pull requests. [\#31](https://github.com/skywinder/Github-Changelog-Generator/issues/31)
**Fixed bugs:**
- Test pull request with invalid label \(\#26\) in changelog appeared. [\#44](https://github.com/skywinder/Github-Changelog-Generator/issues/44)
**Merged pull requests:**
- Implement filtering of Pull Requests by milestones [\#50](https://github.com/skywinder/Github-Changelog-Generator/pull/50) ([skywinder](https://github.com/skywinder))
## [1.2.8](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.8) (2015-02-17)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.7...1.2.8)
**Closed issues:**
- Bugs, that closed simultaneously with push not appeared in correct version. [\#37](https://github.com/skywinder/Github-Changelog-Generator/issues/37)
**Merged pull requests:**
- Feature/fix 37 [\#49](https://github.com/skywinder/Github-Changelog-Generator/pull/49) ([skywinder](https://github.com/skywinder))
- Prettify output [\#48](https://github.com/skywinder/Github-Changelog-Generator/pull/48) ([skywinder](https://github.com/skywinder))
## [1.2.7](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.7) (2015-01-26)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.6...1.2.7)
**Merged pull requests:**
- Add compare link between older version and newer version [\#46](https://github.com/skywinder/Github-Changelog-Generator/pull/46) ([sue445](https://github.com/sue445))
## [1.2.6](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.6) (2015-01-21)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.5...1.2.6)
**Merged pull requests:**
- fix link tag format [\#45](https://github.com/skywinder/Github-Changelog-Generator/pull/45) ([sugamasao](https://github.com/sugamasao))
## [1.2.5](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.5) (2015-01-15)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.4...1.2.5)
**Implemented enhancements:**
- Use milestone to specify in which version bug was fixed [\#22](https://github.com/skywinder/Github-Changelog-Generator/issues/22)
**Fixed bugs:**
- Error when trying to generate log for repo without tags [\#32](https://github.com/skywinder/Github-Changelog-Generator/issues/32)
**Merged pull requests:**
- PrettyPrint class is included using lowercase 'pp' [\#43](https://github.com/skywinder/Github-Changelog-Generator/pull/43) ([schwing](https://github.com/schwing))
- support enterprise github via command line options [\#42](https://github.com/skywinder/Github-Changelog-Generator/pull/42) ([glenlovett](https://github.com/glenlovett))
## [1.2.4](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.4) (2014-12-16)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.3...1.2.4)
**Fixed bugs:**
- Sometimes user is NULL during merges [\#41](https://github.com/skywinder/Github-Changelog-Generator/issues/41)
- Crash when try generate log for rails [\#35](https://github.com/skywinder/Github-Changelog-Generator/issues/35)
## [1.2.3](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.3) (2014-12-16)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.2...1.2.3)
**Implemented enhancements:**
- Add ability to run with one parameter instead -u -p [\#38](https://github.com/skywinder/Github-Changelog-Generator/issues/38)
- Detailed output [\#33](https://github.com/skywinder/Github-Changelog-Generator/issues/33)
**Fixed bugs:**
- Docs lacking or basic behavior not as advertised [\#30](https://github.com/skywinder/Github-Changelog-Generator/issues/30)
**Merged pull requests:**
- Implement async fetching [\#39](https://github.com/skywinder/Github-Changelog-Generator/pull/39) ([skywinder](https://github.com/skywinder))
- Fix crash when user is NULL [\#40](https://github.com/skywinder/Github-Changelog-Generator/pull/40) ([skywinder](https://github.com/skywinder))
## [1.2.2](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.2) (2014-12-10)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.2.1...1.2.2)
**Fixed bugs:**
- 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)
**Fixed bugs:**
- Script fills changelog only for first 30 tags. [\#20](https://github.com/skywinder/Github-Changelog-Generator/issues/20)
**Merged pull requests:**
- Issues for last tag not in list [\#29](https://github.com/skywinder/Github-Changelog-Generator/pull/29) ([skywinder](https://github.com/skywinder))
- Disable default --filter-pull-requests option. [\#28](https://github.com/skywinder/Github-Changelog-Generator/pull/28) ([skywinder](https://github.com/skywinder))
## [1.2.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.2.0) (2014-11-19)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.4...1.2.0)
**Merged pull requests:**
- Add filter for pull-requests labels. \(option --filter-pull-requests\) [\#27](https://github.com/skywinder/Github-Changelog-Generator/pull/27) ([skywinder](https://github.com/skywinder))
- Add ability to insert authors of pull-requests \(--\[no-\]author option\) [\#25](https://github.com/skywinder/Github-Changelog-Generator/pull/25) ([skywinder](https://github.com/skywinder))
- Don't receive issues in case of --no-isses flag specied [\#24](https://github.com/skywinder/Github-Changelog-Generator/pull/24) ([skywinder](https://github.com/skywinder))
## [1.1.4](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.4) (2014-11-18)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.2...1.1.4)
**Implemented enhancements:**
- Implement ability to retrieve GitHub token from ENV variable \(to not put it to script directly\) [\#19](https://github.com/skywinder/Github-Changelog-Generator/issues/19)
**Merged pull requests:**
- Sort tags by date [\#23](https://github.com/skywinder/Github-Changelog-Generator/pull/23) ([skywinder](https://github.com/skywinder))
## [1.1.2](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.2) (2014-11-12)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.1...1.1.2)
**Merged pull requests:**
- Fix bug with dot signs in project name [\#18](https://github.com/skywinder/Github-Changelog-Generator/pull/18) ([skywinder](https://github.com/skywinder))
- Fix bug with dot signs in user name [\#17](https://github.com/skywinder/Github-Changelog-Generator/pull/17) ([skywinder](https://github.com/skywinder))
## [1.1.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.1) (2014-11-10)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.1.0...1.1.1)
**Merged pull requests:**
- Remove duplicates of issues and pull-requests with same number [\#15](https://github.com/skywinder/Github-Changelog-Generator/pull/15) ([skywinder](https://github.com/skywinder))
- Sort issues by tags [\#14](https://github.com/skywinder/Github-Changelog-Generator/pull/14) ([skywinder](https://github.com/skywinder))
- Add ability to add or exclude issues without any labels [\#13](https://github.com/skywinder/Github-Changelog-Generator/pull/13) ([skywinder](https://github.com/skywinder))
## [1.1.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.0) (2014-11-10)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.0.1...1.1.0)
**Implemented enhancements:**
- Detect username and project form origin [\#11](https://github.com/skywinder/Github-Changelog-Generator/issues/11)
**Fixed bugs:**
- Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/Github-Changelog-Generator/issues/12)
- Markdown formating in the last line wrong [\#9](https://github.com/skywinder/Github-Changelog-Generator/issues/9)
## [1.0.1](https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.1) (2014-11-10)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/1.0.0...1.0.1)
## [1.0.0](https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.0) (2014-11-07)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.1.0...1.0.0)
**Implemented enhancements:**
- Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/Github-Changelog-Generator/issues/6)
- Implement option to specify output filename [\#4](https://github.com/skywinder/Github-Changelog-Generator/issues/4)
**Fixed bugs:**
- Last tag not appeared in changelog [\#5](https://github.com/skywinder/Github-Changelog-Generator/issues/5)
**Merged pull requests:**
- Implement support of different tags. [\#8](https://github.com/skywinder/Github-Changelog-Generator/pull/8) ([skywinder](https://github.com/skywinder))
- Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/Github-Changelog-Generator/pull/7) ([skywinder](https://github.com/skywinder))
## [0.1.0](https://github.com/skywinder/Github-Changelog-Generator/tree/0.1.0) (2014-11-07)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.0.2...0.1.0)
**Merged pull requests:**
- Fix parsing date of pull request [\#3](https://github.com/skywinder/Github-Changelog-Generator/pull/3) ([skywinder](https://github.com/skywinder))
- Add changelog generation for last tag [\#2](https://github.com/skywinder/Github-Changelog-Generator/pull/2) ([skywinder](https://github.com/skywinder))
- Add option \(-o --output\) to specify name of the output file. [\#1](https://github.com/skywinder/Github-Changelog-Generator/pull/1) ([skywinder](https://github.com/skywinder))
## [0.0.2](https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.2) (2014-11-06)
[Full Changelog](https://github.com/skywinder/Github-Changelog-Generator/compare/0.0.1...0.0.2)
## [0.0.1](https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.1) (2014-11-06)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

114
spec/spec_helper.rb Normal file
View File

@@ -0,0 +1,114 @@
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#
# Copyright 2014, Zanui, <engineering@zanui.com.au>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'coveralls'
require 'simplecov'
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
SimpleCov::Formatter::HTMLFormatter,
Coveralls::SimpleCov::Formatter
]
SimpleCov.start
require 'github_changelog_generator'
# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# The generated `.rspec` file contains `--require spec_helper` which will cause
# this file to always be loaded, without a need to explicitly require it in any
# files.
#
# Given that it is always loaded, you are encouraged to keep this file as
# light-weight as possible. Requiring heavyweight dependencies from this file
# will add to the boot time of your test suite on EVERY test run, even for an
# individual file that may not need all of that loaded. Instead, consider making
# a separate helper file that requires the additional dependencies and performs
# the additional setup, and require it from the spec files that actually need
# it.
#
# The `.rspec` file also contains a few flags that are not defaults but that
# users commonly want.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
# rspec-expectations config goes here. You can use an alternate
# assertion/expectation library such as wrong or the stdlib/minitest
# assertions if you prefer.
config.expect_with :rspec do |expectations|
# This option will default to `true` in RSpec 4. It makes the `description`
# and `failure_message` of custom matchers include text for helper methods
# defined using `chain`, e.g.:
# be_bigger_than(2).and_smaller_than(4).description
# # => "be bigger than 2 and smaller than 4"
# ...rather than:
# # => "be bigger than 2"
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
# rspec-mocks config goes here. You can use an alternate test double
# library (such as bogus or mocha) by changing the `mock_with` option here.
config.mock_with :rspec do |mocks|
# Prevents you from mocking or stubbing a method that does not exist on
# a real object. This is generally recommended, and will default to
# `true` in RSpec 4.
mocks.verify_partial_doubles = true
end
# These two settings work together to allow you to limit a spec run
# to individual examples or groups you care about by tagging them with
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
# get run.
config.filter_run :focus
config.run_all_when_everything_filtered = true
# Limits the available syntax to the non-monkey patched syntax that is
# recommended. For more details, see:
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
# - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
# config.disable_monkey_patching!
# This setting enables warnings. It's recommended, but in some cases may
# be too noisy due to issues in dependencies.
config.warnings = true
# Many RSpec users commonly either run the entire suite or an individual
# file, and it's useful to allow more verbose output when running an
# individual spec file.
if config.files_to_run.one?
# Use the documentation formatter for detailed output,
# unless a formatter has already been configured
# (e.g. via a command-line flag).
config.default_formatter = 'doc'
end
# Print the 10 slowest examples and example groups at the
# end of the spec run, to help surface which specs are running
# particularly slow.
# config.profile_examples = 10
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = :random
# Seed global randomization in this process using the `--seed` CLI option.
# Setting this allows you to use `--seed` to deterministically reproduce
# test failures related to randomization by passing the same `--seed` value
# as the one that triggered the failure.
Kernel.srand config.seed
end

113
spec/unit/reader_spec.rb Normal file
View File

@@ -0,0 +1,113 @@
#
# Author:: Enrico Stahn <mail@enricostahn.com>
#
# Copyright 2014, Zanui, <engineering@zanui.com.au>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
describe GitHubChangelogGenerator::Reader do
before(:all) do
@reader = GitHubChangelogGenerator::Reader.new
end
describe '#parse_heading' do
context 'when heading is empty' do
subject { @reader.parse_heading('## ') }
it { is_expected.to be_a(Hash) }
it { is_expected.to include('version', 'url', 'date') }
it { is_expected.to include('version' => nil, 'url' => nil, 'date' => nil) }
# TODO: Doesn't work?
# it { is_expected.to have_all_string_keys }
end
context 'when given version, url and date' do
subject { @reader.parse_heading('## [1.3.10](https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10) (2015-03-18)') }
it { is_expected.to include('version' => '1.3.10') }
it { is_expected.to include('url' => 'https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10') }
it { is_expected.to include('date' => '2015-03-18') }
end
context 'when no url and date is provided' do
subject { @reader.parse_heading('## foobar') }
it { is_expected.to include('version' => 'foobar', 'url' => nil, 'date' => nil) }
end
end
describe '#parse' do
context 'when file is empty' do
subject { @reader.parse('') }
it { is_expected.to be_an(Array) }
it { is_expected.to be_empty }
end
context 'when file has only the header' do
subject { @reader.parse('# Change Log') }
it { is_expected.to be_an(Array) }
it { is_expected.to be_empty }
end
end
describe 'example CHANGELOG files' do
subject { @reader.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'files', self.class.description))) }
context 'github-changelog-generator.md' do
it { is_expected.to be_an(Array) }
it { is_expected.not_to be_empty }
it { expect(subject.count).to eq(28) }
it { expect(subject.first).to include('version' => '1.3.10') }
it { expect(subject.first).to include('url' => 'https://github.com/skywinder/Github-Changelog-Generator/tree/1.3.10') }
it { expect(subject.first).to include('date' => '2015-03-18') }
it { expect(subject.first).to include('content') }
it 'content should not be empty' do
expect(subject.first['content']).not_to be_empty
end
end
context 'bundler.md' do
it { is_expected.to be_an(Array) }
it { is_expected.not_to be_empty }
it { expect(subject.count).to eq(151) }
it { expect(subject.first).to include('version' => '1.9.1') }
it { expect(subject.first).to include('url' => nil) }
it { expect(subject.first).to include('date' => '2015-03-21') }
it { expect(subject.first).to include('content') }
it 'content should not be empty' do
expect(subject.first['content']).not_to be_empty
end
end
context 'angular.js.md' do
it { is_expected.to be_an(Array) }
it { is_expected.not_to be_empty }
it do
pending('Implement heading_level for parser.')
expect(subject.count).to eq(134)
end
# it do
# pending('Implement heading_level for parser.')
# expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation')
# end
# it do
# pending('Implement heading_level for parser.')
# expect(subject.first).to include('url' => nil)
# end
# it do
# pending('Implement heading_level for parser.')
# expect(subject.first).to include('date' => '2015-03-17')
# end
# it do
# pending('Implement heading_level for parser.')
# expect(subject.first).to include('content')
# end
# it 'content should not be empty' do
# pending('Implement heading_level for parser.')
# expect(subject.first['content']).not_to be_empty
# end
end
end
end