Skip to content

Commit

Permalink
feat: extend callbacks to support :if and :unless (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcosgz authored Jul 11, 2024
1 parent d01d46c commit 22fca2b
Show file tree
Hide file tree
Showing 10 changed files with 79 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ source 'https://rubygems.org'

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

gem 'esse', '~> 0.3.0'
gem 'esse', '~> 0.3.1'
gem 'sqlite3', '~> 1.7.3'
gem 'activerecord', '~> 5.2'
gem 'esse-rspec', '~> 0.0.6'
Expand Down
6 changes: 3 additions & 3 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down Expand Up @@ -39,7 +39,7 @@ GEM
elasticsearch-transport (7.17.10)
faraday (>= 1, < 3)
multi_json
esse (0.3.0)
esse (0.3.1)
multi_json
thor (>= 0.19)
esse-rspec (0.0.6)
Expand Down Expand Up @@ -142,7 +142,7 @@ DEPENDENCIES
awesome_print
dotenv
elasticsearch (~> 7.17, >= 7.17.10)
esse (~> 0.3.0)
esse (~> 0.3.1)
esse-active_record!
esse-rspec (~> 0.0.6)
pry
Expand Down
2 changes: 1 addition & 1 deletion ci/Gemfile.rails-5.2.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ..
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down
2 changes: 1 addition & 1 deletion ci/Gemfile.rails-6.0.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ..
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down
2 changes: 1 addition & 1 deletion ci/Gemfile.rails-6.1.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ..
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down
2 changes: 1 addition & 1 deletion ci/Gemfile.rails-7.0.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ..
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down
2 changes: 1 addition & 1 deletion ci/Gemfile.rails-7.1.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ..
specs:
esse-active_record (0.3.2)
esse-active_record (0.3.3)
activerecord (>= 4.2, < 8)
esse (>= 0.3.0)

Expand Down
9 changes: 8 additions & 1 deletion lib/esse/active_record/model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@ def esse_callbacks

def esse_callback(index_repo_name, operation_name, on: %i[create update destroy], **options, &block)
@esse_callbacks = esse_callbacks.dup
if_enabled = -> { Esse::ActiveRecord::Hooks.enabled?(index_repo_name) && Esse::ActiveRecord::Hooks.enabled_for_model?(self.class, index_repo_name) }
cb_if = options.delete(:if)
cb_unless = options.delete(:unless)
if_enabled = -> {
(cb_if.nil? || (cb_if.respond_to?(:call) ? instance_exec(&cb_if) : send(cb_if))) &&
(cb_unless.nil? || (cb_unless.respond_to?(:call) ? !instance_exec(&cb_unless) : !send(cb_unless))) &&
Esse::ActiveRecord::Hooks.enabled?(index_repo_name) &&
Esse::ActiveRecord::Hooks.enabled_for_model?(self.class, index_repo_name)
}

Array(on).each do |event|
identifier, klass = Esse::ActiveRecord::Callbacks.fetch!(operation_name, event)
Expand Down
2 changes: 1 addition & 1 deletion lib/esse/active_record/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

module Esse
module ActiveRecord
VERSION = '0.3.2'
VERSION = '0.3.3'
end
end
61 changes: 61 additions & 0 deletions spec/esse/active_record/model/esse_callback_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,67 @@ class DumpTempCallbackOnDestroy < DumpTempCallback; end
expect(model_class.esse_callbacks['states:state']).to be_frozen
end

context 'when passing :if option' do
it 'allows to set custom condition using proc' do
model_class.esse_callback('states:state', :temp, on: :create, if: -> { name == 'TRUE' }) { :ok }

model = build_record(model_class, name: 'FALSE')
expect { model.save }.not_to change { DummyCallbackRepo.all.size }

model = build_record(model_class, name: 'TRUE')
expect { model.save }.to change { DummyCallbackRepo.all.size }.by(1)
end

it 'allows to set custom condition using method' do
model_class.esse_callback('states:state', :temp, on: :create, if: :true?) { :ok }

model = build_record(model_class, name: 'FALSE')
model.define_singleton_method(:true?) { false }
expect { model.save }.not_to change { DummyCallbackRepo.all.size }

model = build_record(model_class, name: 'TRUE')
model.define_singleton_method(:true?) { true }
expect { model.save }.to change { DummyCallbackRepo.all.size }.by(1)
end

it 'does not override hooks condition' do
model_class.esse_callback('states:state', :temp, on: :create, if: -> { name == 'TRUE' }) { :ok }
model = build_record(model_class, name: 'TRUE')
expect { model_class.without_indexing { model.save } }.not_to change { DummyCallbackRepo.all.size }
end
end

context 'when passing :unless option' do
it 'allows to set custom condition using proc' do
model_class.esse_callback('states:state', :temp, on: :create, unless: -> { name == 'TRUE' }) { :ok }

model = build_record(model_class, name: 'FALSE')
expect { model.save }.to change { DummyCallbackRepo.all.size }.by(1)

model = build_record(model_class, name: 'TRUE')
expect { model.save }.not_to change { DummyCallbackRepo.all.size }
end

it 'allows to set custom condition using method' do
model_class.esse_callback('states:state', :temp, on: :create, unless: :true?) { :ok }

model = build_record(model_class, name: 'FALSE')
model.define_singleton_method(:true?) { false }
expect { model.save }.to change { DummyCallbackRepo.all.size }.by(1)

model = build_record(model_class, name: 'TRUE')
model.define_singleton_method(:true?) { true }
expect { model.save }.not_to change { DummyCallbackRepo.all.size }
end

it 'does not override hooks condition' do
model_class.esse_callback('states:state', :temp, on: :create, unless: -> { name == 'TRUE' }) { :ok }
model = build_record(model_class, name: 'FALSE')

expect { model_class.without_indexing { model.save } }.not_to change { DummyCallbackRepo.all.size }
end
end

context 'when on :create' do
it 'raises an error when the callback is not registered' do
expect {
Expand Down

0 comments on commit 22fca2b

Please sign in to comment.