once-ler 0.0.16 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/onceler/extensions/active_record.rb +1 -5
- data/lib/onceler/recordable.rb +43 -7
- data/lib/onceler/transactions.rb +1 -6
- metadata +7 -11
- data/lib/onceler/extensions/active_record_3_0.rb +0 -53
- data/lib/onceler/extensions/active_record_3_2.rb +0 -63
- data/lib/onceler/transactions/active_record_3.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed16df6da817425b161a3d9b887c094ca5eac560
|
4
|
+
data.tar.gz: acb176d0ec4def0482486a1da7cf1dd9189f5dfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90ddd7d85c492c37b65fb5bfe5a01c1fd6e6a74013eec09a0e92cc9098d0348ef161ff1c7d6065e382c931bdc089d67a0088b39fbbb0ac345402ef5823f52376
|
7
|
+
data.tar.gz: 498383c10083fd113abb5df9843517ef3f633689604c2dc01af8793832b1d3724353ec7765036e29f1031178dc77eb4c6452948dcf8692380e4c50eb0361ed45
|
@@ -2,10 +2,6 @@ require "active_record"
|
|
2
2
|
|
3
3
|
if ActiveRecord::VERSION::STRING >= "4.1."
|
4
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
5
|
else
|
10
|
-
require "onceler/extensions/
|
6
|
+
require "onceler/extensions/active_record_4_0"
|
11
7
|
end
|
data/lib/onceler/recordable.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "set"
|
2
|
+
|
1
3
|
module Onceler
|
2
4
|
module Recordable
|
3
5
|
def self.extended(instance)
|
@@ -70,8 +72,8 @@ module Onceler
|
|
70
72
|
# if a nested once block updates an inherited object's associations,
|
71
73
|
# we want to know about it
|
72
74
|
def __associations_equal?(obj1, obj2)
|
73
|
-
cache1 = obj1.association_cache
|
74
|
-
cache2 = obj2.association_cache
|
75
|
+
cache1 = obj1.instance_variable_get(:@association_cache)
|
76
|
+
cache2 = obj2.instance_variable_get(:@association_cache)
|
75
77
|
cache1.size == cache2.size &&
|
76
78
|
cache1.all? { |k, v| cache2.key?(k) && __values_equal?(v.target, cache2[k].target) }
|
77
79
|
end
|
@@ -86,19 +88,53 @@ module Onceler
|
|
86
88
|
rescue TypeError
|
87
89
|
data.each do |hash|
|
88
90
|
hash.each do |key, val|
|
89
|
-
|
90
|
-
Marshal.dump(val)
|
91
|
-
rescue TypeError
|
92
|
-
raise TypeError.new("Unable to dump #{key} in #{self.class.metadata[:location]}: #{$!}")
|
93
|
-
end
|
91
|
+
find_dump_error(key, val)
|
94
92
|
end
|
95
93
|
end
|
94
|
+
raise # find_dump_error should have re-raised, but just in case...
|
95
|
+
ensure
|
96
|
+
__visited_dump_vars.clear
|
96
97
|
end
|
97
98
|
@__comparison_cache = nil
|
98
99
|
data
|
99
100
|
end
|
100
101
|
end
|
101
102
|
|
103
|
+
def __visited_dump_vars
|
104
|
+
@__visited_dump_vars ||= Set.new
|
105
|
+
end
|
106
|
+
|
107
|
+
def find_dump_error(key, val, prefix = "")
|
108
|
+
return if __visited_dump_vars.include?(val)
|
109
|
+
__visited_dump_vars << val
|
110
|
+
|
111
|
+
Marshal.dump(val)
|
112
|
+
rescue TypeError
|
113
|
+
|
114
|
+
# see if anything inside val can't be dumped...
|
115
|
+
sub_prefix = "#{prefix}#{key} (#<#{val.class}>) => "
|
116
|
+
|
117
|
+
# instance var?
|
118
|
+
val.instance_variables.each do |k|
|
119
|
+
v = val.instance_variable_get(k)
|
120
|
+
find_dump_error(k, v, sub_prefix)
|
121
|
+
end
|
122
|
+
|
123
|
+
# hash key/value?
|
124
|
+
val.each_pair do |k, v|
|
125
|
+
find_dump_error("hash key #{k}", k, sub_prefix)
|
126
|
+
find_dump_error("[#{k.inspect}]", v, sub_prefix)
|
127
|
+
end if val.respond_to?(:each_pair)
|
128
|
+
|
129
|
+
# array element?
|
130
|
+
val.each_with_index do |v, i|
|
131
|
+
find_dump_error("[#{i}]", v, sub_prefix)
|
132
|
+
end if val.respond_to?(:each_with_index)
|
133
|
+
|
134
|
+
# guess it's val proper
|
135
|
+
raise TypeError.new("Unable to dump #{prefix}#{key} (#<#{val.class}>) in #{self.class.metadata[:location]}: #{$!}")
|
136
|
+
end
|
137
|
+
|
102
138
|
def copy_from(other)
|
103
139
|
# need two copies of things for __mutated? checks (see above)
|
104
140
|
@__inherited_cache = Marshal.load(other.__data(:inherit)).inject(&:merge)
|
data/lib/onceler/transactions.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Jensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.0'
|
41
41
|
description: once-ler supercharges your let's and before's with the performance of
|
42
42
|
before(:all)
|
43
43
|
email: jon@instructure.com
|
@@ -52,15 +52,12 @@ files:
|
|
52
52
|
- lib/onceler/basic_helpers.rb
|
53
53
|
- lib/onceler/configuration.rb
|
54
54
|
- lib/onceler/extensions/active_record.rb
|
55
|
-
- lib/onceler/extensions/active_record_3_0.rb
|
56
|
-
- lib/onceler/extensions/active_record_3_2.rb
|
57
55
|
- lib/onceler/extensions/active_record_4_0.rb
|
58
56
|
- lib/onceler/extensions/active_record_4_1.rb
|
59
57
|
- lib/onceler/extensions/database_cleaner.rb
|
60
58
|
- lib/onceler/recordable.rb
|
61
59
|
- lib/onceler/recorder.rb
|
62
60
|
- lib/onceler/transactions.rb
|
63
|
-
- lib/onceler/transactions/active_record_3.rb
|
64
61
|
- lib/onceler/transactions/active_record_4.rb
|
65
62
|
homepage: http://github.com/instructure/onceler
|
66
63
|
licenses: []
|
@@ -81,9 +78,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
78
|
version: 1.3.5
|
82
79
|
requirements: []
|
83
80
|
rubyforge_project:
|
84
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.5.1
|
85
82
|
signing_key:
|
86
83
|
specification_version: 4
|
87
84
|
summary: rspec supercharger
|
88
85
|
test_files: []
|
89
|
-
has_rdoc:
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require "onceler/transactions"
|
2
|
-
|
3
|
-
# monkey-patch these to use savepoints (if necessary)
|
4
|
-
|
5
|
-
module ActiveRecord::TestFixtures
|
6
|
-
include Onceler::Transactions
|
7
|
-
|
8
|
-
def setup_fixtures
|
9
|
-
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
10
|
-
|
11
|
-
if pre_loaded_fixtures && !use_transactional_fixtures
|
12
|
-
raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
|
13
|
-
end
|
14
|
-
|
15
|
-
@fixture_cache = {}
|
16
|
-
@@already_loaded_fixtures ||= {}
|
17
|
-
|
18
|
-
# Load fixtures once and begin transaction.
|
19
|
-
if run_in_transaction?
|
20
|
-
if @@already_loaded_fixtures[self.class]
|
21
|
-
@loaded_fixtures = @@already_loaded_fixtures[self.class]
|
22
|
-
else
|
23
|
-
load_fixtures
|
24
|
-
@@already_loaded_fixtures[self.class] = @loaded_fixtures
|
25
|
-
end
|
26
|
-
### ONCELER'd
|
27
|
-
begin_transaction(ActiveRecord::Base.connection)
|
28
|
-
# Load fixtures for every test.
|
29
|
-
else
|
30
|
-
Fixtures.reset_cache
|
31
|
-
@@already_loaded_fixtures[self.class] = nil
|
32
|
-
load_fixtures
|
33
|
-
end
|
34
|
-
|
35
|
-
# Instantiate fixtures for every test if requested.
|
36
|
-
instantiate_fixtures if use_instantiated_fixtures
|
37
|
-
end
|
38
|
-
|
39
|
-
def teardown_fixtures
|
40
|
-
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
41
|
-
|
42
|
-
unless run_in_transaction?
|
43
|
-
ActiveRecord::Fixtures.reset_cache
|
44
|
-
end
|
45
|
-
|
46
|
-
# Rollback changes if a transaction is active.
|
47
|
-
if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0
|
48
|
-
### ONCELER'd
|
49
|
-
rollback_transaction(ActiveRecord::Base.connection)
|
50
|
-
end
|
51
|
-
ActiveRecord::Base.clear_active_connections!
|
52
|
-
end
|
53
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require "onceler/transactions"
|
2
|
-
|
3
|
-
# monkey-patch these to use savepoints (if necessary)
|
4
|
-
|
5
|
-
module ActiveRecord::TestFixtures
|
6
|
-
include ::Onceler::Transactions
|
7
|
-
|
8
|
-
def setup_fixtures
|
9
|
-
return unless !ActiveRecord::Base.configurations.blank?
|
10
|
-
|
11
|
-
if pre_loaded_fixtures && !use_transactional_fixtures
|
12
|
-
raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
|
13
|
-
end
|
14
|
-
|
15
|
-
@fixture_cache = {}
|
16
|
-
@fixture_connections = []
|
17
|
-
@@already_loaded_fixtures ||= {}
|
18
|
-
|
19
|
-
# Load fixtures once and begin transaction.
|
20
|
-
if run_in_transaction?
|
21
|
-
if @@already_loaded_fixtures[self.class]
|
22
|
-
@loaded_fixtures = @@already_loaded_fixtures[self.class]
|
23
|
-
else
|
24
|
-
@loaded_fixtures = load_fixtures
|
25
|
-
@@already_loaded_fixtures[self.class] = @loaded_fixtures
|
26
|
-
end
|
27
|
-
@fixture_connections = enlist_fixture_connections
|
28
|
-
@fixture_connections.each do |connection|
|
29
|
-
### ONCELER'd
|
30
|
-
begin_transaction(connection)
|
31
|
-
end
|
32
|
-
# Load fixtures for every test.
|
33
|
-
else
|
34
|
-
ActiveRecord::Fixtures.reset_cache
|
35
|
-
@@already_loaded_fixtures[self.class] = nil
|
36
|
-
@loaded_fixtures = load_fixtures
|
37
|
-
end
|
38
|
-
|
39
|
-
# Instantiate fixtures for every test if requested.
|
40
|
-
instantiate_fixtures if use_instantiated_fixtures
|
41
|
-
end
|
42
|
-
|
43
|
-
def teardown_fixtures
|
44
|
-
return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?
|
45
|
-
|
46
|
-
unless run_in_transaction?
|
47
|
-
ActiveRecord::Fixtures.reset_cache
|
48
|
-
end
|
49
|
-
|
50
|
-
# Rollback changes if a transaction is active.
|
51
|
-
if run_in_transaction?
|
52
|
-
@fixture_connections.each do |connection|
|
53
|
-
if connection.open_transactions != 0
|
54
|
-
### ONCELER'd
|
55
|
-
rollback_transaction(connection)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
@fixture_connections.clear
|
59
|
-
end
|
60
|
-
ActiveRecord::Base.clear_active_connections!
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Onceler
|
2
|
-
module Transactions
|
3
|
-
def begin_transaction(conn)
|
4
|
-
if conn.open_transactions == 0
|
5
|
-
conn.transaction_joinable = false
|
6
|
-
conn.begin_db_transaction
|
7
|
-
else
|
8
|
-
conn.create_savepoint
|
9
|
-
end
|
10
|
-
conn.increment_open_transactions
|
11
|
-
end
|
12
|
-
|
13
|
-
def rollback_transaction(conn)
|
14
|
-
conn.decrement_open_transactions
|
15
|
-
if conn.open_transactions == 0
|
16
|
-
conn.rollback_db_transaction
|
17
|
-
else
|
18
|
-
conn.rollback_to_savepoint
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|