piko_transaction 2.1.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/piko_transaction/custom_command.rb +79 -20
- data/lib/piko_transaction/delete_command.rb +56 -16
- data/lib/piko_transaction/insert_command.rb +56 -16
- data/lib/piko_transaction/transaction.rb +29 -13
- data/lib/piko_transaction/transaction_holder.rb +1 -1
- data/lib/piko_transaction/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fb92d89b2652b73d375601b371f4e455bb288a2
|
4
|
+
data.tar.gz: 2aedbe5d5503fd358d82bc407a8f5f572d14c066
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d007f9c884d25c6028e8e790239be5d2b2886970963d9df4b91cab56e0927dd4cab49f628d20cfb8675b988a92e457e5aa387b96f9be42ee3976f6745628f6af
|
7
|
+
data.tar.gz: 29a8c4244b32c2e9de4f03b724116bee83472b5bc2630391bd74e82eef1128a2f76f8393d365eecd588983c4cb9500e22cbfc43dd624470fe8ab3636e656a6b4
|
data/CHANGELOG.md
CHANGED
@@ -24,30 +24,48 @@ module PikoTransaction
|
|
24
24
|
include Logger
|
25
25
|
|
26
26
|
def initialize(do_action = nil, undo_action = nil, &alternative_do_action)
|
27
|
-
@
|
27
|
+
@name = nil
|
28
|
+
@do_action = choose_do_action(do_action, alternative_do_action)
|
28
29
|
@undo_action = undo_action
|
29
|
-
@
|
30
|
+
@success_callbacks = []
|
31
|
+
@failure_callbacks = []
|
30
32
|
@done = false
|
31
33
|
end
|
32
34
|
|
33
35
|
def do
|
34
|
-
|
35
|
-
return terminate("Can not execute 'do' action") unless execute_do_action
|
36
|
-
mark_as_done
|
37
|
-
true
|
36
|
+
execute_do_action ? call_success_callbacks : call_failure_callbacks
|
38
37
|
end
|
39
38
|
|
40
39
|
def undo
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
execute_undo_action
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
format "[%s]", @name || "custom_cmd"
|
45
|
+
end
|
46
|
+
|
47
|
+
def name(value)
|
48
|
+
@name = value.to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_success_callback(callback)
|
52
|
+
@success_callbacks << callback if callback.respond_to?(:call)
|
53
|
+
logger.debug { format "%s Registered success callbacks: %i", to_s, @success_callbacks.count }
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_failure_callback(callback)
|
57
|
+
@failure_callbacks << callback if callback.respond_to?(:call)
|
58
|
+
logger.debug { format "%s Registered failure callbacks: %i", to_s, @failure_callbacks.count }
|
45
59
|
end
|
46
60
|
|
47
61
|
private
|
48
62
|
|
63
|
+
def choose_do_action(action, alternative_action)
|
64
|
+
action || alternative_action
|
65
|
+
end
|
66
|
+
|
49
67
|
def terminate(msg)
|
50
|
-
logger.warn { msg }
|
68
|
+
logger.warn { format "%s %s", to_s, msg }
|
51
69
|
false
|
52
70
|
end
|
53
71
|
|
@@ -57,6 +75,7 @@ module PikoTransaction
|
|
57
75
|
|
58
76
|
def mark_as_undone
|
59
77
|
@done = false
|
78
|
+
true
|
60
79
|
end
|
61
80
|
|
62
81
|
def can_do?
|
@@ -68,20 +87,60 @@ module PikoTransaction
|
|
68
87
|
end
|
69
88
|
|
70
89
|
def execute_do_action
|
71
|
-
|
72
|
-
return terminate("
|
73
|
-
|
74
|
-
action
|
90
|
+
return terminate("Command already done") unless can_do?
|
91
|
+
return terminate("'Do' action do not responds to :call") unless \
|
92
|
+
callable_action?(@do_action)
|
93
|
+
return terminate("'Do' action returns false") unless safe_call_do_action
|
94
|
+
mark_as_done
|
75
95
|
end
|
76
96
|
|
77
|
-
def
|
78
|
-
|
97
|
+
def safe_call_do_action
|
98
|
+
logger.info { format "%s Executing custom 'do' action", to_s }
|
99
|
+
return safe_call_action(@do_action) unless @do_action.nil?
|
100
|
+
logger.warn { format "%s Nothing to 'do'", to_s }
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
def safe_call_action(action)
|
105
|
+
action.call ? true : false
|
106
|
+
rescue => e
|
107
|
+
logger.fatal { format "%s %s - %s", to_s, e.class.name, e.message }
|
108
|
+
false
|
109
|
+
end
|
110
|
+
|
111
|
+
def callable_action?(action)
|
112
|
+
action.nil? || action.respond_to?(:call)
|
79
113
|
end
|
80
114
|
|
81
115
|
def execute_undo_action
|
82
|
-
return
|
83
|
-
|
84
|
-
|
116
|
+
return terminate("Can not undo command") unless can_undo?
|
117
|
+
return terminate("'Undo' action do not responds to :call") unless \
|
118
|
+
callable_action?(@undo_action)
|
119
|
+
return terminate("'Undo' action returns false") unless safe_call_undo_action
|
120
|
+
mark_as_undone
|
121
|
+
end
|
122
|
+
|
123
|
+
def safe_call_undo_action
|
124
|
+
logger.debug { format "%s Executing custom 'undo' action", to_s }
|
125
|
+
return safe_call_action(@undo_action) unless @undo_action.nil?
|
126
|
+
logger.warn { format "%s Nothing to 'undo'", to_s }
|
127
|
+
true
|
128
|
+
end
|
129
|
+
|
130
|
+
def call_success_callbacks
|
131
|
+
@success_callbacks.each_with_index do |callback, i|
|
132
|
+
logger.debug { format "%s Run %i success callback", to_s, i + 1 }
|
133
|
+
callback.call
|
134
|
+
end
|
135
|
+
true
|
136
|
+
end
|
137
|
+
|
138
|
+
def call_failure_callbacks
|
139
|
+
@failure_callbacks.each_with_index do |callback, i|
|
140
|
+
logger.debug { format "%s Run %i failure callback", to_s, i + 1 }
|
141
|
+
callback.call
|
142
|
+
end
|
143
|
+
false
|
85
144
|
end
|
86
145
|
end
|
87
146
|
end
|
@@ -24,32 +24,47 @@ module PikoTransaction
|
|
24
24
|
include Logger
|
25
25
|
|
26
26
|
def initialize(document_id, collection, &success_action)
|
27
|
+
@name = nil
|
27
28
|
@document_id = document_id
|
28
29
|
@collection = collection
|
29
30
|
@success_action = success_action
|
31
|
+
@success_callbacks = []
|
32
|
+
@failure_callbacks = []
|
30
33
|
@deleted_doc = nil
|
31
34
|
@done = false
|
32
35
|
end
|
33
36
|
|
34
37
|
def do
|
35
|
-
|
36
|
-
|
37
|
-
call_success_action
|
38
|
-
mark_as_done
|
39
|
-
true
|
38
|
+
add_success_callback @success_action
|
39
|
+
remove_document ? call_success_callbacks : call_failure_callbacks
|
40
40
|
end
|
41
41
|
|
42
42
|
def undo
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
store_document
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
format "[%s]", @name || "delete_cmd"
|
48
|
+
end
|
49
|
+
|
50
|
+
def name(value)
|
51
|
+
@name = value.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_success_callback(callback)
|
55
|
+
@success_callbacks << callback if callback.respond_to?(:call)
|
56
|
+
logger.debug { format "%s Registered success callbacks: %s", to_s, @success_callbacks.count }
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_failure_callback(callback)
|
60
|
+
@failure_callbacks << callback if callback.respond_to?(:call)
|
61
|
+
logger.debug { format "%s Registered failure callbacks: %s", to_s, @failure_callbacks.count }
|
47
62
|
end
|
48
63
|
|
49
64
|
private
|
50
65
|
|
51
66
|
def terminate(msg)
|
52
|
-
logger.warn { msg }
|
67
|
+
logger.warn { format "%s %s", to_s, msg }
|
53
68
|
false
|
54
69
|
end
|
55
70
|
|
@@ -59,6 +74,7 @@ module PikoTransaction
|
|
59
74
|
|
60
75
|
def mark_as_undone
|
61
76
|
@done = false
|
77
|
+
true
|
62
78
|
end
|
63
79
|
|
64
80
|
def can_do?
|
@@ -70,19 +86,43 @@ module PikoTransaction
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def remove_document
|
73
|
-
|
89
|
+
return terminate("Command already done") unless can_do?
|
90
|
+
return terminate("Error during deleting document") unless delete_document_from_collection
|
91
|
+
mark_as_done
|
92
|
+
end
|
93
|
+
|
94
|
+
def delete_document_from_collection
|
95
|
+
logger.info do
|
96
|
+
format "%s Deleting document '%s' from '%s'", to_s, @document_id, @collection.to_s
|
97
|
+
end
|
74
98
|
@collection.find_and_delete_document(@document_id) { |doc| @deleted_doc = doc }
|
75
99
|
end
|
76
100
|
|
77
101
|
def store_document
|
78
|
-
|
102
|
+
return terminate("Can not undo without do") unless can_undo?
|
103
|
+
return terminate("Error durind restoring document") unless insert_document_into_collection
|
104
|
+
mark_as_undone
|
105
|
+
end
|
106
|
+
|
107
|
+
def insert_document_into_collection
|
108
|
+
logger.info { format "%s Restoring document %s in %s", to_s, @deleted_doc, @collection.to_s }
|
79
109
|
@collection.insert_document(@deleted_doc)
|
80
110
|
end
|
81
111
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
112
|
+
def call_success_callbacks
|
113
|
+
@success_callbacks.each_with_index do |callback, i|
|
114
|
+
logger.debug { format "%s Run %i success callback with: %s", to_s, i + 1, @deleted_doc }
|
115
|
+
callback.call(@deleted_doc)
|
116
|
+
end
|
117
|
+
true
|
118
|
+
end
|
119
|
+
|
120
|
+
def call_failure_callbacks
|
121
|
+
@failure_callbacks.each_with_index do |callback, i|
|
122
|
+
logger.debug { format "%s Run %i failure callback", to_s, i + 1 }
|
123
|
+
callback.call
|
124
|
+
end
|
125
|
+
false
|
86
126
|
end
|
87
127
|
end
|
88
128
|
end
|
@@ -24,32 +24,47 @@ module PikoTransaction
|
|
24
24
|
include Logger
|
25
25
|
|
26
26
|
def initialize(document, collection, &success_action)
|
27
|
+
@name = nil
|
27
28
|
@document = document
|
28
29
|
@collection = collection
|
29
30
|
@success_action = success_action
|
31
|
+
@success_callbacks = []
|
32
|
+
@failure_callbacks = []
|
30
33
|
@inserted_id = nil
|
31
34
|
@done = false
|
32
35
|
end
|
33
36
|
|
34
37
|
def do
|
35
|
-
|
36
|
-
|
37
|
-
call_success_action
|
38
|
-
mark_as_done
|
39
|
-
true
|
38
|
+
add_success_callback @success_action
|
39
|
+
store_document ? call_success_callbacks : call_failure_callbacks
|
40
40
|
end
|
41
41
|
|
42
42
|
def undo
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
remove_document
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
format "[%s]", @name || "insert_cmd"
|
48
|
+
end
|
49
|
+
|
50
|
+
def name(value)
|
51
|
+
@name = value.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_success_callback(callback)
|
55
|
+
@success_callbacks << callback if callback.respond_to?(:call)
|
56
|
+
logger.debug { format "%s Registered success callbacks: %i", to_s, @success_callbacks.count }
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_failure_callback(callback)
|
60
|
+
@failure_callbacks << callback if callback.respond_to?(:call)
|
61
|
+
logger.debug { format "%s Registered failure callbacks: %i", to_s, @failure_callbacks.count }
|
47
62
|
end
|
48
63
|
|
49
64
|
private
|
50
65
|
|
51
66
|
def terminate(msg)
|
52
|
-
logger.warn { msg }
|
67
|
+
logger.warn { format "%s %s", to_s, msg }
|
53
68
|
false
|
54
69
|
end
|
55
70
|
|
@@ -59,6 +74,7 @@ module PikoTransaction
|
|
59
74
|
|
60
75
|
def mark_as_undone
|
61
76
|
@done = false
|
77
|
+
true
|
62
78
|
end
|
63
79
|
|
64
80
|
def can_do?
|
@@ -70,19 +86,43 @@ module PikoTransaction
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def store_document
|
73
|
-
|
89
|
+
return terminate("Command already done") unless can_do?
|
90
|
+
return terminate("Error during inserting document") unless insert_document_into_collection
|
91
|
+
mark_as_done
|
92
|
+
end
|
93
|
+
|
94
|
+
def insert_document_into_collection
|
95
|
+
logger.info { format "%s Inserting %s into '%s'", to_s, @document, @collection.to_s }
|
74
96
|
@collection.insert_document(@document) { |doc_id| @inserted_id = doc_id }
|
75
97
|
end
|
76
98
|
|
77
99
|
def remove_document
|
78
|
-
|
100
|
+
return terminate("Can not undo without do") unless can_undo?
|
101
|
+
return terminate("Error during withdrawing document") unless delete_document_from_collection
|
102
|
+
mark_as_undone
|
103
|
+
end
|
104
|
+
|
105
|
+
def delete_document_from_collection
|
106
|
+
logger.info do
|
107
|
+
format "%s Withdrawing document '%s' from '%s'", to_s, @inserted_id, @collection.to_s
|
108
|
+
end
|
79
109
|
@collection.delete_document(@inserted_id)
|
80
110
|
end
|
81
111
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
112
|
+
def call_success_callbacks
|
113
|
+
@success_callbacks.each_with_index do |callback, i|
|
114
|
+
logger.debug { format "%s Run %i success callback with: %s", to_s, i + 1, @inserted_id }
|
115
|
+
callback.call(@inserted_id)
|
116
|
+
end
|
117
|
+
true
|
118
|
+
end
|
119
|
+
|
120
|
+
def call_failure_callbacks
|
121
|
+
@failure_callbacks.each_with_index do |callback, i|
|
122
|
+
logger.debug { format "%s Run %i failure callback", to_s, i + 1 }
|
123
|
+
callback.call
|
124
|
+
end
|
125
|
+
false
|
86
126
|
end
|
87
127
|
end
|
88
128
|
end
|
@@ -23,41 +23,47 @@ module PikoTransaction
|
|
23
23
|
class Transaction
|
24
24
|
include Logger
|
25
25
|
|
26
|
-
def initialize
|
26
|
+
def initialize(name = nil)
|
27
|
+
@name = name
|
27
28
|
@commands = []
|
28
29
|
@done = []
|
29
30
|
yield self if block_given?
|
30
31
|
end
|
31
32
|
|
32
33
|
def add(command)
|
33
|
-
logger.debug { format "Add command: %s", command.class.name }
|
34
34
|
@commands << command
|
35
|
+
logger.debug do
|
36
|
+
format "%s Added command: %s, total: %i", to_s, command.to_s, @commands.count
|
37
|
+
end
|
35
38
|
end
|
36
39
|
|
37
40
|
def do
|
38
|
-
logger.info { format "Start transaction with commands: %s", @commands.count }
|
41
|
+
logger.info { format "%s Start transaction with commands: %s", to_s, @commands.count }
|
39
42
|
return true if run_commands
|
40
43
|
terminate_and_undo
|
41
44
|
end
|
42
45
|
|
43
46
|
def undo
|
44
|
-
logger.info { format "Rolling back transaction with commands: %s", @done.count }
|
47
|
+
logger.info { format "%s Rolling back transaction with commands: %s", to_s, @done.count }
|
45
48
|
undo_done_commands
|
46
49
|
end
|
47
50
|
|
51
|
+
def to_s
|
52
|
+
format "[%s]", @name || "tr"
|
53
|
+
end
|
54
|
+
|
48
55
|
private
|
49
56
|
|
50
57
|
def terminate_and_undo
|
51
|
-
logger.error { "Could not finalize transaction!" }
|
58
|
+
logger.error { format "%s Could not finalize transaction!", to_s }
|
52
59
|
undo_done_commands
|
53
60
|
false
|
54
61
|
end
|
55
62
|
|
56
63
|
def run_commands
|
57
|
-
@commands.
|
58
|
-
|
59
|
-
|
60
|
-
logger.error { "Command execution failed" }
|
64
|
+
@commands.each_with_index do |cmd, i|
|
65
|
+
unless doing_command(cmd, i)
|
66
|
+
logger.warn { format "%s Command %s failed", to_s, cmd.to_s }
|
61
67
|
return false
|
62
68
|
end
|
63
69
|
@done << cmd
|
@@ -65,14 +71,24 @@ module PikoTransaction
|
|
65
71
|
true
|
66
72
|
end
|
67
73
|
|
74
|
+
def doing_command(cmd, i)
|
75
|
+
logger.debug { format "%s Running %i command: %s", to_s, i + 1, cmd.to_s }
|
76
|
+
cmd.do
|
77
|
+
end
|
78
|
+
|
68
79
|
def undo_done_commands
|
69
|
-
@done.
|
70
|
-
|
71
|
-
|
72
|
-
logger.fatal { "Can not undo command" }
|
80
|
+
@done.each_with_index.reverse_each do |cmd, i|
|
81
|
+
unless undoing_command(cmd, i)
|
82
|
+
logger.fatal { format "%s Can not undo command: %s", to_s, cmd.to_s }
|
73
83
|
break
|
74
84
|
end
|
85
|
+
@done.delete(cmd)
|
75
86
|
end
|
76
87
|
end
|
88
|
+
|
89
|
+
def undoing_command(cmd, i)
|
90
|
+
logger.debug { format "%s Undoing %i command: %s", to_s, i + 1, cmd.to_s }
|
91
|
+
cmd.undo
|
92
|
+
end
|
77
93
|
end
|
78
94
|
end
|
@@ -31,7 +31,7 @@ module PikoTransaction
|
|
31
31
|
def method_missing(method_name, *args, &block)
|
32
32
|
logger.debug { format "Looking for transaction '%s'", method_name }
|
33
33
|
return super unless valid_method_name?(method_name)
|
34
|
-
@transactions[method_name] ||= Transaction.new
|
34
|
+
@transactions[method_name] ||= Transaction.new method_name
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piko_transaction
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Szymon Kopciewski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logger2r
|