hyper-mesh 1.0.0.lap27 → 1.0.0.lap28
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/.gitignore +1 -0
- data/.rubocop.yml +6 -2
- data/Gemfile +0 -1
- data/Rakefile +2 -2
- data/hyper-mesh.gemspec +1 -1
- data/lib/active_record_base.rb +39 -27
- data/lib/hyper-mesh.rb +6 -1
- data/lib/hypermesh/version.rb +1 -1
- data/lib/object/tap.rb +7 -0
- data/lib/reactive_record/active_record/associations.rb +14 -3
- data/lib/reactive_record/active_record/base.rb +1 -2
- data/lib/reactive_record/active_record/class_methods.rb +120 -67
- data/lib/reactive_record/active_record/error.rb +17 -12
- data/lib/reactive_record/active_record/errors.rb +374 -0
- data/lib/reactive_record/active_record/instance_methods.rb +58 -67
- data/lib/reactive_record/active_record/reactive_record/backing_record_inspector.rb +1 -4
- data/lib/reactive_record/active_record/reactive_record/base.rb +129 -234
- data/lib/reactive_record/active_record/reactive_record/collection.rb +51 -18
- data/lib/reactive_record/active_record/reactive_record/column_types.rb +5 -3
- data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +6 -4
- data/lib/reactive_record/active_record/reactive_record/getters.rb +133 -0
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +99 -87
- data/lib/reactive_record/active_record/reactive_record/lookup_tables.rb +54 -0
- data/lib/reactive_record/active_record/reactive_record/operations.rb +2 -1
- data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +1 -1
- data/lib/reactive_record/active_record/reactive_record/setters.rb +194 -0
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +4 -5
- data/lib/reactive_record/active_record_error.rb +4 -0
- data/lib/reactive_record/broadcast.rb +55 -18
- data/lib/reactive_record/permissions.rb +5 -4
- data/lib/reactive_record/scope_description.rb +14 -6
- data/lib/reactive_record/server_data_cache.rb +119 -70
- metadata +16 -13
- data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +0 -189
@@ -18,7 +18,7 @@ module ReactiveRecord
|
|
18
18
|
attr_reader :name
|
19
19
|
|
20
20
|
def self.find(target_model, name)
|
21
|
-
name = name.gsub(/!$/,'')
|
21
|
+
name = name.gsub(/!$/, '')
|
22
22
|
target_model.send "_#{name}_synchromesh_scope_description_"
|
23
23
|
rescue
|
24
24
|
nil
|
@@ -34,13 +34,22 @@ module ReactiveRecord
|
|
34
34
|
|
35
35
|
def joins_with?(record)
|
36
36
|
@joins.detect do |klass, vector|
|
37
|
-
|
37
|
+
# added klass < record.class to handle STI case... should check to see if this could ever
|
38
|
+
# cause a problem. Probably not a problem.
|
39
|
+
next unless vector.any?
|
40
|
+
(klass == :all || record.class == klass || record.class < klass || klass < record.class)
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
44
|
+
def get_joins(klass)
|
45
|
+
joins = @joins[klass] if @joins.key? klass
|
46
|
+
joins ||= @joins[klass.base_class] if @joins.key?(klass.base_class)
|
47
|
+
joins || @joins[:all]
|
48
|
+
end
|
49
|
+
|
41
50
|
def related_records_for(record)
|
42
51
|
ReactiveRecord::Base.catch_db_requests([]) do
|
43
|
-
(
|
52
|
+
get_joins(record.class).collect do |vector|
|
44
53
|
crawl(record, *vector)
|
45
54
|
end.flatten.compact
|
46
55
|
end
|
@@ -52,8 +61,6 @@ module ReactiveRecord
|
|
52
61
|
else
|
53
62
|
Set.new(related_records.select { |r| r.instance_exec(*args, &@filter_proc) })
|
54
63
|
end
|
55
|
-
rescue Exception => e
|
56
|
-
raise "Client side scope #{@model}.#{@name} raised error: #{e.message}"
|
57
64
|
end
|
58
65
|
|
59
66
|
# private methods
|
@@ -70,7 +77,8 @@ module ReactiveRecord
|
|
70
77
|
if !@filter_proc || joins_list == []
|
71
78
|
@joins = { all: [] }
|
72
79
|
elsif joins_list.nil?
|
73
|
-
|
80
|
+
klass = @model < ActiveRecord::Base ? @model.base_class : @model
|
81
|
+
@joins = { klass => [[]], all: [] }
|
74
82
|
elsif joins_list == :all
|
75
83
|
@joins = { all: [[]] }
|
76
84
|
else
|
@@ -1,5 +1,11 @@
|
|
1
|
+
require 'set'
|
1
2
|
module ReactiveRecord
|
2
3
|
|
4
|
+
# requested cache items I think is there just so prerendering with multiple components works.
|
5
|
+
# because we have to dump the cache after each component render (during prererender) but
|
6
|
+
# we want to keep the larger cache alive (is this important???) we keep track of what got added
|
7
|
+
# to the cache during this cycle
|
8
|
+
|
3
9
|
# the point is to collect up a all records needed, with whatever attributes were required + primary key, and inheritance column
|
4
10
|
# or get all scope arrays, with the record ids
|
5
11
|
|
@@ -84,17 +90,26 @@ module ReactiveRecord
|
|
84
90
|
# [Todo, [find, 119], owner, todos, active, *all]
|
85
91
|
# -> [[Todo, [find, 119], owner, todos, active, *all], [119, 123], 119, 12]
|
86
92
|
|
87
|
-
|
88
93
|
class ServerDataCache
|
89
94
|
|
90
|
-
# SECURITY - SAFE
|
91
95
|
def initialize(acting_user, preloaded_records)
|
92
96
|
@acting_user = acting_user
|
93
97
|
@cache = []
|
94
|
-
@
|
98
|
+
@cache_reps = {}
|
99
|
+
@requested_cache_items = Set.new
|
95
100
|
@preloaded_records = preloaded_records
|
96
101
|
end
|
97
102
|
|
103
|
+
attr_reader :cache
|
104
|
+
attr_reader :cache_reps
|
105
|
+
attr_reader :requested_cache_items
|
106
|
+
|
107
|
+
def add_item_to_cache(item)
|
108
|
+
cache << item
|
109
|
+
cache_reps[item.vector] = item
|
110
|
+
requested_cache_items << item
|
111
|
+
end
|
112
|
+
|
98
113
|
if RUBY_ENGINE != 'opal'
|
99
114
|
|
100
115
|
def self.get_model(str)
|
@@ -112,52 +127,69 @@ module ReactiveRecord
|
|
112
127
|
str.constantize
|
113
128
|
end
|
114
129
|
|
115
|
-
# SECURITY - NOW SAFE
|
116
130
|
def [](*vector)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
131
|
+
timing('building cache_items') do
|
132
|
+
root = CacheItem.new(self, @acting_user, vector[0], @preloaded_records)
|
133
|
+
vector[1..-1].inject(root) { |cache_item, method| cache_item.apply_method method if cache_item }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def start_timing(&block)
|
138
|
+
ServerDataCache.start_timing(&block)
|
139
|
+
end
|
140
|
+
|
141
|
+
def timing(tag, &block)
|
142
|
+
ServerDataCache.timing(tag, &block)
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.start_timing(&block)
|
146
|
+
@timings = Hash.new { |h, k| h[k] = 0 }
|
147
|
+
start_time = Time.now
|
148
|
+
yield.tap do
|
149
|
+
::Rails.logger.debug "********* Total Time #{total = Time.now - start_time} ***********************"
|
150
|
+
sum = 0
|
151
|
+
@timings.sort_by(&:last).reverse.each do |tag, time|
|
152
|
+
::Rails.logger.debug " #{tag}: #{time} (#{(time/total*100).to_i})%"
|
153
|
+
sum += time
|
154
|
+
end
|
155
|
+
::Rails.logger.debug "********* Other Time ***********************"
|
125
156
|
end
|
126
|
-
last_value
|
127
157
|
end
|
128
158
|
|
129
|
-
|
159
|
+
def self.timing(tag, &block)
|
160
|
+
start_time = Time.now
|
161
|
+
tag = tag.to_sym
|
162
|
+
yield.tap { @timings[tag] += (Time.now - start_time) if @timings }
|
163
|
+
end
|
164
|
+
|
130
165
|
def self.[](models, associations, vectors, acting_user)
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
166
|
+
start_timing do
|
167
|
+
timing(:public_columns_hash) { ActiveRecord::Base.public_columns_hash }
|
168
|
+
result = nil
|
169
|
+
ActiveRecord::Base.transaction do
|
170
|
+
cache = new(acting_user, timing(:save_records) { ReactiveRecord::Base.save_records(models, associations, acting_user, false, false) })
|
171
|
+
timing(:process_vectors) { vectors.each { |vector| cache[*vector] } }
|
172
|
+
timing(:as_json) { result = cache.as_json }
|
173
|
+
raise ActiveRecord::Rollback, "This Rollback is intentional!"
|
174
|
+
end
|
175
|
+
result
|
138
176
|
end
|
139
|
-
result
|
140
177
|
end
|
141
178
|
|
142
|
-
# SECURITY - SAFE
|
143
179
|
def clear_requests
|
144
|
-
@requested_cache_items =
|
180
|
+
@requested_cache_items = Set.new
|
145
181
|
end
|
146
182
|
|
147
|
-
# SECURITY - SAFE
|
148
183
|
def as_json
|
149
184
|
@requested_cache_items.inject({}) do |hash, cache_item|
|
150
185
|
hash.deep_merge! cache_item.as_hash
|
151
186
|
end
|
152
187
|
end
|
153
188
|
|
154
|
-
# SECURITY - SAFE
|
155
189
|
def select(&block); @cache.select(&block); end
|
156
190
|
|
157
|
-
# SECURITY - SAFE
|
158
191
|
def detect(&block); @cache.detect(&block); end
|
159
192
|
|
160
|
-
# SECURITY - SAFE
|
161
193
|
def inject(initial, &block); @cache.inject(initial) █ end
|
162
194
|
|
163
195
|
class CacheItem
|
@@ -167,28 +199,23 @@ module ReactiveRecord
|
|
167
199
|
attr_reader :root
|
168
200
|
attr_reader :acting_user
|
169
201
|
|
170
|
-
# SECURITY - SAFE
|
171
202
|
def value
|
172
203
|
@value # which is a ActiveRecord object
|
173
204
|
end
|
174
205
|
|
175
|
-
# SECURITY - SAFE
|
176
206
|
def method
|
177
207
|
@vector.last
|
178
208
|
end
|
179
209
|
|
180
|
-
# SECURITY - NOW SAFE
|
181
210
|
def self.new(db_cache, acting_user, klass, preloaded_records)
|
182
|
-
|
183
|
-
if existing = db_cache.detect { |cached_item| cached_item.vector == [
|
211
|
+
klass = ServerDataCache.get_model(klass)
|
212
|
+
if existing = ServerDataCache.timing(:root_lookup) { db_cache.cache.detect { |cached_item| cached_item.vector == [klass] } }
|
184
213
|
return existing
|
185
214
|
end
|
186
215
|
super
|
187
216
|
end
|
188
217
|
|
189
|
-
# SECURITY - NOW SAFE
|
190
218
|
def initialize(db_cache, acting_user, klass, preloaded_records)
|
191
|
-
klass = ServerDataCache.get_model(klass)
|
192
219
|
@db_cache = db_cache
|
193
220
|
@acting_user = acting_user
|
194
221
|
@vector = @absolute_vector = [klass]
|
@@ -196,21 +223,30 @@ module ReactiveRecord
|
|
196
223
|
@parent = nil
|
197
224
|
@root = self
|
198
225
|
@preloaded_records = preloaded_records
|
199
|
-
db_cache
|
226
|
+
@db_cache.add_item_to_cache self
|
227
|
+
end
|
228
|
+
|
229
|
+
def start_timing(&block)
|
230
|
+
ServerDataCache.class.start_timing(&block)
|
231
|
+
end
|
232
|
+
|
233
|
+
def timing(tag, &block)
|
234
|
+
ServerDataCache.timing(tag, &block)
|
200
235
|
end
|
201
236
|
|
202
|
-
# SECURITY - UNSAFE
|
203
237
|
def apply_method_to_cache(method)
|
204
|
-
@db_cache.inject(nil) do |representative, cache_item|
|
238
|
+
@db_cache.cache.inject(nil) do |representative, cache_item|
|
205
239
|
if cache_item.vector == vector
|
206
240
|
if method == "*"
|
207
241
|
# apply_star does the security check if value is present
|
208
242
|
cache_item.apply_star || representative
|
209
243
|
elsif method == "*all"
|
210
244
|
# if we secure the collection then we assume its okay to read the ids
|
211
|
-
cache_item.
|
245
|
+
secured_value = cache_item.value.__secure_collection_check(@acting_user)
|
246
|
+
cache_item.build_new_cache_item(timing(:active_record) { secured_value.collect { |record| record.id } }, method, method)
|
212
247
|
elsif method == "*count"
|
213
|
-
cache_item.
|
248
|
+
secured_value = cache_item.value.__secure_collection_check(@acting_user)
|
249
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.__secure_collection_check(@acting_user).count }, method, method)
|
214
250
|
elsif preloaded_value = @preloaded_records[cache_item.absolute_vector + [method]]
|
215
251
|
# no security check needed since we already evaluated this
|
216
252
|
cache_item.build_new_cache_item(preloaded_value, method, method)
|
@@ -224,11 +260,13 @@ module ReactiveRecord
|
|
224
260
|
else
|
225
261
|
begin
|
226
262
|
secured_method = "__secure_remote_access_to_#{[*method].first}"
|
227
|
-
|
263
|
+
|
264
|
+
# order is important. This check must be first since scopes can have same name as attributes!
|
265
|
+
if cache_item.value.respond_to? secured_method
|
266
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(secured_method, cache_item.value, @acting_user, *([*method][1..-1])) }, method, method)
|
267
|
+
elsif (cache_item.value.class < ActiveRecord::Base) && cache_item.value.attributes.has_key?(method) # TODO: second check is not needed, its built into check_permmissions, check should be does class respond to check_permissions...
|
228
268
|
cache_item.value.check_permission_with_acting_user(@acting_user, :view_permitted?, method)
|
229
|
-
cache_item.build_new_cache_item(cache_item.value.send(*method), method, method)
|
230
|
-
elsif cache_item.value.respond_to? secured_method
|
231
|
-
cache_item.build_new_cache_item(cache_item.value.send(secured_method, @acting_user, *([*method][1..-1])), method, method)
|
269
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(*method) }, method, method)
|
232
270
|
else
|
233
271
|
raise "method missing"
|
234
272
|
end
|
@@ -245,7 +283,6 @@ module ReactiveRecord
|
|
245
283
|
end
|
246
284
|
end
|
247
285
|
|
248
|
-
# SECURITY - SAFE
|
249
286
|
def aggregation?(method)
|
250
287
|
if method.is_a?(String) && @value.class.respond_to?(:reflect_on_aggregation)
|
251
288
|
aggregation = @value.class.reflect_on_aggregation(method.to_sym)
|
@@ -255,7 +292,6 @@ module ReactiveRecord
|
|
255
292
|
end
|
256
293
|
end
|
257
294
|
|
258
|
-
# SECURITY - NOW SAFE
|
259
295
|
def apply_star
|
260
296
|
if @value && @value.__secure_collection_check(@acting_user) && @value.length > 0
|
261
297
|
i = -1
|
@@ -272,7 +308,6 @@ module ReactiveRecord
|
|
272
308
|
end
|
273
309
|
end
|
274
310
|
|
275
|
-
# SECURITY - SAFE
|
276
311
|
# TODO replace instance_eval with a method like clone_new_child(....)
|
277
312
|
def build_new_cache_item(new_value, method, absolute_method)
|
278
313
|
new_parent = self
|
@@ -280,26 +315,23 @@ module ReactiveRecord
|
|
280
315
|
@vector = @vector + [method] # don't push it on since you need a new vector!
|
281
316
|
@absolute_vector = @absolute_vector + [absolute_method]
|
282
317
|
@value = new_value
|
283
|
-
@db_cache
|
318
|
+
@db_cache.add_item_to_cache self
|
284
319
|
@parent = new_parent
|
285
320
|
@root = new_parent.root
|
286
321
|
self
|
287
322
|
end
|
288
323
|
end
|
289
324
|
|
290
|
-
# SECURITY - SAFE
|
291
325
|
def apply_method(method)
|
292
|
-
|
293
326
|
if method.is_a? Array and method.first == "find_by_id"
|
294
327
|
method[0] = "find"
|
295
328
|
elsif method.is_a? String and method =~ /^\*[0-9]+$/
|
296
329
|
method = "*"
|
297
330
|
end
|
298
331
|
new_vector = vector + [method]
|
299
|
-
|
332
|
+
timing('apply_method lookup') { @db_cache.cache_reps[new_vector] } || apply_method_to_cache(method)
|
300
333
|
end
|
301
334
|
|
302
|
-
# SECURITY - SAFE
|
303
335
|
def jsonize(method)
|
304
336
|
# sadly standard json converts {[:foo, nil] => 123} to {"['foo', nil]": 123}
|
305
337
|
# luckily [:foo, nil] does convert correctly
|
@@ -307,30 +339,39 @@ module ReactiveRecord
|
|
307
339
|
method.is_a?(Array) ? method.to_json : method
|
308
340
|
end
|
309
341
|
|
342
|
+
def merge_inheritance_column(children)
|
343
|
+
if @value.attributes.key? @value.class.inheritance_column
|
344
|
+
children[@value.class.inheritance_column] = [@value[@value.class.inheritance_column]]
|
345
|
+
end
|
346
|
+
children
|
347
|
+
end
|
348
|
+
|
310
349
|
def as_hash(children = nil)
|
311
350
|
unless children
|
312
|
-
return {} if @value.is_a?(Class)
|
351
|
+
return {} if @value.is_a?(Class) && (@value < ActiveRecord::Base)
|
313
352
|
children = [@value.is_a?(BigDecimal) ? @value.to_f : @value]
|
314
353
|
end
|
315
354
|
if @parent
|
316
355
|
if method == "*"
|
317
356
|
if @value.is_a? Array # this happens when a scope is empty there is test case, but
|
318
|
-
@parent.as_hash({})
|
357
|
+
@parent.as_hash({}) # does it work for all edge cases?
|
319
358
|
else
|
320
359
|
@parent.as_hash({@value.id => children})
|
321
360
|
end
|
322
|
-
elsif @value.class < ActiveRecord::Base
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
@parent.as_hash(
|
361
|
+
elsif (@value.class < ActiveRecord::Base) && children.is_a?(Hash)
|
362
|
+
id = method.is_a?(Array) && method.first == "new" ? [nil] : [@value.id]
|
363
|
+
# c = children.merge(id: id)
|
364
|
+
# if @value.attributes.key? @value.class.inheritance_column
|
365
|
+
# c[@value.class.inheritance_column] = [@value[@value.class.inheritance_column]]
|
366
|
+
# end
|
367
|
+
@parent.as_hash(jsonize(method) => merge_inheritance_column(children.merge(id: id)))
|
368
|
+
elsif method == '*all'
|
369
|
+
@parent.as_hash('*all' => children.first)
|
329
370
|
else
|
330
|
-
@parent.as_hash(
|
371
|
+
@parent.as_hash(jsonize(method) => children)
|
331
372
|
end
|
332
373
|
else
|
333
|
-
{method.name => children}
|
374
|
+
{ method.name => children }
|
334
375
|
end
|
335
376
|
end
|
336
377
|
|
@@ -369,7 +410,6 @@ keys:
|
|
369
410
|
|
370
411
|
|
371
412
|
def self.load_from_json(tree, target = nil)
|
372
|
-
ignore_all = nil
|
373
413
|
|
374
414
|
# have to process *all before any other items
|
375
415
|
# we leave the "*all" key in just for debugging purposes, and then skip it below
|
@@ -384,6 +424,7 @@ keys:
|
|
384
424
|
tree.each do |method, value|
|
385
425
|
method = JSON.parse(method) rescue method
|
386
426
|
new_target = nil
|
427
|
+
|
387
428
|
if method == "*all"
|
388
429
|
next # its already been processed above
|
389
430
|
elsif !target
|
@@ -395,19 +436,24 @@ keys:
|
|
395
436
|
#target << (new_target = target.proxy_association.klass.find(method))
|
396
437
|
elsif method.is_a? Array
|
397
438
|
if method[0] == "new"
|
398
|
-
new_target = ReactiveRecord::Base.
|
439
|
+
new_target = ReactiveRecord::Base.lookup_by_object_id(method[1])
|
399
440
|
elsif !(target.class < ActiveRecord::Base)
|
400
441
|
new_target = target.send(*method)
|
401
442
|
# value is an array if scope returns nil, so we destroy the bogus record
|
402
443
|
new_target.destroy and new_target = nil if value.is_a? Array
|
403
444
|
else
|
404
|
-
target.backing_record.
|
445
|
+
target.backing_record.update_simple_attribute([method], target.backing_record.convert(method, value.first))
|
405
446
|
end
|
406
|
-
elsif target.class.respond_to?(:reflect_on_aggregation)
|
407
|
-
|
408
|
-
|
447
|
+
elsif target.class.respond_to?(:reflect_on_aggregation) &&
|
448
|
+
(aggregation = target.class.reflect_on_aggregation(method)) &&
|
449
|
+
!(aggregation.klass < ActiveRecord::Base)
|
450
|
+
value = [aggregation.deserialize(value.first)] unless value.first.is_a?(aggregation.klass)
|
451
|
+
|
452
|
+
target.send "#{method}=", value.first
|
409
453
|
elsif value.is_a? Array
|
410
|
-
target.send "#{method}="
|
454
|
+
# we cannot use target.send "#{method}=" here because it might be a server method, which does not have a setter
|
455
|
+
# a better fix might be something like target._internal_attribute_hash[method] = ...
|
456
|
+
target.backing_record.set_attr_value(method, value.first) unless method == :id
|
411
457
|
elsif value.is_a? Hash and value[:id] and value[:id].first and association = target.class.reflect_on_association(method)
|
412
458
|
# not sure if its necessary to check the id above... is it possible to for the method to be an association but not have an id?
|
413
459
|
new_target = association.klass.find(value[:id].first)
|
@@ -421,6 +467,9 @@ keys:
|
|
421
467
|
end
|
422
468
|
load_from_json(value, new_target) if new_target
|
423
469
|
end
|
470
|
+
rescue Exception => e
|
471
|
+
# debugger
|
472
|
+
raise e
|
424
473
|
end
|
425
474
|
end
|
426
475
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyper-mesh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.lap28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitch VanDuyn
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-05-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -31,28 +31,28 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - '='
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 1.0.0.
|
34
|
+
version: 1.0.0.lap28
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - '='
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 1.0.0.
|
41
|
+
version: 1.0.0.lap28
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: hyper-operation
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - '='
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: 1.0.0.
|
48
|
+
version: 1.0.0.lap28
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - '='
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: 1.0.0.
|
55
|
+
version: 1.0.0.lap28
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: bundler
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,14 +129,14 @@ dependencies:
|
|
129
129
|
requirements:
|
130
130
|
- - '='
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: 1.0.0.
|
132
|
+
version: 1.0.0.lap28
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
137
|
- - '='
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: 1.0.0.
|
139
|
+
version: 1.0.0.lap28
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
141
|
name: hyper-trace
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -570,9 +570,7 @@ description: HyperMesh is the base for HyperModel. HyperModel gives your HyperCo
|
|
570
570
|
email:
|
571
571
|
- mitch@catprint.com
|
572
572
|
- jan@kursator.com
|
573
|
-
executables:
|
574
|
-
- console
|
575
|
-
- setup
|
573
|
+
executables: []
|
576
574
|
extensions: []
|
577
575
|
extra_rdoc_files: []
|
578
576
|
files:
|
@@ -598,6 +596,7 @@ files:
|
|
598
596
|
- lib/hyper-mesh.rb
|
599
597
|
- lib/hypermesh/version.rb
|
600
598
|
- lib/kernel/itself.rb
|
599
|
+
- lib/object/tap.rb
|
601
600
|
- lib/opal/equality_patches.rb
|
602
601
|
- lib/opal/parse_patch.rb
|
603
602
|
- lib/opal/set_patches.rb
|
@@ -606,6 +605,7 @@ files:
|
|
606
605
|
- lib/reactive_record/active_record/base.rb
|
607
606
|
- lib/reactive_record/active_record/class_methods.rb
|
608
607
|
- lib/reactive_record/active_record/error.rb
|
608
|
+
- lib/reactive_record/active_record/errors.rb
|
609
609
|
- lib/reactive_record/active_record/instance_methods.rb
|
610
610
|
- lib/reactive_record/active_record/public_columns_hash.rb
|
611
611
|
- lib/reactive_record/active_record/reactive_record/backing_record_inspector.rb
|
@@ -613,12 +613,15 @@ files:
|
|
613
613
|
- lib/reactive_record/active_record/reactive_record/collection.rb
|
614
614
|
- lib/reactive_record/active_record/reactive_record/column_types.rb
|
615
615
|
- lib/reactive_record/active_record/reactive_record/dummy_value.rb
|
616
|
+
- lib/reactive_record/active_record/reactive_record/getters.rb
|
616
617
|
- lib/reactive_record/active_record/reactive_record/isomorphic_base.rb
|
618
|
+
- lib/reactive_record/active_record/reactive_record/lookup_tables.rb
|
617
619
|
- lib/reactive_record/active_record/reactive_record/operations.rb
|
618
|
-
- lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb
|
619
620
|
- lib/reactive_record/active_record/reactive_record/scoped_collection.rb
|
621
|
+
- lib/reactive_record/active_record/reactive_record/setters.rb
|
620
622
|
- lib/reactive_record/active_record/reactive_record/unscoped_collection.rb
|
621
623
|
- lib/reactive_record/active_record/reactive_record/while_loading.rb
|
624
|
+
- lib/reactive_record/active_record_error.rb
|
622
625
|
- lib/reactive_record/broadcast.rb
|
623
626
|
- lib/reactive_record/engine.rb
|
624
627
|
- lib/reactive_record/interval.rb
|
@@ -653,7 +656,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
653
656
|
version: 1.3.1
|
654
657
|
requirements: []
|
655
658
|
rubyforge_project:
|
656
|
-
rubygems_version: 2.7.
|
659
|
+
rubygems_version: 2.7.6
|
657
660
|
signing_key:
|
658
661
|
specification_version: 4
|
659
662
|
summary: React based CRUD access and Synchronization of active record models across
|