lazy_lazer 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lazy_lazer/internal_model.rb +33 -7
- data/lib/lazy_lazer/version.rb +1 -1
- data/lib/lazy_lazer.rb +15 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ad5be6027b7147b22c96236407c5700e29cc7fe
|
4
|
+
data.tar.gz: 742cdb3547d6ede2afe121fd14f9e113af4d8de1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4ca6f7e61971cc4f12bdd5d7d9b9b30555d0f1b84777261b1bdafa65bcfed0c18b8b26cbdf6d29b78b2edc7c6272d38dff28fd52aba5405cae0c1b482232088
|
7
|
+
data.tar.gz: 2a89cd5569b7f43292810b9fbbdbf75bf5d1b33ee339a578c56d89058a5aa7b1cddb8575324602214525c37a0eb7641ad09707b4e98e96440d916e7275ed1a38
|
@@ -3,14 +3,19 @@
|
|
3
3
|
module LazyLazer
|
4
4
|
# A delegator for internal operations.
|
5
5
|
class InternalModel
|
6
|
+
# @return [Boolean] whether the model is fully loaded
|
7
|
+
attr_accessor :fully_loaded
|
8
|
+
|
6
9
|
# Create an internal model with a reference to a public model.
|
7
10
|
# @param key_metadata [KeyMetadataStore] a reference to a metadata store
|
8
11
|
# @param parent [LazyLazer] a reference to a LazyLazer model
|
9
12
|
def initialize(key_metadata, parent)
|
10
13
|
@key_metadata = key_metadata
|
11
14
|
@parent = parent
|
15
|
+
@invalidated = Set.new
|
12
16
|
@source_hash = {}
|
13
17
|
@cache_hash = {}
|
18
|
+
@fully_loaded = false
|
14
19
|
end
|
15
20
|
|
16
21
|
# Verify that all the keys marked as required are present.
|
@@ -35,26 +40,47 @@ module LazyLazer
|
|
35
40
|
todo.each_with_object(@cache_hash) { |key, cache| cache[key] = load_key_from_source(key) }.dup
|
36
41
|
end
|
37
42
|
|
38
|
-
# @return [
|
39
|
-
def
|
40
|
-
@
|
43
|
+
# @return [String] the string representation of the parent
|
44
|
+
def parent_inspect
|
45
|
+
"#<#{@parent.class.name} (#{@fully_loaded ? 'loaded' : 'unloaded'}): [" + \
|
46
|
+
@cache_hash.keys.join(', ') + ']>'
|
47
|
+
end
|
48
|
+
|
49
|
+
# Mark a key as tainted, forcing a reload on the next lookup.
|
50
|
+
# @param key_name [Symbol] the key to invalidate
|
51
|
+
# @return [void]
|
52
|
+
def invalidate(key_name)
|
53
|
+
@invalidated.add(key_name)
|
41
54
|
end
|
42
55
|
|
43
56
|
# Get the value of a key (fetching it from the cache if possible)
|
44
57
|
# @param key_name [Symbol] the name of the key
|
45
58
|
# @return [Object] the returned value
|
46
59
|
# @raise MissingAttribute if the attribute wasn't found and there isn't a default
|
47
|
-
def
|
60
|
+
def read_attribute(key_name)
|
61
|
+
if @invalidated.include?(key_name)
|
62
|
+
@parent.reload
|
63
|
+
@invalidated.delete(key_name)
|
64
|
+
end
|
48
65
|
@cache_hash[key_name] ||= load_key_from_source(key_name)
|
49
66
|
end
|
50
67
|
|
68
|
+
# Update an attribute.
|
69
|
+
# @param key_name [Symbol] the attribute to update
|
70
|
+
# @param new_value [Object] the new value
|
71
|
+
# @return [Object] the written value
|
72
|
+
def write_attribute(key_name, new_value)
|
73
|
+
unless @key_metadata.contains?(key_name)
|
74
|
+
raise ArgumentError, "#{key_name} is not a valid attribute for #{parent}"
|
75
|
+
end
|
76
|
+
@cache_hash[key_name] = new_value
|
77
|
+
end
|
78
|
+
|
51
79
|
# Merge a hash into the model.
|
52
80
|
# @param attributes [Hash<Symbol, Object>] the attributes to merge
|
53
|
-
# @return [nil]
|
54
81
|
def merge!(attributes)
|
55
82
|
@cache_hash.clear
|
56
83
|
@source_hash.merge!(attributes)
|
57
|
-
nil
|
58
84
|
end
|
59
85
|
|
60
86
|
private
|
@@ -85,7 +111,7 @@ module LazyLazer
|
|
85
111
|
# @return [void]
|
86
112
|
# @raise MissingAttribute if runtime_required is true and the key can't be loaded.
|
87
113
|
def ensure_key_is_loaded(source_key, runtime_required)
|
88
|
-
@parent.reload if !@source_hash.key?(source_key) && !@
|
114
|
+
@parent.reload if !@source_hash.key?(source_key) && !@fully_loaded
|
89
115
|
return if @source_hash.key?(source_key) || !runtime_required
|
90
116
|
raise MissingAttribute, "`#{source_key} is missing for #{@parent}`"
|
91
117
|
end
|
data/lib/lazy_lazer/version.rb
CHANGED
data/lib/lazy_lazer.rb
CHANGED
@@ -68,8 +68,6 @@ module LazyLazer
|
|
68
68
|
@_lazer_model = InternalModel.new(self.class.instance_variable_get(:@_lazer_metadata), self)
|
69
69
|
@_lazer_model.merge!(attributes)
|
70
70
|
@_lazer_model.verify_required!
|
71
|
-
@_lazer_writethrough = {}
|
72
|
-
@_lazer_loaded = false
|
73
71
|
end
|
74
72
|
|
75
73
|
# Equality check, performed using required keys.
|
@@ -92,8 +90,7 @@ module LazyLazer
|
|
92
90
|
|
93
91
|
# @return [String] a human-friendly view of the model
|
94
92
|
def inspect
|
95
|
-
|
96
|
-
(@_lazer_model.cached_keys + @_lazer_writethrough.keys).join(', ') + ']>'
|
93
|
+
@_lazer_model.parent_inspect
|
97
94
|
end
|
98
95
|
|
99
96
|
# Reload the object. Calls {#lazer_reload}, then merges the results into the internal store.
|
@@ -110,9 +107,7 @@ module LazyLazer
|
|
110
107
|
# @return [Object] the returned value
|
111
108
|
# @raise MissingAttribute if the key was not found
|
112
109
|
def read_attribute(key_name)
|
113
|
-
|
114
|
-
return @_lazer_writethrough[symbol_key] if @_lazer_writethrough.key?(symbol_key)
|
115
|
-
@_lazer_model.fetch(symbol_key)
|
110
|
+
@_lazer_model.read_attribute(key_name.to_sym)
|
116
111
|
end
|
117
112
|
|
118
113
|
# Return the value of the attribute, returning nil if not found.
|
@@ -126,10 +121,10 @@ module LazyLazer
|
|
126
121
|
|
127
122
|
# Update an attribute.
|
128
123
|
# @param key_name [Symbol] the attribute to update
|
129
|
-
# @param
|
124
|
+
# @param new_value [Object] the new value
|
130
125
|
# @return [Object] the written value
|
131
|
-
def write_attribute(key_name,
|
132
|
-
@
|
126
|
+
def write_attribute(key_name, new_value)
|
127
|
+
@_lazer_model.write_attribute(key_name, new_value)
|
133
128
|
end
|
134
129
|
|
135
130
|
# Update multiple attributes at once.
|
@@ -143,7 +138,7 @@ module LazyLazer
|
|
143
138
|
|
144
139
|
# @return [Boolean] whether the object is done with lazy loading
|
145
140
|
def fully_loaded?
|
146
|
-
@
|
141
|
+
@_lazer_model.fully_loaded
|
147
142
|
end
|
148
143
|
|
149
144
|
private
|
@@ -155,16 +150,23 @@ module LazyLazer
|
|
155
150
|
{}
|
156
151
|
end
|
157
152
|
|
153
|
+
# Mark a key as tainted, forcing a reload on the next lookup.
|
154
|
+
# @param key_name [Symbol] the key to invalidate
|
155
|
+
# @return [void]
|
156
|
+
def invalidate(key_name)
|
157
|
+
@_lazer_model.invalidate(key_name)
|
158
|
+
end
|
159
|
+
|
158
160
|
# Mark the model as fully loaded.
|
159
161
|
# @return [void]
|
160
162
|
def fully_loaded!
|
161
|
-
@
|
163
|
+
@_lazer_model.fully_loaded = true
|
162
164
|
end
|
163
165
|
|
164
166
|
# Mark the model as not fully loaded.
|
165
167
|
# @return [void]
|
166
168
|
def not_fully_loaded!
|
167
|
-
@
|
169
|
+
@_lazer_model.fully_loaded = false
|
168
170
|
end
|
169
171
|
end
|
170
172
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_lazer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avinash Dwarapu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|