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.
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