Skip to content

Commit

Permalink
transfers responsibility of states to performances to keep actors lig…
Browse files Browse the repository at this point in the history
…ht and fixes some other stuff in the process
  • Loading branch information
markrebec committed May 27, 2015
1 parent e434ce2 commit 5de24fd
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 66 deletions.
35 changes: 2 additions & 33 deletions lib/transactor/actor.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
module Transactor
class Actor
attr_reader :props, :state, :error, :rollback_error

STATES = [:cast, :performing, :performed, :bombed, :rolling_back, :rolled_back, :rollback_bombed]
attr_reader :props

class << self
def configuration
Expand Down Expand Up @@ -34,28 +32,6 @@ def rollback_on_failure?
configuration.rollback_on_failure
end

def perform!(&block)
@state = :performing
result = perform(&block)
@state = :performed
result
rescue StandardError => e
@state = :bombed
@error = e
raise e
end

def rollback!(&block)
@state = :rolling_back
result = rollback(&block)
@state = :rolled_back
result
rescue StandardError => e
@state = :rollback_bombed
@rollback_error = e
raise e
end

def perform(&block)
raise PerformNotImplemented, "#{self.class.name}##{__method__} has not been implemented"
end
Expand All @@ -65,13 +41,7 @@ def rollback(&block)
end

def to_s
"#{self.class.name} #{state} #{props.to_h}"
end

STATES.each do |state|
define_method "#{state}?" do
@state == state
end
"#{self.class.name} #{props.to_h}"
end

def method_missing(meth, *args, &block)
Expand All @@ -90,7 +60,6 @@ def respond_to_missing?(meth, include_private=false)

def initialize(*args)
@props = Props.new(args.extract_options!)
@state = :cast
end
end
end
6 changes: 3 additions & 3 deletions lib/transactor/improv/transaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ class Transaction
def perform
@transaction.performances << @performance
@transaction.transaction! do
performances.last.perform
performances.last.perform!
end
end

def rollback(&block)
@performance.rollback(&block)
@performance.rollback!(&block)
self
end

Expand All @@ -29,7 +29,7 @@ def initialize(*args, &block)
@transaction = Transactor::Transaction.new
@performance = Improv::Performance.new(Improv::Actor, *args)
@performance.actor.rollback_on_failure!
@performance.perform(&block)
@performance.perform!(&block)
end
end
end
Expand Down
45 changes: 28 additions & 17 deletions lib/transactor/performance.rb
Original file line number Diff line number Diff line change
@@ -1,40 +1,50 @@
module Transactor
class Performance
attr_reader :actor, :result
attr_reader :actor, :result, :state, :error, :rollback_error

STATES = [:cast, :performing, :performed, :bombed, :rolling_back, :rolled_back, :rollback_bombed]

def self.perform(actor, *args, &block)
new(actor, *args).perform(&block)
end

def perform(&block)
@result = actor.perform!(&block)
self
@result = actor.perform(&block)
end

def rollback(&block)
actor.rollback!(&block)
self
end

def state
actor.state
actor.rollback(&block)
end

def to_s
actor.to_s
def perform!(&block)
@state = :performing
perform(&block)
@state = :performed
self
rescue StandardError => e
@state = :bombed
@error = e
raise e
end

def error
actor.error
def rollback!(&block)
@state = :rolling_back
rollback(&block)
@state = :rolled_back
self
rescue StandardError => e
@state = :rollback_bombed
@rollback_error = e
raise e
end

def rollback_error
actor.rollback_error
def to_s
"#{actor.to_s} #{state}"
end

Actor::STATES.each do |state|
STATES.each do |state|
define_method "#{state}?" do
actor.send "#{state}?"
@state == state
end
end

Expand All @@ -53,6 +63,7 @@ def initialize(actor, *args)
end
end
@actor = actor.new(*args)
@state = :cast
end
end
end
4 changes: 2 additions & 2 deletions lib/transactor/stage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def perform(actor, *args, &block)
args = performance_props(*args)
performance = Performance.new(actor, *args)
performances << performance
performance.perform(&block)
performance.perform!(&block)
performance.result
rescue => e
raise PerformanceBombed.new(e, performance)
Expand All @@ -17,7 +17,7 @@ def improvise(*args, &block)
args = performance_props(*args)
performance = Improv::Performance.new(Improv::Actor, *args)
performances << performance
performance.perform(&block)
performance.perform!(&block)
performance
rescue PerformanceBombed => e
raise e
Expand Down
2 changes: 1 addition & 1 deletion lib/transactor/transaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def rollback
def rollback_performances
performances.reverse.each do |performance|
begin
performance.rollback
performance.rollback!
rescue RollbackNotImplemented => e
# noop, rollback was not implemented
rescue StandardError => e
Expand Down
2 changes: 1 addition & 1 deletion spec/transactor/actor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

describe '#to_s' do
it 'stringifies the class name, state and props' do
expect(subject.to_s).to eql("#{subject.class.name} #{subject.state} #{subject.props.to_h}")
expect(subject.to_s).to eql("#{subject.class.name} #{subject.props.to_h}")
end
end

Expand Down
6 changes: 3 additions & 3 deletions spec/transactor/performance_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,21 @@
describe '#perform' do
it "calls the actor's perform method" do
subject.perform
expect(subject.actor.performed).to be_true
expect(subject.actor.instance_variable_get(:@performed)).to be_true
end
end

describe '#rollback' do
it "calls the actor's rollback method" do
subject.perform
subject.rollback
expect(subject.actor.performed).to be_false
expect(subject.actor.instance_variable_get(:@performed)).to be_false
end
end

describe '#to_s' do
it 'stringifies the actor' do
expect(subject.to_s).to eql(subject.actor.to_s)
expect(subject.to_s).to eql("#{subject.actor.to_s} #{subject.state}")
end
end
end
12 changes: 6 additions & 6 deletions spec/transactor/transaction_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -104,17 +104,17 @@
describe '#bombed' do
it 'returns an array of bombed or rolled back performances' do
5.times { subject.stage.perform(TestActor) }
subject.performances[0].rollback
subject.performances[2].actor.instance_variable_set :@state, :bombed
subject.performances[0].rollback!
subject.performances[2].instance_variable_set :@state, :bombed
expect(subject.bombed).to eql([subject.performances[0], subject.performances[2]])
end
end

describe '#rolled_back' do
it 'returns an array of rolled back performances' do
5.times { subject.stage.perform(TestActor) }
subject.performances[0].rollback
subject.performances[2].rollback
subject.performances[0].rollback!
subject.performances[2].rollback!
expect(subject.rolled_back).to eql([subject.performances[0], subject.performances[2]])
end
end
Expand All @@ -123,10 +123,10 @@
it 'returns an array of bombed rollbacks' do
5.times { subject.stage.perform(BlockActor) }
begin
subject.performances[0].rollback { raise 'fail' }
subject.performances[0].rollback! { raise 'fail' }
rescue; end
begin
subject.performances[2].rollback { raise 'fail' }
subject.performances[2].rollback! { raise 'fail' }
rescue; end
expect(subject.bombed_rollbacks).to eql([subject.performances[0], subject.performances[2]])
end
Expand Down

0 comments on commit 5de24fd

Please sign in to comment.