test_after_commit 0.2.5 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecb5ad1846055c48780400cecd1a21e2399d6862
4
- data.tar.gz: d0abaa5cf7047545e2d4aaafcee3f2d2f6d434d1
3
+ metadata.gz: 476b2d55df60abf6d74c93b6b708bb1fb84fe8eb
4
+ data.tar.gz: 3124e64478bec9c3019f7ef86e872c3a90b725b8
5
5
  SHA512:
6
- metadata.gz: e2ef9fe01a46227536a49a0e0190dc63c1566f8a0de333b3357e1761a0c8f5247fd6f0d8b0e302f933ca25b75637abeb4314fb88e965c161909c504b36ab9165
7
- data.tar.gz: 70a4d044459a65829395aa9abb7a114eaedad05d3e29d65d7ab2d2a2d0f20e6c9b49858059d9dadac412416e9578c3a251d47ce37f06e0705b9a2f7784128035
6
+ metadata.gz: de5dbe1aad7eb2dfb337a019c30a1a30045fefcda15062805bff7c9e432f276d0544726d76e1c7c6173c8af35a67d50131dad1ed83d16d2fe1a43356037c2110
7
+ data.tar.gz: 098b7b282ceffaf27fd0829ffd6e6979286430537b2b9ebf628d46f796210c9a8b009902c66042f02dcdf2b8c24aef693ab05fd65a5fba63adbb5a81f0757bb9
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Michael Grosser <michael@grosser.it>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Readme.md CHANGED
@@ -1,5 +1,7 @@
1
1
  Make after_commit callbacks fire in tests for Rails 3+ with transactional_fixtures = true.
2
2
 
3
+ **Deprecation** this is no longer needed on rails 5.0+ https://github.com/rails/rails/pull/18458
4
+
3
5
  Install
4
6
  =======
5
7
 
@@ -30,6 +32,26 @@ it "sets $foo on commit" do
30
32
  end
