reactive-record 0.7.26 → 0.7.27

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c15527bb6caf4a10ea5a096502f28922b327ed1
4
- data.tar.gz: 57eaf2bda747f35a7d73f6c6921686c5e2e62097
3
+ metadata.gz: d768497702030401fd48ec8d9149f4c74e20c725
4
+ data.tar.gz: 4fbf024a9ade1663b8b2b0106f982d39b5642c92
5
5
  SHA512:
6
- metadata.gz: 53444409324a592f76f37a56c4164ee4f52f88df2b9912060a3e0d2807e0020d42a490650a2d9b45d2e4d12c727336bddb79e3a1c59c23d0d93dfdaf884f4a45
7
- data.tar.gz: 68b8f20350a595919c8ef0ecae9a57b029512e27077467d0bf8b5f9bfd26a573ffda5a286c1f3a604fe6b5a303ba96c555341777b849ea24eb1e76f8685bc799
6
+ metadata.gz: cdd59f7cc5d7704559c48099fb91c81b6ce124ad8817be2bf8a8b755d272dab3a8f2514cb3e48ddcf99dcd9ccd26b7f097fe56595ea94912f99cc5f6b65292bb
7
+ data.tar.gz: e09150e494aadd60d997b79473bd9cc9377027b4ea585f5ed243c34cf69629dc22be59e53c0aa39fc5772baea063c74b66c47d79fe4660efb3b57e00d6dfc16e
@@ -189,16 +189,16 @@ module ReactiveRecord
189
189
  inverse_of = association.inverse_of
190
190
  inverse_association = association.klass.reflect_on_association(inverse_of)
191
191
  if inverse_association.collection?
192
- if !value
193
- attributes[attribute].attributes[inverse_of].delete(@ar_instance) if attributes[attribute]
192
+ if value.nil?
193
+ attributes[attribute].attributes[inverse_of].delete(@ar_instance) unless attributes[attribute].nil?
194
194
  elsif value.attributes[inverse_of]
195
195
  value.attributes[inverse_of] << @ar_instance
196
196
  else
197
197
  value.attributes[inverse_of] = Collection.new(@model, value, inverse_association)
198
198
  value.attributes[inverse_of].replace [@ar_instance]
199
199
  end
200
- elsif value
201
- attributes[attribute].attributes[inverse_of] = nil if attributes[attribute]
200
+ elsif !value.nil?
201
+ attributes[attribute].attributes[inverse_of] = nil unless attributes[attribute].nil?
202
202
  value.attributes[inverse_of] = @ar_instance
203
203
  React::State.set_state(value.backing_record, inverse_of, @ar_instance) unless data_loading?
204
204
  elsif attributes[attribute]
@@ -260,15 +260,17 @@ module ReactiveRecord
260
260
  elsif !changed_attributes.include?(attribute)
261
261
  changed_attributes << attribute
262
262
  end
263
+ had_key = attributes.has_key? attribute
263
264
  current_value = attributes[attribute]
264
265
  attributes[attribute] = value if args.count != 0
265
266
  if !data_loading?
266
267
  React::State.set_state(self, attribute, value)
267
- elsif on_opal_client? and current_value.loaded? and current_value != value # this is to handle changes in already loaded server side methods
268
- #after(0.001) { React::State.set_state(self, attribute, value) }
268
+ elsif on_opal_client? and had_key and current_value.loaded? and current_value != value and args.count > 0 # this is to handle changes in already loaded server side methods
269
+ puts "setting up delayed change for #{@ar_instance}.#{attribute} current: #{current_value} new: #{value}"
269
270
  React::State.set_state(self, attribute, value, true)
270
271
  end
271
272
  if empty_before != changed_attributes.empty?
273
+ puts "setting up delayed change on record" unless on_opal_server? or data_loading?
272
274
  React::State.set_state(self, "!CHANGED!", !changed_attributes.empty?, true) unless on_opal_server? or data_loading?
273
275
  aggregate_owner.update_attribute(aggregate_attribute) if aggregate_owner
274
276
  end
@@ -277,7 +277,7 @@ module ReactiveRecord
277
277
  elsif record.changed?(attribute)
278
278
  output_attributes[attribute] = value
279
279
  end
280
- end if record.changed? || (record == record_being_saved && force)
280
+ end if record.new? || record.changed? || (record == record_being_saved && force)
281
281
  record_index += 1
282
282
  end
283
283
  [models, associations, backing_records]
@@ -374,6 +374,7 @@ module ReactiveRecord
374
374
  vectors = {}
375
375
  new_models = []
376
376
  saved_models = []
377
+ dont_save_list = []
377
378
 
378
379
  models.each do |model_to_save|
379
380
  attributes = model_to_save[:attributes]
@@ -406,6 +407,7 @@ module ReactiveRecord
406
407
  end
407
408
  elsif record
408
409
  # either the model is new, or its not even an active record model
410
+ dont_save_list << record unless save
409
411
  keys = record.attributes.keys
410
412
  attributes.each do |key, value|
