Compare commits

..

1 Commits

Author SHA1 Message Date
Olle Jonsson
d3da434e4a Use ruby-2.4.1 in CI 2017-03-23 00:00:03 +01:00
36 changed files with 315 additions and 4526 deletions

View File

@@ -1,7 +1,6 @@
inherit_from: .rubocop_todo.yml
AllCops:
TargetRubyVersion: 2.2
DisplayCopNames: true
DisplayStyleGuide: true
Exclude:
@@ -26,7 +25,7 @@ Metrics/ClassLength:
Metrics/MethodLength:
Enabled: false
Naming/FileName:
Style/FileName:
Exclude:
- 'bin/git-generate-changelog'
@@ -36,7 +35,7 @@ Metrics/AbcSize:
Enabled: false
# Offense count: 1
Naming/AccessorMethodName:
Style/AccessorMethodName:
Enabled: false
# Offense count: 10
@@ -75,8 +74,3 @@ Style/SafeNavigation:
Metrics/BlockLength:
Exclude:
- 'spec/**/*'
# Re-enable when merged; https://github.com/bbatsov/rubocop/pull/4756
Lint/InterpolationCheck:
Enabled: false

View File

@@ -1,20 +1,22 @@
language: ruby
cache:
bundler: true
- bundler
before_install:
- gem update --system
- gem install bundler
matrix:
include:
- rvm: 2.2.8
- rvm: 2.2.6
install: true # This skips 'bundle install'
script: gem build github_changelog_generator && gem install *.gem
- rvm: 2.2.8
- rvm: 2.2.6
install: true # This skips 'bundle install'
script: gem build github_changelog_generator && bundle install
gemfile: spec/install-gem-in-bundler.gemfile
- rvm: 2.3.5
- rvm: 2.4.2
- rvm: jruby-9.1.13.0
- rvm: 2.1
- rvm: 2.3.3
- rvm: 2.4.1
- rvm: jruby-9.1.8.0
jdk: oraclejdk8
env:
- JRUBY_OPTS=--debug
@@ -25,7 +27,6 @@ matrix:
- DEBUG=1
allow_failures:
- rvm: jruby-head
fast_finish: true
addons:
code_climate:

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
source "https://rubygems.org"
ruby RUBY_VERSION
@@ -10,7 +9,7 @@ group :development, :test do
gem "bundler"
gem "overcommit", ">= 0.31"
gem "rake"
gem "rubocop", ">= 0.50"
gem "rubocop", ">= 0.43"
end
group :development do

View File