31
33
  ```
32
34
 
35
+ ### Temporary disable after commit hooks
36
+
37
+ In your test_helper, you can specify the default
38
+
39
+ ```
40
+ TestAfterCommit.enabled = true
41
+ ```
42
+
43
+ Then use blocks in your tests to change the behavior:
44
+
45
+ ```
46
+ TestAfterCommit.with_commits(true) do
47
+ my_tests
48
+ end
49
+
50
+ TestAfterCommit.with_commits(false) do
51
+ my_tests
52
+ end
53
+ ```
54
+
33
55
  TIPS
34
56
  ====
35
57
  - hooks do not re-raise errors (with or without this gem) use [after_commit_exception_notification](https://github.com/grosser/after_commit_exception_notification)
@@ -44,6 +66,11 @@ Inspired by https://gist.github.com/1305285
44
66
  - [emirose](https://github.com/emirose)
45
67
  - [Brad Gessler](https://github.com/bradgessler)
46
68
  - [Rohan McGovern](https://github.com/rohanpm)
69
+ - [lsylvester](https://github.com/lsylvester)
70
+ - [Tony Novak](https://github.com/afn)
71
+ - [Brian Palmer](https://github.com/codekitchen)
72
+ - [Oleg Dashevskii](https://github.com/be9)
73
+ - [Jonathan Spies](https://github.com/jspies)
47
74
 
48
75
  [Michael Grosser](http://grosser.it)<br/>
49
76
  michael@grosser.it<br/>
@@ -1,76 +1,24 @@
1
1
  require 'test_after_commit/version'
2
2
 
3
- module TestAfterCommit
3
+ if ActiveRecord::VERSION::MAJOR >= 4
4
+ require 'test_after_commit/with_transaction_state'
5
+ ActiveRecord::Base.send(:prepend, TestAfterCommit::WithTransactionState)
4
6
  end
5
7
 
6
- ActiveRecord::ConnectionAdapters::DatabaseStatements.class_eval do
7
- def transaction_with_transactional_fixtures(*args)
8
- @test_open_transactions ||= 0
9
- transaction_without_transactional_fixtures(*args) do
10
- begin
11
- @test_open_transactions += 1
12
- result = yield
13
- rescue Exception => e
14
- rolled_back = true
15
- raise e
16
- ensure
17
- if @test_open_transactions == 1 && !rolled_back
18
- test_commit_records
19
- end
20
- @test_open_transactions -= 1
21
- result
22
- end
23
- end
24
- end
25
- alias_method_chain :transaction, :transactional_fixtures
26
-
27
- def test_commit_records
28
- if ActiveRecord::VERSION::MAJOR == 3
29
- commit_transaction_records(false)
30
- else
31
- @transaction.commit_records
32
- @transaction.records.clear # prevent duplicate .commit!
33
- @transaction.instance_variable_get(:@state).set_state(nil)
34
- end
35
- end
36
-
37
- if ActiveRecord::VERSION::MAJOR == 3
38
- # The @_current_transaction_records is a stack of arrays, each one
39
- # containing the records associated with the corresponding transaction
40
- # in the transaction stack. This is used by the
41
- # `rollback_transaction_records` method (to only send a rollback hook to
42
- # models attached to the transaction being rolled back) but is usually
43
- # ignored by the `commit_transaction_records` method. Here we
44
- # monkey-patch it to temporarily replace the array with only the records
45
- # for the top-of-stack transaction, so the real
46
- # `commit_transaction_records` method only sends callbacks to those.
47
- #
48
- def commit_transaction_records_with_transactional_fixtures(commit = true)
49
- return commit_transaction_records_without_transactional_fixtures if commit
8
+ require 'test_after_commit/database_statements'
9
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:prepend, TestAfterCommit::DatabaseStatements)
50
10
 
51
- preserving_current_transaction_records do
52
- @_current_transaction_records = @_current_transaction_records.pop || []
53
- commit_transaction_records_without_transactional_fixtures
54
- end
55
- end
56
- alias_method_chain :commit_transaction_records, :transactional_fixtures
11
+ module TestAfterCommit
12
+ @enabled = true
13
+ class << self
14
+ attr_accessor :enabled
57
15
 
58
- def preserving_current_transaction_records
59
- old_current_transaction_records = @_current_transaction_records.dup
16
+ def with_commits(value = true)
17
+ old = enabled
18
+ self.enabled = value
60
19
  yield
61
20
  ensure
62
- @_current_transaction_records = old_current_transaction_records
63
- end
64
- end
65
- end
66
-
67
- if ActiveRecord::VERSION::MAJOR >= 4
68
- # disable parts of the sync code that starts looping
69
- ActiveRecord::Base.class_eval do
70
- alias_method :sync_with_transaction_state_with_state, :sync_with_transaction_state
71
- def sync_with_transaction_state
72
- @reflects_state[0] = true
73
- sync_with_transaction_state_with_state
21
+ self.enabled = old
74
22
  end
75
23
  end
76
24
  end
@@ -0,0 +1,45 @@
1
+ module TestAfterCommit::DatabaseStatements
2
+ def transaction(*)
3
+ @test_open_transactions ||= 0
4
+
5
+ super do
6
+ begin
7
+ @test_open_transactions += 1
8
+ if ActiveRecord::VERSION::MAJOR == 3
9
+ @_current_transaction_records.push([]) if @_current_transaction_records.empty?
10
+ end
11
+ result = yield
12
+ rescue Exception
13
+ rolled_back = true
14
+ raise
15
+ ensure
16
+ begin
17
+ @test_open_transactions -= 1
18
+ if TestAfterCommit.enabled && @test_open_transactions == 0 && !rolled_back
19
+ test_commit_records
20
+ end
21
+ ensure
22
+ result
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ def test_commit_records
29
+ if ActiveRecord::VERSION::MAJOR == 3
30
+ commit_transaction_records
31
+ else
32
+ # To avoid an infinite loop, we need to copy the transaction locally, and clear out
33
+ # `records` on the copy that stays in the AR stack. Otherwise new
34
+ # transactions inside a commit callback will cause an infinite loop.
35
+ #
36
+ # This is because we're re-using the transaction on the stack, before
37
+ # it's been popped off and re-created by the AR code.
38
+ original = @transaction || @transaction_manager.current_transaction
39
+ transaction = original.dup
40
+ transaction.instance_variable_set(:@records, transaction.records.dup) # deep clone of records array
41
+ original.records.clear # so that this clear doesn't clear out both copies
42
+ transaction.commit_records
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module TestAfterCommit
2
- VERSION = '0.2.5'
2
+ VERSION = '0.5.1'
3
3
  end
@@ -0,0 +1,10 @@
1
+ # disable parts of the sync code that starts looping
2
+ module TestAfterCommit
3
+ module WithTransactionState
4
+ def sync_with_transaction_state
5
+ @reflects_state ||= []
6
+ @reflects_state[0] = true
7
+ super
8
+ end
9
+ end
10
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_after_commit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-19 00:00:00.000000000 Z
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -100,9 +100,12 @@ executables: []
100
100
  extensions: []
101
101
  extra_rdoc_files: []
102
102
  files:
103
+ - MIT-LICENSE
103
104
  - Readme.md
104
105
  - lib/test_after_commit.rb
106
+ - lib/test_after_commit/database_statements.rb
105
107
  - lib/test_after_commit/version.rb
108
+ - lib/test_after_commit/with_transaction_state.rb
106
109
  homepage: https://github.com/grosser/test_after_commit
107
110
  licenses:
108
111
  - MIT
@@ -115,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
118
  requirements:
116
119
  - - ">="
117
120
  - !ruby/object:Gem::Version
118
- version: '0'
121
+ version: 2.0.0
119
122
  required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  requirements:
121
124
  - - ">="
@@ -123,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
126
  version: '0'
124
127
  requirements: []
125
128
  rubyforge_project:
126
- rubygems_version: 2.2.2
129
+ rubygems_version: 2.4.5.1
127
130
  signing_key:
128
131
  specification_version: 4
129
132
  summary: makes after_commit callbacks testable in Rails 3+ with transactional_fixtures