411
413
  if keys.include? key
@@ -423,54 +425,64 @@ module ReactiveRecord
423
425
  end
424
426
 
425
427
  puts "!!!!!!!!!!!!!!attributes updated"
428
+ ActiveRecord::Base.transaction do
429
+ associations.each do |association|
430
+ parent = reactive_records[association[:parent_id]]
431
+ next unless parent
432
+ #parent.instance_variable_set("@reactive_record_#{association[:attribute]}_changed", true) remove this????
433
+ if parent.class.reflect_on_aggregation(association[:attribute].to_sym)
434
+ puts ">>>>>>AGGREGATE>>>> #{parent.class.name}.send('#{association[:attribute]}=', #{reactive_records[association[:child_id]]})"
435
+ aggregate = reactive_records[association[:child_id]]
436
+ dont_save_list << aggregate
437
+ current_attributes = parent.send(association[:attribute]).attributes
438
+ puts "current parent attributes = #{current_attributes}"
439
+ new_attributes = aggregate.attributes
440
+ puts "current child attributes = #{new_attributes}"
441
+ merged_attributes = current_attributes.merge(new_attributes) { |k, current_attr, new_attr| aggregate.send("#{k}_changed?") ? new_attr : current_attr}
442
+ puts "merged attributes = #{merged_attributes}"
443
+ aggregate.assign_attributes(merged_attributes)
444
+ puts "aggregate attributes after merge = #{aggregate.attributes}"
445
+ parent.send("#{association[:attribute]}=", aggregate)
446
+ puts "updated is frozen? #{aggregate.frozen?}, parent attributes = #{parent.send(association[:attribute]).attributes}"
447
+ elsif parent.class.reflect_on_association(association[:attribute].to_sym).nil?
448
+ raise "Missing association :#{association[:attribute]} for #{parent.class.name}. Was association defined on opal side only?"
449
+ elsif parent.class.reflect_on_association(association[:attribute].to_sym).collection?
450
+ puts ">>>>>>>>>> #{parent.class.name}.send('#{association[:attribute]}') << #{reactive_records[association[:child_id]]})"
451
+ dont_save_list.delete(parent)
452
+ if false and parent.new?
453
+ parent.send("#{association[:attribute]}") << reactive_records[association[:child_id]] if parent.new?
454
+ puts "updated"
455
+ else
456
+ puts "skipped"
457
+ end
458
+ else
459
+ puts ">>>>ASSOCIATION>>>> #{parent.class.name}.send('#{association[:attribute]}=', #{reactive_records[association[:child_id]]})"
460
+ parent.send("#{association[:attribute]}=", reactive_records[association[:child_id]])
461
+ dont_save_list.delete(parent)
462
+ puts "updated"
463
+ end
464
+ end if associations
426
465
 
427
- associations.each do |association|
428
- parent = reactive_records[association[:parent_id]]
429
- next unless parent
430
- #parent.instance_variable_set("@reactive_record_#{association[:attribute]}_changed", true) remove this????
431
- if parent.class.reflect_on_aggregation(association[:attribute].to_sym)
432
- puts ">>>>>>AGGREGATE>>>> #{parent.class.name}.send('#{association[:attribute]}=', #{reactive_records[association[:child_id]]})"
433
- aggregate = reactive_records[association[:child_id]]
434
- current_attributes = parent.send(association[:attribute]).attributes
435
- puts "current parent attributes = #{current_attributes}"
436
- new_attributes = aggregate.attributes
437
- puts "current child attributes = #{new_attributes}"
438
- merged_attributes = current_attributes.merge(new_attributes) { |k, current_attr, new_attr| aggregate.send("#{k}_changed?") ? new_attr : current_attr}
439
- puts "merged attributes = #{merged_attributes}"
440
- aggregate.assign_attributes(merged_attributes)
441
- puts "aggregate attributes after merge = #{aggregate.attributes}"
442
- parent.send("#{association[:attribute]}=", aggregate)
443
- puts "updated is frozen? #{aggregate.frozen?}, parent attributes = #{parent.send(association[:attribute]).attributes}"
444
- elsif parent.class.reflect_on_association(association[:attribute].to_sym).nil?
445
- raise "Missing association :#{association[:attribute]} for #{parent.class.name}. Was association defined on opal side only?"
446
- elsif parent.class.reflect_on_association(association[:attribute].to_sym).collection?
447
- puts ">>>>>>>>>> #{parent.class.name}.send('#{association[:attribute]}') << #{reactive_records[association[:child_id]]})"
448
- puts "Skipped (should be done by belongs to)"
449
- else
450
- puts ">>>>ASSOCIATION>>>> #{parent.class.name}.send('#{association[:attribute]}=', #{reactive_records[association[:child_id]]})"
451
- parent.send("#{association[:attribute]}=", reactive_records[association[:child_id]])
452
- puts "updated"
453
- end
454
- end if associations
455
-
456
- puts "!!!!!!!!!!!!associations updated"
466
+ puts "!!!!!!!!!!!!associations updated"
457
467
 