@@ -1,7 +1,6 @@
[![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)
[![Build status](https://ci.appveyor.com/api/projects/status/xdfnfmdjfo0upm7m?svg=true)](https://ci.appveyor.com/project/olleolleolle/github-changelog-generator)
[![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)
@@ -27,18 +26,18 @@ GitHub Changelog Generator ![GitHub Logo](../master/images/logo.jpg)
**Fully automated changelog generation** - This gem generates a change log file based on **tags**, **issues** and merged **pull requests** (and splits them into separate lists according to labels) from :octocat: GitHub Issue Tracker.
Since you don't have to fill your `CHANGELOG.md` manually now: just run the script, relax and take a cup of :coffee: before your next release! :tada:
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:
### *Whats the point of a change log?*
>### *Whats the point of a change log?*
To make it easier for users and contributors to see precisely what notable changes have been made between each release (or version) of the project.
### *Why should I care?*
Because software tools are for people. If you dont care, why are you contributing to open source? Surely, there must be a kernel (ha!) of care somewhere in that lovely little brain of yours.
:arrow_right: *[http://keepachangelog.com](http://keepachangelog.com)*
> :arrow_right: *[http://keepachangelog.com](http://keepachangelog.com)*
## Installation
gem install github_changelog_generator
gem install github_changelog_generator
See also Troubleshooting.
@@ -47,7 +46,7 @@ See also Troubleshooting.
- Look at **[CHANGELOG.md](https://github.com/skywinder/Github-Changelog-Generator/blob/master/CHANGELOG.md)** for this project
- [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by command:
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
- In general, it looks like this:
@@ -75,16 +74,16 @@ See also Troubleshooting.
- If your **`git remote`** `origin` refers to your GitHub repo, just go to your project folder and run:
github_changelog_generator
github_changelog_generator
- Or, run this from anywhere:
`github_changelog_generator -u github_username -p github_project`
`github_changelog_generator github_username/github_project`
- `github_changelog_generator -u github_username -p github_project`
- `github_changelog_generator github_username/github_project`
- If you are running it against a repository on a Github Enterprise install, you must specify *both* `--github-site` and `--github-api` command line options:
github_changelog_generator --github-site="https://github.yoursite.com" \
--github-api="https://github.yoursite.com/api/v3/"
github_changelog_generator --github-site="https://github.yoursite.com" \
--github-api="https://github.yoursite.com/api/v3/"
This generates a changelog to the `CHANGELOG.md` file, with pretty markdown formatting.
@@ -105,7 +104,7 @@ since-tag=1.0.0
### GitHub token
GitHub only allows 50 unauthenticated requests per hour.
GitHub only allows only 50 unauthenticated requests per hour.
Therefore, it's recommended to run this script with authentication by using a **token**.
Here's how:
@@ -117,14 +116,10 @@ Here's how:
You can set an environment variable by running the following command at the prompt, or by adding it to your shell profile (e.g., `~/.bash_profile` or `~/.zshrc`):
export CHANGELOG_GITHUB_TOKEN="«your-40-digit-github-token»"
export CHANGELOG_GITHUB_TOKEN="«your-40-digit-github-token»"
So, if you get a message like this:
``` markdown
API rate limit exceeded for github_username.
See: https://developer.github.com/v3/#rate-limiting
```
So, if you got an error like this:
>! /Library/Ruby/Gems/2.0.0/gems/github_api-0.12.2/lib/github_api/response/raise_error.rb:14:in `on_complete'
It's time to create this token! (Or, wait an hour for GitHub to reset your unauthenticated request limit.)
@@ -140,7 +135,7 @@ If you have a `HISTORY.md` file in your project, it will automatically be picked
### Rake task
You love `rake`? We do, too! So, we've made it even easier for you:
You love `rake`? We do, too! So, we've made it even easier for you:
we've provided a `rake` task library for your changelog generation.
Just put something like this in your `Rakefile`:
@@ -178,7 +173,7 @@ You can look for params names from the [parser source code (#setup_parser)](http
(*See `github_changelog_generator --help` for details)*
### Alternatives
###Alternatives
Here is a [wikipage list of alternatives](https://github.com/skywinder/Github-Changelog-Generator/wiki/Alternatives) that I found. But none satisfied my requirements.
*If you know other projects, feel free to edit this Wiki page!*
@@ -213,14 +208,14 @@ An auto-generated changelog really helps, even if you manually fill in the relea
For example:
When you find a closed bug, it is very useful to know which release fixed it.
So that you can easily find the issue by \# in `CHANGELOG.md`.
When I found a closed bug, it's very useful know which release fixed it.
In this case, you can easily find the issue by \# in `CHANGELOG.md`.
- it's not quite as easy to find this in handwritten releases notes
- a generated file saves you the trouble of remembering everything;
sometimes people forget to add things to a handwritten file
Ultimately, I think GitHub Releases are ideal for end-users.
Ultimately, I think GitHub Releases is ideal for end-users.
Meanwhile, `CHANGELOG.md` lives right in the repository, with its detailed list of changes, which is handy for developers.
Finally, there's nothing wrong with using GitHub Releases alongside `CHANGELOG.md` in this combination.
@@ -261,14 +256,14 @@ can't get the latest version of Ruby installed.
## Contributing
1. Create an issue and describe your idea
2. [Fork it](https://github.com/skywinder/github-changelog-generator/fork)
2. [Fork it] (https://github.com/skywinder/Github-Changelog-Generator/fork)
3. Create your feature branch (`git checkout -b my-new-feature`)
4. Commit your changes (`git commit -am 'Add some feature'`)
5. Publish the branch (`git push origin my-new-feature`)
6. Create a new Pull Request
7. Profit! :white_check_mark:
You can test your workflow with changelog generator with [the skywinder/changelog_test repo](https://github.com/skywinder/changelog_test/).
*To test your workflow with changelog generator, you can use [test repo](https://github.com/skywinder/changelog_test/)*
## License

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require "bundler"
require "bundler/gem_tasks"
require "rubocop/rake_task"
@@ -11,10 +10,31 @@ require "overcommit"
RuboCop::RakeTask.new
RSpec::Core::RakeTask.new(:rspec)
desc "When releasing the gem, re-fetch latest cacert.pem from curl.haxx.se. Developer task."
task :update_ssl_ca_file do
`pushd lib/github_changelog_generator/ssl_certs && curl --remote-name --time-cond cacert.pem https://curl.haxx.se/ca/cacert.pem && popd`
task :copy_man_page_to_manpath do |_t|
known_manpath_paths = %w(/etc/manpath.config /etc/manpaths)
manpath = known_manpath_paths.find do |f|
path = Pathname(f)
path.file? && path.readable?
end
next unless manpath
writable_man_path = Pathname(manpath).each_line.find do |line|
path = Pathname(line.chomp)
path.directory? && path.writable?
end
next unless writable_man_path
man_prefix = Pathname("#{writable_man_path.chomp}/man1")
man_pages = "man/git-*.1"
Pathname.glob(man_pages) do |path|
if path.exist? && man_prefix.exist? && man_prefix.writable?
FileUtils.cp(path, man_prefix + path.basename)
end
end
end
task checks: %i[rubocop rspec]
task default: %i[rubocop rspec]
task checks: [:rubocop, :rspec]
task default: [:rubocop, :rspec]

View File

@@ -17,9 +17,6 @@ environment:
- ruby_version: "21" # Older version, but matches Travis-CI
- ruby_version: "21-x64"
init:
- git config --global core.autocrlf true
install:
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
@@ -51,8 +48,3 @@ notifications:
- sky4winder+githubchangeloggenerator@gmail.com
on_build_success: false
on_build_status_changed: true
- provider: GitHubPullRequest
on_build_success: true
on_build_failure: true
on_build_status_changed: true

11
circle.yml Normal file
View File

@@ -0,0 +1,11 @@
dependencies:
pre:
- gem update --system
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,5 +1,5 @@
# coding: utf-8
# frozen_string_literal: true
lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "github_changelog_generator/version"
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
spec.homepage = "https://github.com/skywinder/Github-Changelog-Generator"
spec.license = "MIT"
spec.files = Dir["{bin,lib,man,spec}/**/*"] + %w[LICENSE Rakefile README.md]
spec.files = Dir["{bin,lib,man,spec}/**/*"] + %w(LICENSE Rakefile README.md)
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})

View File

@@ -5,18 +5,17 @@ require "octokit"
require "faraday-http-cache"
require "logger"
require "active_support"
require "active_support/core_ext/object/blank"
require "json"
require "multi_json"
require "benchmark"
require "github_changelog_generator/helper"
require "github_changelog_generator/options"
require "github_changelog_generator/parser"
require "github_changelog_generator/parser_file"
require "github_changelog_generator/generator/generator"
require "github_changelog_generator/version"
require "github_changelog_generator/reader"
require_relative "github_changelog_generator/helper"
require_relative "github_changelog_generator/options"
require_relative "github_changelog_generator/parser"
require_relative "github_changelog_generator/parser_file"
require_relative "github_changelog_generator/generator/generator"
require_relative "github_changelog_generator/version"
require_relative "github_changelog_generator/reader"
# The main module, where placed all classes (now, at least)
module GitHubChangelogGenerator
@@ -34,10 +33,14 @@ module GitHubChangelogGenerator
def run
log = @generator.compound_changelog
output_filename = @options[:output].to_s
File.open(output_filename, "wb") { |file| file.write(log) }
output_filename = (@options[:output]).to_s
File.open(output_filename, "w") { |file| file.write(log) }
puts "Done!"
puts "Generated log placed in #{Dir.pwd}/#{output_filename}"
end
end
if __FILE__ == $PROGRAM_NAME
GitHubChangelogGenerator::ChangelogGenerator.new.run
end
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require_relative "../octo_fetcher"
require_relative "generator_generation"
require_relative "generator_fetcher"
@@ -36,17 +35,16 @@ module GitHubChangelogGenerator
detect_actual_closed_dates(@issues + @pull_requests)
end
ENCAPSULATED_CHARACTERS = %w(< > * _ \( \) [ ] #)
# Encapsulate characters to make Markdown look as expected.
# Encapsulate characters to make markdown look as expected.
#
# @param [String] string
# @return [String] encapsulated input string
def encapsulate_string(string)
string = string.gsub('\\', '\\\\')
string.gsub! '\\', '\\\\'
ENCAPSULATED_CHARACTERS.each do |char|
string = string.gsub(char, "\\#{char}")
encpas_chars = %w(< > * _ \( \) [ ] #)
encpas_chars.each do |char|
string.gsub! char, "\\#{char}"
end
string
@@ -57,23 +55,14 @@ module GitHubChangelogGenerator
# @param [Array] pull_requests List or PR's in new section
# @param [Array] issues List of issues in new section
# @param [String] newer_tag Name of the newer tag. Could be nil for `Unreleased` section
# @param [Hash, nil] older_tag Older tag, used for the links. Could be nil for last tag.
# @param [String] older_tag_name Older tag, used for the links. Could be nil for last tag.
# @return [String] Ready and parsed section
def create_log_for_tag(pull_requests, issues, newer_tag, older_tag = nil)
def create_log_for_tag(pull_requests, issues, newer_tag, older_tag_name = nil)
newer_tag_link, newer_tag_name, newer_tag_time = detect_link_tag_time(newer_tag)
github_site = options[:github_site] || "https://github.com"
project_url = "#{github_site}/#{options[:user]}/#{options[:project]}"
# If the older tag is nil, go back in time from the latest tag and find
# the SHA for the first commit.
older_tag_name =
if older_tag.nil?
@fetcher.commits_before(newer_tag_time).last["sha"]
else
older_tag["name"]
end
log = generate_header(newer_tag_name, newer_tag_link, newer_tag_time, older_tag_name, project_url)
if options[:issues]
@@ -81,7 +70,7 @@ module GitHubChangelogGenerator
log += issues_to_log(issues, pull_requests)
end
if options[:pulls] && options[:add_pr_wo_labels]
if options[:pulls]
# Generate pull requests:
log += generate_sub_section(pull_requests, options[:merge_prefix])
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
MAX_THREAD_NUMBER = 25
@@ -78,7 +77,7 @@ module GitHubChangelogGenerator
issue["actual_date"] = commit["commit"]["author"]["date"]
# issue['actual_date'] = commit['author']['date']
rescue StandardError
rescue
puts "Warning: Can't fetch commit #{event['commit_id']}. It is probably referenced from another repo."
issue["actual_date"] = issue["closed_at"]
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# Main function to start change log generation
@@ -21,10 +20,7 @@ module GitHubChangelogGenerator
log += File.read(options[:base]) if File.file?(options[:base])
credit_line = "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
log.gsub!(credit_line, "") # Remove old credit lines
log += credit_line
log += "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
@log = log
end
@@ -68,7 +64,7 @@ module GitHubChangelogGenerator
log += if newer_tag_name.equal?(options[:unreleased_label])
"## [#{newer_tag_name}](#{release_url})\n\n"
else
"## [#{newer_tag_name}](#{release_url}) (#{time_string})\n\n"
"## [#{newer_tag_name}](#{release_url}) (#{time_string})\n"
end
if options[:compare_link] && older_tag_link
@@ -85,21 +81,22 @@ module GitHubChangelogGenerator
def generate_log_between_tags(older_tag, newer_tag)
filtered_issues, filtered_pull_requests = filter_issues_for_tags(newer_tag, older_tag)
older_tag_name = older_tag.nil? ? detect_since_tag : older_tag["name"]
if newer_tag.nil? && filtered_issues.empty? && filtered_pull_requests.empty?
# do not generate empty unreleased section
return ""
end
create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag)
create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag_name)
end
# Filters issues and pull requests based on, respectively, `closed_at` and `merged_at`
# timestamp fields.
# Apply all filters to issues and pull requests
#
# @return [Array] filtered issues and pull requests
def filter_issues_for_tags(newer_tag, older_tag)
filtered_pull_requests = delete_by_time(@pull_requests, "merged_at", older_tag, newer_tag)
filtered_issues = delete_by_time(@issues, "closed_at", older_tag, newer_tag)
filtered_pull_requests = delete_by_time(@pull_requests, "actual_date", older_tag, newer_tag)
filtered_issues = delete_by_time(@issues, "actual_date", older_tag, newer_tag)
newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"]

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# delete all labels with labels from options[:exclude_labels] array
@@ -126,17 +125,19 @@ module GitHubChangelogGenerator
# @return [Array] filtered array of issues
def include_issues_by_labels(issues)
filtered_issues = filter_by_include_labels(issues)
filtered_issues = filter_wo_labels(filtered_issues)
filtered_issues |= filter_wo_labels(issues)
filtered_issues
end
# @return [Array] issues without labels or empty array if add_issues_wo_labels is false
def filter_wo_labels(issues)
if options[:add_issues_wo_labels]
issues
else
issues.select { |issue| issue["labels"].map { |l| l["name"] }.any? }
issues_wo_labels = issues.select do |issue|
!issue["labels"].map { |l| l["name"] }.any?
end
return issues_wo_labels
end
[]
end
def filter_by_include_labels(issues)
@@ -196,8 +197,8 @@ module GitHubChangelogGenerator
end
end
pull_requests.reject! do |pr|
pr["merged_at"].nil?
pull_requests.select! do |pr|
!pr["merged_at"].nil?
end
pull_requests

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
class Generator
# fetch, filter tags, fetch dates and sort them in time order
@@ -7,48 +6,31 @@ module GitHubChangelogGenerator
detect_since_tag
detect_due_tag
all_tags = @fetcher.get_all_tags
all_tags = @fetcher.get_all_tags
included_tags = filter_excluded_tags(all_tags)
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
all_sorted_tags = sort_tags_by_date(all_tags)
@sorted_tags = sort_tags_by_date(included_tags)
@filtered_tags = get_filtered_tags(included_tags)
@sorted_tags = filter_excluded_tags(all_sorted_tags)
@filtered_tags = get_filtered_tags(@sorted_tags)
# Because we need to properly create compare links, we need a sorted list
# of all filtered tags (including the excluded ones). We'll exclude those
# tags from section headers inside the mapping function.
section_tags = get_filtered_tags(all_sorted_tags)
@tag_section_mapping = build_tag_section_mapping(section_tags, @filtered_tags)
@tag_section_mapping = build_tag_section_mapping(@filtered_tags, sorted_tags)
@filtered_tags
end
# @param [Array] section_tags are the tags that need a subsection output
# @param [Array] filtered_tags is the list of filtered tags ordered from newest -> oldest
# @param [Array] filtered_tags are the tags that need a subsection output
# @param [Array] all_tags is the list of all tags ordered from newest -> oldest
# @return [Hash] key is the tag to output, value is an array of [Left Tag, Right Tag]
# PRs to include in this section will be >= [Left Tag Date] and <= [Right Tag Date]
# rubocop:disable Style/For - for allows us to be more concise
def build_tag_section_mapping(section_tags, filtered_tags)
def build_tag_section_mapping(filtered_tags, all_tags)
tag_mapping = {}
for i in 0..(section_tags.length - 1)
tag = section_tags[i]
# Don't create section header for the "since" tag
next if @since_tag && tag["name"] == @since_tag
# Don't create a section header for the first tag in between_tags
next if options[:between_tags] && tag == section_tags.last
# Don't create a section header for excluded tags
next unless filtered_tags.include?(tag)
older_tag = section_tags[i + 1]
filtered_tags.each do |tag|
older_tag_idx = all_tags.index(tag) + 1
older_tag = all_tags[older_tag_idx]
tag_mapping[tag] = [older_tag, tag]
end
tag_mapping
end
# rubocop:enable Style/For
# Sort all tags by date, newest to oldest
def sort_tags_by_date(tags)
@@ -113,12 +95,13 @@ module GitHubChangelogGenerator
sections.first["version"] if sections && sections.any?
end
# Return tags after filtering tags in lists provided by option: --exclude-tags
# Return tags after filtering tags in lists provided by option: --between-tags & --exclude-tags
#
# @return [Array]
def get_filtered_tags(all_tags)
filtered_tags = filter_since_tag(all_tags)
filter_due_tag(filtered_tags)
filtered_tags = filter_due_tag(filtered_tags)
filter_between_tags(filtered_tags)
end
# @param [Array] all_tags all tags
@@ -130,7 +113,7 @@ module GitHubChangelogGenerator
if all_tags.map { |t| t["name"] }.include? tag
idx = all_tags.index { |t| t["name"] == tag }
filtered_tags = if idx > 0
all_tags[0..idx]
all_tags[0..idx - 1]
else
[]
end
@@ -161,6 +144,23 @@ module GitHubChangelogGenerator
filtered_tags
end
# @param [Array] all_tags all tags
# @return [Array] filtered tags according :between_tags option
def filter_between_tags(all_tags)
filtered_tags = all_tags
tag_names = filtered_tags.map { |ft| ft["name"] }
if options[:between_tags]
options[:between_tags].each do |tag|
unless tag_names.include?(tag)
Helper.log.warn "Warning: can't find tag #{tag}, specified with --between-tags option."
end
end
filtered_tags = all_tags.select { |tag| options[:between_tags].include?(tag["name"]) }
end
filtered_tags
end
# @param [Array] all_tags all tags
# @return [Array] filtered tags according :exclude_tags or :exclude_tags_regex option
def filter_excluded_tags(all_tags)
@@ -177,19 +177,18 @@ module GitHubChangelogGenerator
def apply_exclude_tags(all_tags)
if options[:exclude_tags].is_a?(Regexp)
filter_tags_with_regex(all_tags, options[:exclude_tags], "--exclude-tags")
filter_tags_with_regex(all_tags, options[:exclude_tags])
else
filter_exact_tags(all_tags)
end
end
def apply_exclude_tags_regex(all_tags)
regex = Regexp.new(options[:exclude_tags_regex])
filter_tags_with_regex(all_tags, regex, "--exclude-tags-regex")
filter_tags_with_regex(all_tags, Regexp.new(options[:exclude_tags_regex]))
end
def filter_tags_with_regex(all_tags, regex, regex_option_name)
warn_if_nonmatching_regex(all_tags, regex, regex_option_name)
def filter_tags_with_regex(all_tags, regex)
warn_if_nonmatching_regex(all_tags)
all_tags.reject { |tag| regex =~ tag["name"] }
end
@@ -200,10 +199,11 @@ module GitHubChangelogGenerator
all_tags.reject { |tag| options[:exclude_tags].include?(tag["name"]) }
end
def warn_if_nonmatching_regex(all_tags, regex, regex_option_name)
unless all_tags.map { |t| t["name"] }.any? { |t| regex =~ t }
def warn_if_nonmatching_regex(all_tags)
unless all_tags.map { |t| t["name"] }.any? { |t| options[:exclude_tags] =~ t }
Helper.log.warn "Warning: unable to reject any tag, using regex "\
"#{regex.inspect} in #{regex_option_name} option."
"#{options[:exclude_tags].inspect} in --exclude-tags "\
"option."
end
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require "logger"
require "rainbow"

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require "tmpdir"
require "retriable"
module GitHubChangelogGenerator
@@ -43,16 +42,9 @@ module GitHubChangelogGenerator
@github_options[:access_token] = @github_token unless @github_token.nil?
@github_options[:api_endpoint] = @options[:github_endpoint] unless @options[:github_endpoint].nil?
configure_octokit_ssl
@client = Octokit::Client.new(@github_options)
end
def configure_octokit_ssl
ca_file = @options[:ssl_ca_file] || ENV["SSL_CA_FILE"] || File.expand_path("../ssl_certs/cacert.pem", __FILE__)
Octokit.connection_options = { ssl: { ca_file: ca_file } }
end
def init_cache
middleware_opts = {
serializer: Marshal,
@@ -236,17 +228,6 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
end
end
# Fetch all commits before certain point
#
# @return [String]
def commits_before(start_time)
commits = []
iterate_pages(@client, "commits_before", start_time.to_datetime.to_s) do |new_commits|
commits.concat(new_commits)
end
commits
end
private
def stringify_keys_deep(indata)

View File

@@ -1,57 +1,55 @@
# frozen_string_literal: true
require "delegate"
module GitHubChangelogGenerator
class Options < SimpleDelegator
UnsupportedOptionError = Class.new(ArgumentError)
KNOWN_OPTIONS = %i[
add_issues_wo_labels
add_pr_wo_labels
author
base
between_tags
bug_labels
bug_prefix
cache_file
cache_log
compare_link
date_format
due_tag
enhancement_labels
enhancement_prefix
exclude_labels
exclude_tags
exclude_tags_regex
filter_issues_by_milestone
frontmatter
future_release
git_remote
github_endpoint
github_site
header
http_cache
include_labels
issue_prefix
issue_line_labels
issues
max_issues
merge_prefix
output
project
pulls
release_branch
release_url
simple_list
since_tag
ssl_ca_file
token
unreleased
unreleased_label
unreleased_only
user
usernames_as_github_logins
verbose
KNOWN_OPTIONS = [
:add_issues_wo_labels,
:add_pr_wo_labels,
:author,
:base,
:between_tags,
:bug_labels,
:bug_prefix,
:cache_file,
:cache_log,
:compare_link,
:date_format,
:due_tag,
:enhancement_labels,
:enhancement_prefix,
:exclude_labels,
:exclude_tags,
:exclude_tags_regex,
:filter_issues_by_milestone,
:frontmatter,
:future_release,
:git_remote,
:github_endpoint,
:github_site,
:header,
:http_cache,
:include_labels,
:issue_prefix,
:issue_line_labels,
:issues,
:max_issues,
:merge_prefix,
:output,
:project,
:pulls,
:release_branch,
:release_url,
:simple_list,
:since_tag,
:token,
:unreleased,
:unreleased_label,
:unreleased_only,
:user,
:usernames_as_github_logins,
:verbose
]
def initialize(values)

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require "optparse"
require "pp"
require_relative "version"
@@ -14,10 +13,7 @@ module GitHubChangelogGenerator
ParserFile.new(options).parse!
parser = setup_parser(options)
begin parser.parse!
rescue OptionParser::InvalidOption => e
abort [e, parser].join("\n")
end
parser.parse!
fetch_user_and_project(options)
@@ -132,6 +128,9 @@ module GitHubChangelogGenerator
opts.on("--issue-line-labels x,y,z", Array, 'The specified labels will be shown in brackets next to each matching issue. Use "ALL" to show all labels. Default is [].') do |list|
options[:issue_line_labels] = list
end
opts.on("--between-tags x,y,z", Array, "Change log will be filled only between specified tags") do |list|
options[:between_tags] = list
end
opts.on("--exclude-tags x,y,z", Array, "Change log will exclude specified tags") do |list|
options[:exclude_tags] = list
end
@@ -174,9 +173,6 @@ module GitHubChangelogGenerator
opts.on("--cache-log [CACHE-LOG]", "Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.") do |cache_log|
options[:cache_log] = cache_log
end
opts.on("--ssl-ca-file [PATH]", "Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH.") do |ssl_ca_file|
options[:ssl_ca_file] = ssl_ca_file
end
opts.on("--[no-]verbose", "Run verbosely. Default is true") do |v|
options[:verbose] = v
end
@@ -207,13 +203,12 @@ module GitHubChangelogGenerator
unreleased: true,
unreleased_label: "Unreleased",
compare_link: true,
enhancement_labels: ["enhancement", "Enhancement", "Type: Enhancement"],
bug_labels: ["bug", "Bug", "Type: Bug"],
exclude_labels: ["duplicate", "question", "invalid", "wontfix", "Duplicate", "Question", "Invalid", "Wontfix", "Meta: Exclude From Changelog"],
enhancement_labels: %w(enhancement Enhancement),
bug_labels: %w(bug Bug),
exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix),
issue_line_labels: [],
max_issues: nil,
simple_list: false,
ssl_ca_file: nil,
verbose: true,
header: "# Change Log",
merge_prefix: "**Merged pull requests:**",
@@ -277,7 +272,7 @@ module GitHubChangelogGenerator
begin
param = match[2].nil?
rescue StandardError
rescue
puts "Can't detect user and name from first parameter: '#{arg0}' -> exit'"
return
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require "pathname"
module GitHubChangelogGenerator
@@ -48,7 +47,7 @@ module GitHubChangelogGenerator
return if non_configuration_line?(line)
option_name, value = extract_pair(line)
@options[option_key_for(option_name)] = convert_value(value, option_name)
rescue StandardError
rescue
raise ParserError, "Failed on line ##{line_number}: \"#{line.gsub(/[\n\r]+/, '')}\""
end
@@ -66,8 +65,8 @@ module GitHubChangelogGenerator
[key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
end
KNOWN_ARRAY_KEYS = %i[exclude_labels include_labels bug_labels
enhancement_labels issue_line_labels between_tags exclude_tags]
KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels,
:enhancement_labels, :issue_line_labels, :between_tags, :exclude_tags]
KNOWN_INTEGER_KEYS = [:max_issues]
def convert_value(value, option_name)

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
require "rake"
require "rake/tasklib"
require "github_changelog_generator"
@@ -8,7 +7,7 @@ module GitHubChangelogGenerator
class RakeTask < ::Rake::TaskLib
include ::Rake::DSL if defined?(::Rake::DSL)
OPTIONS = %w[ user project token date_format output
OPTIONS = %w( user project token date_format output
bug_prefix enhancement_prefix issue_prefix
header merge_prefix issues
add_issues_wo_labels add_pr_wo_labels
@@ -19,7 +18,7 @@ module GitHubChangelogGenerator
between_tags exclude_tags exclude_tags_regex since_tag max_issues
github_site github_endpoint simple_list
future_release release_branch verbose release_url
base ]
base )
OPTIONS.each do |o|
attr_accessor o.to_sym

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
VERSION = "1.15.0-alpha"
VERSION = "1.14.3"
end

View File

@@ -192,6 +192,10 @@
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</p>
<p> --between-tags x,y,z</p>
<p> Change log will be filled only between specified tags</p>
<p> --exclude-tags x,y,z</p>
<p> Change log will exclude specified tags</p>

View File

@@ -184,6 +184,10 @@
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</p>
<p> --between-tags x,y,z</p>
<p> Change log will be filled only between specified tags</p>
<p> --exclude-tags x,y,z</p>
<p> Change log will exclude specified tags</p>

View File

@@ -119,6 +119,10 @@ Automatically generate change log from your tags, issues, labels and pull reques
Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'
--between-tags x,y,z
Change log will be filled only between specified tags
--exclude-tags x,y,z
Change log will exclude specified tags
@@ -175,10 +179,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory.
--ssl-ca-file [PATH]
Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH.
--[no-]verbose
Run verbosely. Default is true

View File

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

View File

@@ -1,17 +0,0 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
describe Generator do
describe "#get_string_for_issue" do
let(:issue) do
{ "title" => "Bug in code" }
end
it "formats an issue according to options" do
expect do
described_class.new.get_string_for_issue(issue)
end.not_to raise_error
end
end
end
end

View File

@@ -1,32 +1,19 @@
# frozen_string_literal: true
module GitHubChangelogGenerator
describe Generator do
let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
let(:options) { {} }
let(:generator) { described_class.new(default_options.merge(options)) }
context "#exclude_issues_by_labels" do
let(:label) { { "name" => "BAD" } }
let(:issue) { { "labels" => [label] } }
let(:good_label) { { "name" => "GOOD" } }
let(:good_issue) { { "labels" => [good_label] } }
let(:issues) { [issue, good_issue] }
subject(:generator) { described_class.new(exclude_labels: %w(BAD BOO)) }
let(:bad_label) { { "name" => "BAD" } }
let(:bad_issue) { { "labels" => [bad_label] } }
let(:good_label) { { "name" => "GOOD" } }
let(:good_issue) { { "labels" => [good_label] } }
let(:unlabeled_issue) { { "labels" => [] } }
let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
it "removes issues with labels in the exclude_label list" do
result = generator.exclude_issues_by_labels(issues)
describe "#exclude_issues_by_labels" do
subject do
generator.exclude_issues_by_labels(issues)
end
let(:expected_issues) { issues }
it { is_expected.to eq(expected_issues) }
context "when 'exclude_lables' is provided" do
let(:options) { { exclude_labels: %w[BAD BOO] } }
let(:expected_issues) { [good_issue, unlabeled_issue] }
it { is_expected.to eq(expected_issues) }
expect(result).to include(good_issue)
expect(result).not_to include(issue)
end
context "with no option given" do
@@ -38,43 +25,5 @@ module GitHubChangelogGenerator
end
end
end
describe "#get_filtered_issues" do
subject do
generator.get_filtered_issues(issues)
end
let(:expected_issues) { issues }
it { is_expected.to eq(expected_issues) }
context "when 'exclude_labels' is provided" do
let(:options) { { exclude_labels: %w[BAD BOO] } }
let(:expected_issues) { [good_issue, unlabeled_issue] }
it { is_expected.to eq(expected_issues) }
end
context "when 'add_issues_wo_labels' is false" do
let(:options) { { add_issues_wo_labels: false } }
let(:expected_issues) { [bad_issue, good_issue] }
it { is_expected.to eq(expected_issues) }
context "with 'exclude_labels'" do
let(:options) { { add_issues_wo_labels: false, exclude_labels: %w[GOOD] } }
let(:expected_issues) { [bad_issue] }
it { is_expected.to eq(expected_issues) }
end
end
context "when 'include_labels' is specified" do
let(:options) { { include_labels: %w[GOOD] } }
let(:expected_issues) { [good_issue] }
it { is_expected.to eq(expected_issues) }
end
end
end
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::Generator do
def tag_with_name(tag)
{
@@ -13,231 +12,174 @@ describe GitHubChangelogGenerator::Generator do
end
end
describe "#tag_section_mapping" do
let(:all_tags) { tags_from_strings(%w[8 7 6 5 4 3 2 1]) }
let(:sorted_tags) { all_tags }
describe "#filter_between_tags" do
context "when between_tags nil" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: nil)
end
let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
let(:options) { {} }
let(:generator) { described_class.new(default_options.merge(options)) }
before do
allow_any_instance_of(GitHubChangelogGenerator::OctoFetcher).to receive(:get_all_tags).and_return(all_tags)
allow(generator).to receive(:fetch_tags_dates).with(all_tags)
allow(generator).to receive(:sort_tags_by_date).with(all_tags).and_return(sorted_tags)
generator.fetch_and_filter_tags
subject do
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
context "when between_tags same as input array" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3))
end
subject do
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
context "when between_tags filled with correct values" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2))
end
subject do
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_from_strings(%w(1 2))) }
end
context "when between_tags filled with invalid values" do
before do
@generator = GitHubChangelogGenerator::Generator.new(between_tags: %w(1 q w))
end
subject do
@generator.get_filtered_tags(tags_from_strings(%w(1 2 3)))
end
it { is_expected.to be_a(Array) }
it { is_expected.to match_array(tags_from_strings(%w(1))) }
end
end
describe "#get_filtered_tags" do
subject do
generator.tag_section_mapping
generator.get_filtered_tags(tags_from_strings(%w(1 2 3 4 5)))
end
shared_examples_for "a section mapping" do
it { is_expected.to be_a(Hash) }
it { is_expected.to eq(expected_mapping) }
end
context "respects between tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3)) }
shared_examples_for "a full changelog" do
let(:expected_mapping) do
{
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
tag_with_name("7") => [tag_with_name("6"), tag_with_name("7")],
tag_with_name("6") => [tag_with_name("5"), tag_with_name("6")],
tag_with_name("5") => [tag_with_name("4"), tag_with_name("5")],
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
tag_with_name("2") => [tag_with_name("1"), tag_with_name("2")],
tag_with_name("1") => [nil, tag_with_name("1")]
}
end
it_behaves_like "a section mapping"
end
shared_examples_for "a changelog with some exclusions" do
let(:expected_mapping) do
{
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
tag_with_name("6") => [tag_with_name("5"), tag_with_name("6")],
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
tag_with_name("1") => [nil, tag_with_name("1")]
}
end
it_behaves_like "a section mapping"
end
context "with no constraints" do
it_behaves_like "a full changelog"
end
context "with since only" do
let(:options) { { since_tag: "6" } }
let(:expected_mapping) do
{
tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
tag_with_name("7") => [tag_with_name("6"), tag_with_name("7")]
}
end
it_behaves_like "a section mapping"
end
context "with due only" do
let(:options) { { due_tag: "4" } }
let(:expected_mapping) do
{
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
tag_with_name("2") => [tag_with_name("1"), tag_with_name("2")],
tag_with_name("1") => [nil, tag_with_name("1")]
}
end
it_behaves_like "a section mapping"
end
context "with since and due" do
let(:options) { { since_tag: "2", due_tag: "5" } }
let(:expected_mapping) do
{
tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")]
}
end
it_behaves_like "a section mapping"
end
context "with excluded tags" do
context "as a list of strings" do
let(:options) { { exclude_tags: %w[2 5 7] } }
it_behaves_like "a changelog with some exclusions"
end
context "as a regex" do
let(:options) { { exclude_tags: /[257]/ } }
it_behaves_like "a changelog with some exclusions"
end
context "as a regex string" do
let(:options) { { exclude_tags_regex: "[257]" } }
it_behaves_like "a changelog with some exclusions"
end
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
end
describe "#filter_excluded_tags" do
subject { generator.filter_excluded_tags(tags_from_strings(%w[1 2 3])) }
subject { generator.filter_excluded_tags(tags_from_strings(%w(1 2 3))) }
context "with matching string" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w[3]) }
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(3)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2))) }
end
context "with non-matching string" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w[invalid tags]) }
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(invalid tags)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
context "with matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1])) }
it { is_expected.to match_array(tags_from_strings(%w(1))) }
end
context "with non-matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
end
describe "#filter_excluded_tags_regex" do
subject { generator.filter_excluded_tags(tags_from_strings(%w[1 2 3])) }
subject { generator.filter_excluded_tags(tags_from_strings(%w(1 2 3))) }
context "with matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[23]") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1])) }
it { is_expected.to match_array(tags_from_strings(%w(1))) }
end
context "with non-matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[45]") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
end
describe "#filter_since_tag" do
context "with filled array" do
subject { generator.filter_since_tag(tags_from_strings(%w[1 2 3])) }
subject { generator.filter_since_tag(tags_from_strings(%w(1 2 3))) }
context "with valid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2])) }
it { is_expected.to match_array(tags_from_strings(%w(1))) }
end
context "with invalid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
end
context "with empty array" do
subject { generator.filter_since_tag(tags_from_strings(%w[])) }
subject { generator.filter_since_tag(tags_from_strings(%w())) }
context "with valid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "2") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[])) }
it { is_expected.to match_array(tags_from_strings(%w())) }
end
context "with invalid since tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(since_tag: "Invalid tag") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[])) }
it { is_expected.to match_array(tags_from_strings(%w())) }
end
end
end
describe "#filter_due_tag" do
context "with filled array" do
subject { generator.filter_due_tag(tags_from_strings(%w[1 2 3])) }
subject { generator.filter_due_tag(tags_from_strings(%w(1 2 3))) }
context "with valid due tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[3])) }
it { is_expected.to match_array(tags_from_strings(%w(3))) }
end
context "with invalid due tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[1 2 3])) }
it { is_expected.to match_array(tags_from_strings(%w(1 2 3))) }
end
end
context "with empty array" do
subject { generator.filter_due_tag(tags_from_strings(%w[])) }
subject { generator.filter_due_tag(tags_from_strings(%w())) }
context "with valid due tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "2") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[])) }
it { is_expected.to match_array(tags_from_strings(%w())) }
end
context "with invalid due tag" do
let(:generator) { GitHubChangelogGenerator::Generator.new(due_tag: "Invalid tag") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_from_strings(%w[])) }
it { is_expected.to match_array(tags_from_strings(%w())) }
end
end
end
@@ -290,13 +232,13 @@ describe GitHubChangelogGenerator::Generator do
@generator.sort_tags_by_date(tags)
end
context "sort unsorted tags" do
let(:tags) { tags_from_strings %w[valid_tag1 valid_tag2 valid_tag3] }
let(:tags) { tags_from_strings %w(valid_tag1 valid_tag2 valid_tag3) }
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags.reverse!) }
end
context "sort sorted tags" do
let(:tags) { tags_from_strings %w[valid_tag3 valid_tag2 valid_tag1] }
let(:tags) { tags_from_strings %w(valid_tag3 valid_tag2 valid_tag1) }
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags) }

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
VALID_TOKEN = "0123456789abcdef"
INVALID_TOKEN = "0000000000000000"
@@ -300,7 +299,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
pull_requests = fetcher.fetch_closed_pull_requests
pr = pull_requests.first
expect(pr.keys).to eq(%w[url id html_url diff_url patch_url issue_url number state locked title user body created_at updated_at closed_at merged_at merge_commit_sha assignee assignees milestone commits_url review_comments_url review_comment_url comments_url statuses_url head base _links])
expect(pr.keys).to eq(%w(url id html_url diff_url patch_url issue_url number state locked title user body created_at updated_at closed_at merged_at merge_commit_sha assignee assignees milestone commits_url review_comments_url review_comment_url comments_url statuses_url head base _links))
end
end
end
@@ -501,7 +500,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
commit = fetcher.fetch_commit(event)
expectations = [
%w[sha decfe840d1a1b86e0c28700de5362d3365a29555],
%w(sha decfe840d1a1b86e0c28700de5362d3365a29555),
["url",
"https://api.github.com/repos/skywinder/changelog_test/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
# OLD API: "https://api.github.com/repos/skywinder/changelog_test/git/commits/decfe840d1a1b86e0c28700de5362d3365a29555"],
@@ -526,18 +525,4 @@ describe GitHubChangelogGenerator::OctoFetcher do
end
end
end
describe "#commits_before" do
context "when API is valid", :vcr do
let(:start_time) { Time.parse("Wed Mar 4 18:47:17 2015 +0200") }
subject do
fetcher.commits_before(start_time)
end
it "returns commits" do
expect(subject.last["sha"]).to eq("4c2d6d1ed58bdb24b870dcb5d9f2ceed0283d69d")
end
end
end
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
RSpec.describe GitHubChangelogGenerator::Options do
describe "#initialize" do
context "with known options" do

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::ParserFile do
describe ".github_changelog_generator" do
let(:options) { {} }
@@ -14,7 +13,7 @@ describe GitHubChangelogGenerator::ParserFile do
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, StringIO.new("")) }
it "does not change the options" do
expect { parser.parse! }.to_not(change { options })
expect { parser.parse! }.to_not change { options }
end
end
@@ -52,11 +51,12 @@ describe GitHubChangelogGenerator::ParserFile do
context "turns exclude-labels into an Array", bug: "#327" do
let(:file) do
line1 = "exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90\n"
line2 = "header_label=# My changelog\n"
StringIO.new(line1 + line2)
StringIO.new(<<EOF
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90
header_label=# My changelog
EOF
)
end
it "reads exclude_labels into an Array" do
expect { parser.parse! }.to change { options[:exclude_labels] }
.from(default_options[:exclude_labels])

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true
describe GitHubChangelogGenerator::Parser do
describe ".user_project_from_remote" do
context "when remote is type 1" do

View File

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