once-ler 0.0.16 → 0.1.0
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 +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
|
-
|