From 06962b7d5d069445a50e6b41b974f54cef9652e0 Mon Sep 17 00:00:00 2001 From: Klaus Weidinger Date: Thu, 31 Aug 2023 13:16:13 +0200 Subject: [PATCH] Raise an ArgumentError if unsupported options are passed --- CHANGELOG.md | 2 +- .../active_record/restriction/base.rb | 21 ++++++++++++++++++- lib/assignable_values/errors.rb | 1 + spec/assignable_values/active_record_spec.rb | 8 +++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b55f6b6..b05dda9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html ### Compatible changes -- +- Calling `assignable_values_for` with unsupported options will raise an error. diff --git a/lib/assignable_values/active_record/restriction/base.rb b/lib/assignable_values/active_record/restriction/base.rb index 6d37d3e..c4c0b8e 100644 --- a/lib/assignable_values/active_record/restriction/base.rb +++ b/lib/assignable_values/active_record/restriction/base.rb @@ -5,11 +5,24 @@ class Base attr_reader :model, :property, :options, :values, :default, :secondary_default + SUPPORTED_OPTIONS = [ + :allow_blank, + :decorate, + :default, + :include_old_value, + :message, + :multiple, + :secondary_default, + :through, + ].freeze + private_constant :SUPPORTED_OPTIONS + def initialize(model, property, options, &values) @model = model @property = property @options = options @values = values + validate_supported_options! ensure_values_given setup_default define_assignable_values_method @@ -274,8 +287,14 @@ def ensure_values_given @values or @options[:through] or raise NoValuesGiven, 'You must supply the list of assignable values by either a block or :through option' end + def validate_supported_options! + unsupported_options = @options.keys - SUPPORTED_OPTIONS + if unsupported_options.any? + raise UnsupportedOption, + "The following options are not supported: #{unsupported_options.map { |o| ":#{o}" }.join(', ')}" + end + end end end end end - diff --git a/lib/assignable_values/errors.rb b/lib/assignable_values/errors.rb index 7474fbd..db883e6 100644 --- a/lib/assignable_values/errors.rb +++ b/lib/assignable_values/errors.rb @@ -3,4 +3,5 @@ class Error < StandardError; end class DelegateUnavailable < Error; end class NoValuesGiven < Error; end class NoDefault < Error; end + class UnsupportedOption < Error; end end diff --git a/spec/assignable_values/active_record_spec.rb b/spec/assignable_values/active_record_spec.rb index bd540cd..01aa4e7 100644 --- a/spec/assignable_values/active_record_spec.rb +++ b/spec/assignable_values/active_record_spec.rb @@ -21,6 +21,14 @@ def save_without_validation(record) end.to raise_error(AssignableValues::NoValuesGiven) end + it 'should raise an error when called with unsupported options' do + expect do + Song.disposable_copy do + assignable_values_for :genre, unsupported_option: 42 + end + end.to raise_error(AssignableValues::UnsupportedOption, 'The following options are not supported: :unsupported_option') + end + context 'when validating virtual attributes' do before :each do