def compose_deltas(old_delta, new_delta): """Combines new_delta onto old_delta if possible. If combination takes place, returns old_delta, since it has the combined data. If not, returns new_delta. """ new_delta_type = new_delta.WhichOneof("type") if new_delta_type == "new_element": return new_delta elif new_delta_type == "new_block": return new_delta elif new_delta_type == "add_rows": import streamlit.elements.data_frame_proto as data_frame_proto # We should make data_frame_proto.add_rows *not* mutate any of the # inputs. In the meantime, we have to deepcopy the input that will be # mutated. composed_delta = copy.deepcopy(old_delta) data_frame_proto.add_rows(composed_delta, new_delta, name=new_delta.add_rows.name) return composed_delta LOGGER.error("Old delta: %s;\nNew delta: %s;", old_delta, new_delta) raise NotImplementedError("Need to implement the compose code.")
def test_add_rows(self): """Test streamlit.data_frame_proto._add_rows.""" # Generic Data aa = AnyArray() aa.int64s.data.extend([1, 2]) cell_style = CellStyle() cell_style.css.extend([_css_style("color", "black")]) style = CellStyleArray() style.styles.extend([cell_style]) # Delta DataFrame dt1 = Delta() dt1.new_element.data_frame.data.cols.extend([aa]) dt1.new_element.data_frame.index.plain_index.data.int64s.data.extend([3, 4]) dt1.new_element.data_frame.columns.plain_index.data.int64s.data.extend([5, 6]) dt1.new_element.data_frame.style.cols.extend([style]) dt2 = Delta() dt2.new_element.data_frame.data.cols.extend([aa]) dt2.new_element.data_frame.index.plain_index.data.int64s.data.extend([3, 4]) dt2.new_element.data_frame.columns.plain_index.data.int64s.data.extend([5, 6]) dt2.new_element.data_frame.style.cols.extend([style]) combined = Delta() aa_combined = AnyArray() aa_combined.int64s.data.extend([1, 2, 1, 2]) style_combined = CellStyleArray() style_combined.styles.extend([cell_style, cell_style]) combined.new_element.data_frame.data.cols.extend([aa_combined]) row_index = combined.new_element.data_frame.index.plain_index row_index.data.int64s.data.extend([3, 4, 3, 4]) col_index = combined.new_element.data_frame.columns.plain_index col_index.data.int64s.data.extend([5, 6]) combined.new_element.data_frame.style.cols.extend([style_combined]) # Test both not empty data_frame_proto.add_rows(dt1, dt2) self.assertEqual(dt1, combined) # Test one empty dt0 = Delta() dt0.new_element.data_frame.data.cols.extend([]) data_frame_proto.add_rows(dt0, dt1) self.assertEqual(str(dt0), str(dt1)) # Test both empty empty0 = Delta() empty0.new_element.data_frame.data.cols.extend([]) empty1 = Delta() empty1.new_element.data_frame.data.cols.extend([]) data_frame_proto.add_rows(empty0, empty1) self.assertEqual(str(empty0), str(empty1)) # Test different data shapes diff0 = Delta() diff0.new_element.data_frame.data.cols.extend([aa, aa]) diff1 = Delta() diff1.new_element.data_frame.data.cols.extend([aa]) with pytest.raises(ValueError) as e: data_frame_proto.add_rows(diff0, diff1) err_msg = "Dataframes have incompatible shapes" self.assertEqual(err_msg, str(e.value))