Пример #1
0
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.")
Пример #2
0
    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))