示例#1
0
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"])
示例#2
0
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'])
示例#3
0
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
示例#4
0
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"],
            )
示例#5
0
文件: __init__.py 项目: unachka/dtale
def build_dtypes(input_dict):
    for data_id, data in input_dict.items():
        global_state.set_dtypes(data_id, data)