From cef76b59a1f0b4a447231e6ea45fbaaf1d1e5099 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Mon, 14 Mar 2022 11:00:36 -0400 Subject: [PATCH 01/14] call on_focus in test_szng004_on_focus --- components/dash-table/tests/selenium/test_sizing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/dash-table/tests/selenium/test_sizing.py b/components/dash-table/tests/selenium/test_sizing.py index 707678aa41..816e3ec6de 100644 --- a/components/dash-table/tests/selenium/test_sizing.py +++ b/components/dash-table/tests/selenium/test_sizing.py @@ -300,6 +300,10 @@ def test_szng002_percentages_result_in_same_widths(test): [generate_mock_data, generate_markdown_mock_data, generate_mixed_markdown_data], ) def test_szng004_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) + + +def on_focus(test, props, data_fn): app = dash.Dash(__name__) baseProps1 = get_props(data_fn=data_fn) From 3b6a2ed23fd5ec46f909519926e454690742a9a0 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Mon, 14 Mar 2022 11:05:41 -0400 Subject: [PATCH 02/14] split szng004_on_focus into 3 tests --- .../dash-table/tests/selenium/test_sizing.py | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/components/dash-table/tests/selenium/test_sizing.py b/components/dash-table/tests/selenium/test_sizing.py index 816e3ec6de..360d5f8ece 100644 --- a/components/dash-table/tests/selenium/test_sizing.py +++ b/components/dash-table/tests/selenium/test_sizing.py @@ -294,15 +294,6 @@ def test_szng002_percentages_result_in_same_widths(test): assert test.get_log_errors() == [] -@pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_mock_data, generate_markdown_mock_data, generate_mixed_markdown_data], -) -def test_szng004_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) - - def on_focus(test, props, data_fn): app = dash.Dash(__name__) @@ -333,3 +324,30 @@ def on_focus(test, props, data_fn): cells_are_same_width(t1, t2) assert test.get_log_errors() == [] + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_mock_data], +) +def test_szng004_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_markdown_mock_data], +) +def test_szng005_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_mixed_markdown_data], +) +def test_szng006_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) From 8e7d3650f9f5d7ab3c41a2f5bdb14381bcefb0f7 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Mon, 14 Mar 2022 12:40:30 -0400 Subject: [PATCH 03/14] move on_focus tests to separate files --- .../dash-table/tests/selenium/test_sizing.py | 32 ------------------- .../tests/selenium/test_sizing_x.py | 17 ++++++++++ .../tests/selenium/test_sizing_y.py | 17 ++++++++++ .../tests/selenium/test_sizing_z.py | 17 ++++++++++ 4 files changed, 51 insertions(+), 32 deletions(-) create mode 100644 components/dash-table/tests/selenium/test_sizing_x.py create mode 100644 components/dash-table/tests/selenium/test_sizing_y.py create mode 100644 components/dash-table/tests/selenium/test_sizing_z.py diff --git a/components/dash-table/tests/selenium/test_sizing.py b/components/dash-table/tests/selenium/test_sizing.py index 360d5f8ece..d2f743e7e4 100644 --- a/components/dash-table/tests/selenium/test_sizing.py +++ b/components/dash-table/tests/selenium/test_sizing.py @@ -1,12 +1,7 @@ import dash -import pytest from utils import ( - basic_modes, get_props, - generate_mock_data, - generate_markdown_mock_data, - generate_mixed_markdown_data, ) from dash.dependencies import Input, Output @@ -324,30 +319,3 @@ def on_focus(test, props, data_fn): cells_are_same_width(t1, t2) assert test.get_log_errors() == [] - - -@pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_mock_data], -) -def test_szng004_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) - - -@pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_markdown_mock_data], -) -def test_szng005_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) - - -@pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_mixed_markdown_data], -) -def test_szng006_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) diff --git a/components/dash-table/tests/selenium/test_sizing_x.py b/components/dash-table/tests/selenium/test_sizing_x.py new file mode 100644 index 0000000000..ea132cac6e --- /dev/null +++ b/components/dash-table/tests/selenium/test_sizing_x.py @@ -0,0 +1,17 @@ +import pytest + +from test_sizing import on_focus + +from utils import ( + basic_modes, + generate_mock_data, +) + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_mock_data], +) +def test_szng004_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) diff --git a/components/dash-table/tests/selenium/test_sizing_y.py b/components/dash-table/tests/selenium/test_sizing_y.py new file mode 100644 index 0000000000..f8388991a2 --- /dev/null +++ b/components/dash-table/tests/selenium/test_sizing_y.py @@ -0,0 +1,17 @@ +import pytest + +from test_sizing import on_focus + +from utils import ( + basic_modes, + generate_markdown_mock_data, +) + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_markdown_mock_data], +) +def test_szng005_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) diff --git a/components/dash-table/tests/selenium/test_sizing_z.py b/components/dash-table/tests/selenium/test_sizing_z.py new file mode 100644 index 0000000000..edd081106e --- /dev/null +++ b/components/dash-table/tests/selenium/test_sizing_z.py @@ -0,0 +1,17 @@ +import pytest + +from test_sizing import on_focus + +from utils import ( + basic_modes, + generate_mixed_markdown_data, +) + + +@pytest.mark.parametrize("props", basic_modes) +@pytest.mark.parametrize( + "data_fn", + [generate_mixed_markdown_data], +) +def test_szng006_on_focus(test, props, data_fn): + on_focus(test, props, data_fn) From 0d36a4e6a47459410081cc573656b94863adcdab Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Mon, 14 Mar 2022 13:25:33 -0400 Subject: [PATCH 04/14] adjust parallelism in table-server-test --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a817962452..176d3817c6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -385,7 +385,7 @@ jobs: PERCY_ENABLE: 1 PERCY_PARALLEL_TOTAL: -1 - parallelism: 4 + parallelism: 5 steps: - checkout: From e19dc6de7592e6c16b3971890b9778907fc959cf Mon Sep 17 00:00:00 2001 From: philippe Date: Thu, 10 Mar 2022 13:40:46 -0500 Subject: [PATCH 05/14] Replace deprecated flask shutdown with thread kill. #1780 --- dash/testing/application_runners.py | 40 ++++++++++++++++++----------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/dash/testing/application_runners.py b/dash/testing/application_runners.py index 87a7b9cb28..323b272157 100644 --- a/dash/testing/application_runners.py +++ b/dash/testing/application_runners.py @@ -7,9 +7,9 @@ import subprocess import logging import inspect +import ctypes import runpy -import flask import requests from dash.testing.errors import NoAppFoundError, TestingTimeoutError, ServerCloseError @@ -102,6 +102,26 @@ def tmp_app_path(self): return self._tmp_app_path +class StoppableThread(threading.Thread): + def get_id(self): # pylint: disable=R1710 + if hasattr(self, "_thread_id"): + return self._thread_id + for thread_id, thread in threading._active.items(): # pylint: disable=W0212 + if thread is self: + return thread_id + + def kill(self): + thread_id = self.get_id() + res = ctypes.pythonapi.PyThreadState_SetAsyncExc( + ctypes.c_long(thread_id), ctypes.py_object(SystemExit) + ) + if res == 0: + raise ValueError(f"Invalid thread id: {thread_id}") + if res > 1: + ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(thread_id), None) + raise SystemExit("Stopping thread failure") + + class ThreadedRunner(BaseDashRunner): """Runs a dash application in a thread. @@ -110,25 +130,14 @@ class ThreadedRunner(BaseDashRunner): def __init__(self, keep_open=False, stop_timeout=3): super().__init__(keep_open=keep_open, stop_timeout=stop_timeout) - self.stop_route = "/_stop-{}".format(uuid.uuid4().hex) self.thread = None - @staticmethod - def _stop_server(): - # https://werkzeug.palletsprojects.com/en/0.15.x/serving/#shutting-down-the-server - stopper = flask.request.environ.get("werkzeug.server.shutdown") - if stopper is None: - raise RuntimeError("Not running with the Werkzeug Server") - stopper() - return "Flask server is shutting down" - # pylint: disable=arguments-differ def start(self, app, **kwargs): """Start the app server in threading flavor.""" - app.server.add_url_rule(self.stop_route, self.stop_route, self._stop_server) def _handle_error(): - self._stop_server() + self.stop() app.server.errorhandler(500)(_handle_error) @@ -141,7 +150,7 @@ def run(): self.port = kwargs["port"] app.run_server(threaded=True, **kwargs) - self.thread = threading.Thread(target=run) + self.thread = StoppableThread(target=run) self.thread.daemon = True try: self.thread.start() @@ -155,7 +164,8 @@ def run(): wait.until(lambda: self.accessible(self.url), timeout=1) def stop(self): - requests.get("{}{}".format(self.url, self.stop_route)) + self.thread.kill() + self.thread.join() wait.until_not(self.thread.is_alive, self.stop_timeout) From 13733f5dd6b065faaba527b7e5f080ce5394fab2 Mon Sep 17 00:00:00 2001 From: philippe Date: Mon, 14 Mar 2022 09:00:23 -0400 Subject: [PATCH 06/14] Wrap app.run_server in try except. --- dash/testing/application_runners.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dash/testing/application_runners.py b/dash/testing/application_runners.py index 323b272157..2a79d0373e 100644 --- a/dash/testing/application_runners.py +++ b/dash/testing/application_runners.py @@ -148,7 +148,11 @@ def run(): kwargs["port"] = self.port else: self.port = kwargs["port"] - app.run_server(threaded=True, **kwargs) + + try: + app.run_server(threaded=True, **kwargs) + except SystemExit: + logger.info("Server stopped") self.thread = StoppableThread(target=run) self.thread.daemon = True From a3bbd74a8a68dfa233c780b2f344f2f56603c2e3 Mon Sep 17 00:00:00 2001 From: philippe Date: Fri, 18 Mar 2022 10:42:41 -0400 Subject: [PATCH 07/14] Update changelog for 1963. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b689c025ca..b036f014cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to `dash` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [Unreleased] + +### Fixed + +- [#1963](https://github.com/plotly/dash/pull/1963) Fix [#1780](https://github.com/plotly/dash/issues/1780) flask shutdown deprecation warning when running dashduo threaded tests. + ## [2.3.0] - 2022-03-13 ### Added From 6bd395d1e92ac5021c5b5ad53140a544cc92734b Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Fri, 18 Mar 2022 12:35:26 -0400 Subject: [PATCH 08/14] refactor - inline data_fn in test_sizing x, y & z --- components/dash-table/tests/selenium/test_sizing_x.py | 8 ++------ components/dash-table/tests/selenium/test_sizing_y.py | 8 ++------ components/dash-table/tests/selenium/test_sizing_z.py | 8 ++------ 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/components/dash-table/tests/selenium/test_sizing_x.py b/components/dash-table/tests/selenium/test_sizing_x.py index ea132cac6e..51dfefc046 100644 --- a/components/dash-table/tests/selenium/test_sizing_x.py +++ b/components/dash-table/tests/selenium/test_sizing_x.py @@ -9,9 +9,5 @@ @pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_mock_data], -) -def test_szng004_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) +def test_szng004_on_focus(test, props): + on_focus(test, props, generate_mock_data) diff --git a/components/dash-table/tests/selenium/test_sizing_y.py b/components/dash-table/tests/selenium/test_sizing_y.py index f8388991a2..7a2344cab0 100644 --- a/components/dash-table/tests/selenium/test_sizing_y.py +++ b/components/dash-table/tests/selenium/test_sizing_y.py @@ -9,9 +9,5 @@ @pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_markdown_mock_data], -) -def test_szng005_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) +def test_szng005_on_focus(test, props): + on_focus(test, props, generate_markdown_mock_data) diff --git a/components/dash-table/tests/selenium/test_sizing_z.py b/components/dash-table/tests/selenium/test_sizing_z.py index edd081106e..004ad015dd 100644 --- a/components/dash-table/tests/selenium/test_sizing_z.py +++ b/components/dash-table/tests/selenium/test_sizing_z.py @@ -9,9 +9,5 @@ @pytest.mark.parametrize("props", basic_modes) -@pytest.mark.parametrize( - "data_fn", - [generate_mixed_markdown_data], -) -def test_szng006_on_focus(test, props, data_fn): - on_focus(test, props, data_fn) +def test_szng006_on_focus(test, props): + on_focus(test, props, generate_mixed_markdown_data) From 877aaa95d4d11890715aec1f982915dbbb72a606 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 29 Mar 2022 12:17:40 -0400 Subject: [PATCH 09/14] Fix werkzeug 2.1.0 import & dev tools error html rendering. --- .../error/FrontEnd/FrontEndError.react.js | 2 +- dash/dash.py | 42 +++++++++++++++---- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/dash/dash-renderer/src/components/error/FrontEnd/FrontEndError.react.js b/dash/dash-renderer/src/components/error/FrontEnd/FrontEndError.react.js index 5703add4db..49939ea1de 100644 --- a/dash/dash-renderer/src/components/error/FrontEnd/FrontEndError.react.js +++ b/dash/dash-renderer/src/components/error/FrontEnd/FrontEndError.react.js @@ -110,7 +110,7 @@ function UnconnectedErrorContent({error, base}) { )} {/* Backend Error */} {typeof error.html !== 'string' ? null : error.html.indexOf( - '
diff --git a/dash/dash.py b/dash/dash.py index c0b6cb410d..963f1d829e 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -15,7 +15,10 @@ import flask from flask_compress import Compress -from werkzeug.debug.tbtools import get_current_traceback + +from werkzeug.debug import tbtools +from werkzeug.security import gen_salt + from pkg_resources import get_distribution, parse_version from dash import dcc from dash import html @@ -102,6 +105,30 @@ _re_renderer_scripts_id = 'id="_dash-renderer', "new DashRenderer" +def _get_traceback(secret, error): + def _get_skip(text): + skip = 0 + for i, line in enumerate(text.splitlines()): + if "%% callback invoked %%" in line: + skip = int((i + 1) / 2) + break + return skip + + # werkzeug<2.1.0 + if hasattr(tbtools, "get_current_traceback"): + tb = tbtools.get_current_traceback() + skip = _get_skip(tb.plaintext) + return tbtools.get_current_traceback(skip=skip).render_full() + + tb = tbtools.DebugTraceback(error) # pylint: disable=no-member + skip = _get_skip(tb.render_traceback_text()) + + # pylint: disable=no-member + return tbtools.DebugTraceback(error, skip=skip).render_debugger_html( + True, secret, True + ) + + class _NoUpdate: # pylint: disable=too-few-public-methods pass @@ -1756,19 +1783,16 @@ def enable_dev_tools( if debug and dev_tools.prune_errors: + secret = gen_salt(20) + @self.server.errorhandler(Exception) - def _wrap_errors(_): + def _wrap_errors(error): # find the callback invocation, if the error is from a callback # and skip the traceback up to that point # if the error didn't come from inside a callback, we won't # skip anything. - tb = get_current_traceback() - skip = 0 - for i, line in enumerate(tb.plaintext.splitlines()): - if "%% callback invoked %%" in line: - skip = int((i + 1) / 2) - break - return get_current_traceback(skip=skip).render_full(), 500 + tb = _get_traceback(secret, error) + return tb, 500 if debug and dev_tools.ui: From 8c198b41b360e55c9dcee975ab7225731b1d5571 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 29 Mar 2022 13:06:17 -0400 Subject: [PATCH 10/14] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b036f014cf..700fce7b78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ### Fixed - [#1963](https://github.com/plotly/dash/pull/1963) Fix [#1780](https://github.com/plotly/dash/issues/1780) flask shutdown deprecation warning when running dashduo threaded tests. +- [#1995](https://github.com/plotly/dash/pull/1995) Fix [#1992](https://github.com/plotly/dash/issues/1992) ImportError: cannot import name 'get_current_traceback' from 'werkzeug.debug.tbtools'. ## [2.3.0] - 2022-03-13 From 5e89d95225d17e4ae4b0fdd94fd1c05d7bfe8761 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 29 Mar 2022 15:26:15 -0400 Subject: [PATCH 11/14] Add fallback traceback formatting. --- dash/_utils.py | 8 ++++++++ dash/dash.py | 39 +++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/dash/_utils.py b/dash/_utils.py index 31de7e88cb..83b2895554 100644 --- a/dash/_utils.py +++ b/dash/_utils.py @@ -8,6 +8,8 @@ import logging import io import json +import secrets +import string from functools import wraps logger = logging.getLogger() @@ -206,3 +208,9 @@ def _wrapper(*args, **kwargs): return _wrapper return wrapper + + +def gen_salt(chars): + return "".join( + secrets.choice(string.ascii_letters + string.digits) for _ in range(chars) + ) diff --git a/dash/dash.py b/dash/dash.py index 963f1d829e..cc04b48b10 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -11,14 +11,12 @@ import mimetypes import hashlib import base64 +import traceback from urllib.parse import urlparse import flask from flask_compress import Compress -from werkzeug.debug import tbtools -from werkzeug.security import gen_salt - from pkg_resources import get_distribution, parse_version from dash import dcc from dash import html @@ -51,6 +49,7 @@ patch_collections_abc, split_callback_id, to_json, + gen_salt, ) from . import _callback from . import _get_paths @@ -105,28 +104,40 @@ _re_renderer_scripts_id = 'id="_dash-renderer', "new DashRenderer" -def _get_traceback(secret, error): - def _get_skip(text): +def _get_traceback(secret, error: Exception): + + try: + # pylint: disable=import-outside-toplevel + from werkzeug.debug import tbtools + except ImportError: + tbtools = None + + def _get_skip(text, divider=2): skip = 0 - for i, line in enumerate(text.splitlines()): + for i, line in enumerate(text): if "%% callback invoked %%" in line: - skip = int((i + 1) / 2) + skip = int((i + 1) / divider) break return skip # werkzeug<2.1.0 if hasattr(tbtools, "get_current_traceback"): tb = tbtools.get_current_traceback() - skip = _get_skip(tb.plaintext) + skip = _get_skip(tb.plaintext.splitlines()) return tbtools.get_current_traceback(skip=skip).render_full() - tb = tbtools.DebugTraceback(error) # pylint: disable=no-member - skip = _get_skip(tb.render_traceback_text()) + if hasattr(tbtools, "DebugTraceback"): + tb = tbtools.DebugTraceback(error) # pylint: disable=no-member + skip = _get_skip(tb.render_traceback_text().splitlines()) + + # pylint: disable=no-member + return tbtools.DebugTraceback(error, skip=skip).render_debugger_html( + True, secret, True + ) - # pylint: disable=no-member - return tbtools.DebugTraceback(error, skip=skip).render_debugger_html( - True, secret, True - ) + tb = traceback.format_exception(type(error), error, error.__traceback__) + skip = _get_skip(tb, 1) + return tb[0] + "".join(tb[skip:]) class _NoUpdate: From c2c7ee0881fe7dac09f5fd92f2817281cb50d18c Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Tue, 29 Mar 2022 17:16:05 -0400 Subject: [PATCH 12/14] downgrade click on CI for use with black==21.6b0 new click==8.1.0 fails, but 8.0.4 is fine. --- requires-ci.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requires-ci.txt b/requires-ci.txt index dbeb8476c0..56277ca3f3 100644 --- a/requires-ci.txt +++ b/requires-ci.txt @@ -1,5 +1,6 @@ # Dependencies used by CI on github.com/plotly/dash black==21.6b0 +click==8.0.4 dash-flow-example==0.0.5 dash-dangerously-set-inner-html flake8==3.9.2 From 660694ec87db36a3b585eb60ff2286ce293a970d Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Tue, 29 Mar 2022 17:24:47 -0400 Subject: [PATCH 13/14] version bump dash 2.3.1, dash-renderer 1.11.4 --- CHANGELOG.md | 2 +- dash/_dash_renderer.py | 4 ++-- dash/dash-renderer/package-lock.json | 4 ++-- dash/dash-renderer/package.json | 2 +- dash/version.py | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 700fce7b78..7b67f54c9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to `dash` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [Unreleased] +## [2.3.1] - 2022-03-29 ### Fixed diff --git a/dash/_dash_renderer.py b/dash/_dash_renderer.py index b7bdcfbccf..ce978ec74e 100644 --- a/dash/_dash_renderer.py +++ b/dash/_dash_renderer.py @@ -1,4 +1,4 @@ -__version__ = "1.11.3" +__version__ = "1.11.4" _js_dist_dependencies = [ { @@ -39,7 +39,7 @@ { "relative_package_path": "dash-renderer/build/dash_renderer.min.js", "dev_package_path": "dash-renderer/build/dash_renderer.dev.js", - "external_url": "https://unpkg.com/dash-renderer@1.11.3" + "external_url": "https://unpkg.com/dash-renderer@1.11.4" "/build/dash_renderer.min.js", "namespace": "dash", }, diff --git a/dash/dash-renderer/package-lock.json b/dash/dash-renderer/package-lock.json index 07b3ed0b5b..b9e768168f 100644 --- a/dash/dash-renderer/package-lock.json +++ b/dash/dash-renderer/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-renderer", - "version": "1.11.3", + "version": "1.11.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-renderer", - "version": "1.11.3", + "version": "1.11.4", "license": "MIT", "dependencies": { "@babel/polyfill": "^7.12.1", diff --git a/dash/dash-renderer/package.json b/dash/dash-renderer/package.json index e03100240e..57171862c6 100644 --- a/dash/dash-renderer/package.json +++ b/dash/dash-renderer/package.json @@ -1,6 +1,6 @@ { "name": "dash-renderer", - "version": "1.11.3", + "version": "1.11.4", "description": "render dash components in react", "main": "build/dash_renderer.min.js", "scripts": { diff --git a/dash/version.py b/dash/version.py index 55e4709070..3a5935a2d0 100644 --- a/dash/version.py +++ b/dash/version.py @@ -1 +1 @@ -__version__ = "2.3.0" +__version__ = "2.3.1" From 1ab5aba439708a2eb6fa3a6705249f042323b6ca Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Tue, 29 Mar 2022 17:37:22 -0400 Subject: [PATCH 14/14] looser click restriction in CI --- requires-ci.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requires-ci.txt b/requires-ci.txt index 56277ca3f3..6106e2fafb 100644 --- a/requires-ci.txt +++ b/requires-ci.txt @@ -1,6 +1,6 @@ # Dependencies used by CI on github.com/plotly/dash black==21.6b0 -click==8.0.4 +click<8.1 dash-flow-example==0.0.5 dash-dangerously-set-inner-html flake8==3.9.2