hyper-mesh 1.0.0.lap27 → 1.0.0.lap28
Sign up to get free protection for your applications and to get access to all the features.
- 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
|