458
- if save
468
+ #if true or save
459
469
 
460
- ActiveRecord::Base.transaction do
470
+ # ActiveRecord::Base.transaction do
461
471
 
462
472
  has_errors = false
463
473
 
474
+ puts "ready to start saving... dont_save_list = #{dont_save_list}"
475
+
464
476
  saved_models = reactive_records.collect do |reactive_record_id, model|
465
477
  puts "saving rr_id: #{reactive_record_id} model.object_id: #{model.object_id} frozen? <#{model.frozen?}>"
466
- if model.frozen?
478
+ if model and (model.frozen? or dont_save_list.include?(model))
467
479
  puts "validating frozen model #{model.class.name} #{model} (reactive_record_id = #{reactive_record_id})"
468
480
  valid = model.valid?
469
481
  puts "has_errors before = #{has_errors}, validate= #{validate}, !valid= #{!valid} (validate and !valid) #{validate and !valid}"
470
482
  has_errors ||= (validate and !valid)
471
483
  puts "validation complete errors = <#{!valid}>, #{model.errors.messages} has_errors #{has_errors}"
472
484
  [reactive_record_id, model.class.name, model.attributes, (valid ? nil : model.errors.messages)]
473
- elsif !model.id or model.changed?
485
+ elsif model and (!model.id or model.changed?)
474
486
  puts "saving #{model.class.name} #{model} (reactive_record_id = #{reactive_record_id})"
475
487
  saved = model.check_permission_with_acting_user(acting_user, new_models.include?(model) ? :create_permitted? : :update_permitted?).save(validate: validate)
476
488
  has_errors ||= !saved
@@ -482,16 +494,19 @@ module ReactiveRecord
482
494
 
483
495
  raise "Could not save all models" if has_errors
484
496
 
485
- end
497
+ # end
498
+ if save
486
499
 
487
- {success: true, saved_models: saved_models }
500
+ {success: true, saved_models: saved_models }
488
501
 
489
- else
502
+ else
490
503
 
491
- vectors
504
+ vectors.each { |vector, model| model.reload unless model.nil? or model.new_record? }
505
+ vectors
492
506
 
493
- end
507
+ end
494
508
 
509
+ end
495
510
 
496
511
  rescue Exception => e
497
512
  puts "exception #{e}"
@@ -115,7 +115,9 @@ module ReactiveRecord
115
115
  end
116
116
 
117
117
  def loaded_at(loaded_at)
118
+ puts "loaded_at started"
118
119
  React::State.set_state(self, :loaded_at, loaded_at)
120
+ puts "loaded_at done"
119
121
  @is_loading = false
120
122
  end
121
123
 
@@ -106,9 +106,14 @@ module ReactiveRecord
106
106
  end
107
107
 
108
108
  def self.[](models, associations, vectors, acting_user)
109
- cache = new(acting_user, ReactiveRecord::Base.save_records(models, associations, acting_user, false, false))
110
- vectors.each { |vector| cache[*vector] }
111
- cache.as_json
109
+ result = nil
110
+ ActiveRecord::Base.transaction do
111
+ cache = new(acting_user, ReactiveRecord::Base.save_records(models, associations, acting_user, false, false))
112
+ vectors.each { |vector| cache[*vector] }
113
+ result = cache.as_json
114
+ raise ActiveRecord::Rollback
115
+ end
116
+ result
112
117
  end
113
118
 
114
119
  def clear_requests
@@ -182,7 +187,7 @@ module ReactiveRecord
182
187
  self
183
188
  end
184
189
  rescue Exception => e
185
- #binding.pry if cache_item.value and cache_item.value != []
190
+ binding.pry if cache_item.value and cache_item.value != []
186
191
  raise "ReactiveRecord exception caught when applying #{method} to db objects #{e}" if cache_item.value and cache_item.value != []
187
192
  representative
188
193
  end
@@ -253,7 +258,7 @@ module ReactiveRecord
253
258
  end
254
259
  elsif @ar_object.class < ActiveRecord::Base and children.is_a? Hash
255
260
  @parent.as_hash({jsonize(method) => children.merge({
256
- :id => [@ar_object.id],
261
+ :id => (method.is_a?(Array) && method.first == "new") ? [nil] : [@ar_object.id],
257
262
  @ar_object.class.inheritance_column => [@ar_object[@ar_object.class.inheritance_column]],
258
263
  })})
259
264
  elsif method == "*all"
@@ -323,6 +328,9 @@ module ReactiveRecord
323
328
  load_from_json(value, new_target) if new_target
324
329
  end
325
330
  #target.save if target.respond_to? :save
331
+ rescue Exception => e
332
+ `debugger`
333
+ nil
326
334
  end
327
335
 
328
336
 
@@ -1,3 +1,3 @@
1
1
  module ReactiveRecord
2
- VERSION = "0.7.26"
2
+ VERSION = "0.7.27"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reactive-record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.26
4
+ version: 0.7.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitch VanDuyn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-14 00:00:00.000000000 Z
11
+ date: 2015-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails