sagas 0.0.0 → 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sagas.rb +26 -20
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e5859e7cd5a7b7d6d1915eed8608da28a886b98
4
- data.tar.gz: 367e2e85ca6887c0f468c060afff260e5a2316c3
3
+ metadata.gz: e6130b14df41d9e8ef58acd7f83ae1855dd7df66
4
+ data.tar.gz: 18103acc218313e7eb9db7bde80c7b4b518c06b0
5
5
  SHA512:
6
- metadata.gz: 0ed5ac2dda86a88a044e03a762e45a8ca124f557921e3d951e8ad238eb1918134a07dc034825f799796a71997a9236f9a9d4fa3ca78ee23137eb4ea9ee88b403
7
- data.tar.gz: 5a01d5c032624d41baf2de0878fa9472ca7a6f1fae4a15f0d7c97cf021143ed876b43f76ce562195941dea4473830e64bf08519b1311f0d90f01a404f130a4e6
6
+ metadata.gz: 2053abdc45d08fe8f7c984bf814aca113fa9fdd26c17a44f4a50b3e76572e9d4f6b00345c4b930cc303e4da83a4eb8b0179f18375c7974edb92bb521344e7c32
7
+ data.tar.gz: a56f9850ae727212842efb8bb9e42a8b7eab1474812f0bc10ef45b75fdb3e18926b7877873aa99e5fd7796112b7c80f67d7d0ccdc42752d8ded57d42868b9759
data/lib/sagas.rb CHANGED
@@ -1,34 +1,40 @@
1
1
  class Effect
2
- def initialize(name, transaction, compensation)
3
- @name = name
4
-
5
- (class << self; self; end).class_eval do
6
- define_method :transaction do
7
- transaction.call
8
- end
2
+ attr_reader :name, :perform, :undo
3
+ attr_accessor :side_effect
9
4
 
10
- define_method :compensation do
11
- compensation.call
12
- end
13
- end
5
+ def initialize(name:, perform:, undo:)
6
+ @name = name
7
+ @perform = perform
8
+ @undo = undo
14
9
  end
15
10
  end
16
11
 
17
12
  class Saga
18
- attr_reader :actions
13
+ def initialize
14
+ @effects = []
15
+ # Can be :abort, :error, or :ok
16
+ @transaction_state = :ok
17
+ end
18
+
19
+ def self.transaction(&block)
20
+ block.call(Saga.new)
21
+ end
19
22
 
20
- def initialize()
21
- @actions = []
23
+ def run(name:, perform:, undo:)
24
+ add_stage(name: name, perform: perform, undo: undo)
25
+ execute_stage if @transaction_state == :ok
22
26
  end
23
27
 
24
- def run(action)
25
- action.transaction
26
- @actions.push(action)
28
+ def add_stage(name:, perform:, undo:)
29
+ @effects.push(Effect.new(name: name, perform: perform, undo: undo))
27
30
  end
28
31
 
29
- def abort
30
- actions.each do |action|
31
- action.compensation
32
+ def execute_stage
33
+ @effects.last.side_effect = @effects.last.perform.call()
34
+ rescue => e
35
+ @transaction_state = :abort
36
+ @effects.reverse_each do |effect|
37
+ effect.undo.call(effect.side_effect)
32
38
  end
33
39
  end
34
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sagas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Yu
@@ -11,7 +11,7 @@ bindir: bin
11
11
  cert_chain: []
12
12
  date: 2018-11-30 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Boop
14
+ description: A dependency-free library to manage distributed transactions in Ruby
15
15
  email: victor.yu.canada@gmail.com
16
16
  executables: []
17
17
  extensions: []
@@ -41,5 +41,5 @@ rubyforge_project:
41
41
  rubygems_version: 2.5.2
42
42
  signing_key:
43
43
  specification_version: 4
44
- summary: A Ruby implementation of Sagas
44
+ summary: A Ruby implementation of the Saga design pattern
45
45
  test_files: []