From 43a6e49055ba45d492e01c3aa7a6041c254f9394 Mon Sep 17 00:00:00 2001 From: Olle Jonsson Date: Wed, 5 Oct 2016 19:35:55 +0000 Subject: [PATCH] Options: a class to wrap Hash-accessing options choices - protects against bad names --- lib/github_changelog_generator.rb | 1 + lib/github_changelog_generator/options.rb | 78 +++++++++++++++++++++++ lib/github_changelog_generator/parser.rb | 4 +- spec/unit/options_spec.rb | 16 +++++ spec/unit/reader_spec.rb | 4 -- 5 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 lib/github_changelog_generator/options.rb create mode 100644 spec/unit/options_spec.rb diff --git a/lib/github_changelog_generator.rb b/lib/github_changelog_generator.rb index 1495273..5b7e983 100755 --- a/lib/github_changelog_generator.rb +++ b/lib/github_changelog_generator.rb @@ -10,6 +10,7 @@ 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" diff --git a/lib/github_changelog_generator/options.rb b/lib/github_changelog_generator/options.rb new file mode 100644 index 0000000..20771ee --- /dev/null +++ b/lib/github_changelog_generator/options.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +require 'delegate' +module GitHubChangelogGenerator + class Options < SimpleDelegator + 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, + :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, + ] + + THESE_ARE_DIFFERENT = [ + :tag1, + :tag2, + ] + + def initialize(values) + super(values) + if unsupported_options.any? + raise ArgumentError, "Unsupported options #{unsupported_options}" + end + end + + def to_hash + values + end + + private + + def values + __getobj__ + end + + def unsupported_options + values.keys - (KNOWN_OPTIONS + THESE_ARE_DIFFERENT) + end + end +end diff --git a/lib/github_changelog_generator/parser.rb b/lib/github_changelog_generator/parser.rb index b907383..340fcaf 100755 --- a/lib/github_changelog_generator/parser.rb +++ b/lib/github_changelog_generator/parser.rb @@ -187,7 +187,7 @@ module GitHubChangelogGenerator # @return [Hash] Default options def self.default_options - { + Options.new( tag1: nil, tag2: nil, date_format: "%Y-%m-%d", @@ -217,7 +217,7 @@ module GitHubChangelogGenerator http_cache: true, cache_file: "/tmp/github-changelog-http-cache", cache_log: "/tmp/github-changelog-logger.log" - } + ) end # If `:user` or `:project` not set in options, try setting them diff --git a/spec/unit/options_spec.rb b/spec/unit/options_spec.rb new file mode 100644 index 0000000..c76b7ad --- /dev/null +++ b/spec/unit/options_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +describe GitHubChangelogGenerator::Options do + it 'can be instantiated with defaults' do + expect(described_class.new(user: 'olle')[:user]).to eq('olle') + end + + it 'disallows unknown option names' do + expect { + described_class.new( + git_remote: 'origin', + strength: 'super-strength', + wisdom: 'deep' + ) + }.to raise_error(ArgumentError, "Unsupported options [:strength, :wisdom]") + end +end diff --git a/spec/unit/reader_spec.rb b/spec/unit/reader_spec.rb index 2bc21e8..e2f8e7d 100644 --- a/spec/unit/reader_spec.rb +++ b/spec/unit/reader_spec.rb @@ -85,10 +85,6 @@ describe GitHubChangelogGenerator::Reader do 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')