From a6f9c782a52ea59d83389befeec84cb3b59e8ae9 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 18 Feb 2021 14:33:41 -0500 Subject: [PATCH 01/18] add logs to db test connection and post failures --- superset/databases/api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/superset/databases/api.py b/superset/databases/api.py index ba665c1cb412a..bc4e71c9d3167 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -238,6 +238,7 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: + logger.exception("Database connection failed") return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( @@ -607,6 +608,7 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: + logger.exception("Database test connection failed") return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) From d59e2247c6731a60b0114b0498365800d888046b Mon Sep 17 00:00:00 2001 From: hughhhh Date: Thu, 18 Feb 2021 20:07:19 -0500 Subject: [PATCH 02/18] yerp --- superset/databases/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index bc4e71c9d3167..2d037c5d27a03 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -608,7 +608,7 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - logger.exception("Database test connection failed") + logger.warning("Database test connection failed", exc_info=True) return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) @@ -801,7 +801,7 @@ def import_(self) -> Response: logger.warning("Import database failed") return self.response_422(message=exc.normalized_messages()) except DatabaseImportError as exc: - logger.exception("Import database failed") + logger.warning("Import database failed", exc_info=True) return self.response_500(message=str(exc)) @expose("//function_names/", methods=["GET"]) From 07c3fb3427b243094de9eb70687480f614703aab Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 19 Feb 2021 16:55:00 -0500 Subject: [PATCH 03/18] fix the logs --- superset/databases/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index 2d037c5d27a03..db5496a282a27 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -608,7 +608,7 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - logger.warning("Database test connection failed", exc_info=True) + logger.warning(ex) return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) From 9a84f7e5cec803aac84735bce60742f5fd043bf7 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 19 Feb 2021 18:02:08 -0500 Subject: [PATCH 04/18] remove --- superset/databases/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index db5496a282a27..4e8650d80f132 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -801,7 +801,7 @@ def import_(self) -> Response: logger.warning("Import database failed") return self.response_422(message=exc.normalized_messages()) except DatabaseImportError as exc: - logger.warning("Import database failed", exc_info=True) + logger.exception("Import database failed") return self.response_500(message=str(exc)) @expose("//function_names/", methods=["GET"]) From df6d5084189b8c1bf648ac210be4bd9b885d2cf4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Fri, 19 Feb 2021 18:05:14 -0500 Subject: [PATCH 05/18] change the logs --- superset/databases/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index 4e8650d80f132..e93be199bb549 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -238,7 +238,7 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: - logger.exception("Database connection failed") + logger.warning("Database connection failed") return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( From 732a63846c60341af719acf9dfa72d347faf390e Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 22 Feb 2021 08:47:11 -0500 Subject: [PATCH 06/18] add more information --- superset/databases/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index e93be199bb549..9ae558fd5e77f 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -238,7 +238,7 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: - logger.warning("Database connection failed") + logger.warning("Database connection failed: %s", item["sqlalchemy_uri"]) return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( From 0bf3b386a6d706331cd16f9fe8dbf7a6e86415f4 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 22 Feb 2021 16:04:15 -0500 Subject: [PATCH 07/18] fix this --- superset/databases/api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index 9ae558fd5e77f..2b7d506603e2d 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -66,11 +66,13 @@ from superset.databases.utils import get_table_metadata from superset.extensions import security_manager from superset.models.core import Database +from superset.stats_logger import StatsdStatsLogger from superset.typing import FlaskResponse from superset.utils.core import error_msg_from_exception from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics logger = logging.getLogger(__name__) +statsd = StatsdStatsLogger() class DatabaseRestApi(BaseSupersetModelRestApi): @@ -238,7 +240,7 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: - logger.warning("Database connection failed: %s", item["sqlalchemy_uri"]) + statsd.incr("db_connection_error") # add engine return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( @@ -608,7 +610,7 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - logger.warning(ex) + statsd.incr("db_test_connection_error") # add engine return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) From dc1d2c474a8d8a9fd56423079a63fe505b0fac6d Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 22 Feb 2021 16:09:15 -0500 Subject: [PATCH 08/18] add info for engine --- superset/databases/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index 2b7d506603e2d..b6fe8612a63f5 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -610,7 +610,8 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - statsd.incr("db_test_connection_error") # add engine + statsd.incr("db_test_connection_error") + logger.warning(ex) return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) From 94e17d3538bf39891f90d230a3ca51d4b5263d0a Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 22 Feb 2021 17:54:14 -0500 Subject: [PATCH 09/18] fix merge conflicts --- superset-frontend/package-lock.json | 701 ++++++++++++++++------------ superset/databases/api.py | 13 +- 2 files changed, 402 insertions(+), 312 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 40d71995fcf0e..88cdb65a5ee95 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -13,34 +13,34 @@ "@babel/runtime-corejs3": "^7.12.5", "@data-ui/sparkline": "^0.0.84", "@emotion/core": "^10.0.35", - "@superset-ui/chart-controls": "^0.17.9", - "@superset-ui/core": "^0.17.9", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.9", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.9", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.9", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.9", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.9", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.9", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.9", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.9", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.9", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.9", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.9", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.9", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.9", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.9", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.9", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.9", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.9", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.9", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.9", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.9", - "@superset-ui/legacy-preset-chart-deckgl": "^0.4.1", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.9", - "@superset-ui/plugin-chart-echarts": "^0.17.9", - "@superset-ui/plugin-chart-table": "^0.17.9", - "@superset-ui/plugin-chart-word-cloud": "^0.17.9", - "@superset-ui/preset-chart-xy": "^0.17.9", + "@superset-ui/chart-controls": "^0.17.10", + "@superset-ui/core": "^0.17.10", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.10", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.10", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.10", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.10", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.10", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.10", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.10", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.10", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.10", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.10", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.10", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.10", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.10", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.10", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.10", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.10", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.10", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.10", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.10", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.10", + "@superset-ui/legacy-preset-chart-deckgl": "^0.4.2", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.10", + "@superset-ui/plugin-chart-echarts": "^0.17.10", + "@superset-ui/plugin-chart-table": "^0.17.10", + "@superset-ui/plugin-chart-word-cloud": "^0.17.10", + "@superset-ui/preset-chart-xy": "^0.17.10", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -251,7 +251,7 @@ "yargs": "^15.4.1" }, "engines": { - "node": ">= 12.18.3 < 13", + "node": "^14.15.5", "npm": "^7.5.4" } }, @@ -14123,19 +14123,26 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.9.tgz", - "integrity": "sha512-0mnVFLP/0JXZ5VI8kXDTfTOaxGeARrrU8qlPph7SLt5UYbs9ptHwmo0y9wzgrjiKYh25FneCQxM2M4rN8dD/IA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.10.tgz", + "integrity": "sha512-KnvTV1oE28gkeAy4rJuGhykDzrUUhtEDE4cRj0ySB2xxvh7NsYYMjoDwVCmO3hsAGTsM2Mwd/n1bKSH45ZrVig==", "dependencies": { - "@superset-ui/core": "0.17.9", + "@superset-ui/core": "0.17.10", "lodash": "^4.17.15", "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-bootstrap": "*", + "antd": "^4.9.1", + "react": "^16.13.1", + "react-bootstrap": "^0.33.1" } }, "node_modules/@superset-ui/core": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.9.tgz", - "integrity": "sha512-S5+D0jL6FJlclTsoUUB5oZgY/9fIaS+D1H5Ej6Ho653Y1bdbI9VB+QK016Omx/07ouzi3Wvtcf4E12LMjuXo0g==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.10.tgz", + "integrity": "sha512-tcHU2fJ7vxk5NwbQudlAykkfaIOIpGe0kSa0wQdn2AnffIAUt5Ueq8RHlrH4HKU5rGD8aJs/CzUsDiipkof/Ow==", "dependencies": { "@babel/runtime": "^7.1.2", "@emotion/core": "^10.0.28", @@ -14165,6 +14172,14 @@ "rison": "^0.1.1", "seedrandom": "^3.0.5", "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-bootstrap": "*", + "@types/react-loadable": "*", + "react": "^16.13.1", + "react-bootstrap": "^0.33.1", + "react-loadable": "^5.5.0" } }, "node_modules/@superset-ui/core/node_modules/@vx/responsive": { @@ -14216,16 +14231,19 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.9.tgz", - "integrity": "sha512-+DaNJ2fJmTFYYvWdzY3p40D2DBWOLqRkjPKpNY9TCpbIxInBg2yXjY0Izmb4hhF8jFntk1P1EJygDIcji4uRvg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.10.tgz", + "integrity": "sha512-kWpvIpvKRYcvOnv8uQDoIgADj3ZRnlx2/PV2U9ji7vbPFJZVth7VeUpYw7fEOJfTeiLPruqRJ8EesRY1iVMYxw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar/node_modules/d3-array": { @@ -14237,24 +14255,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.9.tgz", - "integrity": "sha512-DhezgOenbqhu9nvEWimut4JJGrp+AtmCH12NFlouYo7l/b+B+JC1VIRa1tlB0lGDCCtfofHh/nPqAbYcbXf+dw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.10.tgz", + "integrity": "sha512-urNihzkh8TH317ZjHH/uDVgez6TQE+/anTJW+FU8+prVXdxM8/6TNwUKtGI9t0dQVMsnK3ex1NlyLfbKkpYzZw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.9.tgz", - "integrity": "sha512-WSWKs8gbyrM4uLXAT6xLk/yqizufXXZD5nwyf7FGh3lPo2E6NeJUkmrPUBRuPX+qefGMnMenVjlowLEjQJGe5w==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.10.tgz", + "integrity": "sha512-ZIG4dGMj444PgTAMoANGT8M7R3e4UCmkkDZRP33BPbs4RpKa1iXUCZ5Au76RwdDiaVfKsR0tyoXEG+bfa/Hk0Q==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -14269,34 +14287,40 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.9.tgz", - "integrity": "sha512-Enev+3p2dd/7/n5CaWQ19f0W/clAcYreLaXLVQ/cBoWaS826OLTeJFjK0ggaXpAM6AW10z4pkWjBvOMv6Mk3wA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.10.tgz", + "integrity": "sha512-L6n4gYdMAeWWv0jzpwl7UjY8wsei9rebFql3/8AQUjc+og1uK4DmFPTZu23Suqc71I6SNfjTlg8KJZSY89MtDA==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.9.tgz", - "integrity": "sha512-NQHCveptnPHvO6T9sdf4efp7g1sqsizc8onmq9kKoJ3IM0l7lrzNE/MOvdgW8T1gGjzf099h36u/mp20JXL+YQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.10.tgz", + "integrity": "sha512-hauxW3bUDp4KalraRH02Dyw7Vp17MTORrpT8vAyOfyu56IyvXM9rcZa7T/ti12LygXOaBA/r9HmCjshn83hZlQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.9.tgz", - "integrity": "sha512-r4y9F4Jj2wQd1PK+I5FHe1+XrPJErs1YQGlY8XaeSyEEYSOzqrTVan92AgkCBWw7ulg4MxZWmHMW1MLSoqb0WQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.10.tgz", + "integrity": "sha512-W+K7gn7iV1PWiSFpTyi2FcFl0GX9EPbVII9RfjjEnlVVXFpNFxmjY+uV7BH/9VCz5125AeUv29xaX1wOo2ChhQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -14304,18 +14328,21 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.9.tgz", - "integrity": "sha512-eoPwofWwowGsuy0dUB1HRTNbefwvHEvvLEw/ciuZ6pibRJGtfW4bfasxNclgDQBIbUNmXiu2ldUxIRcImhkCKQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.10.tgz", + "integrity": "sha512-LnLF0xYLin4P8G/L9dotPvFIE9U0qpmHnrqrRBb43vlBYlGa7IDTMhQlx+p5QYGvFK6mUnEEHwTam4WfjugOvA==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram/node_modules/@vx/group": { @@ -14377,15 +14404,18 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.9.tgz", - "integrity": "sha512-2Nl7+gtwF8nT+YL3he6/KQq5qEqYHvkyyT/utqY5FEJdDyzu12BszDIWWa/0UkDMI7Ue+KfRC6xw6GjfF0k8iQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.10.tgz", + "integrity": "sha512-Cy5kX+gL4xi6Oe+6w7KTUqU0nZL49x+lYBe4COynW4KAzRMPakBB4MaDaFKjANVxMLK3WzUJgWjg1vfrdlhaQg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon/node_modules/d3-array": { @@ -14409,18 +14439,21 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.9.tgz", - "integrity": "sha512-HRJ4GQivkLAJh0s9mHNiQdJZp/65O7bSrmx4iAdNBMydXWhxdfTorCmdXIx6VdYVX2MsxGhWT0esiOQ8oZG1VA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.10.tgz", + "integrity": "sha512-sS2ir6haVfDM0GhwTpK4pIyT6kUTK41SRFqneOTX8dXoBQ0cQ0T+JniR24emh2a8wk1KUD6lv8Uo7EKfjoGIKw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", "react-map-gl": "^4.0.10", "supercluster": "^4.1.1", "viewport-mercator-project": "^6.1.1" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box/node_modules/immutable": { @@ -14432,123 +14465,141 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.9.tgz", - "integrity": "sha512-dcufi2lzZL+v3q1w4bK3Rb/lzjgon5KqXSQoufj4JfoV74fCdvii1obf6dfsztjic59TIisyneaMiXoFAGskqQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.10.tgz", + "integrity": "sha512-uNrjMF59WkYcPj3MndnP2Cg7KLw4C9hL8601UIT3jgX4WP5JAd8G8Foq4C3NzIAQich5pS9fn7rVXOmggFTkNA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "distributions": "^1.0.0", "prop-types": "^15.6.2", - "reactable-arc": "0.15.0" + "reactable": "^1.1.0" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.9.tgz", - "integrity": "sha512-+ditYOV3L1miz4SsZL29xifyGRwbh4P116awtTeyz8uMIGr/QvzOhsBa3Ilq119xvEIpABz0XNHV0qDzsSaekw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.10.tgz", + "integrity": "sha512-GRcW+CFPugGUxLBi/X41x0xoXYgySqeBKHjoy8YSy4epoQfB401IX1urr2EUi0ajYycxElv6NMBaE4ymuSxYjA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.9.tgz", - "integrity": "sha512-VyX97EGtHHn7wScxJLNFxPRe920avDZ8qP4wuLuVrHaH18qgaUrvXFuZ6hq64EwrdontKgLRVlxgreu3RNTCDg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.10.tgz", + "integrity": "sha512-L4hl4zxl5Vc0ZFELaYnJYCvYlxP9PxuF+ANTA7jstbZ5sDKcvaI+yJQdcI+6408HId42qoWGqa2K53F+SW3IGw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.9.tgz", - "integrity": "sha512-KtpRI4p4sz0roxYFu9TzVQ4qkAj7DVsIfR+H+k22KQib4ewt8AqRL6E8Gh69zrYdhLYC28ISEbXECm6HHzL1VA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.10.tgz", + "integrity": "sha512-3lQrDnFNRNaYnI7vpFUNnuvMkmoFBCGlmS3sPUIcyh9VMeXJra3IzMERXWlj1c6PROeYw7vfKbjzJrlnTaikpQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.9.tgz", - "integrity": "sha512-cZ/p8tiuEVLdqvgt8PDE/DJl6FEtLckwsHZV7uf0XdbeY3IvXki5XpxExp3h4szqQ4YvX//EGaZQb3HDkwoRog==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.10.tgz", + "integrity": "sha512-7NxQDBiMsMhdzw6TPGUqK1qmkOGuDA8p1N1kg+79vsQpIY1yfuSDExLX0Ix6fzIoT5ZYEZpRI61xHIOCkWdD2w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.9.tgz", - "integrity": "sha512-aoGLce7jTdljNmL2BrvRYbxFm1zMEr1uBJrvq/J0Om8gkVHCw598lEbalbPnI2KJ41BNCOdJk9zBHhfk1Ap7cQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.10.tgz", + "integrity": "sha512-sgKD0OKBI0iKVsCAuA5epaGhEoB2hv3qgBqtzCcgdxGI/QVUZ8CwdPFVAbU4gXgLxezAUiM+XSXzs42Z3W1UiA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.9.tgz", - "integrity": "sha512-3X1Eaz8N+Aa0jp1kpBPbBEWHsFzj9mkQ+Px66OOMtIftzhz06y44BDlUghShKGOg2HXo4zDNWxA1qtP5eLOmXA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.10.tgz", + "integrity": "sha512-lYTNlXUIP5ryDjwRNrqZFXGj9LtV3KPEWAJrB9IS0cPU0+D88Nfc3eNnuvxj2xQvpcXztTMrCK9QSpRqOAlC1g==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.9.tgz", - "integrity": "sha512-ikc8T+QYxZP/DdHmI9UzFjP+/z6juJZiEfcVDv+EZG8sP7WuM9hcbtMeGQ/8en5273gBbzkPHMQlWeHlpmEADg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.10.tgz", + "integrity": "sha512-mYldzaWJR7hBrHgpzsFqySwIw8TOi8wmNMa8/0SS9vE3Cj+xhXweQtzmR6KwnU21U1cL+yvENQi0aHs10Kt5GA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.9.tgz", - "integrity": "sha512-6ISszXcLDPiNW7EKcqCrXFxeG0dDILBHJ0VRxh8MpqMbIWPJx6qLAOvPzC2quHEurWGTtNU7KvQsmiJJk1V6OQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.10.tgz", + "integrity": "sha512-ghQNXUqpDEFJyY9/nnd9RQjeUwgH2JOOW6T8Hmt6qJcF91k3djS7LLSxWNLCCUa1M3bZt3AAxsr4+6b4Y8BAXA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.9.tgz", - "integrity": "sha512-KV+cIKWfYnjk3rBm71CULqa2hadXjSytB++LEDrEpFyQmxDXz2IwaoadSr0HupM/fqkWtTT2CCDUrIehGmVjgw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.10.tgz", + "integrity": "sha512-EvECxrRxL7kVu5LuiIBmaFXIGGJM1q8nXYEdHcA6sJzvLwM55J6lpkLuokHihmTiMdI2qmejQKJ3/omzS+D7yA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", "datamaps": "^0.5.8", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-world-map/node_modules/d3-array": { @@ -14565,23 +14616,26 @@ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.9.tgz", - "integrity": "sha512-CN4FMPdywRVefn3rnR9xp6iWs8Z+sxPUxx+MjCsa5ti2UDCBxT8mU3CU6FYimlvloYPpIQCnA5iGw4M48bCyUA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.10.tgz", + "integrity": "sha512-Xvpb1gwc5aY9zz1xs3AXoxLvpcGlsh7zaQbt4wU0eXvovdhCPHX0TCaOvY6Q8X8tbM7MeM82hjwOxO16NwJZbA==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", "shortid": "^2.2.14" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-preset-chart-deckgl": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.4.1.tgz", - "integrity": "sha512-3THN+WM8HUU1NlV3VNXRVS1j2jH33CmVAdyPNB35RqtwkY+udgFGOxm0lXumcUElht/3ROGMPvcwo1SXijVuLA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.4.2.tgz", + "integrity": "sha512-lr9K0KihVgaCjE72Zu/nd3YoU/q2EDX7qd73y95vzoXBgIA2cMfIkAmEnOe2Komb51ed9hzz0MnudfZHZk1cfw==", "dependencies": { "@math.gl/web-mercator": "^3.2.2", "@types/d3-array": "^2.0.0", @@ -14601,16 +14655,21 @@ "underscore": "^1.8.3", "urijs": "^1.18.10", "xss": "^1.0.6" + }, + "peerDependencies": { + "@superset-ui/chart-controls": "^0.16.3", + "@superset-ui/core": "^0.16.3", + "react": "^15 || ^16" } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.9.tgz", - "integrity": "sha512-hCbOun3uywyW3tV87VqqA64vHw1s8tdK1SwUFKXl0VWHdqxlJOZn8IlpP9Pmuh0+vvPZs8WuF86UjJMtG70fMw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.10.tgz", + "integrity": "sha512-oCuvPwyZyvQLz5iCpK2coNJWKs4SD7OyGwFCtfmqBabAt1wt1+mZ0/YfQNJygguwDSRz8nWGaRbtMTGvcrfU6w==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -14621,28 +14680,35 @@ "nvd3-fork": "^2.0.5", "prop-types": "^15.6.2", "urijs": "^1.18.10" + }, + "peerDependencies": { + "react": "^15 || ^16" } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.9.tgz", - "integrity": "sha512-xlVWrq7qQnX8I2KKNdFdhybPrNPg+aJ5sK3LYEqG9nEA48rQUS/yb8cFgoiguiYw05b/PeqS7c6Shj9I5A9+aQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.10.tgz", + "integrity": "sha512-2bd2VEUShPFG6CUljHNt7pE2diHW8vrbi5DAWgxV3TkVnjCg4g0CCTS6mmxUhLi9gqV6V0jV4XYWvMg3GIPI0w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/mathjs": "^6.0.7", + "d3-array": "^1.2.0", "echarts": "^5.0.2", "mathjs": "^8.0.1" + }, + "peerDependencies": { + "react": "^16.13.1" } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.9.tgz", - "integrity": "sha512-FEUXPOqMdw8Mqznlr6nE6LgwqdX9bAZkZKyi1DI0xzgv6FoGwjzxk5BBM4LPVqCpPR4RK8sw+ANTT3W1CTnREw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.10.tgz", + "integrity": "sha512-9FPypGUeCh8wQeTy3N9R4ewTAkVFb3jGnY7XbSiL3PfZzd0+AgKyA+fBV98IOdXJHJj45uIrREpAzYuKQa58rw==", "dependencies": { "@emotion/core": "^10.0.28", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-array": "^2.0.0", "@types/react-table": "^7.0.19", "d3-array": "^2.4.0", @@ -14652,6 +14718,11 @@ "react-table": "^7.2.1", "regenerator-runtime": "^0.13.5", "xss": "^1.0.6" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.13.1", + "react-dom": "^16.13.1" } }, "node_modules/@superset-ui/plugin-chart-table/node_modules/d3-array": { @@ -14663,18 +14734,22 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.9.tgz", - "integrity": "sha512-jFkfY4ug9bEBb6xvadQ/u+6lEskGPNvuA9SuU747FWyTd+hdg/TyucU4WXx7OHtB2u0MSJ7lEegp0ZoMUnKZjw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.10.tgz", + "integrity": "sha512-1Le/sHAve6VRad/uFcGIuNFvvpSx54duhJHnAnZAVwhAgW/OVm+7ohtEPjHvJdsAPZDpWFsgi601UuTDsSUvfw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", "d3-scale": "^3.0.1", "emotion-theming": "^10.0.27", "encodable": "^0.7.6" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.13.1" } }, "node_modules/@superset-ui/plugin-chart-word-cloud/node_modules/d3-array": { @@ -14698,14 +14773,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.9.tgz", - "integrity": "sha512-vl5ht0+uJaNROBgaDGBOcGSLBw+UAJghpK6ofaIPINlfs/Xi1cSqjPk3q0hDWhxe7eItLB36g9qq6COD73zt4Q==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.10.tgz", + "integrity": "sha512-ym3zRIjOh+qNB1H1kPRZjmM0woC2Zkr/uhYI0cjpaGgXVr5B0AelT1ntpXQyu+Pse3Tj0XLVWzi+x4ZK79JmyQ==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -14713,6 +14788,9 @@ "encodable": "^0.7.6", "lodash": "^4.17.11", "reselect": "^4.0.0" + }, + "peerDependencies": { + "react": "^16.2" } }, "node_modules/@superset-ui/preset-chart-xy/node_modules/@vx/axis": { @@ -21888,6 +21966,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -46815,10 +46894,13 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, - "node_modules/reactable-arc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/reactable-arc/-/reactable-arc-0.15.0.tgz", - "integrity": "sha512-XH1mryI/xvbYb3lCVOU3rx/KRacDE0PDa45KazL/PPTM0AgPZ/awVmCAxRi179BpjbStk7cgCyFjI2oYJ28E8A==" + "node_modules/reactable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reactable/-/reactable-1.1.0.tgz", + "integrity": "sha512-SnvZ3CXyFFxGotw9cqNiVUGb2oW16UlIypGQZRJGgPiJuFqW22jO7A+Y/Tvv8no8F/bZoLdZ+QJP7eZfcc9kCw==", + "peerDependencies": { + "react": "* || ^0.14.0" + } }, "node_modules/reactcss": { "version": "1.2.3", @@ -68364,19 +68446,19 @@ } }, "@superset-ui/chart-controls": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.9.tgz", - "integrity": "sha512-0mnVFLP/0JXZ5VI8kXDTfTOaxGeARrrU8qlPph7SLt5UYbs9ptHwmo0y9wzgrjiKYh25FneCQxM2M4rN8dD/IA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.10.tgz", + "integrity": "sha512-KnvTV1oE28gkeAy4rJuGhykDzrUUhtEDE4cRj0ySB2xxvh7NsYYMjoDwVCmO3hsAGTsM2Mwd/n1bKSH45ZrVig==", "requires": { - "@superset-ui/core": "0.17.9", + "@superset-ui/core": "0.17.10", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.9.tgz", - "integrity": "sha512-S5+D0jL6FJlclTsoUUB5oZgY/9fIaS+D1H5Ej6Ho653Y1bdbI9VB+QK016Omx/07ouzi3Wvtcf4E12LMjuXo0g==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.10.tgz", + "integrity": "sha512-tcHU2fJ7vxk5NwbQudlAykkfaIOIpGe0kSa0wQdn2AnffIAUt5Ueq8RHlrH4HKU5rGD8aJs/CzUsDiipkof/Ow==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/core": "^10.0.28", @@ -68459,12 +68541,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.9.tgz", - "integrity": "sha512-+DaNJ2fJmTFYYvWdzY3p40D2DBWOLqRkjPKpNY9TCpbIxInBg2yXjY0Izmb4hhF8jFntk1P1EJygDIcji4uRvg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.10.tgz", + "integrity": "sha512-kWpvIpvKRYcvOnv8uQDoIgADj3ZRnlx2/PV2U9ji7vbPFJZVth7VeUpYw7fEOJfTeiLPruqRJ8EesRY1iVMYxw==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -68482,24 +68564,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.9.tgz", - "integrity": "sha512-DhezgOenbqhu9nvEWimut4JJGrp+AtmCH12NFlouYo7l/b+B+JC1VIRa1tlB0lGDCCtfofHh/nPqAbYcbXf+dw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.10.tgz", + "integrity": "sha512-urNihzkh8TH317ZjHH/uDVgez6TQE+/anTJW+FU8+prVXdxM8/6TNwUKtGI9t0dQVMsnK3ex1NlyLfbKkpYzZw==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.9.tgz", - "integrity": "sha512-WSWKs8gbyrM4uLXAT6xLk/yqizufXXZD5nwyf7FGh3lPo2E6NeJUkmrPUBRuPX+qefGMnMenVjlowLEjQJGe5w==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.10.tgz", + "integrity": "sha512-ZIG4dGMj444PgTAMoANGT8M7R3e4UCmkkDZRP33BPbs4RpKa1iXUCZ5Au76RwdDiaVfKsR0tyoXEG+bfa/Hk0Q==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -68516,34 +68598,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.9.tgz", - "integrity": "sha512-Enev+3p2dd/7/n5CaWQ19f0W/clAcYreLaXLVQ/cBoWaS826OLTeJFjK0ggaXpAM6AW10z4pkWjBvOMv6Mk3wA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.10.tgz", + "integrity": "sha512-L6n4gYdMAeWWv0jzpwl7UjY8wsei9rebFql3/8AQUjc+og1uK4DmFPTZu23Suqc71I6SNfjTlg8KJZSY89MtDA==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.9.tgz", - "integrity": "sha512-NQHCveptnPHvO6T9sdf4efp7g1sqsizc8onmq9kKoJ3IM0l7lrzNE/MOvdgW8T1gGjzf099h36u/mp20JXL+YQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.10.tgz", + "integrity": "sha512-hauxW3bUDp4KalraRH02Dyw7Vp17MTORrpT8vAyOfyu56IyvXM9rcZa7T/ti12LygXOaBA/r9HmCjshn83hZlQ==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.9.tgz", - "integrity": "sha512-r4y9F4Jj2wQd1PK+I5FHe1+XrPJErs1YQGlY8XaeSyEEYSOzqrTVan92AgkCBWw7ulg4MxZWmHMW1MLSoqb0WQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.10.tgz", + "integrity": "sha512-W+K7gn7iV1PWiSFpTyi2FcFl0GX9EPbVII9RfjjEnlVVXFpNFxmjY+uV7BH/9VCz5125AeUv29xaX1wOo2ChhQ==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -68551,14 +68633,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.9.tgz", - "integrity": "sha512-eoPwofWwowGsuy0dUB1HRTNbefwvHEvvLEw/ciuZ6pibRJGtfW4bfasxNclgDQBIbUNmXiu2ldUxIRcImhkCKQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.10.tgz", + "integrity": "sha512-LnLF0xYLin4P8G/L9dotPvFIE9U0qpmHnrqrRBb43vlBYlGa7IDTMhQlx+p5QYGvFK6mUnEEHwTam4WfjugOvA==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -68626,12 +68708,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.9.tgz", - "integrity": "sha512-2Nl7+gtwF8nT+YL3he6/KQq5qEqYHvkyyT/utqY5FEJdDyzu12BszDIWWa/0UkDMI7Ue+KfRC6xw6GjfF0k8iQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.10.tgz", + "integrity": "sha512-Cy5kX+gL4xi6Oe+6w7KTUqU0nZL49x+lYBe4COynW4KAzRMPakBB4MaDaFKjANVxMLK3WzUJgWjg1vfrdlhaQg==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -68660,12 +68742,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.9.tgz", - "integrity": "sha512-HRJ4GQivkLAJh0s9mHNiQdJZp/65O7bSrmx4iAdNBMydXWhxdfTorCmdXIx6VdYVX2MsxGhWT0esiOQ8oZG1VA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.10.tgz", + "integrity": "sha512-sS2ir6haVfDM0GhwTpK4pIyT6kUTK41SRFqneOTX8dXoBQ0cQ0T+JniR24emh2a8wk1KUD6lv8Uo7EKfjoGIKw==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -68682,118 +68764,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.9.tgz", - "integrity": "sha512-dcufi2lzZL+v3q1w4bK3Rb/lzjgon5KqXSQoufj4JfoV74fCdvii1obf6dfsztjic59TIisyneaMiXoFAGskqQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.10.tgz", + "integrity": "sha512-uNrjMF59WkYcPj3MndnP2Cg7KLw4C9hL8601UIT3jgX4WP5JAd8G8Foq4C3NzIAQich5pS9fn7rVXOmggFTkNA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "distributions": "^1.0.0", "prop-types": "^15.6.2", - "reactable-arc": "0.15.0" + "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.9.tgz", - "integrity": "sha512-+ditYOV3L1miz4SsZL29xifyGRwbh4P116awtTeyz8uMIGr/QvzOhsBa3Ilq119xvEIpABz0XNHV0qDzsSaekw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.10.tgz", + "integrity": "sha512-GRcW+CFPugGUxLBi/X41x0xoXYgySqeBKHjoy8YSy4epoQfB401IX1urr2EUi0ajYycxElv6NMBaE4ymuSxYjA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.9.tgz", - "integrity": "sha512-VyX97EGtHHn7wScxJLNFxPRe920avDZ8qP4wuLuVrHaH18qgaUrvXFuZ6hq64EwrdontKgLRVlxgreu3RNTCDg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.10.tgz", + "integrity": "sha512-L4hl4zxl5Vc0ZFELaYnJYCvYlxP9PxuF+ANTA7jstbZ5sDKcvaI+yJQdcI+6408HId42qoWGqa2K53F+SW3IGw==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.9.tgz", - "integrity": "sha512-KtpRI4p4sz0roxYFu9TzVQ4qkAj7DVsIfR+H+k22KQib4ewt8AqRL6E8Gh69zrYdhLYC28ISEbXECm6HHzL1VA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.10.tgz", + "integrity": "sha512-3lQrDnFNRNaYnI7vpFUNnuvMkmoFBCGlmS3sPUIcyh9VMeXJra3IzMERXWlj1c6PROeYw7vfKbjzJrlnTaikpQ==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.9.tgz", - "integrity": "sha512-cZ/p8tiuEVLdqvgt8PDE/DJl6FEtLckwsHZV7uf0XdbeY3IvXki5XpxExp3h4szqQ4YvX//EGaZQb3HDkwoRog==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.10.tgz", + "integrity": "sha512-7NxQDBiMsMhdzw6TPGUqK1qmkOGuDA8p1N1kg+79vsQpIY1yfuSDExLX0Ix6fzIoT5ZYEZpRI61xHIOCkWdD2w==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.9.tgz", - "integrity": "sha512-aoGLce7jTdljNmL2BrvRYbxFm1zMEr1uBJrvq/J0Om8gkVHCw598lEbalbPnI2KJ41BNCOdJk9zBHhfk1Ap7cQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.10.tgz", + "integrity": "sha512-sgKD0OKBI0iKVsCAuA5epaGhEoB2hv3qgBqtzCcgdxGI/QVUZ8CwdPFVAbU4gXgLxezAUiM+XSXzs42Z3W1UiA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.9.tgz", - "integrity": "sha512-3X1Eaz8N+Aa0jp1kpBPbBEWHsFzj9mkQ+Px66OOMtIftzhz06y44BDlUghShKGOg2HXo4zDNWxA1qtP5eLOmXA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.10.tgz", + "integrity": "sha512-lYTNlXUIP5ryDjwRNrqZFXGj9LtV3KPEWAJrB9IS0cPU0+D88Nfc3eNnuvxj2xQvpcXztTMrCK9QSpRqOAlC1g==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.9.tgz", - "integrity": "sha512-ikc8T+QYxZP/DdHmI9UzFjP+/z6juJZiEfcVDv+EZG8sP7WuM9hcbtMeGQ/8en5273gBbzkPHMQlWeHlpmEADg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.10.tgz", + "integrity": "sha512-mYldzaWJR7hBrHgpzsFqySwIw8TOi8wmNMa8/0SS9vE3Cj+xhXweQtzmR6KwnU21U1cL+yvENQi0aHs10Kt5GA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.9.tgz", - "integrity": "sha512-6ISszXcLDPiNW7EKcqCrXFxeG0dDILBHJ0VRxh8MpqMbIWPJx6qLAOvPzC2quHEurWGTtNU7KvQsmiJJk1V6OQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.10.tgz", + "integrity": "sha512-ghQNXUqpDEFJyY9/nnd9RQjeUwgH2JOOW6T8Hmt6qJcF91k3djS7LLSxWNLCCUa1M3bZt3AAxsr4+6b4Y8BAXA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.9.tgz", - "integrity": "sha512-KV+cIKWfYnjk3rBm71CULqa2hadXjSytB++LEDrEpFyQmxDXz2IwaoadSr0HupM/fqkWtTT2CCDUrIehGmVjgw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.10.tgz", + "integrity": "sha512-EvECxrRxL7kVu5LuiIBmaFXIGGJM1q8nXYEdHcA6sJzvLwM55J6lpkLuokHihmTiMdI2qmejQKJ3/omzS+D7yA==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -68817,13 +68899,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.9.tgz", - "integrity": "sha512-CN4FMPdywRVefn3rnR9xp6iWs8Z+sxPUxx+MjCsa5ti2UDCBxT8mU3CU6FYimlvloYPpIQCnA5iGw4M48bCyUA==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.10.tgz", + "integrity": "sha512-Xvpb1gwc5aY9zz1xs3AXoxLvpcGlsh7zaQbt4wU0eXvovdhCPHX0TCaOvY6Q8X8tbM7MeM82hjwOxO16NwJZbA==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -68831,9 +68913,9 @@ } }, "@superset-ui/legacy-preset-chart-deckgl": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.4.1.tgz", - "integrity": "sha512-3THN+WM8HUU1NlV3VNXRVS1j2jH33CmVAdyPNB35RqtwkY+udgFGOxm0lXumcUElht/3ROGMPvcwo1SXijVuLA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.4.2.tgz", + "integrity": "sha512-lr9K0KihVgaCjE72Zu/nd3YoU/q2EDX7qd73y95vzoXBgIA2cMfIkAmEnOe2Komb51ed9hzz0MnudfZHZk1cfw==", "requires": { "@math.gl/web-mercator": "^3.2.2", "@types/d3-array": "^2.0.0", @@ -68856,13 +68938,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.9.tgz", - "integrity": "sha512-hCbOun3uywyW3tV87VqqA64vHw1s8tdK1SwUFKXl0VWHdqxlJOZn8IlpP9Pmuh0+vvPZs8WuF86UjJMtG70fMw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.10.tgz", + "integrity": "sha512-oCuvPwyZyvQLz5iCpK2coNJWKs4SD7OyGwFCtfmqBabAt1wt1+mZ0/YfQNJygguwDSRz8nWGaRbtMTGvcrfU6w==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -68876,25 +68958,26 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.9.tgz", - "integrity": "sha512-xlVWrq7qQnX8I2KKNdFdhybPrNPg+aJ5sK3LYEqG9nEA48rQUS/yb8cFgoiguiYw05b/PeqS7c6Shj9I5A9+aQ==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.10.tgz", + "integrity": "sha512-2bd2VEUShPFG6CUljHNt7pE2diHW8vrbi5DAWgxV3TkVnjCg4g0CCTS6mmxUhLi9gqV6V0jV4XYWvMg3GIPI0w==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/mathjs": "^6.0.7", + "d3-array": "^1.2.0", "echarts": "^5.0.2", "mathjs": "^8.0.1" } }, "@superset-ui/plugin-chart-table": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.9.tgz", - "integrity": "sha512-FEUXPOqMdw8Mqznlr6nE6LgwqdX9bAZkZKyi1DI0xzgv6FoGwjzxk5BBM4LPVqCpPR4RK8sw+ANTT3W1CTnREw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.10.tgz", + "integrity": "sha512-9FPypGUeCh8wQeTy3N9R4ewTAkVFb3jGnY7XbSiL3PfZzd0+AgKyA+fBV98IOdXJHJj45uIrREpAzYuKQa58rw==", "requires": { "@emotion/core": "^10.0.28", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-array": "^2.0.0", "@types/react-table": "^7.0.19", "d3-array": "^2.4.0", @@ -68917,12 +69000,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.9.tgz", - "integrity": "sha512-jFkfY4ug9bEBb6xvadQ/u+6lEskGPNvuA9SuU747FWyTd+hdg/TyucU4WXx7OHtB2u0MSJ7lEegp0ZoMUnKZjw==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.10.tgz", + "integrity": "sha512-1Le/sHAve6VRad/uFcGIuNFvvpSx54duhJHnAnZAVwhAgW/OVm+7ohtEPjHvJdsAPZDpWFsgi601UuTDsSUvfw==", "requires": { - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -68954,14 +69037,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.9.tgz", - "integrity": "sha512-vl5ht0+uJaNROBgaDGBOcGSLBw+UAJghpK6ofaIPINlfs/Xi1cSqjPk3q0hDWhxe7eItLB36g9qq6COD73zt4Q==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.10.tgz", + "integrity": "sha512-ym3zRIjOh+qNB1H1kPRZjmM0woC2Zkr/uhYI0cjpaGgXVr5B0AelT1ntpXQyu+Pse3Tj0XLVWzi+x4ZK79JmyQ==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.9", - "@superset-ui/core": "0.17.9", + "@superset-ui/chart-controls": "0.17.10", + "@superset-ui/core": "0.17.10", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -96313,10 +96396,10 @@ "has": "^1.0.1" } }, - "reactable-arc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/reactable-arc/-/reactable-arc-0.15.0.tgz", - "integrity": "sha512-XH1mryI/xvbYb3lCVOU3rx/KRacDE0PDa45KazL/PPTM0AgPZ/awVmCAxRi179BpjbStk7cgCyFjI2oYJ28E8A==" + "reactable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reactable/-/reactable-1.1.0.tgz", + "integrity": "sha512-SnvZ3CXyFFxGotw9cqNiVUGb2oW16UlIypGQZRJGgPiJuFqW22jO7A+Y/Tvv8no8F/bZoLdZ+QJP7eZfcc9kCw==" }, "reactcss": { "version": "1.2.3", diff --git a/superset/databases/api.py b/superset/databases/api.py index b6fe8612a63f5..b106b98ba9702 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -240,7 +240,11 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: - statsd.incr("db_connection_error") # add engine + engine = item["sqlalchemy_uri"].split("://")[0] + self.incr_stats( + f"db_connection_failed.{engine}.{ex.__class__.__name__}", + self.post.__name__, + ) return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( @@ -610,8 +614,11 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - statsd.incr("db_test_connection_error") - logger.warning(ex) + engine = item["sqlalchemy_uri"].split("://")[0] + self.incr_stats( + f"db_test_connection_failed.{engine}.{ex.__class__.__name__}", + self.test_connection.__name__, + ) return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) From 9fa0f73d8fe23e24f2c7f9393b767b89aca0cf46 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 22 Feb 2021 17:56:01 -0500 Subject: [PATCH 10/18] remove unneeded code --- superset/databases/api.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index b106b98ba9702..b0077a289496b 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -66,13 +66,11 @@ from superset.databases.utils import get_table_metadata from superset.extensions import security_manager from superset.models.core import Database -from superset.stats_logger import StatsdStatsLogger from superset.typing import FlaskResponse from superset.utils.core import error_msg_from_exception from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics logger = logging.getLogger(__name__) -statsd = StatsdStatsLogger() class DatabaseRestApi(BaseSupersetModelRestApi): From 65dadfd0d2e3464676cd2affaf0858b75341c860 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 23 Feb 2021 14:20:02 -0500 Subject: [PATCH 11/18] move stats to commands --- superset/databases/api.py | 10 ---------- superset/databases/commands/test_connection.py | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/superset/databases/api.py b/superset/databases/api.py index b0077a289496b..ba665c1cb412a 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -238,11 +238,6 @@ def post(self) -> Response: except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: - engine = item["sqlalchemy_uri"].split("://")[0] - self.incr_stats( - f"db_connection_failed.{engine}.{ex.__class__.__name__}", - self.post.__name__, - ) return self.response_422(message=str(ex)) except DatabaseCreateFailedError as ex: logger.error( @@ -612,11 +607,6 @@ def test_connection( # pylint: disable=too-many-return-statements TestConnectionDatabaseCommand(g.user, item).run() return self.response(200, message="OK") except DatabaseTestConnectionFailedError as ex: - engine = item["sqlalchemy_uri"].split("://")[0] - self.incr_stats( - f"db_test_connection_failed.{engine}.{ex.__class__.__name__}", - self.test_connection.__name__, - ) return self.response_422(message=str(ex)) @expose("//related_objects/", methods=["GET"]) diff --git a/superset/databases/commands/test_connection.py b/superset/databases/commands/test_connection.py index d35d07aaa781e..8c4a454b79dde 100644 --- a/superset/databases/commands/test_connection.py +++ b/superset/databases/commands/test_connection.py @@ -23,6 +23,7 @@ from sqlalchemy.engine.url import make_url from sqlalchemy.exc import DBAPIError, NoSuchModuleError +from superset import app from superset.commands.base import BaseCommand from superset.databases.commands.exceptions import ( DatabaseSecurityUnsafeError, @@ -35,6 +36,8 @@ from superset.models.core import Database logger = logging.getLogger(__name__) +config = app.config +stats_logger = config["STATS_LOGGER"] class TestConnectionDatabaseCommand(BaseCommand): @@ -69,10 +72,17 @@ def run(self) -> None: message=_("Could not load database driver: {}").format(driver_name), ) except DBAPIError: + stats_logger.incr(f"test_connection_error.{make_url(uri).drivername}.dbapi") raise DatabaseTestConnectionFailedError() except SupersetSecurityException as ex: + stats_logger.incr( + f"test_connection_error.{make_url(uri).drivername}.security" + ) raise DatabaseSecurityUnsafeError(message=str(ex)) except Exception: + stats_logger.incr( + f"test_connection_error.{make_url(uri).drivername}.unknown" + ) raise DatabaseTestConnectionUnexpectedError() def validate(self) -> None: From 12c9acce8717b6b73b08cac9193038e6980ae667 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Tue, 23 Feb 2021 14:29:14 -0500 Subject: [PATCH 12/18] add stats for engine --- superset/databases/commands/create.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/superset/databases/commands/create.py b/superset/databases/commands/create.py index c438444d043e9..373bcdfce365a 100644 --- a/superset/databases/commands/create.py +++ b/superset/databases/commands/create.py @@ -21,6 +21,7 @@ from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import app from superset.commands.base import BaseCommand from superset.dao.exceptions import DAOCreateFailedError from superset.databases.commands.exceptions import ( @@ -35,6 +36,8 @@ from superset.extensions import db, security_manager logger = logging.getLogger(__name__) +config = app.config +stats_logger = config["STATS_LOGGER"] class CreateDatabaseCommand(BaseCommand): @@ -52,6 +55,9 @@ def run(self) -> Model: TestConnectionDatabaseCommand(self._actor, self._properties).run() except Exception: db.session.rollback() + stats_logger.incr( + f"db_connection_failed.{database.db_engine_spec.__name__}" + ) raise DatabaseConnectionFailedError() # adding a new database we always want to force refresh schema list From eb697eca8b8902b80c2ae0f28860c8e3e15b9fdc Mon Sep 17 00:00:00 2001 From: hughhhh Date: Wed, 24 Feb 2021 12:49:33 -0500 Subject: [PATCH 13/18] clean up stat reference --- superset/databases/commands/test_connection.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/superset/databases/commands/test_connection.py b/superset/databases/commands/test_connection.py index 8c4a454b79dde..4899350e45abc 100644 --- a/superset/databases/commands/test_connection.py +++ b/superset/databases/commands/test_connection.py @@ -71,17 +71,19 @@ def run(self) -> None: raise DatabaseTestConnectionDriverError( message=_("Could not load database driver: {}").format(driver_name), ) - except DBAPIError: - stats_logger.incr(f"test_connection_error.{make_url(uri).drivername}.dbapi") + except DBAPIError as ex: + stats_logger.incr( + f"test_connection_error.{make_url(uri).drivername}.{ex.__class__.__name__}" + ) raise DatabaseTestConnectionFailedError() except SupersetSecurityException as ex: stats_logger.incr( - f"test_connection_error.{make_url(uri).drivername}.security" + f"test_connection_error.{make_url(uri).drivername}.{ex.__class__.__name__}" ) raise DatabaseSecurityUnsafeError(message=str(ex)) - except Exception: + except Exception as ex: stats_logger.incr( - f"test_connection_error.{make_url(uri).drivername}.unknown" + f"test_connection_error.{make_url(uri).drivername}.{ex.__class__.__name__}" ) raise DatabaseTestConnectionUnexpectedError() From 23d94116cdfd13e6ea4474ae95fe6695d80436dc Mon Sep 17 00:00:00 2001 From: hughhhh Date: Wed, 24 Feb 2021 14:02:00 -0500 Subject: [PATCH 14/18] just to see the results of this test --- tests/databases/commands_tests.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/databases/commands_tests.py b/tests/databases/commands_tests.py index 3b1767fdc2397..8a68fc12941d5 100644 --- a/tests/databases/commands_tests.py +++ b/tests/databases/commands_tests.py @@ -15,18 +15,25 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=no-self-use, invalid-name +from unittest import mock from unittest.mock import patch import pytest import yaml +from sqlalchemy.exc import DBAPIError from superset import db, security_manager from superset.commands.exceptions import CommandInvalidError from superset.commands.importers.exceptions import IncorrectVersionError from superset.connectors.sqla.models import SqlaTable -from superset.databases.commands.exceptions import DatabaseNotFoundError +from superset.databases.commands.exceptions import ( + DatabaseNotFoundError, + DatabaseTestConnectionDriverError, +) from superset.databases.commands.export import ExportDatabasesCommand from superset.databases.commands.importers.v1 import ImportDatabasesCommand +from superset.databases.commands.test_connection import TestConnectionDatabaseCommand +from superset.databases.schemas import DatabaseTestConnectionSchema from superset.models.core import Database from superset.utils.core import backend, get_example_database from tests.base_tests import SupersetTestCase @@ -508,3 +515,20 @@ def test_import_v1_rollback(self, mock_import_dataset): # verify that the database was not added new_num_databases = db.session.query(Database).count() assert new_num_databases == num_databases + + +class TestTestConnectionDatabaseCommand(SupersetTestCase): + @mock.patch("superset.databases.commands.test_connection.stats_logger") + def test_connection_db_exception_dbapi(self, mock_stats_logger): + """Test that users can't export databases they don't have access to""" + json_payload = {"sqlalchemy_uri": "mssql+pymssql://test"} + test_item = DatabaseTestConnectionSchema().load(json_payload) + command = TestConnectionDatabaseCommand( + security_manager.find_user("admin"), test_item + ) + with pytest.raises(DBAPIError) as excinfo: + command.run() + + mock_stats_logger.assert_called() + + # assert False is True From 0af5caba0825444151034457211e72a10425aa30 Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 1 Mar 2021 10:52:39 -0700 Subject: [PATCH 15/18] working test --- tests/databases/commands_tests.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/databases/commands_tests.py b/tests/databases/commands_tests.py index 8a68fc12941d5..95f035f7ace63 100644 --- a/tests/databases/commands_tests.py +++ b/tests/databases/commands_tests.py @@ -29,6 +29,7 @@ from superset.databases.commands.exceptions import ( DatabaseNotFoundError, DatabaseTestConnectionDriverError, + DatabaseTestConnectionUnexpectedError, ) from superset.databases.commands.export import ExportDatabasesCommand from superset.databases.commands.importers.v1 import ImportDatabasesCommand @@ -518,16 +519,25 @@ def test_import_v1_rollback(self, mock_import_dataset): class TestTestConnectionDatabaseCommand(SupersetTestCase): - @mock.patch("superset.databases.commands.test_connection.stats_logger") - def test_connection_db_exception_dbapi(self, mock_stats_logger): + @mock.patch("superset.databases.dao.DatabaseDAO.build_db_for_connection_test") + @mock.patch("superset.databases.commands.test_connection.stats_logger.incr") + def test_connection_db_exception_dbapi( + self, mock_stats_logger, mock_build_db_for_connection_test + ): """Test that users can't export databases they don't have access to""" - json_payload = {"sqlalchemy_uri": "mssql+pymssql://test"} - test_item = DatabaseTestConnectionSchema().load(json_payload) - command = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), test_item + database = get_example_database() + mock_build_db_for_connection_test.side_effect = Exception( + "An error has occurred!" ) - with pytest.raises(DBAPIError) as excinfo: - command.run() + db_uri = database.sqlalchemy_uri_decrypted + json_payload = {"sqlalchemy_uri": db_uri} + command_without_db_name = TestConnectionDatabaseCommand( + security_manager.find_user("admin"), json_payload + ) + + # test with no db name + with self.assertRaises(DatabaseTestConnectionUnexpectedError): + command_without_db_name.run() mock_stats_logger.assert_called() From 23a7a6f6f89221bbee23d7193d2391ad83f015bc Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 1 Mar 2021 11:02:03 -0700 Subject: [PATCH 16/18] another working test --- tests/databases/commands_tests.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/databases/commands_tests.py b/tests/databases/commands_tests.py index 95f035f7ace63..b83d89cb0441e 100644 --- a/tests/databases/commands_tests.py +++ b/tests/databases/commands_tests.py @@ -28,6 +28,7 @@ from superset.connectors.sqla.models import SqlaTable from superset.databases.commands.exceptions import ( DatabaseNotFoundError, + DatabaseSecurityUnsafeError, DatabaseTestConnectionDriverError, DatabaseTestConnectionUnexpectedError, ) @@ -35,6 +36,8 @@ from superset.databases.commands.importers.v1 import ImportDatabasesCommand from superset.databases.commands.test_connection import TestConnectionDatabaseCommand from superset.databases.schemas import DatabaseTestConnectionSchema +from superset.errors import SupersetError +from superset.exceptions import SupersetSecurityException from superset.models.core import Database from superset.utils.core import backend, get_example_database from tests.base_tests import SupersetTestCase @@ -541,4 +544,26 @@ def test_connection_db_exception_dbapi( mock_stats_logger.assert_called() + @mock.patch("superset.databases.dao.DatabaseDAO.build_db_for_connection_test") + @mock.patch("superset.databases.commands.test_connection.stats_logger.incr") + def test_connection_superset_security_connection( + self, mock_stats_logger, mock_build_db_for_connection_test + ): + """Test that users can't export databases they don't have access to""" + database = get_example_database() + mock_build_db_for_connection_test.side_effect = SupersetSecurityException( + SupersetError(error_type=500, message="test", level="info", extra={}) + ) + db_uri = database.sqlalchemy_uri_decrypted + json_payload = {"sqlalchemy_uri": db_uri} + command_without_db_name = TestConnectionDatabaseCommand( + security_manager.find_user("admin"), json_payload + ) + + # test with no db name + with self.assertRaises(DatabaseSecurityUnsafeError): + command_without_db_name.run() + + mock_stats_logger.assert_called() + # assert False is True From 42ae1cd4136fafa0fcb511197789f998b9661bfe Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 1 Mar 2021 12:54:13 -0700 Subject: [PATCH 17/18] add db api exception --- tests/databases/commands_tests.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/databases/commands_tests.py b/tests/databases/commands_tests.py index b83d89cb0441e..b1ccb47ffd49d 100644 --- a/tests/databases/commands_tests.py +++ b/tests/databases/commands_tests.py @@ -30,6 +30,7 @@ DatabaseNotFoundError, DatabaseSecurityUnsafeError, DatabaseTestConnectionDriverError, + DatabaseTestConnectionFailedError, DatabaseTestConnectionUnexpectedError, ) from superset.databases.commands.export import ExportDatabasesCommand @@ -524,7 +525,7 @@ def test_import_v1_rollback(self, mock_import_dataset): class TestTestConnectionDatabaseCommand(SupersetTestCase): @mock.patch("superset.databases.dao.DatabaseDAO.build_db_for_connection_test") @mock.patch("superset.databases.commands.test_connection.stats_logger.incr") - def test_connection_db_exception_dbapi( + def test_connection_db_exception( self, mock_stats_logger, mock_build_db_for_connection_test ): """Test that users can't export databases they don't have access to""" @@ -566,4 +567,24 @@ def test_connection_superset_security_connection( mock_stats_logger.assert_called() - # assert False is True + @mock.patch("superset.databases.dao.DatabaseDAO.build_db_for_connection_test") + @mock.patch("superset.databases.commands.test_connection.stats_logger.incr") + def test_connection_db_api_exc( + self, mock_stats_logger, mock_build_db_for_connection_test + ): + """Test that users can't export databases they don't have access to""" + database = get_example_database() + mock_build_db_for_connection_test.side_effect = DBAPIError( + statement="error", params={}, orig={} + ) + db_uri = database.sqlalchemy_uri_decrypted + json_payload = {"sqlalchemy_uri": db_uri} + command_without_db_name = TestConnectionDatabaseCommand( + security_manager.find_user("admin"), json_payload + ) + + # test with no db name + with self.assertRaises(DatabaseTestConnectionFailedError): + command_without_db_name.run() + + mock_stats_logger.assert_called() From d323eb1e7dda5ec3242fc3e49e3d65a91dbae87f Mon Sep 17 00:00:00 2001 From: hughhhh Date: Mon, 1 Mar 2021 12:54:39 -0700 Subject: [PATCH 18/18] cleanup --- tests/databases/commands_tests.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/databases/commands_tests.py b/tests/databases/commands_tests.py index b1ccb47ffd49d..8eaece501c6a0 100644 --- a/tests/databases/commands_tests.py +++ b/tests/databases/commands_tests.py @@ -539,7 +539,6 @@ def test_connection_db_exception( security_manager.find_user("admin"), json_payload ) - # test with no db name with self.assertRaises(DatabaseTestConnectionUnexpectedError): command_without_db_name.run() @@ -561,7 +560,6 @@ def test_connection_superset_security_connection( security_manager.find_user("admin"), json_payload ) - # test with no db name with self.assertRaises(DatabaseSecurityUnsafeError): command_without_db_name.run() @@ -583,7 +581,6 @@ def test_connection_db_api_exc( security_manager.find_user("admin"), json_payload ) - # test with no db name with self.assertRaises(DatabaseTestConnectionFailedError): command_without_db_name.run()