test_array_dict_data_accessor.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. # Copyright 2021-2025 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. import os
  12. from importlib import util
  13. import pandas
  14. from taipy.gui import Gui
  15. from taipy.gui.data.array_dict_data_accessor import _ArrayDictDataAccessor
  16. from taipy.gui.data.data_format import _DataFormat
  17. from taipy.gui.utils import _MapDict
  18. an_array = [1, 2, 3]
  19. def test_simple_data(gui: Gui, helpers):
  20. accessor = _ArrayDictDataAccessor(gui)
  21. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  22. assert ret_data
  23. value = ret_data["value"]
  24. assert value
  25. assert value["rowcount"] == 3
  26. data = value["data"]
  27. assert len(data) == 3
  28. def test_simple_data_with_arrow(gui: Gui, helpers):
  29. if util.find_spec("pyarrow"):
  30. accessor = _ArrayDictDataAccessor(gui)
  31. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.APACHE_ARROW)
  32. assert ret_data
  33. value = ret_data["value"]
  34. assert value
  35. assert value["rowcount"] == 3
  36. data = value["data"]
  37. assert isinstance(data, bytes)
  38. def test_slice(gui: Gui, helpers):
  39. accessor = _ArrayDictDataAccessor(gui)
  40. value = accessor.get_data("x", an_array, {"start": 0, "end": 1}, _DataFormat.JSON)["value"]
  41. assert value["rowcount"] == 3
  42. data = value["data"]
  43. assert len(data) == 2
  44. value = accessor.get_data("x", an_array, {"start": "0", "end": "1"}, _DataFormat.JSON)["value"]
  45. data = value["data"]
  46. assert len(data) == 2
  47. def test_sort(gui: Gui, helpers):
  48. accessor = _ArrayDictDataAccessor(gui)
  49. a_dict = {"name": ["A", "B", "C"], "value": [3, 2, 1]}
  50. query = {"columns": ["name", "value"], "start": 0, "end": -1, "orderby": "name", "sort": "desc"}
  51. data = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]["data"]
  52. assert data[0]["name"] == "C"
  53. def test_aggregate(gui: Gui, helpers, small_dataframe):
  54. accessor = _ArrayDictDataAccessor(gui)
  55. a_dict = {"name": ["A", "B", "C", "A"], "value": [3, 2, 1, 2]}
  56. query = {"columns": ["name", "value"], "start": 0, "end": -1, "aggregates": ["name"], "applies": {"value": "sum"}}
  57. value = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]
  58. assert value["rowcount"] == 3
  59. data = value["data"]
  60. agregValue = next(v.get("value") for v in data if v.get("name") == "A")
  61. assert agregValue == 5
  62. def test_array_of_array(gui: Gui, helpers, small_dataframe):
  63. accessor = _ArrayDictDataAccessor(gui)
  64. an_array = [[1, 2, 3], [2, 4, 6]]
  65. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  66. assert ret_data
  67. value = ret_data["value"]
  68. assert value
  69. assert value["rowcount"] == 2
  70. data = value["data"]
  71. assert len(data) == 2
  72. assert len(data[0]) == 4 # including _tp_index
  73. def test_empty_array(gui: Gui, helpers, small_dataframe):
  74. accessor = _ArrayDictDataAccessor(gui)
  75. an_array: list[str] = []
  76. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  77. assert ret_data
  78. value = ret_data["value"]
  79. assert value
  80. assert value["rowcount"] == 0
  81. data = value["data"]
  82. assert len(data) == 0
  83. def test_array_of_diff_array(gui: Gui, helpers, small_dataframe):
  84. accessor = _ArrayDictDataAccessor(gui)
  85. an_array = [[1, 2, 3], [2, 4]]
  86. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  87. assert ret_data
  88. value = ret_data["value"]
  89. assert value
  90. assert value["multi"] is True
  91. data = value["data"]
  92. assert len(data) == 2
  93. assert len(data[0]["0/0"]) == 3
  94. assert len(data[1]["1/0"]) == 2
  95. def test_array_of_dicts(gui: Gui, helpers, small_dataframe):
  96. accessor = _ArrayDictDataAccessor(gui)
  97. an_array_of_dicts = [
  98. {
  99. "temperatures": [
  100. [17.2, 27.4, 28.6, 21.5],
  101. [5.6, 15.1, 20.2, 8.1],
  102. [26.6, 22.8, 21.8, 24.0],
  103. [22.3, 15.5, 13.4, 19.6],
  104. [3.9, 18.9, 25.7, 9.8],
  105. ],
  106. "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
  107. },
  108. {"seasons": ["Winter", "Summer", "Spring", "Autumn"]},
  109. ]
  110. ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  111. assert ret_data
  112. value = ret_data["value"]
  113. assert value
  114. assert value["multi"] is True
  115. data = value["data"]
  116. assert len(data) == 2
  117. assert len(data[0]["temperatures"]) == 5
  118. assert len(data[1]["seasons"]) == 4
  119. def test_array_of_dicts_of_scalar(gui: Gui, helpers, small_dataframe):
  120. accessor = _ArrayDictDataAccessor(gui)
  121. an_array_of_dicts = [
  122. {
  123. "temperature": 17.2,
  124. "city": "Hanoi",
  125. },
  126. {
  127. "temperature": 5.62,
  128. "city": "Paris",
  129. },
  130. ]
  131. ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  132. assert ret_data
  133. value = ret_data["value"]
  134. assert value
  135. assert "multi" not in value
  136. data = value["data"]
  137. assert len(data) == 2
  138. assert len(data["temperature"]) == 2
  139. assert len(data["city"]) == 2
  140. def test_array_of_Mapdicts(gui: Gui, helpers, small_dataframe):
  141. accessor = _ArrayDictDataAccessor(gui)
  142. dict1 = _MapDict(
  143. {
  144. "temperatures": [
  145. [17.2, 27.4, 28.6, 21.5],
  146. [5.6, 15.1, 20.2, 8.1],
  147. [26.6, 22.8, 21.8, 24.0],
  148. [22.3, 15.5, 13.4, 19.6],
  149. [3.9, 18.9, 25.7, 9.8],
  150. ],
  151. "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
  152. }
  153. )
  154. dict2 = _MapDict({"seasons": ["Winter", "Summer", "Spring", "Autumn"]})
  155. ret_data = accessor.get_data("x", [dict1, dict2], {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  156. assert ret_data
  157. value = ret_data["value"]
  158. assert value
  159. assert value["multi"] is True
  160. data = value["data"]
  161. assert len(data) == 2
  162. assert len(data[0]["temperatures"]) == 5
  163. assert len(data[1]["seasons"]) == 4
  164. def test_array_of_Mapdicts_of_scalar(gui: Gui, helpers, small_dataframe):
  165. accessor = _ArrayDictDataAccessor(gui)
  166. an_array_of_dicts = [
  167. {
  168. "temperature": 17.2,
  169. "city": "Hanoi",
  170. },
  171. {
  172. "temperature": 5.62,
  173. "city": "Paris",
  174. },
  175. ]
  176. ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  177. assert ret_data
  178. value = ret_data["value"]
  179. assert value
  180. assert "multi" not in value
  181. data = value["data"]
  182. assert len(data) == 2
  183. assert len(data["temperature"]) == 2
  184. assert len(data["city"]) == 2
  185. def test_edit_dict(gui, small_dataframe):
  186. accessor = _ArrayDictDataAccessor(gui)
  187. pd = small_dataframe
  188. ln = len(pd["name"])
  189. assert pd["value"][0] != 10
  190. ret_data = accessor.on_edit(pd, {"index": 0, "col": "value", "value": 10})
  191. assert isinstance(ret_data, dict)
  192. assert len(ret_data["name"]) == ln
  193. assert ret_data["value"][0] == 10
  194. def test_delete_dict(gui, small_dataframe):
  195. accessor = _ArrayDictDataAccessor(gui)
  196. pd = small_dataframe
  197. ln = len(pd["name"])
  198. ret_data = accessor.on_delete(pd, {"index": 0})
  199. assert isinstance(ret_data, dict)
  200. assert len(ret_data["name"]) == ln - 1
  201. def test_add_dict(gui, small_dataframe):
  202. accessor = _ArrayDictDataAccessor(gui)
  203. pd = small_dataframe
  204. ln = len(pd["name"])
  205. ret_data = accessor.on_add(pd, {"index": 0})
  206. assert isinstance(ret_data, dict)
  207. assert len(ret_data["name"]) == ln + 1
  208. assert ret_data["value"][0] == 0
  209. assert ret_data["name"][0] == ""
  210. ret_data = accessor.on_add(pd, {"index": 2})
  211. assert isinstance(ret_data, dict)
  212. assert len(ret_data["name"]) == ln + 1
  213. assert ret_data["value"][2] == 0
  214. assert ret_data["name"][2] == ""
  215. ret_data = accessor.on_add(pd, {"index": 0}, ["New", 100])
  216. assert isinstance(ret_data, dict)
  217. assert len(ret_data["name"]) == ln + 1
  218. assert ret_data["value"][0] == 100
  219. assert ret_data["name"][0] == "New"
  220. ret_data = accessor.on_add(pd, {"index": 2}, ["New", 100])
  221. assert isinstance(ret_data, dict)
  222. assert len(ret_data["name"]) == ln + 1
  223. assert ret_data["value"][2] == 100
  224. assert ret_data["name"][2] == "New"
  225. def test_csv(gui, small_dataframe):
  226. accessor = _ArrayDictDataAccessor(gui)
  227. pd = small_dataframe
  228. path = accessor.to_csv("", pd)
  229. assert path is not None
  230. assert os.path.getsize(path) > 0
  231. def test__from_pandas_dict(gui, small_dataframe):
  232. accessor = _ArrayDictDataAccessor(gui)
  233. pd = small_dataframe
  234. ad = accessor._from_pandas(pandas.DataFrame(pd), dict)
  235. assert isinstance(ad, dict)
  236. assert len(ad) == 2
  237. assert len(ad["name"]) == len(pd["name"])
  238. assert len(ad["value"]) == len(pd["value"])
  239. assert ad["name"][0] == pd["name"][0]
  240. assert ad["value"][0] == pd["value"][0]
  241. assert ad["name"][-1] == pd["name"][-1]
  242. assert ad["value"][-1] == pd["value"][-1]
  243. def test__from_pandas_MapDict(gui, small_dataframe):
  244. accessor = _ArrayDictDataAccessor(gui)
  245. pd = small_dataframe
  246. ad = accessor._from_pandas(pandas.DataFrame(pd), _MapDict)
  247. assert isinstance(ad, _MapDict)
  248. assert len(ad) == 2
  249. assert len(ad["name"]) == len(pd["name"])
  250. assert len(ad["value"]) == len(pd["value"])
  251. assert ad["name"][0] == pd["name"][0]
  252. assert ad["value"][0] == pd["value"][0]
  253. assert ad["name"][-1] == pd["name"][-1]
  254. assert ad["value"][-1] == pd["value"][-1]
  255. def test__from_pandas_list(gui, small_dataframe):
  256. accessor = _ArrayDictDataAccessor(gui)
  257. pd = {"name": small_dataframe["name"]}
  258. ad = accessor._from_pandas(pandas.DataFrame(pd), list)
  259. assert isinstance(ad, list)
  260. assert len(ad) == 3
  261. assert ad[0] == pd["name"][0]