after_commit 1.0.8 → 1.0.9

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.
data/README.textile CHANGED
@@ -62,3 +62,5 @@ This version (maintained by Pat Allan) includes the following patches:
62
62
  * Keeping callbacks focused on the correct transactions ("Benjamin Stein":http://benjaminste.in/)
63
63
  * Using savepoints for test helper ("Lars Klevan":http://www.linkedin.com/in/larsklevan and "Joel Chippindale":http://blog.monkeysthumb.org/)
64
64
  * Only tracking objects from classes that have appropriate callbacks; Adding @after/before_commit_on_save@ to cover creates and updates but not destroys ("Jason Weathered":http://jasoncodes.com/)
65
+ * Fixing up exception handling and savepoints in the test helper, and cleaning up successful transactions correctly ("Identified":https://github.com/Identified).
66
+ * Improved JRuby support ("Kevin Menard":https://github.com/nirvdrum)
@@ -34,9 +34,23 @@ module AfterCommit
34
34
  module TestConnectionAdapters
35
35
  def self.included(base)
36
36
  base.class_eval do
37
+
38
+ def after_callback_transaction_committed?
39
+ committed = (Thread.current[:after_callback_committed] || {})[unique_transaction_key]
40
+ return !committed.nil? && committed
41
+ end
42
+
43
+ def after_callback_mark_committed committed
44
+ (Thread.current[:after_callback_committed] ||= {})[unique_transaction_key] = committed
45
+ end
46
+
47
+ def after_callback_cleanup_committed
48
+ (Thread.current[:after_callback_committed] ||= {})[unique_transaction_key] = nil
49
+ end
50
+
37
51
  def release_savepoint_with_callback
38
52
  increment_transaction_pointer
39
- committed = false
53
+ after_callback_mark_committed false
40
54
  begin
41
55
  trigger_before_commit_callbacks
42
56
  trigger_before_commit_on_create_callbacks
@@ -45,21 +59,15 @@ module AfterCommit
45
59
  trigger_before_commit_on_destroy_callbacks
46
60
 
47
61
  release_savepoint_without_callback
48
- committed = true
49
-
62
+ after_callback_mark_committed true
50
63
  trigger_after_commit_callbacks
51
64
  trigger_after_commit_on_create_callbacks
52
65
  trigger_after_commit_on_save_callbacks
53
66
  trigger_after_commit_on_update_callbacks
54
67
  trigger_after_commit_on_destroy_callbacks
55
- rescue
56
- unless committed
57
- decrement_transaction_pointer
58
- rollback_to_savepoint
59
- increment_transaction_pointer
60
- end
61
- ensure
62
68
  AfterCommit.cleanup(self)
69
+ after_callback_cleanup_committed
70
+ ensure
63
71
  decrement_transaction_pointer
64
72
  end
65
73
  end
@@ -71,13 +79,17 @@ module AfterCommit
71
79
  def rollback_to_savepoint_with_callback
72
80
  increment_transaction_pointer
73
81
  begin
74
- trigger_before_rollback_callbacks
75
- rollback_to_savepoint_without_callback
76
- trigger_after_rollback_callbacks
82
+ # Only rollback if we have not already released rollback
83
+ unless after_callback_transaction_committed?
84
+ trigger_before_rollback_callbacks
85
+ rollback_to_savepoint_without_callback
86
+ trigger_after_rollback_callbacks
87
+ end
77
88
  ensure
78
89
  AfterCommit.cleanup(self)
79
- end
80
- decrement_transaction_pointer
90
+ after_callback_cleanup_committed
91
+ decrement_transaction_pointer
92
+ end
81
93
  end
82
94
  alias_method_chain :rollback_to_savepoint, :callback
83
95
  end
@@ -2,18 +2,35 @@ module AfterCommit
2
2
  module ConnectionAdapters
3
3
  def self.included(base)
4
4
  base.class_eval do
5
- def transaction_with_callback(*args, &block)
6
- # @disable_rollback is set to false at the start of the
7
- # outermost call to #transaction. After committing, it is
8
- # set to true to prevent exceptions causing a spurious
9
- # rollback.
10
- outermost_call = @disable_rollback.nil?
11
- @disable_rollback = false if outermost_call
12
- transaction_without_callback(*args, &block)
13
- ensure
14
- @disable_rollback = nil if outermost_call
15
- end
16
- alias_method_chain :transaction, :callback
5
+
6
+ if respond_to?(:transaction)
7
+ def transaction_with_callback(*args, &block)
8
+ # @disable_rollback is set to false at the start of the
9
+ # outermost call to #transaction. After committing, it is
10
+ # set to true to prevent exceptions causing a spurious
11
+ # rollback.
12
+ outermost_call = @disable_rollback.nil?
13
+ @disable_rollback = false if outermost_call
14
+ transaction_without_callback(*args, &block)
15
+ ensure
16
+ @disable_rollback = nil if outermost_call
17
+ end
18
+ alias_method_chain :transaction, :callback
19
+
20
+ elsif respond_to?(:begin_db_transaction)
21
+ def begin_db_transaction_with_callback(*args, &block)
22
+ # @disable_rollback is set to false at the start of the
23
+ # outermost call to #transaction. After committing, it is
24
+ # set to true to prevent exceptions causing a spurious
25
+ # rollback.
26
+ outermost_call = @disable_rollback.nil?
27
+ @disable_rollback = false if outermost_call
28
+ begin_db_transaction_without_callback(*args, &block)
29
+ ensure
30
+ @disable_rollback = nil if outermost_call
31
+ end
32
+ alias_method_chain :begin_db_transaction, :callback
33
+ end
17
34
 
18
35
  # The commit_db_transaction method gets called when the outermost
19
36
  # transaction finishes and everything inside commits. We want to
@@ -53,7 +70,7 @@ module AfterCommit
53
70
  AfterCommit.cleanup(self)
54
71
  decrement_transaction_pointer unless @already_decremented
55
72
  end
56
- end
73
+ end
57
74
  alias_method_chain :commit_db_transaction, :callback
58
75
 
59
76
  # In the event the transaction fails and rolls back, nothing inside
@@ -183,6 +200,7 @@ module AfterCommit
183
200
  Thread.current[:after_commit_pointer] ||= 0
184
201
  Thread.current[:after_commit_pointer] -= 1
185
202
  end
203
+
186
204
  end
187
205
  end
188
206
  end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: after_commit
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 8
9
- version: 1.0.8
4
+ prerelease:
5
+ version: 1.0.9
10
6
  platform: ruby
11
7
  authors:
12
8
  - Nick Muerdter
@@ -16,7 +12,7 @@ autorequire:
16
12
  bindir: bin
17
13
  cert_chain: []
18
14
 
19
- date: 2010-09-03 00:00:00 +09:00
15
+ date: 2011-06-08 00:00:00 +01:00
20
16
  default_executable:
21
17
  dependencies:
22
18
  - !ruby/object:Gem::Dependency
@@ -27,11 +23,10 @@ dependencies:
27
23
  requirements:
28
24
  - - <
29
25
  - !ruby/object:Gem::Version
30
- segments:
31
- - 3
32
- - 0
33
- - 0
34
26
  version: 3.0.0
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.15.6
35
30
  type: :runtime
36
31
  version_requirements: *id001
37
32
  - !ruby/object:Gem::Dependency
@@ -42,8 +37,6 @@ dependencies:
42
37
  requirements:
43
38
  - - ">="
44
39
  - !ruby/object:Gem::Version
45
- segments:
46
- - 0
47
40
  version: "0"
48
41
  type: :development
49
42
  version_requirements: *id002
@@ -72,8 +65,8 @@ homepage: http://github.com/freelancing-god/after_commit
72
65
  licenses: []
73
66
 
74
67
  post_install_message:
75
- rdoc_options:
76
- - --charset=UTF-8
68
+ rdoc_options: []
69
+
77
70
  require_paths:
78
71
  - lib
79
72
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -81,21 +74,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
74
  requirements:
82
75
  - - ">="
83
76
  - !ruby/object:Gem::Version
84
- segments:
85
- - 0
86
77
  version: "0"
87
78
  required_rubygems_version: !ruby/object:Gem::Requirement
88
79
  none: false
89
80
  requirements:
90
81
  - - ">="
91
82
  - !ruby/object:Gem::Version
92
- segments:
93
- - 0
94
83
  version: "0"
95
84
  requirements: []
96
85
 
97
86
  rubyforge_project:
98
- rubygems_version: 1.3.7
87
+ rubygems_version: 1.6.2
99
88
  signing_key:
100
89
  specification_version: 3
101
90
  summary: after_commit callback for ActiveRecord