fixture_background 0.9.0.2 → 0.9.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.
- data/lib/fixture_background.rb +1 -0
- data/lib/fixture_background/active_support/test_case.rb +6 -16
- data/lib/fixture_background/background.rb +27 -4
- data/lib/fixture_background/generator.rb +6 -5
- data/lib/fixture_background/ivars.rb +122 -0
- data/lib/fixture_background/shoulda.rb +14 -7
- data/lib/fixture_background/version.rb +1 -1
- metadata +4 -4
data/lib/fixture_background.rb
CHANGED
@@ -4,7 +4,7 @@ module FixtureBackground
|
|
4
4
|
extend ::ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
class_inheritable_accessor :
|
7
|
+
class_inheritable_accessor :background_ivars
|
8
8
|
class_inheritable_accessor :active_record_fixture_cache_resetted
|
9
9
|
|
10
10
|
set_callback(:setup, :before, :reset_active_record_fixture_cache, {:prepend => true})
|
@@ -27,22 +27,12 @@ module FixtureBackground
|
|
27
27
|
|
28
28
|
module InstanceMethods
|
29
29
|
def setup_background_ivars
|
30
|
-
|
30
|
+
self.background_ivars ||= IVars.deserialize((YAML.load_file("#{fixture_path}/ivars.dump") rescue {}))
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
instance_variable_set(ivar,
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def fill_background_ivar_cache
|
40
|
-
bm = Benchmark.realtime do
|
41
|
-
self.background_ivar_cache = YAML.load_file("#{fixture_path}/ivars.dump")
|
42
|
-
background_ivar_cache.each do |ivar, (class_name, id)|
|
43
|
-
record = class_name.constantize.find(id)
|
44
|
-
self.background_ivar_cache[ivar] = record
|
45
|
-
end
|
32
|
+
deep_copy = Marshal.load(Marshal.dump(self.background_ivars))
|
33
|
+
|
34
|
+
deep_copy.each do |ivar, record|
|
35
|
+
instance_variable_set(ivar,record)
|
46
36
|
end
|
47
37
|
end
|
48
38
|
|
@@ -1,5 +1,31 @@
|
|
1
1
|
module FixtureBackground
|
2
2
|
class Background
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def class_for_test(full_class_name, background_to_use, test_unit_class)
|
6
|
+
klass = class_by_name(full_class_name) || Object.const_set(full_class_name, Class.new(test_unit_class))
|
7
|
+
|
8
|
+
if helper_class = test_unit_class.instance_variable_get(:@helper_class)
|
9
|
+
klass.instance_variable_set(:@helper_class, helper_class)
|
10
|
+
end
|
11
|
+
|
12
|
+
if controller_class = (test_unit_class.respond_to?(:controller_class) && test_unit_class.controller_class)
|
13
|
+
klass.controller_class = controller_class
|
14
|
+
end
|
15
|
+
|
16
|
+
klass.fixture_path = background_to_use.fixture_path
|
17
|
+
klass.fixtures :all
|
18
|
+
klass
|
19
|
+
end
|
20
|
+
|
21
|
+
def class_by_name(class_name)
|
22
|
+
klass = Module.const_get(class_name)
|
23
|
+
klass.is_a?(Class) && klass
|
24
|
+
rescue NameError
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
3
29
|
attr_reader :background_block
|
4
30
|
|
5
31
|
def initialize(full_class_name, test_unit_class, parent, blk)
|
@@ -34,10 +60,7 @@ module FixtureBackground
|
|
34
60
|
end
|
35
61
|
|
36
62
|
def class_for_test
|
37
|
-
|
38
|
-
klass.fixture_path = fixture_path
|
39
|
-
klass.fixtures :all
|
40
|
-
klass
|
63
|
+
self.class.class_for_test(@full_class_name, self, @test_unit_class)
|
41
64
|
end
|
42
65
|
end
|
43
66
|
end
|
@@ -54,12 +54,13 @@ module FixtureBackground
|
|
54
54
|
|
55
55
|
yield klass
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
ivar_hash[ivar.to_s] = [record.class.name, record.id] if record.class.respond_to? :find
|
57
|
+
ivars_with_value = (klass.instance_variables - existing_ivars).inject({}) do |memo, ivar|
|
58
|
+
memo[ivar] = klass.instance_variable_get(ivar)
|
59
|
+
memo
|
61
60
|
end
|
62
61
|
|
62
|
+
ivar_hash = IVars.serialize(ivars_with_value)
|
63
|
+
|
63
64
|
File.open("#{@background_dir}/ivars.dump", 'w+') do |f|
|
64
65
|
YAML.dump(ivar_hash, f)
|
65
66
|
end
|
@@ -73,7 +74,7 @@ module FixtureBackground
|
|
73
74
|
|
74
75
|
fixtures = {}
|
75
76
|
records.each do |record|
|
76
|
-
fixtures[table_name + record.id.to_s] = record.attributes
|
77
|
+
fixtures[table_name + record.id.to_s] = record.instance_variable_get(:@attributes)
|
77
78
|
end
|
78
79
|
|
79
80
|
File.open("#{@background_dir}/#{table_name}.yml", 'w+') do |f|
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module FixtureBackground
|
2
|
+
class IVars
|
3
|
+
class << self
|
4
|
+
def serialize(value)
|
5
|
+
case value
|
6
|
+
when Hash
|
7
|
+
value.inject({}) do |memo, (key, v)|
|
8
|
+
memo[key] = serialize(v)
|
9
|
+
memo
|
10
|
+
end
|
11
|
+
when Array
|
12
|
+
value.map { |v| serialize(v) }
|
13
|
+
else
|
14
|
+
if value.class.respond_to?(:find) && value.respond_to?(:id)
|
15
|
+
"#{value.class.name}##{value.id}"
|
16
|
+
else
|
17
|
+
raise ArgumentError
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def deserialize(value)
|
23
|
+
case value
|
24
|
+
when Hash
|
25
|
+
value.inject({}) do |memo, (key, v)|
|
26
|
+
memo[key] = deserialize(v)
|
27
|
+
memo
|
28
|
+
end
|
29
|
+
when Array
|
30
|
+
value.map { |v| deserialize(v) }
|
31
|
+
when String
|
32
|
+
klass, id = value.split("#")
|
33
|
+
klass.constantize.find(id)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if __FILE__ == $0
|
41
|
+
require 'test/unit'
|
42
|
+
gem "activesupport"
|
43
|
+
require 'active_support/all'
|
44
|
+
|
45
|
+
include FixtureBackground
|
46
|
+
|
47
|
+
class Record
|
48
|
+
attr_reader :id
|
49
|
+
|
50
|
+
class << self
|
51
|
+
def find(id)
|
52
|
+
new(id)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def initialize(id)
|
57
|
+
@id = id.to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def ==(other)
|
61
|
+
other.class == Record && other.id == id
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class IVarsTest < Test::Unit::TestCase
|
66
|
+
def test_serialize_simple_values
|
67
|
+
data = {
|
68
|
+
:hase => Record.find(1),
|
69
|
+
:igel => Record.find(2)
|
70
|
+
}
|
71
|
+
|
72
|
+
expected = {
|
73
|
+
:hase => 'Record#1',
|
74
|
+
:igel => 'Record#2'
|
75
|
+
}
|
76
|
+
|
77
|
+
assert_serialize_deserialize expected, data
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_serialize_arrays
|
81
|
+
data = {
|
82
|
+
:hase => [Record.find(1), Record.find(2), [Record.find(3), Record.find(4)]]
|
83
|
+
}
|
84
|
+
|
85
|
+
expected = {
|
86
|
+
:hase => ['Record#1', 'Record#2', ['Record#3', 'Record#4']]
|
87
|
+
}
|
88
|
+
|
89
|
+
assert_serialize_deserialize expected, data
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_serialize_hash
|
93
|
+
data = {
|
94
|
+
:hase => { 'thies' => [Record.find(1), Record.find(2)], :sebastian => [Record.find(3), Record.find(4)]}
|
95
|
+
}
|
96
|
+
|
97
|
+
expected = {
|
98
|
+
:hase => {'thies' => ['Record#1', 'Record#2'], :sebastian => ['Record#3', 'Record#4']}
|
99
|
+
}
|
100
|
+
|
101
|
+
assert_serialize_deserialize expected, data
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_raises_exception_if_some_var_does_not_respond_to_find
|
105
|
+
data = [
|
106
|
+
:some => 1
|
107
|
+
]
|
108
|
+
|
109
|
+
assert_raises(ArgumentError) { IVars.serialize(data) }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def assert_serialize_deserialize(expected, data)
|
114
|
+
serialized = IVars.serialize(data)
|
115
|
+
deserialized = IVars.deserialize(serialized)
|
116
|
+
|
117
|
+
assert_equal expected, serialized
|
118
|
+
assert_equal deserialized, data
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
|
@@ -1,11 +1,17 @@
|
|
1
1
|
module Shoulda
|
2
2
|
raise "fixture_background is only compatible with shoulda 2.11.3 installed #{VERSION}" if VERSION != "2.11.3"
|
3
3
|
|
4
|
+
module ClassMethods
|
5
|
+
def described_type
|
6
|
+
self.name.gsub(/Test.*/, '').constantize
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
class Context
|
5
11
|
attr_reader :fixture_background
|
6
12
|
|
7
13
|
def full_class_name
|
8
|
-
(test_unit_class.name + full_name.gsub(
|
14
|
+
(test_unit_class.name + full_name.gsub(/[^a-zA-Z0-9]/, '_')).camelcase
|
9
15
|
end
|
10
16
|
|
11
17
|
def parent_fixture_background
|
@@ -19,9 +25,10 @@ module Shoulda
|
|
19
25
|
end
|
20
26
|
|
21
27
|
def class_for_test
|
22
|
-
@fixture_background
|
28
|
+
(@fixture_background && @fixture_background.class_for_test) ||
|
29
|
+
(parent_fixture_background && FixtureBackground::Background.class_for_test(full_class_name, parent_fixture_background, test_unit_class)) ||
|
30
|
+
test_unit_class
|
23
31
|
end
|
24
|
-
|
25
32
|
|
26
33
|
#
|
27
34
|
# the following functions are copied from shoulda/context.rb
|
@@ -29,11 +36,11 @@ module Shoulda
|
|
29
36
|
|
30
37
|
def create_test_from_should_hash(klass, should)
|
31
38
|
test_name = ["test:", full_name, "should", "#{should[:name]}. "].flatten.join(' ').to_sym
|
32
|
-
|
39
|
+
|
33
40
|
if klass.instance_methods.include?(test_name.to_s)
|
34
41
|
warn " * WARNING: '#{test_name}' is already defined"
|
35
42
|
end
|
36
|
-
|
43
|
+
|
37
44
|
context = self
|
38
45
|
klass.send(:define_method, test_name) do
|
39
46
|
@shoulda_context = context
|
@@ -54,9 +61,9 @@ module Shoulda
|
|
54
61
|
shoulds.each do |should|
|
55
62
|
create_test_from_should_hash(klass, should)
|
56
63
|
end
|
57
|
-
|
64
|
+
|
58
65
|
subcontexts.each { |context| context.build }
|
59
|
-
|
66
|
+
|
60
67
|
print_should_eventuallys
|
61
68
|
end
|
62
69
|
end
|
metadata
CHANGED
@@ -5,9 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 9
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.9.0.2
|
8
|
+
- 1
|
9
|
+
version: 0.9.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Thies C. Arntzen
|
@@ -16,7 +15,7 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-12 00:00:00 +01:00
|
20
19
|
default_executable:
|
21
20
|
dependencies: []
|
22
21
|
|
@@ -41,6 +40,7 @@ files:
|
|
41
40
|
- lib/fixture_background/active_support/test_case.rb
|
42
41
|
- lib/fixture_background/background.rb
|
43
42
|
- lib/fixture_background/generator.rb
|
43
|
+
- lib/fixture_background/ivars.rb
|
44
44
|
- lib/fixture_background/shoulda.rb
|
45
45
|
- lib/fixture_background/version.rb
|
46
46
|
has_rdoc: true
|