diff --git a/lib/github_changelog_generator/options.rb b/lib/github_changelog_generator/options.rb index 20771ee..ac86740 100644 --- a/lib/github_changelog_generator/options.rb +++ b/lib/github_changelog_generator/options.rb @@ -2,6 +2,8 @@ require 'delegate' module GitHubChangelogGenerator class Options < SimpleDelegator + UnsupportedOptionError = Class.new(ArgumentError) + KNOWN_OPTIONS = [ :add_issues_wo_labels, :add_pr_wo_labels, @@ -56,9 +58,12 @@ module GitHubChangelogGenerator def initialize(values) super(values) - if unsupported_options.any? - raise ArgumentError, "Unsupported options #{unsupported_options}" - end + unsupported_options.any? && raise(UnsupportedOptionError, unsupported_options.inspect) + end + + def []=(key, val) + supported_option?(key) || raise(UnsupportedOptionError, key.inspect) + values[key] = val end def to_hash @@ -72,7 +77,15 @@ module GitHubChangelogGenerator end def unsupported_options - values.keys - (KNOWN_OPTIONS + THESE_ARE_DIFFERENT) + values.keys - supported_options + end + + def supported_option?(key) + supported_options.include?(key) + end + + def supported_options + KNOWN_OPTIONS + THESE_ARE_DIFFERENT end end end diff --git a/spec/unit/options_spec.rb b/spec/unit/options_spec.rb index c76b7ad..a3effc2 100644 --- a/spec/unit/options_spec.rb +++ b/spec/unit/options_spec.rb @@ -1,16 +1,42 @@ # 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') +RSpec.describe GitHubChangelogGenerator::Options do + describe "#initialize" do + context "with known options" do + it "instantiates successfully" do + expect(described_class.new(user: "olle")[:user]).to eq("olle") + end + end + + context "with unknown options" do + it "raises an error" do + expect { + described_class.new( + git_remote: "origin", + strength: "super-strength", + wisdom: "deep" + ) + }.to raise_error("[:strength, :wisdom]") + end + end 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]") + describe "#[]=(key, value)" do + let(:options) { described_class.new(git_remote: "origin") } + + context "with known options" do + it "sets the option value" do + expect { + options[:git_remote] = "in the cloud" + }.to change { options[:git_remote] }.to "in the cloud" + end + end + + context "with unknown options" do + it "raises an error" do + expect { + options[:charisma] = 8 + }.to raise_error(":charisma") + end + end end end