diff --git a/.gitignore b/.gitignore index e69de29..404abb2 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +coverage/ diff --git a/README.md b/README.md index de5803f..399da6b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![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) +[![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) [![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) @@ -32,7 +32,7 @@ To make it easier for users and contributors to see precisely what notable chang ### *Why should I care?* Because software tools are for people. If you don’t 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. -> :copyright: *[http://keepachangelog.com](http://keepachangelog.com/)* +> :arrow_right: *[http://keepachangelog.com](http://keepachangelog.com/)* ## Installation @@ -117,7 +117,7 @@ It's time to create this token or wait for 1 hour before GitHub reset the counte ## Migrating from a manual changelog Knowing how dedicated you are to your project, you probably haven't been waiting for github-changelog-generator to keep a changelog, -but you most likely wouln't like to have to open issues and PRs for all past features listed in your historic changelog. +but you most likely wouldn't like to have to open issues and PRs for all past features listed in your historic changelog. That's where `--base` comes handy. This option lets you pass a static changelog to be appended at the end of the generated entries. diff --git a/lib/github_changelog_generator/parser.rb b/lib/github_changelog_generator/parser.rb index 5001ad6..46ffdef 100644 --- a/lib/github_changelog_generator/parser.rb +++ b/lib/github_changelog_generator/parser.rb @@ -7,22 +7,16 @@ module GitHubChangelogGenerator class Parser # parse options with optparse def self.parse_options - options = get_default_options + options = default_options - parser_file = ParserFile.new options - parser_file.parse! + ParserFile.new(options).parse! parser = setup_parser(options) parser.parse! - if options[:user].nil? || options[:project].nil? - detect_user_and_project(options, ARGV[0], ARGV[1]) - end + user_and_project_from_git(options) - if !options[:user] || !options[:project] - puts parser.banner - exit - end + abort(parser.banner) unless options[:user] && options[:project] print_options(options) @@ -165,8 +159,8 @@ module GitHubChangelogGenerator end # just get default options - def self.get_default_options - options = { + def self.default_options + { tag1: nil, tag2: nil, date_format: "%Y-%m-%d", @@ -194,21 +188,25 @@ module GitHubChangelogGenerator enhancement_prefix: "**Implemented enhancements:**", git_remote: "origin" } + end - options + def self.user_and_project_from_git(options) + if options[:user].nil? || options[:project].nil? + detect_user_and_project(options, ARGV[0], ARGV[1]) + end end # Detects user and project from git def self.detect_user_and_project(options, arg0 = nil, arg1 = nil) options[:user], options[:project] = user_project_from_option(arg0, arg1, options[:github_site]) - if !options[:user] || !options[:project] - if ENV["RUBYLIB"] =~ /ruby-debug-ide/ - options[:user] = "skywinder" - options[:project] = "changelog_test" - else - remote = `git config --get remote.#{options[:git_remote]}.url` - options[:user], options[:project] = user_project_from_remote(remote) - end + return if options[:user] && options[:project] + + if ENV["RUBYLIB"] =~ /ruby-debug-ide/ + options[:user] = "skywinder" + options[:project] = "changelog_test" + else + remote = `git config --get remote.#{options[:git_remote]}.url` + options[:user], options[:project] = user_project_from_remote(remote) end end diff --git a/lib/github_changelog_generator/parser_file.rb b/lib/github_changelog_generator/parser_file.rb index b8a77e2..df92814 100644 --- a/lib/github_changelog_generator/parser_file.rb +++ b/lib/github_changelog_generator/parser_file.rb @@ -1,4 +1,6 @@ module GitHubChangelogGenerator + ParserError = Class.new(StandardError) + class ParserFile def initialize(options) @options = options @@ -22,7 +24,7 @@ module GitHubChangelogGenerator value = false if value =~ (/^(false|f|no|n|0)$/i) @options[key_sym] = value rescue - raise "Config file #{file} is incorrect in line \"#{line.gsub(/[\n\r]+/, '')}\"" + raise ParserError, "Config file #{file} is incorrect in line \"#{line.gsub(/[\n\r]+/, '')}\"" end # Returns a the setting as a symbol and its string value sans newlines. diff --git a/lib/github_changelog_generator/reader.rb b/lib/github_changelog_generator/reader.rb index f46301f..d0d65b2 100644 --- a/lib/github_changelog_generator/reader.rb +++ b/lib/github_changelog_generator/reader.rb @@ -53,31 +53,28 @@ module GitHubChangelogGenerator @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? + if matches + captures.merge!(Hash[matches.names.zip(matches.captures)]) + break + end end captures end - # Parse the given ChangeLog data into a Hash + # Parse the given ChangeLog data into a list of Hashes # # @param [String] data File data from the ChangeLog.md - # @return [Hash] Parsed data, e.g. [{ 'version' => ..., 'url' => ..., 'date' => ..., 'content' => ...}, ...] + # @return [Array] 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 + headings.each_with_index.map do |heading, index| + section = parse_heading(heading) + section["content"] = sections.at(index + 1) + section end - - changelog end def read(file_path) diff --git a/lib/github_changelog_generator/task.rb b/lib/github_changelog_generator/task.rb index 8903833..e87f7f2 100644 --- a/lib/github_changelog_generator/task.rb +++ b/lib/github_changelog_generator/task.rb @@ -43,11 +43,9 @@ module GitHubChangelogGenerator task @name do # mimick parse_options - options = Parser.get_default_options + options = Parser.default_options - if options[:user].nil? || options[:project].nil? - Parser.detect_user_and_project(options) - end + Parser.user_and_project_from_git(options) OPTIONS.each do |o| v = instance_variable_get("@#{o}") diff --git a/spec/unit/parse_file_spec.rb b/spec/unit/parse_file_spec.rb index eb8af0c..92d56e6 100644 --- a/spec/unit/parse_file_spec.rb +++ b/spec/unit/parse_file_spec.rb @@ -20,11 +20,11 @@ describe GitHubChangelogGenerator::ParserFile do let(:options) { { params_file: "spec/files/github_changelog_params_incorrect" } } let(:options_before_change) { options.dup } let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) } - it { expect { parse.parse! }.to raise_error } + it { expect { parse.parse! }.to raise_error(GitHubChangelogGenerator::ParserError) } end context "when override default values" do - let(:default_options) { GitHubChangelogGenerator::Parser.get_default_options } + let(:default_options) { GitHubChangelogGenerator::Parser.default_options } let(:options) { { params_file: "spec/files/github_changelog_params_override" }.merge(default_options) } let(:options_before_change) { options.dup } let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) }