From 887ffd70878db2df4b5d9bc5eb099152dda9bee5 Mon Sep 17 00:00:00 2001 From: Caio Ramos Date: Wed, 24 Mar 2021 23:50:33 -0300 Subject: [PATCH 1/3] add specs --- spec/database.rb | 15 ++++----------- spec/models/active_record/namespaced.rb | 16 ++++++++++++++++ .../active_record_persistence_multiple_spec.rb | 17 +++++++++++++++++ 3 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 spec/models/active_record/namespaced.rb diff --git a/spec/database.rb b/spec/database.rb index 7593d13e..482754b4 100644 --- a/spec/database.rb +++ b/spec/database.rb @@ -5,17 +5,10 @@ end end - ActiveRecord::Migration.create_table "simple_new_dsls", :force => true do |t| - t.string "status" - end - ActiveRecord::Migration.create_table "multiple_simple_new_dsls", :force => true do |t| - t.string "status" - end - ActiveRecord::Migration.create_table "implemented_abstract_class_dsls", :force => true do |t| - t.string "status" - end - ActiveRecord::Migration.create_table "users", :force => true do |t| - t.string "status" + %w(simple_new_dsls multiple_simple_new_dsls implemented_abstract_class_dsls users multiple_namespaceds).each do |table_name| + ActiveRecord::Migration.create_table table_name, :force => true do |t| + t.string "status" + end end ActiveRecord::Migration.create_table "complex_active_record_examples", :force => true do |t| diff --git a/spec/models/active_record/namespaced.rb b/spec/models/active_record/namespaced.rb new file mode 100644 index 00000000..2e3c1451 --- /dev/null +++ b/spec/models/active_record/namespaced.rb @@ -0,0 +1,16 @@ +class MultipleNamespaced < ActiveRecord::Base + include AASM + + aasm(:status, namespace: :car) do + state :unsold, initial: true + state :sold + + event :sell do + transitions from: :unsold, to: :sold + end + + event :return do + transitions from: :sold, to: :unsold + end + end +end diff --git a/spec/unit/persistence/active_record_persistence_multiple_spec.rb b/spec/unit/persistence/active_record_persistence_multiple_spec.rb index 33e856a2..dff3658a 100644 --- a/spec/unit/persistence/active_record_persistence_multiple_spec.rb +++ b/spec/unit/persistence/active_record_persistence_multiple_spec.rb @@ -331,6 +331,23 @@ expect(MultipleSimpleNewDsl.unknown_scope).to contain_exactly(dsl2) end end + + context "when namespeced" do + it "add namespaced scopes" do + expect(MultipleNamespaced).to respond_to(:car_unsold) + expect(MultipleNamespaced).to respond_to(:car_sold) + + expect(MultipleNamespaced.car_unsold.is_a?(ActiveRecord::Relation)).to be_truthy + expect(MultipleNamespaced.car_sold.is_a?(ActiveRecord::Relation)).to be_truthy + end + it "add unnamespaced scopes" do + expect(MultipleNamespaced).to respond_to(:unsold) + expect(MultipleNamespaced).to respond_to(:sold) + + expect(MultipleNamespaced.unsold.is_a?(ActiveRecord::Relation)).to be_truthy + expect(MultipleNamespaced.sold.is_a?(ActiveRecord::Relation)).to be_truthy + end + end end # scopes describe "direct assignment" do From 2d9a560c6ab9aedd68117a6de3ccc844919270b0 Mon Sep 17 00:00:00 2001 From: Caio Ramos Date: Wed, 24 Mar 2021 23:50:46 -0300 Subject: [PATCH 2/3] add implementation --- lib/aasm/persistence/base.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/aasm/persistence/base.rb b/lib/aasm/persistence/base.rb index 398d951c..81fb3ef6 100644 --- a/lib/aasm/persistence/base.rb +++ b/lib/aasm/persistence/base.rb @@ -59,7 +59,14 @@ class Base # make sure to create a (named) scope for each state def state_with_scope(*args) names = state_without_scope(*args) - names.each { |name| create_scope(name) if create_scope?(name) } + names.each do |name| + if namespace? + # Create default scopes even when namespace? for backward compatibility + namepaced_name = "#{namespace}_#{name}" + create_scope(namepaced_name) if create_scope?(namepaced_name) + end + create_scope(name) if create_scope?(name) + end end alias_method :state_without_scope, :state alias_method :state, :state_with_scope From 7b7b2dda0a40777b278b8e836e0561cc14c777c5 Mon Sep 17 00:00:00 2001 From: Caio Ramos Date: Thu, 25 Mar 2021 00:10:59 -0300 Subject: [PATCH 3/3] refactor to decrease complexity --- lib/aasm/persistence/base.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/aasm/persistence/base.rb b/lib/aasm/persistence/base.rb index 81fb3ef6..031157c7 100644 --- a/lib/aasm/persistence/base.rb +++ b/lib/aasm/persistence/base.rb @@ -60,12 +60,7 @@ class Base def state_with_scope(*args) names = state_without_scope(*args) names.each do |name| - if namespace? - # Create default scopes even when namespace? for backward compatibility - namepaced_name = "#{namespace}_#{name}" - create_scope(namepaced_name) if create_scope?(namepaced_name) - end - create_scope(name) if create_scope?(name) + create_scopes(name) end end alias_method :state_without_scope, :state @@ -78,7 +73,16 @@ def create_scope?(name) end def create_scope(name) - @klass.aasm_create_scope(@name, name) + @klass.aasm_create_scope(@name, name) if create_scope?(name) + end + + def create_scopes(name) + if namespace? + # Create default scopes even when namespace? for backward compatibility + namepaced_name = "#{namespace}_#{name}" + create_scope(namepaced_name) + end + create_scope(name) end end # Base