test_array_dict_data_accessor.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. # Copyright 2021-2024 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. from taipy.gui import Gui
  14. from taipy.gui.data.array_dict_data_accessor import _ArrayDictDataAccessor
  15. from taipy.gui.data.data_format import _DataFormat
  16. from taipy.gui.utils import _MapDict
  17. an_array = [1, 2, 3]
  18. def test_simple_data(gui: Gui, helpers):
  19. accessor = _ArrayDictDataAccessor(gui)
  20. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  21. assert ret_data
  22. value = ret_data["value"]
  23. assert value
  24. assert value["rowcount"] == 3
  25. data = value["data"]
  26. assert len(data) == 3
  27. def test_simple_data_with_arrow(gui: Gui, helpers):
  28. if util.find_spec("pyarrow"):
  29. accessor = _ArrayDictDataAccessor(gui)
  30. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.APACHE_ARROW)
  31. assert ret_data
  32. value = ret_data["value"]
  33. assert value
  34. assert value["rowcount"] == 3
  35. data = value["data"]
  36. assert isinstance(data, bytes)
  37. def test_slice(gui: Gui, helpers):
  38. accessor = _ArrayDictDataAccessor(gui)
  39. value = accessor.get_data("x", an_array, {"start": 0, "end": 1}, _DataFormat.JSON)["value"]
  40. assert value["rowcount"] == 3
  41. data = value["data"]
  42. assert len(data) == 2
  43. value = accessor.get_data("x", an_array, {"start": "0", "end": "1"}, _DataFormat.JSON)["value"]
  44. data = value["data"]
  45. assert len(data) == 2
  46. def test_sort(gui: Gui, helpers):
  47. accessor = _ArrayDictDataAccessor(gui)
  48. a_dict = {"name": ["A", "B", "C"], "value": [3, 2, 1]}
  49. query = {"columns": ["name", "value"], "start": 0, "end": -1, "orderby": "name", "sort": "desc"}
  50. data = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]["data"]
  51. assert data[0]["name"] == "C"
  52. def test_aggregate(gui: Gui, helpers, small_dataframe):
  53. accessor = _ArrayDictDataAccessor(gui)
  54. a_dict = {"name": ["A", "B", "C", "A"], "value": [3, 2, 1, 2]}
  55. query = {"columns": ["name", "value"], "start": 0, "end": -1, "aggregates": ["name"], "applies": {"value": "sum"}}
  56. value = accessor.get_data("x", a_dict, query, _DataFormat.JSON)["value"]
  57. assert value["rowcount"] == 3
  58. data = value["data"]
  59. agregValue = next(v.get("value") for v in data if v.get("name") == "A")
  60. assert agregValue == 5
  61. def test_array_of_array(gui: Gui, helpers, small_dataframe):
  62. accessor = _ArrayDictDataAccessor(gui)
  63. an_array = [[1, 2, 3], [2, 4, 6]]
  64. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  65. assert ret_data
  66. value = ret_data["value"]
  67. assert value
  68. assert value["rowcount"] == 2
  69. data = value["data"]
  70. assert len(data) == 2
  71. assert len(data[0]) == 4 # including _tp_index
  72. def test_empty_array(gui: Gui, helpers, small_dataframe):
  73. accessor = _ArrayDictDataAccessor(gui)
  74. an_array: list[str] = []
  75. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1}, _DataFormat.JSON)
  76. assert ret_data
  77. value = ret_data["value"]
  78. assert value
  79. assert value["rowcount"] == 0
  80. data = value["data"]
  81. assert len(data) == 0
  82. def test_array_of_diff_array(gui: Gui, helpers, small_dataframe):
  83. accessor = _ArrayDictDataAccessor(gui)
  84. an_array = [[1, 2, 3], [2, 4]]
  85. ret_data = accessor.get_data("x", an_array, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  86. assert ret_data
  87. value = ret_data["value"]
  88. assert value
  89. assert value["multi"] is True
  90. data = value["data"]
  91. assert len(data) == 2
  92. assert len(data[0]["0/0"]) == 3
  93. assert len(data[1]["1/0"]) == 2
  94. def test_array_of_dicts(gui: Gui, helpers, small_dataframe):
  95. accessor = _ArrayDictDataAccessor(gui)
  96. an_array_of_dicts = [
  97. {
  98. "temperatures": [
  99. [17.2, 27.4, 28.6, 21.5],
  100. [5.6, 15.1, 20.2, 8.1],
  101. [26.6, 22.8, 21.8, 24.0],
  102. [22.3, 15.5, 13.4, 19.6],
  103. [3.9, 18.9, 25.7, 9.8],
  104. ],
  105. "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
  106. },
  107. {"seasons": ["Winter", "Summer", "Spring", "Autumn"]},
  108. ]
  109. ret_data = accessor.get_data("x", an_array_of_dicts, {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  110. assert ret_data
  111. value = ret_data["value"]
  112. assert value
  113. assert value["multi"] is True
  114. data = value["data"]
  115. assert len(data) == 2
  116. assert len(data[0]["temperatures"]) == 5
  117. assert len(data[1]["seasons"]) == 4
  118. def test_array_of_Mapdicts(gui: Gui, helpers, small_dataframe):
  119. accessor = _ArrayDictDataAccessor(gui)
  120. dict1 = _MapDict(
  121. {
  122. "temperatures": [
  123. [17.2, 27.4, 28.6, 21.5],
  124. [5.6, 15.1, 20.2, 8.1],
  125. [26.6, 22.8, 21.8, 24.0],
  126. [22.3, 15.5, 13.4, 19.6],
  127. [3.9, 18.9, 25.7, 9.8],
  128. ],
  129. "cities": ["Hanoi", "Paris", "Rio de Janeiro", "Sydney", "Washington"],
  130. }
  131. )
  132. dict2 = _MapDict({"seasons": ["Winter", "Summer", "Spring", "Autumn"]})
  133. ret_data = accessor.get_data("x", [dict1, dict2], {"start": 0, "end": -1, "alldata": True}, _DataFormat.JSON)
  134. assert ret_data
  135. value = ret_data["value"]
  136. assert value
  137. assert value["multi"] is True
  138. data = value["data"]
  139. assert len(data) == 2
  140. assert len(data[0]["temperatures"]) == 5
  141. assert len(data[1]["seasons"]) == 4
  142. def test_edit_dict(gui, small_dataframe):
  143. accessor = _ArrayDictDataAccessor(gui)
  144. pd = small_dataframe
  145. ln = len(pd["name"])
  146. assert pd["value"][0] != 10
  147. ret_data = accessor.on_edit(pd, {"index": 0, "col": "value", "value": 10})
  148. assert isinstance(ret_data, dict)
  149. assert len(ret_data["name"]) == ln
  150. assert ret_data["value"][0] == 10
  151. def test_delete_dict(gui, small_dataframe):
  152. accessor = _ArrayDictDataAccessor(gui)
  153. pd = small_dataframe
  154. ln = len(pd['name'])
  155. ret_data = accessor.on_delete(pd, {"index": 0})
  156. assert isinstance(ret_data, dict)
  157. assert len(ret_data["name"]) == ln - 1
  158. def test_add_dict(gui, small_dataframe):
  159. accessor = _ArrayDictDataAccessor(gui)
  160. pd = small_dataframe
  161. ln = len(pd["name"])
  162. ret_data = accessor.on_add(pd, {"index": 0})
  163. assert isinstance(ret_data, dict)
  164. assert len(ret_data["name"]) == ln + 1
  165. assert ret_data["value"][0] == 0
  166. assert ret_data["name"][0] == ""
  167. ret_data = accessor.on_add(pd, {"index": 2})
  168. assert isinstance(ret_data, dict)
  169. assert len(ret_data["name"]) == ln + 1
  170. assert ret_data["value"][2] == 0
  171. assert ret_data["name"][2] == ""
  172. ret_data = accessor.on_add(pd, {"index": 0}, ["New", 100])
  173. assert isinstance(ret_data, dict)
  174. assert len(ret_data["name"]) == ln + 1
  175. assert ret_data["value"][0] == 100
  176. assert ret_data["name"][0] == "New"
  177. ret_data = accessor.on_add(pd, {"index": 2}, ["New", 100])
  178. assert isinstance(ret_data, dict)
  179. assert len(ret_data["name"]) == ln + 1
  180. assert ret_data["value"][2] == 100
  181. assert ret_data["name"][2] == "New"
  182. def test_csv(gui, small_dataframe):
  183. accessor = _ArrayDictDataAccessor(gui)
  184. pd = small_dataframe
  185. path = accessor.to_csv("", pd)
  186. assert path is not None
  187. assert os.path.getsize(path) > 0