iknow_view_models 3.3.0 → 3.3.1
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/iknow_view_models/version.rb +1 -1
- data/lib/view_model/active_record/collection_nested_controller.rb +10 -10
- data/lib/view_model/active_record/nested_controller_base.rb +9 -5
- data/lib/view_model/active_record/singular_nested_controller.rb +6 -6
- data/test/unit/view_model/active_record/has_many_test.rb +33 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 169b16cc95d420bc248b0d201edecc825ce67cdcaf8a8bc743083685731017bf
         | 
| 4 | 
            +
              data.tar.gz: 974ba2af7789e733a3aecdb989e0508147c9d415332398a7ab024d212babef9e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a4dc1e63038e01b6af791ef0551f7f79ac19cbe0ba9b47a6d1fa3367200417afe0b3bfaa9951b8c7287c97d821139e217521229c4bdee34c045da70bcbf0d052
         | 
| 7 | 
            +
              data.tar.gz: 63bab618289cf6e24e26ffd7be8d6a2a7571d220c1a1c5b05bb45d52c778bab4aff751f4c3853ce58226c1830de3dfebfa0296db8ad070b5e8e696224ccb3bc7
         | 
| @@ -22,23 +22,23 @@ module ViewModel::ActiveRecord::CollectionNestedController | |
| 22 22 | 
             
              extend ActiveSupport::Concern
         | 
| 23 23 | 
             
              include ViewModel::ActiveRecord::NestedControllerBase
         | 
| 24 24 |  | 
| 25 | 
            -
              def index_associated(scope: nil, serialize_context: new_serialize_context, &block)
         | 
| 26 | 
            -
                show_association(scope: scope, serialize_context: serialize_context, &block)
         | 
| 25 | 
            +
              def index_associated(scope: nil, serialize_context: new_serialize_context, lock_owner: nil, &block)
         | 
| 26 | 
            +
                show_association(scope: scope, serialize_context: serialize_context, lock_owner: lock_owner, &block)
         | 
| 27 27 | 
             
              end
         | 
| 28 28 |  | 
| 29 29 | 
             
              # Deserialize items of the associated type and associate them with the owner,
         | 
| 30 30 | 
             
              # replacing previously associated items.
         | 
| 31 | 
            -
              def replace(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, &block)
         | 
| 32 | 
            -
                write_association(serialize_context: serialize_context, deserialize_context: deserialize_context, &block)
         | 
| 31 | 
            +
              def replace(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil, &block)
         | 
| 32 | 
            +
                write_association(serialize_context: serialize_context, deserialize_context: deserialize_context, lock_owner: lock_owner, &block)
         | 
| 33 33 | 
             
              end
         | 
