transactor 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/transactor.rb +8 -2
- data/lib/transactor/actor.rb +8 -11
- data/lib/transactor/improv.rb +5 -22
- data/lib/transactor/improv/actor.rb +13 -0
- data/lib/transactor/improv/performance.rb +34 -0
- data/lib/transactor/improv/transaction.rb +36 -0
- data/lib/transactor/transaction.rb +40 -17
- data/lib/transactor/version.rb +1 -1
- data/spec/transactor/actor_spec.rb +4 -4
- data/spec/transactor/improv/actor_spec.rb +33 -0
- data/spec/transactor/improv_spec.rb +0 -5
- data/spec/transactor/transaction_spec.rb +6 -4
- data/spec/transactor_spec.rb +3 -5
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0392c2682f4ed22ea823090f2d75a4b6b4125361
|
4
|
+
data.tar.gz: e1081c5a720c23bc9f11992b14d7fa23b3994d00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f97d27444ceb76a2f3a6ff52728702086be33847064abfbe64231214c1ec708efb579f147e83eec4b738778f5990d50f10151237979e91dfcb7b5cbd364b6b2
|
7
|
+
data.tar.gz: 67643d51a70a006ca5fdddb8df47d492a008a8bf80195c8a48d70a3a9f4c08a42390e3ad82cc3dc1cf661f3b39d93b67cb35f09ee629ff15cd20c94354bd8093
|
data/lib/transactor.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'active_support/core_ext/module/attribute_accessors'
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
3
|
+
require 'active_support/core_ext/hash/keys'
|
2
4
|
require 'active_support/core_ext/string/inflections'
|
3
5
|
require 'active_support/core_ext/string/output_safety'
|
4
6
|
require 'canfig'
|
@@ -17,7 +19,11 @@ module Transactor
|
|
17
19
|
config.rollback_failed_actors = false
|
18
20
|
end
|
19
21
|
|
20
|
-
def self.transaction(&block)
|
21
|
-
Transactor::Transaction.new &block
|
22
|
+
def self.transaction(*args, &block)
|
23
|
+
Transactor::Transaction.new *args, &block
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.improvise(*args, &block)
|
27
|
+
Transactor::Improv::Transaction.new *args, &block
|
22
28
|
end
|
23
29
|
end
|
data/lib/transactor/actor.rb
CHANGED
@@ -17,24 +17,21 @@ module Transactor
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def rollback_on_failure!
|
21
|
+
@rollback_on_failure = true
|
22
|
+
end
|
23
|
+
|
20
24
|
def rollback_on_failure?
|
21
|
-
self.class.rollback_on_failure?
|
25
|
+
return self.class.rollback_on_failure? if @rollback_on_failure.nil?
|
26
|
+
@rollback_on_failure
|
22
27
|
end
|
23
28
|
|
24
29
|
def perform(&block)
|
25
|
-
|
26
|
-
instance_eval &block
|
27
|
-
else
|
28
|
-
raise PerformNotImplemented, "#{self.class.name}##{__method__} has not been implemented"
|
29
|
-
end
|
30
|
+
raise PerformNotImplemented, "#{self.class.name}##{__method__} has not been implemented"
|
30
31
|
end
|
31
32
|
|
32
33
|
def rollback(&block)
|
33
|
-
|
34
|
-
instance_eval &block
|
35
|
-
else
|
36
|
-
raise RollbackNotImplemented, "#{self.class.name}##{__method__} has not been implemented"
|
37
|
-
end
|
34
|
+
raise RollbackNotImplemented, "#{self.class.name}##{__method__} has not been implemented"
|
38
35
|
end
|
39
36
|
|
40
37
|
def state
|
data/lib/transactor/improv.rb
CHANGED
@@ -1,25 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
if block_given?
|
5
|
-
super(&block)
|
6
|
-
else
|
7
|
-
super { nil }
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def rollback(&block)
|
12
|
-
if block_given?
|
13
|
-
super(&block)
|
14
|
-
else
|
15
|
-
super { nil }
|
16
|
-
end
|
17
|
-
end
|
1
|
+
require 'transactor/improv/performance'
|
2
|
+
require 'transactor/improv/actor'
|
3
|
+
require 'transactor/improv/transaction'
|
18
4
|
|
19
|
-
|
20
|
-
|
21
|
-
def initialize(*args)
|
22
|
-
super(Actor, *args)
|
23
|
-
end
|
5
|
+
module Transactor
|
6
|
+
module Improv
|
24
7
|
end
|
25
8
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Transactor
|
2
|
+
module Improv
|
3
|
+
class Performance < Transactor::Performance
|
4
|
+
|
5
|
+
def perform(&block)
|
6
|
+
if block_given?
|
7
|
+
@perform_block = block
|
8
|
+
else
|
9
|
+
super(&perform_block)
|
10
|
+
end
|
11
|
+
self
|
12
|
+
rescue => e
|
13
|
+
raise PerformanceBombed.new(e, self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def rollback(&block)
|
17
|
+
if block_given?
|
18
|
+
@rollback_block = block
|
19
|
+
else
|
20
|
+
super(&rollback_block)
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def perform_block
|
26
|
+
@perform_block ||= Proc.new {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def rollback_block
|
30
|
+
@rollback_block ||= Proc.new {}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Transactor
|
2
|
+
module Improv
|
3
|
+
class Transaction
|
4
|
+
attr_reader :performance
|
5
|
+
|
6
|
+
def perform
|
7
|
+
@transaction.performances << @performance
|
8
|
+
@transaction.transaction! do
|
9
|
+
performances.last.perform
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def rollback(&block)
|
14
|
+
@performance.rollback(&block)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def actor
|
19
|
+
@performance.actor
|
20
|
+
end
|
21
|
+
|
22
|
+
def result
|
23
|
+
@performance.result
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def initialize(*args, &block)
|
29
|
+
@transaction = Transactor::Transaction.new
|
30
|
+
@performance = Improv::Performance.new(Improv::Actor, *args)
|
31
|
+
@performance.actor.rollback_on_failure!
|
32
|
+
@performance.perform(&block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -2,7 +2,7 @@ module Transactor
|
|
2
2
|
class Transaction
|
3
3
|
attr_reader :performances, :result
|
4
4
|
|
5
|
-
def in_transaction(&block)
|
5
|
+
def in_transaction(*args, &block)
|
6
6
|
begin
|
7
7
|
@result = instance_eval &block if block_given?
|
8
8
|
rescue Exception => e # yes, we want to catch everything
|
@@ -16,22 +16,23 @@ module Transactor
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def transaction!(&block)
|
19
|
+
def transaction!(*args, &block)
|
20
20
|
if defined?(ActiveRecord::Base) && ActiveRecord::Base.respond_to?(:transaction)
|
21
|
-
ActiveRecord::Base.transaction { in_transaction &block }
|
21
|
+
ActiveRecord::Base.transaction { in_transaction *args, &block }
|
22
22
|
else
|
23
|
-
in_transaction &block
|
23
|
+
in_transaction *args, &block
|
24
24
|
end
|
25
25
|
self
|
26
26
|
end
|
27
27
|
|
28
|
-
def transaction(&block)
|
29
|
-
transaction!(&block)
|
28
|
+
def transaction(*args, &block)
|
29
|
+
transaction!(*args, &block)
|
30
30
|
rescue => e
|
31
31
|
false
|
32
32
|
end
|
33
33
|
|
34
34
|
def perform(actor, *args, &block)
|
35
|
+
args = performance_args(*args)
|
35
36
|
performance = Performance.new(actor, *args)
|
36
37
|
performances << performance
|
37
38
|
performance.perform(&block)
|
@@ -41,10 +42,14 @@ module Transactor
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def improvise(*args, &block)
|
44
|
-
|
45
|
+
block ||= Proc.new {}
|
46
|
+
args = performance_args(*args)
|
47
|
+
performance = Improv::Performance.new(Improv::Actor, *args)
|
45
48
|
performances << performance
|
46
49
|
performance.perform(&block)
|
47
50
|
performance
|
51
|
+
rescue PerformanceBombed => e
|
52
|
+
raise e
|
48
53
|
rescue => e
|
49
54
|
raise PerformanceBombed.new(e, performance)
|
50
55
|
end
|
@@ -77,29 +82,47 @@ module Transactor
|
|
77
82
|
end
|
78
83
|
end
|
79
84
|
|
80
|
-
def
|
81
|
-
|
85
|
+
def set_context!(*args)
|
86
|
+
@context = args.extract_options!.symbolize_keys
|
82
87
|
end
|
83
88
|
|
84
|
-
def
|
85
|
-
|
86
|
-
# it did and is configured to rollback on failure
|
87
|
-
!last_performance.failed? || (last_performance.failed? && last_performance.rollback_on_failure?)
|
89
|
+
def clear_context!
|
90
|
+
@context = {}
|
88
91
|
end
|
89
92
|
|
90
93
|
def method_missing(meth, *args, &block)
|
91
|
-
|
92
|
-
|
94
|
+
if meth.to_s.match(/=\Z/)
|
95
|
+
key = meth.to_s.gsub(/=/,'').to_sym
|
96
|
+
return (@context[key] = args.first) if @context.key?(key)
|
97
|
+
else
|
98
|
+
return @context[meth] if @context.key?(meth)
|
99
|
+
end
|
93
100
|
|
94
|
-
|
95
|
-
true # *shrug* we try to perform just about anything
|
101
|
+
perform meth, *args, &block
|
96
102
|
end
|
97
103
|
|
98
104
|
protected
|
99
105
|
|
100
106
|
def initialize(*args, &block)
|
101
107
|
@performances = []
|
108
|
+
set_context! *args
|
102
109
|
transaction! &block if block_given?
|
103
110
|
end
|
111
|
+
|
112
|
+
def performance_args(*args)
|
113
|
+
context = @context.merge(args.extract_options!.symbolize_keys)
|
114
|
+
args << context
|
115
|
+
args
|
116
|
+
end
|
117
|
+
|
118
|
+
def last_performance
|
119
|
+
performances.last
|
120
|
+
end
|
121
|
+
|
122
|
+
def rollback_last_performance?
|
123
|
+
# only rollback the last performance if it didn't bomb OR if
|
124
|
+
# it did and is configured to rollback on failure
|
125
|
+
!last_performance.failed? || (last_performance.failed? && last_performance.rollback_on_failure?)
|
126
|
+
end
|
104
127
|
end
|
105
128
|
end
|
data/lib/transactor/version.rb
CHANGED
@@ -19,8 +19,8 @@ RSpec.describe Transactor::Actor do
|
|
19
19
|
|
20
20
|
describe '#perform' do
|
21
21
|
context 'when passed a block' do
|
22
|
-
it '
|
23
|
-
expect
|
22
|
+
it 'raises a PerformNotImplemented error' do
|
23
|
+
expect { subject.perform }.to raise_exception(Transactor::PerformNotImplemented)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -33,8 +33,8 @@ RSpec.describe Transactor::Actor do
|
|
33
33
|
|
34
34
|
describe '#rollback' do
|
35
35
|
context 'when passed a block' do
|
36
|
-
it '
|
37
|
-
expect
|
36
|
+
it 'raises a PerformNotImplemented error' do
|
37
|
+
expect { subject.rollback }.to raise_exception(Transactor::RollbackNotImplemented)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Transactor::Improv::Actor do
|
4
|
+
subject { Transactor::Improv::Actor.new(test_one: 'one', test_two: 2) }
|
5
|
+
|
6
|
+
describe '#perform' do
|
7
|
+
context 'when passed a block' do
|
8
|
+
it 'executes the block and returns the value' do
|
9
|
+
expect(subject.perform { 5+5 }).to eql(10)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when not passed a block' do
|
14
|
+
it 'raises a PerformNotImplemented error' do
|
15
|
+
expect { subject.perform }.to raise_exception(Transactor::PerformNotImplemented)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#rollback' do
|
21
|
+
context 'when passed a block' do
|
22
|
+
it 'executes the block and returns the value' do
|
23
|
+
expect(subject.rollback { 5+5 }).to eql(10)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when not passed a block' do
|
28
|
+
it 'raises a PerformNotImplemented error' do
|
29
|
+
expect { subject.rollback }.to raise_exception(Transactor::RollbackNotImplemented)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -67,7 +67,7 @@ RSpec.describe Transactor::Transaction do
|
|
67
67
|
|
68
68
|
describe '#improvise' do
|
69
69
|
it 'returns an improv performance' do
|
70
|
-
expect(subject.improvise).to be_an_instance_of(Transactor::Improv)
|
70
|
+
expect(subject.improvise).to be_an_instance_of(Transactor::Improv::Performance)
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'adds a performance to the performances array' do
|
@@ -77,11 +77,11 @@ RSpec.describe Transactor::Transaction do
|
|
77
77
|
|
78
78
|
it 'casts the default actor in the performance' do
|
79
79
|
subject.improvise
|
80
|
-
expect(subject.performances.last.actor).to be_an_instance_of(Transactor::Actor)
|
80
|
+
expect(subject.performances.last.actor).to be_an_instance_of(Transactor::Improv::Actor)
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'executes the improv block' do
|
84
|
-
subject.improvise { 5+5 }
|
84
|
+
subject.improvise { 5+5 }.perform
|
85
85
|
expect(subject.performances.last.result).to eql(10)
|
86
86
|
end
|
87
87
|
|
@@ -89,7 +89,9 @@ RSpec.describe Transactor::Transaction do
|
|
89
89
|
expect do
|
90
90
|
subject.improvise do
|
91
91
|
raise "Bombing"
|
92
|
-
end
|
92
|
+
end.rollback do
|
93
|
+
puts "Rolling Back"
|
94
|
+
end.perform
|
93
95
|
end.to raise_exception(Transactor::PerformanceBombed)
|
94
96
|
end
|
95
97
|
end
|
data/spec/transactor_spec.rb
CHANGED
@@ -7,11 +7,9 @@ RSpec.describe Transactor do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
expect(Transactor.configuration.rollback_failed_actors).to be_false
|
14
|
-
end
|
10
|
+
describe '#improvise' do
|
11
|
+
it 'returns a Transactor::Improv::Transaction' do
|
12
|
+
expect(Transactor.improvise).to be_an_instance_of(Transactor::Improv::Transaction)
|
15
13
|
end
|
16
14
|
end
|
17
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rebec
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -77,6 +77,9 @@ files:
|
|
77
77
|
- lib/transactor/actor.rb
|
78
78
|
- lib/transactor/errors.rb
|
79
79
|
- lib/transactor/improv.rb
|
80
|
+
- lib/transactor/improv/actor.rb
|
81
|
+
- lib/transactor/improv/performance.rb
|
82
|
+
- lib/transactor/improv/transaction.rb
|
80
83
|
- lib/transactor/performance.rb
|
81
84
|
- lib/transactor/props.rb
|
82
85
|
- lib/transactor/transaction.rb
|
@@ -84,6 +87,7 @@ files:
|
|
84
87
|
- spec/spec_helper.rb
|
85
88
|
- spec/support/test_actors.rb
|
86
89
|
- spec/transactor/actor_spec.rb
|
90
|
+
- spec/transactor/improv/actor_spec.rb
|
87
91
|
- spec/transactor/improv_spec.rb
|
88
92
|
- spec/transactor/performance_spec.rb
|
89
93
|
- spec/transactor/transaction_spec.rb
|
@@ -115,6 +119,7 @@ test_files:
|
|
115
119
|
- spec/spec_helper.rb
|
116
120
|
- spec/support/test_actors.rb
|
117
121
|
- spec/transactor/actor_spec.rb
|
122
|
+
- spec/transactor/improv/actor_spec.rb
|
118
123
|
- spec/transactor/improv_spec.rb
|
119
124
|
- spec/transactor/performance_spec.rb
|
120
125
|
- spec/transactor/transaction_spec.rb
|