def test_patch_integer_property(self): d = document.Document() assert not d.roots assert len(d._all_models) == 0 root1 = SomeModelInTestDocument(foo=42) root2 = SomeModelInTestDocument(foo=43) child1 = SomeModelInTestDocument(foo=44) root1.child = child1 root2.child = child1 d.add_root(root1) d.add_root(root2) assert len(d.roots) == 2 event1 = ModelChangedEvent(d, root1, 'foo', root1.foo, 57, 57) patch1, buffers = process_document_events([event1]) d.apply_json_patch_string(patch1) assert root1.foo == 57 event2 = ModelChangedEvent(d, child1, 'foo', child1.foo, 67, 67) patch2, buffers = process_document_events([event2]) d.apply_json_patch_string(patch2) assert child1.foo == 67
def patch_test(new_value): serializable_new = root1.lookup('foo').property.to_serializable( root1, 'foo', new_value) event1 = ModelChangedEvent(d, root1, 'foo', root1.foo, new_value, serializable_new) patch1, buffers = process_document_events([event1]) d.apply_json_patch_string(patch1) if isinstance(new_value, dict): expected = copy(new_value) if 'units' not in expected: expected['units'] = root1.foo_units assert expected == root1.lookup('foo').serializable_value( root1) else: assert new_value == root1.foo
def test_patch_integer_property(self) -> None: d = document.Document() assert not d.roots assert len(d.models) == 0 root1 = SomeModelInTestDocument(foo=42) root2 = SomeModelInTestDocument(foo=43) child1 = SomeModelInTestDocument(foo=44) root1.child = child1 root2.child = child1 d.add_root(root1) d.add_root(root2) assert len(d.roots) == 2 event1 = ModelChangedEvent(d, root1, 'foo', 57) patch1 = patch_doc.create([event1]).content d.apply_json_patch(patch1) assert root1.foo == 57 event2 = ModelChangedEvent(d, child1, 'foo', 67) patch2 = patch_doc.create([event2]).content d.apply_json_patch(patch2) assert child1.foo == 67
def update_model(): update = {k: v for msg in msgs for k, v in msg.items()} if comm: for attr, new in update.items(): setattr(model, attr, new) event = doc._held_events[ -1] if doc._held_events else None if (event and event.model is model and event.attr == attr and event.new is new): continue # If change did not trigger event trigger it manually old = getattr(model, attr) serializable_new = model.lookup( attr).serializable_value(model) event = ModelChangedEvent(doc, model, attr, old, new, serializable_new) _combine_document_events(event, doc._held_events) else: model.update(**update)
def test_create_then_apply_model_changed(self) -> None: sample = self._sample_doc() foos = [] for r in sample.roots: foos.append(r.foo) assert foos == [ 2, 2 ] obj = next(iter(sample.roots)) assert obj.foo == 2 event = ModelChangedEvent(sample, obj, 'foo', 42) msg = proto.create("PATCH-DOC", [event]) copy = document.Document.from_json(sample.to_json()) msg.apply_to_document(copy) foos = [] for r in copy.roots: foos.append(r.foo) foos.sort() assert foos == [ 2, 42 ]
def test_create_model_changed(self) -> None: sample = self._sample_doc() obj = next(iter(sample.roots)) event = ModelChangedEvent(sample, obj, 'foo', 42) proto.create("PATCH-DOC", [event])
def test_patch_event_contains_setter(self) -> None: sample = self._sample_doc() root = None other_root = None for r in sample.roots: if r.child is not None: root = r else: other_root = r assert root is not None assert other_root is not None new_child = AnotherModelInTestPatchDoc(bar=56) cds = ColumnDataSource(data={'a': np.array([0., 1., 2.])}) sample.add_root(cds) mock_session = object() def sample_document_callback_assert(event): """Asserts that setter is correctly set on event""" assert event.setter is mock_session sample.on_change(sample_document_callback_assert) # Model property changed event = ModelChangedEvent(sample, root, 'child', new_child) msg = proto.create("PATCH-DOC", [event]) msg.apply_to_document(sample, mock_session) assert msg.buffers == [] # RootAdded event2 = RootAddedEvent(sample, root) msg2 = proto.create("PATCH-DOC", [event2]) msg2.apply_to_document(sample, mock_session) assert msg2.buffers == [] # RootRemoved event3 = RootRemovedEvent(sample, root) msg3 = proto.create("PATCH-DOC", [event3]) msg3.apply_to_document(sample, mock_session) assert msg3.buffers == [] # ColumnsStreamed event4 = ColumnsStreamedEvent(sample, cds, "data", {"a": [3]}, None, mock_session) msg4 = proto.create("PATCH-DOC", [event4]) msg4.apply_to_document(sample, mock_session) assert msg4.buffers == [] # ColumnsPatched event5 = ColumnsPatchedEvent(sample, cds, "data", {"a": [(0, 11)]}) msg5 = proto.create("PATCH-DOC", [event5]) msg5.apply_to_document(sample, mock_session) assert msg5.buffers == [] # ColumnDataChanged event7 = ColumnDataChangedEvent(sample, cds, "data") msg7 = proto.create("PATCH-DOC", [event7]) msg7.apply_to_document(sample, mock_session) assert len(msg7.buffers) == 1 # reports CDS buffer *as it is* Normally events called by setter and # value in local object would have been already mutated. [buf] = msg7.buffers assert bytes(buf.data) == np.array([11., 1., 2., 3]).tobytes()
def test_patch_event_contains_setter(self) -> None: sample = self._sample_doc() root = None other_root = None for r in sample.roots: if r.child is not None: root = r else: other_root = r assert root is not None assert other_root is not None new_child = AnotherModelInTestPatchDoc(bar=56) cds = ColumnDataSource(data={'a': np.array([0., 1., 2.])}) sample.add_root(cds) mock_session = object() def sample_document_callback_assert(event): """Asserts that setter is correctly set on event""" assert event.setter is mock_session sample.on_change(sample_document_callback_assert) # Model property changed event = ModelChangedEvent(sample, root, 'child', root.child, new_child, new_child) msg = proto.create("PATCH-DOC", [event]) msg.apply_to_document(sample, mock_session) assert msg.buffers == [] # RootAdded event2 = RootAddedEvent(sample, root) msg2 = proto.create("PATCH-DOC", [event2]) msg2.apply_to_document(sample, mock_session) assert msg2.buffers == [] # RootRemoved event3 = RootRemovedEvent(sample, root) msg3 = proto.create("PATCH-DOC", [event3]) msg3.apply_to_document(sample, mock_session) assert msg3.buffers == [] # ColumnsStreamed event4 = ModelChangedEvent(sample, cds, 'data', 10, None, None, hint=ColumnsStreamedEvent( sample, cds, {"a": [3]}, None, mock_session)) msg4 = proto.create("PATCH-DOC", [event4]) msg4.apply_to_document(sample, mock_session) assert msg4.buffers == [] # ColumnsPatched event5 = ModelChangedEvent(sample, cds, 'data', 10, None, None, hint=ColumnsPatchedEvent( sample, cds, {"a": [(0, 11)]})) msg5 = proto.create("PATCH-DOC", [event5]) msg5.apply_to_document(sample, mock_session) assert msg5.buffers == [] # ColumnDataChanged, use_buffers=False event6 = ModelChangedEvent(sample, cds, 'data', {'a': np.array([0., 1.])}, None, None, hint=ColumnDataChangedEvent(sample, cds)) msg6 = proto.create("PATCH-DOC", [event6], use_buffers=False) msg6.apply_to_document(sample, mock_session) assert msg6.buffers == [] print(cds.data) # ColumnDataChanged, use_buffers=True event7 = ModelChangedEvent(sample, cds, 'data', {'a': np.array([0., 1.])}, None, None, hint=ColumnDataChangedEvent(sample, cds)) msg7 = proto.create("PATCH-DOC", [event7]) # can't test apply, doc not set up to *receive* binary buffers # msg7.apply_to_document(sample, mock_session) assert len(msg7.buffers) == 1 buf = msg7.buffers.pop() assert len(buf) == 2 assert isinstance(buf[0], dict) assert list(buf[0]) == ['id'] # reports CDS buffer *as it is* Normally events called by setter and # value in local object would have been already mutated. assert buf[1] == np.array([11., 1., 2., 3]).tobytes()
def test_create_model_changed(self): sample = self._sample_doc() obj = next(iter(sample.roots)) event = ModelChangedEvent(sample, obj, 'foo', obj.foo, 42, 42) Protocol("1.0").create("PATCH-DOC", [event])
def test_patch_event_contains_setter(self): sample = self._sample_doc() root = None other_root = None for r in sample.roots: if r.child is not None: root = r else: other_root = r assert root is not None assert other_root is not None new_child = AnotherModelInTestPatchDoc(bar=56) cds = ColumnDataSource(data={'a': [0, 1, 2]}) sample.add_root(cds) mock_session = object() def sample_document_callback_assert(event): """Asserts that setter is correctly set on event""" assert event.setter is mock_session sample.on_change(sample_document_callback_assert) # Model property changed event = ModelChangedEvent(sample, root, 'child', root.child, new_child, new_child) msg = Protocol("1.0").create("PATCH-DOC", [event]) msg.apply_to_document(sample, mock_session) # RootAdded event2 = RootAddedEvent(sample, root) msg2 = Protocol("1.0").create("PATCH-DOC", [event2]) msg2.apply_to_document(sample, mock_session) # RootRemoved event3 = RootRemovedEvent(sample, root) msg3 = Protocol("1.0").create("PATCH-DOC", [event3]) msg3.apply_to_document(sample, mock_session) # ColumnsStreamed event4 = ModelChangedEvent(sample, cds, 'data', 10, None, None, hint=ColumnsStreamedEvent( sample, cds, {"a": [3]}, None, mock_session)) msg4 = Protocol("1.0").create("PATCH-DOC", [event4]) msg4.apply_to_document(sample, mock_session) # ColumnsPatched event5 = ModelChangedEvent(sample, cds, 'data', 10, None, None, hint=ColumnsPatchedEvent( sample, cds, {"a": [(0, 11)]})) msg5 = Protocol("1.0").create("PATCH-DOC", [event5]) msg5.apply_to_document(sample, mock_session)