123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- # Copyright 2021-2025 Avaiga Private Limited
- #
- # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- # the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations under the License.
- import os
- from importlib import util
- import pandas
- from taipy.gui import Gui
- from taipy.gui.data.array_dict_data_accessor import _ArrayDictDataAccessor
- from taipy.gui.data.data_format import _DataFormat
- from taipy.gui.utils import _MapDict
- an_array = [1, 2, 3]
- def test_simple_data(gui: Gui, helpers):
- accessor = _ArrayDictDataAccessor(gui)
- ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["rowcount"] == 3
- data = value["data"]
- assert len(data) == 3
- def test_simple_data_with_arrow(gui: Gui, helpers):
- if util.find_spec("pyarrow"):
- accessor = _ArrayDictDataAccessor(gui)
- ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.APACHE_ARROW)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["rowcount"] == 3
- data = value["data"]
- assert isinstance(data, bytes)
- def test_slice(gui: Gui, helpers):
- accessor = _ArrayDictDataAccessor(gui)
- value = accessor.get_data("x", an_array, {"start": 0, "end": 1}, _DataFormat.JSON)["value"]
- assert value["rowcount"] == 3
- data = value["data"]
- assert len(data) == 2
- value = accessor.get_data("x", an_array, {"start": "0", "end": "1"}, _DataFormat.JSON)["value"]
- data = value["data"]
- assert len(data) == 2
- def test_sort(gui: Gui, helpers):
- accessor = _ArrayDictDataAccessor(gui)
- a_dict = {"name": ["A", "B", "C"], "value": [3, 2, 1]}
- query = {"columns": ["name", "value"], "start": 0, "end": -1, "orderby": "name", "sort": "desc"}
- data = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]["data"]
- assert data[0]["name"] == "C"
- def test_aggregate(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- a_dict = {"name": ["A", "B", "C", "A"], "value": [3, 2, 1, 2]}
- query = {"columns": ["name", "value"], "start": 0, "end": -1, "aggregates": ["name"], "applies": {"value": "sum"}}
- value = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]
- assert value["rowcount"] == 3
- data = value["data"]
- agregValue = next(v.get("value") for v in data if v.get("name") == "A")
- assert agregValue == 5
- def test_array_of_array(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array = [[1, 2, 3], [2, 4, 6]]
- ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["rowcount"] == 2
- data = value["data"]
- assert len(data) == 2
- assert len(data[0]) == 4 # including _tp_index
- def test_empty_array(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array: list[str] = []
- ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["rowcount"] == 0
- data = value["data"]
- assert len(data) == 0
- def test_array_of_diff_array(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array = [[1, 2, 3], [2, 4]]
- ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["multi"] is True
- data = value["data"]
- assert len(data) == 2
- assert len(data[0]["0/0"]) == 3
- assert len(data[1]["1/0"]) == 2
- def test_array_of_dicts(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array_of_dicts = [
- {
- "temperatures": [
- [17.2, 27.4, 28.6, 21.5],
- [5.6, 15.1, 20.2, 8.1],
- [26.6, 22.8, 21.8, 24.0],
- [22.3, 15.5, 13.4, 19.6],
- [3.9, 18.9, 25.7, 9.8],
- ],
- "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
- },
- {"seasons": ["Winter", "Summer", "Spring", "Autumn"]},
- ]
- ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["multi"] is True
- data = value["data"]
- assert len(data) == 2
- assert len(data[0]["temperatures"]) == 5
- assert len(data[1]["seasons"]) == 4
- def test_array_of_dicts_of_scalar(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array_of_dicts = [
- {
- "temperature": 17.2,
- "city": "Hanoi",
- },
- {
- "temperature": 5.62,
- "city": "Paris",
- },
- ]
- ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert "multi" not in value
- data = value["data"]
- assert len(data) == 2
- assert len(data["temperature"]) == 2
- assert len(data["city"]) == 2
- def test_array_of_Mapdicts(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- dict1 = _MapDict(
- {
- "temperatures": [
- [17.2, 27.4, 28.6, 21.5],
- [5.6, 15.1, 20.2, 8.1],
- [26.6, 22.8, 21.8, 24.0],
- [22.3, 15.5, 13.4, 19.6],
- [3.9, 18.9, 25.7, 9.8],
- ],
- "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
- }
- )
- dict2 = _MapDict({"seasons": ["Winter", "Summer", "Spring", "Autumn"]})
- ret_data = accessor.get_data("x", [dict1, dict2], {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert value["multi"] is True
- data = value["data"]
- assert len(data) == 2
- assert len(data[0]["temperatures"]) == 5
- assert len(data[1]["seasons"]) == 4
- def test_array_of_Mapdicts_of_scalar(gui: Gui, helpers, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- an_array_of_dicts = [
- {
- "temperature": 17.2,
- "city": "Hanoi",
- },
- {
- "temperature": 5.62,
- "city": "Paris",
- },
- ]
- ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
- assert ret_data
- value = ret_data["value"]
- assert value
- assert "multi" not in value
- data = value["data"]
- assert len(data) == 2
- assert len(data["temperature"]) == 2
- assert len(data["city"]) == 2
- def test_edit_dict(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- ln = len(pd["name"])
- assert pd["value"][0] != 10
- ret_data = accessor.on_edit(pd, {"index": 0, "col": "value", "value": 10})
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln
- assert ret_data["value"][0] == 10
- def test_delete_dict(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- ln = len(pd["name"])
- ret_data = accessor.on_delete(pd, {"index": 0})
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln - 1
- def test_add_dict(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- ln = len(pd["name"])
- ret_data = accessor.on_add(pd, {"index": 0})
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln + 1
- assert ret_data["value"][0] == 0
- assert ret_data["name"][0] == ""
- ret_data = accessor.on_add(pd, {"index": 2})
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln + 1
- assert ret_data["value"][2] == 0
- assert ret_data["name"][2] == ""
- ret_data = accessor.on_add(pd, {"index": 0}, ["New", 100])
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln + 1
- assert ret_data["value"][0] == 100
- assert ret_data["name"][0] == "New"
- ret_data = accessor.on_add(pd, {"index": 2}, ["New", 100])
- assert isinstance(ret_data, dict)
- assert len(ret_data["name"]) == ln + 1
- assert ret_data["value"][2] == 100
- assert ret_data["name"][2] == "New"
- def test_csv(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- path = accessor.to_csv("", pd)
- assert path is not None
- assert os.path.getsize(path) > 0
- def test__from_pandas_dict(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- ad = accessor._from_pandas(pandas.DataFrame(pd), dict)
- assert isinstance(ad, dict)
- assert len(ad) == 2
- assert len(ad["name"]) == len(pd["name"])
- assert len(ad["value"]) == len(pd["value"])
- assert ad["name"][0] == pd["name"][0]
- assert ad["value"][0] == pd["value"][0]
- assert ad["name"][-1] == pd["name"][-1]
- assert ad["value"][-1] == pd["value"][-1]
- def test__from_pandas_MapDict(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = small_dataframe
- ad = accessor._from_pandas(pandas.DataFrame(pd), _MapDict)
- assert isinstance(ad, _MapDict)
- assert len(ad) == 2
- assert len(ad["name"]) == len(pd["name"])
- assert len(ad["value"]) == len(pd["value"])
- assert ad["name"][0] == pd["name"][0]
- assert ad["value"][0] == pd["value"][0]
- assert ad["name"][-1] == pd["name"][-1]
- assert ad["value"][-1] == pd["value"][-1]
- def test__from_pandas_list(gui, small_dataframe):
- accessor = _ArrayDictDataAccessor(gui)
- pd = {"name": small_dataframe["name"]}
- ad = accessor._from_pandas(pandas.DataFrame(pd), list)
- assert isinstance(ad, list)
- assert len(ad) == 3
- assert ad[0] == pd["name"][0]
|