once-ler 0.0.9 → 0.0.10
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/recordable.rb +28 -17
- metadata +2 -2
data/lib/onceler/recordable.rb
CHANGED
@@ -3,7 +3,7 @@ module Onceler
|
|
3
3
|
def self.extended(instance)
|
4
4
|
instance.instance_eval do
|
5
5
|
@__retvals = {}
|
6
|
-
@
|
6
|
+
@__inherited_retvals = {}
|
7
7
|
@__ignore_ivars = instance_variables
|
8
8
|
end
|
9
9
|
end
|
@@ -11,10 +11,9 @@ module Onceler
|
|
11
11
|
def __prepare_recording(recording)
|
12
12
|
method = recording.name
|
13
13
|
define_singleton_method(method) do
|
14
|
-
if @
|
14
|
+
if @__retvals.key?(method)
|
15
15
|
@__retvals[method]
|
16
16
|
else
|
17
|
-
@__retvals_recorded[method] = true
|
18
17
|
@__retvals[method] = __record(recording)
|
19
18
|
end
|
20
19
|
end
|
@@ -24,39 +23,51 @@ module Onceler
|
|
24
23
|
instance_eval(&recording.block)
|
25
24
|
end
|
26
25
|
|
27
|
-
def __retvals
|
28
|
-
@
|
26
|
+
def __retvals(inherit = false)
|
27
|
+
retvals = @__inherited_retvals.merge(@__retvals)
|
28
|
+
retvals.inject({}) do |hash, (key, val)|
|
29
|
+
hash[key] = val if __mutated?(key, val) || inherit
|
30
|
+
hash
|
31
|
+
end
|
29
32
|
end
|
30
33
|
|
31
|
-
def __ivars
|
34
|
+
def __ivars(inherit = false)
|
32
35
|
ivars = instance_variables - @__ignore_ivars
|
33
36
|
ivars.inject({}) do |hash, key|
|
34
37
|
if key.to_s !~ /\A@__/
|
35
38
|
val = instance_variable_get(key)
|
36
|
-
hash[key] = val
|
39
|
+
hash[key] = val if __mutated?(key, val) || inherit
|
37
40
|
end
|
38
41
|
hash
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
|
43
|
-
|
45
|
+
# we don't include inherited stuff in __data, because we might need to
|
46
|
+
# interleave things from an intermediate before(:each) at run time
|
47
|
+
def __mutated?(key, val)
|
48
|
+
return true unless @__inherited_cache
|
44
49
|
# need to do both types of comparison, i.e. it's the same object in
|
45
|
-
# memory, and nothing about it has been changed
|
46
|
-
|
50
|
+
# memory (not reassigned), and nothing about it has been changed
|
51
|
+
return false if @__inherited_values.equal?(val)
|
52
|
+
return false if @__inherited_cache[key] == val
|
53
|
+
true
|
47
54
|
end
|
48
55
|
|
49
|
-
def __data
|
50
|
-
@__data ||=
|
56
|
+
def __data(inherit = false)
|
57
|
+
@__data ||= {}
|
58
|
+
@__data[inherit] ||= Marshal.dump([__ivars(inherit), __retvals(inherit)])
|
51
59
|
end
|
52
60
|
|
53
61
|
def copy_from(other)
|
54
|
-
|
55
|
-
@
|
56
|
-
|
62
|
+
# need two copies of things for __mutated? checks (see above)
|
63
|
+
@__inherited_cache = Marshal.load(other.__data(:inherit)).inject(&:merge)
|
64
|
+
ivars, retvals = Marshal.load(other.__data(:inherit))
|
65
|
+
@__inherited_retvals = retvals
|
66
|
+
@__inherited_values = ivars.merge(retvals)
|
67
|
+
ivars.each do |key, value|
|
57
68
|
instance_variable_set(key, value)
|
58
69
|
end
|
59
|
-
|
70
|
+
retvals.each do |key, value|
|
60
71
|
define_singleton_method(key) { value }
|
61
72
|
end
|
62
73
|
end
|
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.10
|
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-
|
12
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|