From ffbb3ed05a0daff81f6d2009fcde960e66db0641 Mon Sep 17 00:00:00 2001 From: Markus Doits Date: Tue, 26 Mar 2024 18:40:14 +0100 Subject: [PATCH] fix active model `*_previously_changed?` dirty methods to accept kwargs since Rails 6.1 they accept kwargs `from` and `to`, see https://github.com/rails/rails/commit/a6841c720ad567d28a5ffac945bce8acc8b66c1a --- lib/mobility/plugins/active_model/dirty.rb | 8 +++++--- spec/mobility/plugins/active_model/dirty_spec.rb | 4 ++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mobility/plugins/active_model/dirty.rb b/lib/mobility/plugins/active_model/dirty.rb index 3cd13a79..0f869747 100644 --- a/lib/mobility/plugins/active_model/dirty.rb +++ b/lib/mobility/plugins/active_model/dirty.rb @@ -135,7 +135,7 @@ def define_handler_methods public_patterns.each do |pattern| method_name = pattern % 'attribute' - kwargs = pattern == '%s_changed?' ? ', **kwargs' : '' + kwargs = (pattern == '%s_changed?' || pattern == '%s_previously_changed?') ? ', **kwargs' : '' module_eval <<-EOM, __FILE__, __LINE__ + 1 def #{method_name}(attr_name, *rest#{kwargs}) if (mutations_from_mobility.attribute_changed?(attr_name) || @@ -298,8 +298,10 @@ def attribute_changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN) (OPTION_NOT_GIVEN == to || fetch_value(attr_name) == to) end - def attribute_previously_changed?(attr_name) - previous_changes.include?(attr_name) + def attribute_previously_changed?(attr_name, from: OPTION_NOT_GIVEN, to: OPTION_NOT_GIVEN) + previous_changes.include?(attr_name) && + (OPTION_NOT_GIVEN == from || attribute_previous_change(attr_name).first == from) && + (OPTION_NOT_GIVEN == to || attribute_previous_change(attr_name).second == to) end def attribute_was(attr_name) diff --git a/spec/mobility/plugins/active_model/dirty_spec.rb b/spec/mobility/plugins/active_model/dirty_spec.rb index 8356dc69..bf733667 100644 --- a/spec/mobility/plugins/active_model/dirty_spec.rb +++ b/spec/mobility/plugins/active_model/dirty_spec.rb @@ -240,10 +240,14 @@ def save expect(instance.attribute_changed?(:title_en)).to eq(false) expect(instance.title_previously_changed?).to eq(true) + expect(instance.title_previously_changed?(from: 'foo', to: 'bar')).to eq(true) + expect(instance.title_previously_changed?(from: 'foo', to: 'baz')).to eq(false) expect(instance.title_previous_change).to eq(["foo", "bar"]) expect(instance.title_changed?).to eq(false) expect(instance.attribute_previously_changed?(:title_en)).to eq(true) + expect(instance.attribute_previously_changed?(:title_en, from: 'foo', to: 'bar')).to eq(true) + expect(instance.attribute_previously_changed?(:title_en, from: 'foo', to: 'baz')).to eq(false) expect(instance.attribute_changed?(:title_en)).to eq(false) expect(instance.title_previously_was).to eq('foo')