def initialize_store(test_data): """Helper function that sets up a default store with some data in it""" global_state.cleanup() global_state.use_default_store() for data_id in ["1", "2"]: global_state.set_data(data_id, test_data) global_state.set_dtypes(data_id, build_dtypes_state(test_data)) global_state.set_settings(data_id, dict(locked=[])) global_state.set_name(data_id, "test_name" + data_id) global_state.set_context_variables( data_id, dict(favorite_words=["foo", "bar", "baz"])) global_state.set_history(data_id, ["foo", "bar", "baz"])
def initialize_store(test_data): """Helper function that sets up a default store with some data in it""" global_state.cleanup() global_state.use_default_store() for data_id in ['1', '2']: global_state.set_data(data_id, test_data) global_state.set_dtypes(data_id, build_dtypes_state(test_data)) global_state.set_settings(data_id, dict(locked=[])) global_state.set_metadata(data_id, dict(name='test_name')) global_state.set_context_variables( data_id, dict(favorite_words=['foo', 'bar', 'baz'])) global_state.set_history(data_id, ['foo', 'bar', 'baz'])
def test_bar_and_popup(unittest): import dtale.views as views df = pd.DataFrame( dict(a=[1, 2, 3], b=[4, 5, 6], c=[7, 8, 9], d=[10, 11, 12])) with app.test_client() as c: df, _ = views.format_data(df) build_data_inst({c.port: df}) global_state.set_dtypes(c.port, views.build_dtypes_state(df)) inputs = { "chart_type": "bar", "x": "a", "y": ["b", "c"], "z": None, "group": None, "agg": None, "window": None, "rolling_comp": None, } chart_inputs = { "cpg": False, "cpy": True, "barmode": "group", "barsort": None } extended_aggregation = [ dict(col="b", agg="sum"), dict(col="c", agg="mean") ] params = build_chart_params( c.port, inputs, chart_inputs, dict(type="multi", data={}), extended_aggregation=extended_aggregation, ) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] assert len(resp_data["chart-content"]["children"][0]["props"] ["children"]) == 2 chart_inputs["cpy"] = False params = build_chart_params( c.port, inputs, chart_inputs, dict(type="multi", data={}), extended_aggregation=extended_aggregation, ) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] links_div = resp_data["chart-content"]["children"]["props"][ "children"][0]["props"]["children"] url = links_div[0]["props"]["children"][0]["props"]["href"] assert url.startswith("/dtale/charts/{}?".format(c.port)) url_params = dict(get_url_parser()(url.split("?")[-1])) unittest.assertEqual( url_params, { "chart_type": "bar", "x": "a", "barmode": "group", "cpg": "false", "cpy": "false", "y": '["b", "c"]', "extended_aggregation": '[{"agg": "sum", "col": "b"}, {"agg": "mean", "col": "c"}]', }, ) unittest.assertEqual( resp_data["chart-content"]["children"]["props"]["children"][1] ["props"]["figure"]["layout"], { "barmode": "group", "legend": { "orientation": "h" }, "title": { "text": "Sum of b, Mean of c by a" }, "xaxis": { "tickformat": ".0f", "title": { "text": "a" } }, "yaxis": { "tickformat": ".0f", "title": { "text": "Sum of b" } }, "yaxis2": { "anchor": "x", "overlaying": "y", "side": "right", "tickformat": ".0f", "title": { "text": "Mean of c" }, }, }, ) response = c.get(url) assert response.status_code == 200 [pathname_val, search_val] = url.split("?") response = c.post( "/dtale/charts/_dash-update-component", json={ "output": "popup-content.children", "changedPropIds": ["url.modified_timestamp"], "inputs": [ { "id": "url", "property": "pathname", "value": pathname_val }, { "id": "url", "property": "search", "value": "?{}".format(search_val), }, ], }, ) assert response.status_code == 200 inputs["y"] = ["b"] inputs["agg"] = "sum" chart_inputs["animate_by"] = "c" params = build_chart_params(c.port, inputs, chart_inputs, extended_aggregation=extended_aggregation) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] assert ("frames" in resp_data["chart-content"]["children"]["props"] ["children"][1]["props"]["figure"]) inputs["y"] = ["b"] inputs["agg"] = "raw" inputs["group"] = ["d"] chart_inputs["animate_by"] = "c" params = build_chart_params(c.port, inputs, chart_inputs, extended_aggregation=extended_aggregation) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] assert ("frames" in resp_data["chart-content"]["children"]["props"] ["children"][1]["props"]["figure"]) inputs["y"] = ["b", "c"] inputs["group"] = None chart_inputs["animate_by"] = None chart_inputs["barmode"] = "group" chart_inputs["barsort"] = "b|sum" inputs["agg"] = None params = build_chart_params(c.port, inputs, chart_inputs, extended_aggregation=extended_aggregation) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] unittest.assertEqual( resp_data["chart-content"]["children"]["props"]["children"][1] ["props"]["figure"]["layout"], { "barmode": "group", "legend": { "orientation": "h" }, "title": { "text": "Sum of b, Mean of c by a" }, "xaxis": { "tickmode": "array", "ticktext": [1, 2, 3], "tickvals": [0, 1, 2], "tickformat": ".0f", "title": { "text": "a" }, }, "yaxis": { "tickformat": ".0f", "title": { "text": "Sum of b, Mean of c" }, }, }, ) inputs["y"] = ["b"] inputs["group"] = ["c"] chart_inputs["cpg"] = True params = build_chart_params(c.port, inputs, chart_inputs, extended_aggregation=extended_aggregation) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] assert len(resp_data["chart-content"]["children"]) == 2 chart_inputs["top_bars"] = 5 params = build_chart_params(c.port, inputs, chart_inputs, extended_aggregation=extended_aggregation) response = c.post("/dtale/charts/_dash-update-component", json=params) resp_data = response.get_json()["response"] assert len(resp_data["chart-content"]["children"]) == 2 chart_inputs["top_bars"] = None params["inputs"][-1]["value"] = 1 params["state"][-3]["value"] = False response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.get_json()["response"]["load-clicks"]["data"] == 1 params["state"][-2]["value"] = 1 response = c.post("/dtale/charts/_dash-update-component", json=params) assert response.status_code == 204
def test_upload(unittest): import dtale.views as views import dtale.global_state as global_state global_state.clear_store() df, _ = views.format_data(pd.DataFrame([1, 2, 3])) with build_app(url=URL).test_client() as c: build_data_inst({c.port: df}) global_state.set_dtypes(c.port, views.build_dtypes_state(df)) resp = c.post("/dtale/upload") assert not resp.get_json()["success"] c.post( "/dtale/upload", data={ "tests_df.csv": (build_upload_data(), "test_df.csv"), "separatorType": "csv", }, ) assert global_state.size() == 2 new_key = next((k for k in global_state.keys() if k != c.port), None) assert list(global_state.get_data(new_key).columns) == ["a", "b", "c"] with build_app(url=URL).test_client() as c: global_state.clear_store() build_data_inst({c.port: df}) global_state.set_dtypes(c.port, views.build_dtypes_state(df)) resp = c.post("/dtale/upload") assert not resp.get_json()["success"] c.post( "/dtale/upload", data={ "tests_df.csv": (build_upload_data(), "test_df.csv"), "separatorType": "custom", "separator": ",", }, ) assert global_state.size() == 2 new_key = next((k for k in global_state.keys() if k != c.port), None) assert list(global_state.get_data(new_key).columns) == ["a", "b", "c"] with build_app(url=URL).test_client() as c: global_state.clear_store() build_data_inst({c.port: df}) global_state.set_dtypes(c.port, views.build_dtypes_state(df)) assert global_state.size() == 1 if PY3: c.post( "/dtale/upload", data={ "test_df.xlsx": ( os.path.join( os.path.dirname(__file__), "..", "data/test_df.xlsx" ), "test_df.xlsx", ) }, ) assert global_state.size() == 2 new_key = next((k for k in global_state.keys() if k != c.port), None) assert list(global_state.get_data(new_key).columns) == ["a", "b", "c"] with build_app(url=URL).test_client() as c: with ExitStack() as stack: global_state.clear_store() data = {c.port: df} build_data_inst(data) global_state.set_dtypes(c.port, views.build_dtypes_state(df)) stack.enter_context( mock.patch( "dtale.views.pd.read_excel", mock.Mock( return_value={ "Sheet 1": pd.DataFrame(dict(a=[1], b=[2])), "Sheet 2": pd.DataFrame(dict(c=[1], d=[2])), } ), ) ) resp = c.post( "/dtale/upload", data={ "test_df.xlsx": ( os.path.join( os.path.dirname(__file__), "..", "data/test_df.xlsx" ), "test_df.xlsx", ) }, ) assert global_state.size() == 3 sheets = resp.json["sheets"] assert len(sheets) == 2 unittest.assertEqual( sorted([s["name"] for s in sheets]), ["Sheet 1", "Sheet 2"], )
def build_dtypes(input_dict): for data_id, data in input_dict.items(): global_state.set_dtypes(data_id, data)