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 +4 -4
- data/lib/reactive_record/active_record/reactive_record/base.rb +8 -6
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +55 -40
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +2 -0
- data/lib/reactive_record/server_data_cache.rb +13 -5
- data/lib/reactive_record/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d768497702030401fd48ec8d9149f4c74e20c725
         | 
| 4 | 
            +
              data.tar.gz: 4fbf024a9ade1663b8b2b0106f982d39b5642c92
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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  | 
| 193 | 
            -
                            attributes[attribute].attributes[inverse_of].delete(@ar_instance)  | 
| 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  | 
| 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 | 
            -
                     | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 468 | 
            +
                      #if true or save
         | 
| 459 469 |  | 
| 460 | 
            -
             | 
| 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 | 
            -
             | 
| 500 | 
            +
                        {success: true, saved_models: saved_models }
         | 
| 488 501 |  | 
| 489 | 
            -
             | 
| 502 | 
            +
                      else
         | 
| 490 503 |  | 
| 491 | 
            -
             | 
| 504 | 
            +
                        vectors.each { |vector, model| model.reload unless model.nil? or model.new_record? }
         | 
| 505 | 
            +
                        vectors
         | 
| 492 506 |  | 
| 493 | 
            -
             | 
| 507 | 
            +
                      end
         | 
| 494 508 |  | 
| 509 | 
            +
                    end
         | 
| 495 510 |  | 
| 496 511 | 
             
                  rescue Exception => e
         | 
| 497 512 | 
             
                    puts "exception #{e}"
         | 
| @@ -106,9 +106,14 @@ module ReactiveRecord | |
| 106 106 | 
             
                    end
         | 
| 107 107 |  | 
| 108 108 | 
             
                    def self.[](models, associations, vectors, acting_user)
         | 
| 109 | 
            -
                       | 
| 110 | 
            -
                       | 
| 111 | 
            -
             | 
| 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 | 
            -
                               | 
| 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 |  | 
    
        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. | 
| 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- | 
| 11 | 
            +
            date: 2015-10-16 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         |