diff --git a/Gemfile b/Gemfile index 257099e..685e152 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,5 @@ # frozen_string_literal: true + source "https://rubygems.org" ruby RUBY_VERSION diff --git a/github_changelog_generator.gemspec b/github_changelog_generator.gemspec index 708e535..164cdbb 100644 --- a/github_changelog_generator.gemspec +++ b/github_changelog_generator.gemspec @@ -1,5 +1,6 @@ # 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 +19,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)/}) diff --git a/lib/github_changelog_generator.rb b/lib/github_changelog_generator.rb index ed3cf1a..191d330 100755 --- a/lib/github_changelog_generator.rb +++ b/lib/github_changelog_generator.rb @@ -9,13 +9,13 @@ require "json" require "multi_json" require "benchmark" -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" +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" # The main module, where placed all classes (now, at least) module GitHubChangelogGenerator @@ -33,14 +33,10 @@ module GitHubChangelogGenerator def run log = @generator.compound_changelog - output_filename = (@options[:output]).to_s - File.open(output_filename, "w") { |file| file.write(log) } + output_filename = @options[:output].to_s + File.open(output_filename, "wb") { |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 diff --git a/lib/github_changelog_generator/generator/generator.rb b/lib/github_changelog_generator/generator/generator.rb index a3944b8..833e969 100644 --- a/lib/github_changelog_generator/generator/generator.rb +++ b/lib/github_changelog_generator/generator/generator.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require_relative "../octo_fetcher" require_relative "generator_generation" require_relative "generator_fetcher" diff --git a/lib/github_changelog_generator/generator/generator_fetcher.rb b/lib/github_changelog_generator/generator/generator_fetcher.rb index 8bec7f9..9c16d8f 100644 --- a/lib/github_changelog_generator/generator/generator_fetcher.rb +++ b/lib/github_changelog_generator/generator/generator_fetcher.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator class Generator MAX_THREAD_NUMBER = 25 diff --git a/lib/github_changelog_generator/generator/generator_generation.rb b/lib/github_changelog_generator/generator/generator_generation.rb index b8b9878..a86bf89 100644 --- a/lib/github_changelog_generator/generator/generator_generation.rb +++ b/lib/github_changelog_generator/generator/generator_generation.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator class Generator # Main function to start change log generation diff --git a/lib/github_changelog_generator/generator/generator_processor.rb b/lib/github_changelog_generator/generator/generator_processor.rb index f1eb286..7042c05 100644 --- a/lib/github_changelog_generator/generator/generator_processor.rb +++ b/lib/github_changelog_generator/generator/generator_processor.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator class Generator # delete all labels with labels from options[:exclude_labels] array @@ -132,8 +133,8 @@ module GitHubChangelogGenerator # @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_wo_labels = issues.select do |issue| - !issue["labels"].map { |l| l["name"] }.any? + issues_wo_labels = issues.reject do |issue| + issue["labels"].map { |l| l["name"] }.none? end return issues_wo_labels end @@ -197,8 +198,8 @@ module GitHubChangelogGenerator end end - pull_requests.select! do |pr| - !pr["merged_at"].nil? + pull_requests.reject! do |pr| + pr["merged_at"].nil? end pull_requests diff --git a/lib/github_changelog_generator/generator/generator_tags.rb b/lib/github_changelog_generator/generator/generator_tags.rb index 01480b5..79b967e 100644 --- a/lib/github_changelog_generator/generator/generator_tags.rb +++ b/lib/github_changelog_generator/generator/generator_tags.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator class Generator # fetch, filter tags, fetch dates and sort them in time order diff --git a/lib/github_changelog_generator/helper.rb b/lib/github_changelog_generator/helper.rb index fd61ed3..cdbd450 100644 --- a/lib/github_changelog_generator/helper.rb +++ b/lib/github_changelog_generator/helper.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require "logger" require "rainbow" diff --git a/lib/github_changelog_generator/options.rb b/lib/github_changelog_generator/options.rb index 5473148..0370df5 100644 --- a/lib/github_changelog_generator/options.rb +++ b/lib/github_changelog_generator/options.rb @@ -1,56 +1,57 @@ # frozen_string_literal: true + require "delegate" module GitHubChangelogGenerator class Options < SimpleDelegator UnsupportedOptionError = Class.new(ArgumentError) - 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, - :ssl_ca_file, - :token, - :unreleased, - :unreleased_label, - :unreleased_only, - :user, - :usernames_as_github_logins, - :verbose + 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 ] def initialize(values) diff --git a/lib/github_changelog_generator/parser_file.rb b/lib/github_changelog_generator/parser_file.rb index 83d5565..c5dc93f 100644 --- a/lib/github_changelog_generator/parser_file.rb +++ b/lib/github_changelog_generator/parser_file.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require "pathname" module GitHubChangelogGenerator @@ -65,8 +66,8 @@ module GitHubChangelogGenerator [key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")] end - KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels, - :enhancement_labels, :issue_line_labels, :between_tags, :exclude_tags] + KNOWN_ARRAY_KEYS = %i[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) diff --git a/lib/github_changelog_generator/reader.rb b/lib/github_changelog_generator/reader.rb index 4740003..1342b2a 100644 --- a/lib/github_changelog_generator/reader.rb +++ b/lib/github_changelog_generator/reader.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # # Author:: Enrico Stahn # diff --git a/lib/github_changelog_generator/task.rb b/lib/github_changelog_generator/task.rb index 72dd0b9..c9dfd6e 100644 --- a/lib/github_changelog_generator/task.rb +++ b/lib/github_changelog_generator/task.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require "rake" require "rake/tasklib" require "github_changelog_generator" @@ -7,7 +8,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 @@ -18,7 +19,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 diff --git a/lib/github_changelog_generator/version.rb b/lib/github_changelog_generator/version.rb index 9b206a0..4035ed6 100644 --- a/lib/github_changelog_generator/version.rb +++ b/lib/github_changelog_generator/version.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator VERSION = "1.14.3" end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e54ff2e..240928e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # # Author:: Enrico Stahn # diff --git a/spec/unit/generator/generator_processor_spec.rb b/spec/unit/generator/generator_processor_spec.rb index b6f26ab..a0765b5 100644 --- a/spec/unit/generator/generator_processor_spec.rb +++ b/spec/unit/generator/generator_processor_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module GitHubChangelogGenerator describe Generator do context "#exclude_issues_by_labels" do @@ -7,7 +8,7 @@ module GitHubChangelogGenerator 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)) } + subject(:generator) { described_class.new(exclude_labels: %w[BAD BOO]) } it "removes issues with labels in the exclude_label list" do result = generator.exclude_issues_by_labels(issues) diff --git a/spec/unit/generator/generator_tags_spec.rb b/spec/unit/generator/generator_tags_spec.rb index 64dab24..d88172c 100644 --- a/spec/unit/generator/generator_tags_spec.rb +++ b/spec/unit/generator/generator_tags_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + describe GitHubChangelogGenerator::Generator do def tag_with_name(tag) { @@ -19,167 +20,167 @@ describe GitHubChangelogGenerator::Generator do end subject do - @generator.get_filtered_tags(tags_from_strings(%w(1 2 3))) + @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))) } + 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)) + @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w[1 2 3]) end subject do - @generator.get_filtered_tags(tags_from_strings(%w(1 2 3))) + @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))) } + 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)) + @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w[1 2]) end subject do - @generator.get_filtered_tags(tags_from_strings(%w(1 2 3))) + @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))) } + 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)) + @generator = GitHubChangelogGenerator::Generator.new(between_tags: %w[1 q w]) end subject do - @generator.get_filtered_tags(tags_from_strings(%w(1 2 3))) + @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))) } + it { is_expected.to match_array(tags_from_strings(%w[1])) } end end describe "#get_filtered_tags" do subject do - generator.get_filtered_tags(tags_from_strings(%w(1 2 3 4 5))) + generator.get_filtered_tags(tags_from_strings(%w[1 2 3 4 5])) end context "respects between tags" do - let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w(1 2 3)) } + let(:generator) { GitHubChangelogGenerator::Generator.new(between_tags: %w[1 2 3]) } 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" 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))) } + 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 @@ -232,13 +233,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) } diff --git a/spec/unit/octo_fetcher_spec.rb b/spec/unit/octo_fetcher_spec.rb index f2dbdeb..2c3fa1e 100644 --- a/spec/unit/octo_fetcher_spec.rb +++ b/spec/unit/octo_fetcher_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + VALID_TOKEN = "0123456789abcdef" INVALID_TOKEN = "0000000000000000" @@ -299,7 +300,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 @@ -500,7 +501,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"], diff --git a/spec/unit/options_spec.rb b/spec/unit/options_spec.rb index 51874ab..56acde6 100644 --- a/spec/unit/options_spec.rb +++ b/spec/unit/options_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + RSpec.describe GitHubChangelogGenerator::Options do describe "#initialize" do context "with known options" do diff --git a/spec/unit/parse_file_spec.rb b/spec/unit/parse_file_spec.rb index 3ccb992..82d1809 100644 --- a/spec/unit/parse_file_spec.rb +++ b/spec/unit/parse_file_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + describe GitHubChangelogGenerator::ParserFile do describe ".github_changelog_generator" do let(:options) { {} } @@ -13,7 +14,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 @@ -51,12 +52,11 @@ describe GitHubChangelogGenerator::ParserFile do context "turns exclude-labels into an Array", bug: "#327" do let(:file) do - StringIO.new(< #