once-ler 0.0.3 → 0.0.4
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/lib/onceler/basic_helpers.rb +2 -1
- data/lib/onceler/blank_tape.rb +2 -2
- data/lib/onceler/configuration.rb +16 -0
- data/lib/onceler/extensions/active_record.rb +10 -2
- data/lib/onceler/extensions/active_record_3_0.rb +55 -0
- data/lib/onceler/extensions/active_record_3_2.rb +65 -0
- data/lib/onceler/extensions/active_record_4_0.rb +19 -0
- data/lib/onceler/extensions/active_record_4_1.rb +17 -0
- data/lib/onceler/recorder.rb +4 -35
- data/lib/onceler/transactions.rb +7 -0
- data/lib/onceler/transactions/active_record_3.rb +28 -0
- data/lib/onceler/transactions/active_record_4.rb +12 -0
- metadata +9 -2
data/lib/onceler/blank_tape.rb
CHANGED
@@ -32,7 +32,7 @@ module Onceler
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def __data
|
35
|
-
[__ivars, @__retvals]
|
35
|
+
@__data ||= Marshal.dump([__ivars, @__retvals])
|
36
36
|
end
|
37
37
|
|
38
38
|
def copy(mixins)
|
@@ -42,7 +42,7 @@ module Onceler
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def copy_from(other)
|
45
|
-
ivars, @__retvals = Marshal.load(
|
45
|
+
ivars, @__retvals = Marshal.load(other.__data)
|
46
46
|
ivars.each do |key, value|
|
47
47
|
instance_variable_set(key, value)
|
48
48
|
end
|
@@ -15,5 +15,21 @@ module Onceler
|
|
15
15
|
def include(mod)
|
16
16
|
modules << mod
|
17
17
|
end
|
18
|
+
|
19
|
+
def before(scope, &block)
|
20
|
+
callbacks[scope][:before] << block
|
21
|
+
end
|
22
|
+
|
23
|
+
def callbacks
|
24
|
+
@callbacks ||= Hash.new do |scopes, scope|
|
25
|
+
scopes[scope] = Hash.new do |timings, timing|
|
26
|
+
timings[timing] = []
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_callbacks(scope, timing)
|
32
|
+
callbacks[scope][timing].each(&:call)
|
33
|
+
end
|
18
34
|
end
|
19
35
|
end
|
@@ -1,3 +1,11 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require "active_record"
|
2
|
+
|
3
|
+
if ActiveRecord::VERSION::STRING >= "4.1."
|
4
|
+
require "onceler/extensions/active_record_4_1"
|
5
|
+
elsif ActiveRecord::VERSION::STRING >= "4.0."
|
6
|
+
require "onceler/extensions/active_record_4_0"
|
7
|
+
elsif ActiveRecord::VERSION::STRING >= "3.2."
|
8
|
+
require "onceler/extensions/active_record_3_2"
|
9
|
+
else
|
10
|
+
require "onceler/extensions/active_record_3_0"
|
3
11
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "onceler/transactions"
|
2
|
+
|
3
|
+
# monkey-patch these to:
|
4
|
+
# 1. not clear connections so that we don't lose our transactions
|
5
|
+
# 2. use savepoints (if necessary)
|
6
|
+
|
7
|
+
module ActiveRecord::TestFixtures
|
8
|
+
include Onceler::Transactions
|
9
|
+
|
10
|
+
def setup_fixtures
|
11
|
+
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
12
|
+
|
13
|
+
if pre_loaded_fixtures && !use_transactional_fixtures
|
14
|
+
raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
|
15
|
+
end
|
16
|
+
|
17
|
+
@fixture_cache = {}
|
18
|
+
@@already_loaded_fixtures ||= {}
|
19
|
+
|
20
|
+
# Load fixtures once and begin transaction.
|
21
|
+
if run_in_transaction?
|
22
|
+
if @@already_loaded_fixtures[self.class]
|
23
|
+
@loaded_fixtures = @@already_loaded_fixtures[self.class]
|
24
|
+
else
|
25
|
+
load_fixtures
|
26
|
+
@@already_loaded_fixtures[self.class] = @loaded_fixtures
|
27
|
+
end
|
28
|
+
### ONCELER'd
|
29
|
+
begin_transaction(ActiveRecord::Base.connection)
|
30
|
+
# Load fixtures for every test.
|
31
|
+
else
|
32
|
+
Fixtures.reset_cache
|
33
|
+
@@already_loaded_fixtures[self.class] = nil
|
34
|
+
load_fixtures
|
35
|
+
end
|
36
|
+
|
37
|
+
# Instantiate fixtures for every test if requested.
|
38
|
+
instantiate_fixtures if use_instantiated_fixtures
|
39
|
+
end
|
40
|
+
|
41
|
+
def teardown_fixtures
|
42
|
+
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
43
|
+
|
44
|
+
unless run_in_transaction?
|
45
|
+
ActiveRecord::Fixtures.reset_cache
|
46
|
+
end
|
47
|
+
|
48
|
+
# Rollback changes if a transaction is active.
|
49
|
+
if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0
|
50
|
+
### ONCELER'd
|
51
|
+
rollback_transaction(ActiveRecord::Base.connection)
|
52
|
+
end
|
53
|
+
### ONCELER'd
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "onceler/transactions"
|
2
|
+
|
3
|
+
# monkey-patch these to:
|
4
|
+
# 1. not clear connections so that we don't lose our transactions
|
5
|
+
# 2. use savepoints (if necessary)
|
6
|
+
|
7
|
+
module ActiveRecord::TestFixtures
|
8
|
+
include ::Onceler::Transactions
|
9
|
+
|
10
|
+
def setup_fixtures
|
11
|
+
return unless !ActiveRecord::Base.configurations.blank?
|
12
|
+
|
13
|
+
if pre_loaded_fixtures && !use_transactional_fixtures
|
14
|
+
raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
|
15
|
+
end
|
16
|
+
|
17
|
+
@fixture_cache = {}
|
18
|
+
@fixture_connections = []
|
19
|
+
@@already_loaded_fixtures ||= {}
|
20
|
+
|
21
|
+
# Load fixtures once and begin transaction.
|
22
|
+
if run_in_transaction?
|
23
|
+
if @@already_loaded_fixtures[self.class]
|
24
|
+
@loaded_fixtures = @@already_loaded_fixtures[self.class]
|
25
|
+
else
|
26
|
+
@loaded_fixtures = load_fixtures
|
27
|
+
@@already_loaded_fixtures[self.class] = @loaded_fixtures
|
28
|
+
end
|
29
|
+
@fixture_connections = enlist_fixture_connections
|
30
|
+
@fixture_connections.each do |connection|
|
31
|
+
### ONCELER'd
|
32
|
+
begin_transaction(connection)
|
33
|
+
end
|
34
|
+
# Load fixtures for every test.
|
35
|
+
else
|
36
|
+
ActiveRecord::Fixtures.reset_cache
|
37
|
+
@@already_loaded_fixtures[self.class] = nil
|
38
|
+
@loaded_fixtures = load_fixtures
|
39
|
+
end
|
40
|
+
|
41
|
+
# Instantiate fixtures for every test if requested.
|
42
|
+
instantiate_fixtures if use_instantiated_fixtures
|
43
|
+
end
|
44
|
+
|
45
|
+
def teardown_fixtures
|
46
|
+
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
47
|
+
|
48
|
+
unless run_in_transaction?
|
49
|
+
ActiveRecord::Fixtures.reset_cache
|
50
|
+
end
|
51
|
+
|
52
|
+
# Rollback changes if a transaction is active.
|
53
|
+
if run_in_transaction?
|
54
|
+
@fixture_connections.each do |connection|
|
55
|
+
if connection.open_transactions != 0
|
56
|
+
### ONCELER'd
|
57
|
+
rollback_transaction(connection)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
@fixture_connections.clear
|
61
|
+
end
|
62
|
+
### ONCELER'd
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# monkey-patch this to not clear connections so that we don't lose our
|
2
|
+
# transactions
|
3
|
+
|
4
|
+
module ActiveRecord::TestFixtures
|
5
|
+
def teardown_fixtures
|
6
|
+
return if ActiveRecord::Base.configurations.blank?
|
7
|
+
|
8
|
+
# Rollback changes if a transaction is active.
|
9
|
+
if run_in_transaction?
|
10
|
+
@fixture_connections.each do |connection|
|
11
|
+
connection.rollback_transaction if connection.transaction_open?
|
12
|
+
end
|
13
|
+
@fixture_connections.clear
|
14
|
+
else
|
15
|
+
ActiveRecord::FixtureSet.reset_cache
|
16
|
+
end
|
17
|
+
### ONCELER'd
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# monkey-patch this to not clear connections so that we don't lose our
|
2
|
+
# transactions
|
3
|
+
|
4
|
+
module ActiveRecord::TestFixtures
|
5
|
+
def teardown_fixtures
|
6
|
+
# Rollback changes if a transaction is active.
|
7
|
+
if run_in_transaction?
|
8
|
+
@fixture_connections.each do |connection|
|
9
|
+
connection.rollback_transaction if connection.transaction_open?
|
10
|
+
end
|
11
|
+
@fixture_connections.clear
|
12
|
+
else
|
13
|
+
ActiveRecord::FixtureSet.reset_cache
|
14
|
+
end
|
15
|
+
### ONCELER'd
|
16
|
+
end
|
17
|
+
end
|
data/lib/onceler/recorder.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require "onceler/blank_tape"
|
2
|
-
require "
|
2
|
+
require "onceler/transactions"
|
3
3
|
|
4
4
|
module Onceler
|
5
5
|
class Recorder
|
6
|
+
include Transactions
|
7
|
+
|
6
8
|
attr_accessor :tape, :helper_proxy
|
7
9
|
|
8
10
|
def initialize(parent)
|
@@ -37,7 +39,7 @@ module Onceler
|
|
37
39
|
@recordings.each do |recording|
|
38
40
|
recording.record_onto!(@tape)
|
39
41
|
end
|
40
|
-
@data =
|
42
|
+
@data = @tape.__data
|
41
43
|
end
|
42
44
|
|
43
45
|
def reset!
|
@@ -116,39 +118,6 @@ module Onceler
|
|
116
118
|
rollback_transaction(klass.connection)
|
117
119
|
end
|
118
120
|
end
|
119
|
-
|
120
|
-
if ActiveRecord::VERSION::MAJOR >= 4
|
121
|
-
def begin_transaction(conn)
|
122
|
-
conn.begin_transaction requires_new: true
|
123
|
-
end
|
124
|
-
|
125
|
-
def rollback_transaction(conn)
|
126
|
-
conn.rollback_transaction
|
127
|
-
end
|
128
|
-
else
|
129
|
-
def begin_transaction(klass)
|
130
|
-
unless conn.instance_variable_get(:@_current_transaction_records)
|
131
|
-
conn.instance_variable_set(:@_current_transaction_records, [])
|
132
|
-
end
|
133
|
-
if conn.open_transactions == 0
|
134
|
-
conn.begin_db_transaction
|
135
|
-
else
|
136
|
-
conn.create_savepoint
|
137
|
-
end
|
138
|
-
conn.increment_open_transactions
|
139
|
-
end
|
140
|
-
|
141
|
-
def begin_transaction(klass)
|
142
|
-
conn.decrement_open_transactions
|
143
|
-
if conn.open_transactions == 0
|
144
|
-
conn.rollback_db_transaction
|
145
|
-
conn.send :rollback_transaction_records, true
|
146
|
-
else
|
147
|
-
conn.rollback_to_savepoint
|
148
|
-
conn.send :rollback_transaction_records, false
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
121
|
end
|
153
122
|
|
154
123
|
class Recording
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Onceler
|
2
|
+
module Transactions
|
3
|
+
def begin_transaction(conn)
|
4
|
+
unless conn.instance_variable_get(:@_current_transaction_records)
|
5
|
+
conn.instance_variable_set(:@_current_transaction_records, [])
|
6
|
+
end
|
7
|
+
if conn.open_transactions == 0
|
8
|
+
conn.transaction_joinable = false
|
9
|
+
conn.begin_db_transaction
|
10
|
+
else
|
11
|
+
conn.create_savepoint
|
12
|
+
end
|
13
|
+
conn.increment_open_transactions
|
14
|
+
end
|
15
|
+
|
16
|
+
def rollback_transaction(conn)
|
17
|
+
conn.decrement_open_transactions
|
18
|
+
if conn.open_transactions == 0
|
19
|
+
conn.rollback_db_transaction
|
20
|
+
conn.send :rollback_transaction_records, true
|
21
|
+
else
|
22
|
+
conn.rollback_to_savepoint
|
23
|
+
conn.send :rollback_transaction_records, false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: once-ler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -57,7 +57,14 @@ files:
|
|
57
57
|
- lib/onceler/blank_tape.rb
|
58
58
|
- lib/onceler/configuration.rb
|
59
59
|
- lib/onceler/extensions/active_record.rb
|
60
|
+
- lib/onceler/extensions/active_record_3_0.rb
|
61
|
+
- lib/onceler/extensions/active_record_3_2.rb
|
62
|
+
- lib/onceler/extensions/active_record_4_0.rb
|
63
|
+
- lib/onceler/extensions/active_record_4_1.rb
|
60
64
|
- lib/onceler/recorder.rb
|
65
|
+
- lib/onceler/transactions/active_record_3.rb
|
66
|
+
- lib/onceler/transactions/active_record_4.rb
|
67
|
+
- lib/onceler/transactions.rb
|
61
68
|
- lib/onceler.rb
|
62
69
|
homepage: http://github.com/instructure/onceler
|
63
70
|
licenses: []
|