| 34 34 |  | 
| 35 | 
            -
              def disassociate_all(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 36 | 
            -
                destroy_association(true, serialize_context: serialize_context, deserialize_context: deserialize_context)
         | 
| 35 | 
            +
              def disassociate_all(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 36 | 
            +
                destroy_association(true, serialize_context: serialize_context, deserialize_context: deserialize_context, lock_owner: lock_owner)
         | 
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 39 | 
             
              # Deserialize items of the associated type and append them to the owner's
         | 
| 40 40 | 
             
              # collection.
         | 
| 41 | 
            -
              def append(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 41 | 
            +
              def append(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 42 42 | 
             
                assoc_view = nil
         | 
| 43 43 | 
             
                pre_rendered = owner_viewmodel.transaction do
         | 
| 44 44 | 
             
                  update_hash, refs = parse_viewmodel_updates
         | 
| @@ -50,7 +50,7 @@ module ViewModel::ActiveRecord::CollectionNestedController | |
| 50 50 | 
             
                    raise ViewModel::DeserializationError::InvalidSyntax.new('Can not provide both `before` and `after` anchors for a collection append')
         | 
| 51 51 | 
             
                  end
         | 
| 52 52 |  | 
| 53 | 
            -
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
         | 
| 53 | 
            +
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, lock: lock_owner, serialize_context: serialize_context)
         | 
| 54 54 |  | 
| 55 55 | 
             
                  assoc_view = owner_view.append_associated(association_name,
         | 
| 56 56 | 
             
                                                            update_hash,
         | 
| @@ -69,9 +69,9 @@ module ViewModel::ActiveRecord::CollectionNestedController | |
| 69 69 | 
             
                assoc_view
         | 
| 70 70 | 
             
              end
         | 
| 71 71 |  | 
| 72 | 
            -
              def disassociate(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 72 | 
            +
              def disassociate(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 73 73 | 
             
                owner_viewmodel.transaction do
         | 
| 74 | 
            -
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
         | 
| 74 | 
            +
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, lock: lock_owner, serialize_context: serialize_context)
         | 
| 75 75 | 
             
                  owner_view.delete_associated(association_name, viewmodel_id, type: viewmodel_class, deserialize_context: deserialize_context)
         | 
| 76 76 | 
             
                  render_viewmodel(nil)
         | 
| 77 77 | 
             
                end
         | 
| @@ -9,10 +9,10 @@ module ViewModel::ActiveRecord::NestedControllerBase | |
| 9 9 |  | 
| 10 10 | 
             
              protected
         | 
| 11 11 |  | 
| 12 | 
            -
              def show_association(scope: nil, serialize_context: new_serialize_context)
         | 
| 12 | 
            +
              def show_association(scope: nil, serialize_context: new_serialize_context, lock_owner: nil)
         | 
| 13 13 | 
             
                associated_views = nil
         | 
| 14 14 | 
             
                pre_rendered = owner_viewmodel.transaction do
         | 
| 15 | 
            -
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
         | 
| 15 | 
            +
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, lock: lock_owner, serialize_context: serialize_context)
         | 
| 16 16 | 
             
                  ViewModel::Callbacks.wrap_serialize(owner_view, context: serialize_context) do
         | 
| 17 17 | 
             
                    # Association manipulation methods construct child contexts internally
         | 
| 18 18 | 
             
                    associated_views = owner_view.load_associated(association_name, scope: scope, serialize_context: serialize_context)
         | 
| @@ -27,12 +27,12 @@ module ViewModel::ActiveRecord::NestedControllerBase | |
| 27 27 | 
             
                associated_views
         | 
| 28 28 | 
             
              end
         | 
| 29 29 |  | 
| 30 | 
            -
              def write_association(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 30 | 
            +
              def write_association(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 31 31 | 
             
                association_view = nil
         | 
| 32 32 | 
             
                pre_rendered = owner_viewmodel.transaction do
         | 
| 33 33 | 
             
                  update_hash, refs = parse_viewmodel_updates
         | 
| 34 34 |  | 
| 35 | 
            -
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
         | 
| 35 | 
            +
                  owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, lock: lock_owner, serialize_context: serialize_context)
         | 
| 36 36 |  | 
| 37 37 | 
             
                  association_view = owner_view.replace_associated(association_name, update_hash,
         | 
| 38 38 | 
             
                                                                   references: refs,
         | 
| @@ -49,7 +49,11 @@ module ViewModel::ActiveRecord::NestedControllerBase | |
| 49 49 | 
             
                association_view
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 | 
            -
              def destroy_association(collection, serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 52 | 
            +
              def destroy_association(collection, serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 53 | 
            +
                if lock_owner
         | 
| 54 | 
            +
                  owner_viewmodel.find(owner_viewmodel_id, eager_include: false, lock: lock_owner, serialize_context: serialize_context)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 53 57 | 
             
                empty_update = collection ? [] : nil
         | 
| 54 58 | 
             
                owner_viewmodel.deserialize_from_view(owner_update_hash(empty_update),
         | 
| 55 59 | 
             
                                                      deserialize_context: deserialize_context)
         | 
| @@ -20,15 +20,15 @@ module ViewModel::ActiveRecord::SingularNestedController | |
| 20 20 | 
             
              extend ActiveSupport::Concern
         | 
| 21 21 | 
             
              include ViewModel::ActiveRecord::NestedControllerBase
         | 
| 22 22 |  | 
| 23 | 
            -
              def show_associated(scope: nil, serialize_context: new_serialize_context,  | 
| 24 | 
            -
                show_association(scope: scope, serialize_context: serialize_context, &block)
         | 
| 23 | 
            +
              def show_associated(scope: nil, serialize_context: new_serialize_context, lock_owner: nil, &block)
         | 
| 24 | 
            +
                show_association(scope: scope, serialize_context: serialize_context, lock_owner: lock_owner, &block)
         | 
| 25 25 | 
             
              end
         | 
| 26 26 |  | 
| 27 | 
            -
              def create_associated(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, &block)
         | 
| 28 | 
            -
                write_association(serialize_context: serialize_context, deserialize_context: deserialize_context, &block)
         | 
| 27 | 
            +
              def create_associated(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil, &block)
         | 
| 28 | 
            +
                write_association(serialize_context: serialize_context, deserialize_context: deserialize_context, lock_owner: lock_owner, &block)
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| 31 | 
            -
              def destroy_associated(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
         | 
| 32 | 
            -
                destroy_association(false, serialize_context: serialize_context, deserialize_context: deserialize_context)
         | 
| 31 | 
            +
              def destroy_associated(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context, lock_owner: nil)
         | 
| 32 | 
            +
                destroy_association(false, serialize_context: serialize_context, deserialize_context: deserialize_context, lock_owner: lock_owner)
         | 
| 33 33 | 
             
              end
         | 
| 34 34 | 
             
            end
         | 
| @@ -808,6 +808,39 @@ class ViewModel::ActiveRecord::HasManyTest < ActiveSupport::TestCase | |
| 808 808 | 
             
                assert_match(/Removed entities must have only _type and id fields/, ex.message)
         | 
| 809 809 | 
             
              end
         | 
| 810 810 |  | 
| 811 | 
            +
              def test_functional_update_move
         | 
| 812 | 
            +
                c1_id, c2_id, c3_id = @model1.children.pluck(:id)
         | 
| 813 | 
            +
                c4_id, c5_id = @model2.children.pluck(:id)
         | 
| 814 | 
            +
             | 
| 815 | 
            +
                remove_fupdate = build_fupdate do
         | 
| 816 | 
            +
                  remove([{ '_type' => 'Child', 'id' => c2_id }])
         | 
| 817 | 
            +
                end
         | 
| 818 | 
            +
             | 
| 819 | 
            +
                append_fupdate = build_fupdate do
         | 
| 820 | 
            +
                  append([{ '_type' => 'Child', 'id' => c2_id }])
         | 
| 821 | 
            +
                end
         | 
| 822 | 
            +
             | 
| 823 | 
            +
                move_view = [
         | 
| 824 | 
            +
                  {
         | 
| 825 | 
            +
                    '_type' => 'Model',
         | 
| 826 | 
            +
                    'id'       => @model1.id,
         | 
| 827 | 
            +
                    'children' => remove_fupdate
         | 
| 828 | 
            +
                  },
         | 
| 829 | 
            +
                  {
         | 
| 830 | 
            +
                    '_type' => 'Model',
         | 
| 831 | 
            +
                    'id'       => @model2.id,
         | 
| 832 | 
            +
                    'children' => append_fupdate
         | 
| 833 | 
            +
                  }
         | 
| 834 | 
            +
                ]
         | 
| 835 | 
            +
             | 
| 836 | 
            +
                viewmodel_class.deserialize_from_view(move_view)
         | 
| 837 | 
            +
                @model1.reload
         | 
| 838 | 
            +
                @model2.reload
         | 
| 839 | 
            +
             | 
| 840 | 
            +
                assert_equal([c1_id, c3_id], @model1.children.pluck(:id))
         | 
| 841 | 
            +
                assert_equal([c4_id, c5_id, c2_id], @model2.children.pluck(:id))
         | 
| 842 | 
            +
              end
         | 
| 843 | 
            +
             | 
| 811 844 | 
             
              def test_functional_update_update_success
         | 
| 812 845 | 
             
                c1_id, c2_id, c3_id = @model1.children.pluck(:id)
         | 
| 813 846 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: iknow_view_models
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.3. | 
| 4 | 
            +
              version: 3.3.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - iKnow Team
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021-04- | 
| 11 | 
            +
            date: 2021-04-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         |