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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +6 -2
  4. data/Gemfile +0 -1
  5. data/Rakefile +2 -2
  6. data/hyper-mesh.gemspec +1 -1
  7. data/lib/active_record_base.rb +39 -27
  8. data/lib/hyper-mesh.rb +6 -1
  9. data/lib/hypermesh/version.rb +1 -1
  10. data/lib/object/tap.rb +7 -0
  11. data/lib/reactive_record/active_record/associations.rb +14 -3
  12. data/lib/reactive_record/active_record/base.rb +1 -2
  13. data/lib/reactive_record/active_record/class_methods.rb +120 -67
  14. data/lib/reactive_record/active_record/error.rb +17 -12
  15. data/lib/reactive_record/active_record/errors.rb +374 -0
  16. data/lib/reactive_record/active_record/instance_methods.rb +58 -67
  17. data/lib/reactive_record/active_record/reactive_record/backing_record_inspector.rb +1 -4
  18. data/lib/reactive_record/active_record/reactive_record/base.rb +129 -234
  19. data/lib/reactive_record/active_record/reactive_record/collection.rb +51 -18
  20. data/lib/reactive_record/active_record/reactive_record/column_types.rb +5 -3
  21. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +6 -4
  22. data/lib/reactive_record/active_record/reactive_record/getters.rb +133 -0
  23. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +99 -87
  24. data/lib/reactive_record/active_record/reactive_record/lookup_tables.rb +54 -0
  25. data/lib/reactive_record/active_record/reactive_record/operations.rb +2 -1
  26. data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +1 -1
  27. data/lib/reactive_record/active_record/reactive_record/setters.rb +194 -0
  28. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +4 -5
  29. data/lib/reactive_record/active_record_error.rb +4 -0
  30. data/lib/reactive_record/broadcast.rb +55 -18
  31. data/lib/reactive_record/permissions.rb +5 -4
  32. data/lib/reactive_record/scope_description.rb +14 -6
  33. data/lib/reactive_record/server_data_cache.rb +119 -70
  34. metadata +16 -13
  35. 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
- vector.any? && (klass == :all || record.class == klass || record.class < klass)
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
- (@joins[record.class.base_class] || @joins[:all]).collect do |vector|
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
- @joins = { @model => [[]], all: [] }
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
- @requested_cache_items = []
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
- root = CacheItem.new(@cache, @acting_user, vector[0], @preloaded_records)
118
- vector[1..-1].inject(root) { |cache_item, method| cache_item.apply_method method if cache_item }
119
- vector[0] = ServerDataCache.get_model(vector[0])
120
- last_value = nil
121
- @cache.each do |cache_item|
122
- next if cache_item.root != root || @requested_cache_items.include?(cache_item)
123
- @requested_cache_items << cache_item
124
- last_value = cache_item
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
- # SECURITY - SAFE
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
- ActiveRecord::Base.public_columns_hash
132
- result = nil
133
- ActiveRecord::Base.transaction do
134
- cache = new(acting_user, ReactiveRecord::Base.save_records(models, associations, acting_user, false, false))
135
- vectors.each { |vector| cache[*vector] }
136
- result = cache.as_json
137
- raise ActiveRecord::Rollback, "This Rollback is intentional!"
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) &block; 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
- klass_constant = ServerDataCache.get_model(klass)
183
- if existing = db_cache.detect { |cached_item| cached_item.vector == [klass_constant] }
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 << self
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.build_new_cache_item(cache_item.value.__secure_collection_check(@acting_user).collect { |record| record.id }, method, method)
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.build_new_cache_item(cache_item.value.__secure_collection_check(@acting_user).count, method, method)
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
- if cache_item.value.class < ActiveRecord::Base and 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...
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 << self
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
- @db_cache.detect { |cached_item| cached_item.vector == new_vector} || apply_method_to_cache(method)
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) and (@value < ActiveRecord::Base)
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({}) # does it work for all edge cases?
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 and children.is_a? Hash
323
- @parent.as_hash({jsonize(method) => children.merge({
324
- :id => (method.is_a?(Array) && method.first == "new") ? [nil] : [@value.id],
325
- @value.class.inheritance_column => [@value[@value.class.inheritance_column]],
326
- })})
327
- elsif method == "*all"
328
- @parent.as_hash({jsonize(method) => children.first})
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({jsonize(method) => children})
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.find_by_object_id(target.base_class, method[1])
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.update_attribute([method], target.backing_record.convert(method, value.first))
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) and aggregation = target.class.reflect_on_aggregation(method) and
407
- !(aggregation.klass < ActiveRecord::Base)
408
- target.send "#{method}=", aggregation.deserialize(value.first)
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}=", value.first unless method == "id" # we handle ids first so things sync nicely
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.lap27
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-03-07 00:00:00.000000000 Z
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.lap27
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.lap27
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.lap27
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.lap27
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.lap27
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.lap27
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.3
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