diff --git a/components/dash-core-components/src/fragments/DatePickerRange.react.js b/components/dash-core-components/src/fragments/DatePickerRange.react.js index b548a01148..fe8fab4cc8 100644 --- a/components/dash-core-components/src/fragments/DatePickerRange.react.js +++ b/components/dash-core-components/src/fragments/DatePickerRange.react.js @@ -3,7 +3,7 @@ import {DateRangePicker} from 'react-dates'; import React, {Component} from 'react'; import uniqid from 'uniqid'; -import {propTypes, defaultProps} from '../components/DatePickerRange.react'; +import {propTypes} from '../components/DatePickerRange.react'; import convertToMoment from '../utils/convertToMoment'; import LoadingElement from '../utils/LoadingElement'; @@ -219,4 +219,3 @@ export default class DatePickerRange extends Component { } DatePickerRange.propTypes = propTypes; -DatePickerRange.defaultProps = defaultProps; diff --git a/components/dash-core-components/src/fragments/DatePickerSingle.react.js b/components/dash-core-components/src/fragments/DatePickerSingle.react.js index 5b5ac3784b..8cbe792588 100644 --- a/components/dash-core-components/src/fragments/DatePickerSingle.react.js +++ b/components/dash-core-components/src/fragments/DatePickerSingle.react.js @@ -4,7 +4,7 @@ import {SingleDatePicker} from 'react-dates'; import moment from 'moment'; import React, {Component} from 'react'; -import {propTypes, defaultProps} from '../components/DatePickerSingle.react'; +import {propTypes} from '../components/DatePickerSingle.react'; import convertToMoment from '../utils/convertToMoment'; import LoadingElement from '../utils/LoadingElement'; @@ -155,4 +155,3 @@ export default class DatePickerSingle extends Component { } DatePickerSingle.propTypes = propTypes; -DatePickerSingle.defaultProps = defaultProps; diff --git a/components/dash-core-components/src/fragments/Markdown.react.js b/components/dash-core-components/src/fragments/Markdown.react.js index b209c73a7a..557ed863fd 100644 --- a/components/dash-core-components/src/fragments/Markdown.react.js +++ b/components/dash-core-components/src/fragments/Markdown.react.js @@ -6,7 +6,7 @@ import RemarkMath from 'remark-math'; import Math from './Math.react'; import MarkdownHighlighter from '../utils/MarkdownHighlighter'; -import {propTypes, defaultProps} from '../components/Markdown.react'; +import {propTypes} from '../components/Markdown.react'; import DccLink from './../components/Link.react'; import LoadingElement from '../utils/LoadingElement'; @@ -187,4 +187,3 @@ export default class DashMarkdown extends Component { } DashMarkdown.propTypes = propTypes; -DashMarkdown.defaultProps = defaultProps; diff --git a/components/dash-core-components/src/fragments/RangeSlider.react.js b/components/dash-core-components/src/fragments/RangeSlider.react.js index 4673d2b5df..e0aa0dc312 100644 --- a/components/dash-core-components/src/fragments/RangeSlider.react.js +++ b/components/dash-core-components/src/fragments/RangeSlider.react.js @@ -10,7 +10,7 @@ import { calcStep, setUndefined, } from '../utils/computeSliderMarkers'; -import {propTypes, defaultProps} from '../components/RangeSlider.react'; +import {propTypes} from '../components/RangeSlider.react'; import { formatSliderTooltip, transformSliderTooltip, @@ -152,4 +152,3 @@ export default class RangeSlider extends Component { } RangeSlider.propTypes = propTypes; -RangeSlider.defaultProps = defaultProps; diff --git a/components/dash-core-components/src/fragments/Slider.react.js b/components/dash-core-components/src/fragments/Slider.react.js index 61e3d97317..eeebde563d 100644 --- a/components/dash-core-components/src/fragments/Slider.react.js +++ b/components/dash-core-components/src/fragments/Slider.react.js @@ -10,7 +10,7 @@ import { calcStep, setUndefined, } from '../utils/computeSliderMarkers'; -import {propTypes, defaultProps} from '../components/Slider.react'; +import {propTypes} from '../components/Slider.react'; import { formatSliderTooltip, transformSliderTooltip, @@ -152,4 +152,3 @@ export default class Slider extends Component { } Slider.propTypes = propTypes; -Slider.defaultProps = defaultProps; diff --git a/components/dash-core-components/src/fragments/Upload.react.js b/components/dash-core-components/src/fragments/Upload.react.js index f106ce99b0..3e9ac0bd34 100644 --- a/components/dash-core-components/src/fragments/Upload.react.js +++ b/components/dash-core-components/src/fragments/Upload.react.js @@ -1,7 +1,7 @@ import React, {Component} from 'react'; import Dropzone from 'react-dropzone'; -import {propTypes, defaultProps} from '../components/Upload.react'; +import {propTypes} from '../components/Upload.react'; import LoadingElement from '../utils/LoadingElement'; export default class Upload extends Component { @@ -91,4 +91,3 @@ export default class Upload extends Component { } Upload.propTypes = propTypes; -Upload.defaultProps = defaultProps; diff --git a/components/dash-core-components/tests/integration/graph/test_graph_varia.py b/components/dash-core-components/tests/integration/graph/test_graph_varia.py index 373aa1fee4..582c211aa7 100644 --- a/components/dash-core-components/tests/integration/graph/test_graph_varia.py +++ b/components/dash-core-components/tests/integration/graph/test_graph_varia.py @@ -15,6 +15,8 @@ from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC +from flaky import flaky + @pytest.mark.parametrize("is_eager", [True, False]) def test_grva001_candlestick(dash_dcc, is_eager): @@ -681,6 +683,7 @@ def load_chart(n_clicks): assert dash_dcc.get_logs() == [] +@flaky(max_runs=3) def test_grva008_shapes_not_lost(dash_dcc): # See issue #879 and pr #905 app = Dash(__name__) diff --git a/components/dash-table/tests/selenium/test_navigation.py b/components/dash-table/tests/selenium/test_navigation.py index 44e6c1fe09..78c587d5e3 100644 --- a/components/dash-table/tests/selenium/test_navigation.py +++ b/components/dash-table/tests/selenium/test_navigation.py @@ -6,6 +6,7 @@ from selenium.webdriver.common.keys import Keys import pytest +import flaky DATA_SIZE = 50 @@ -154,6 +155,7 @@ def test_navg002_keyboard_after_ctrl_copy(test, props): assert test.get_log_errors() == [] +@flaky.flaky(max_runs=3) @pytest.mark.parametrize("props", [get_markdown_table(), get_mixed_markdown_table()]) @pytest.mark.parametrize( "key,row,col", diff --git a/dash/__init__.py b/dash/__init__.py index 2c8542a6b5..92d9e45a12 100644 --- a/dash/__init__.py +++ b/dash/__init__.py @@ -61,6 +61,7 @@ def _jupyter_nbextension_paths(): "Input", "Output", "State", + "clientside_callback", "ClientsideFunction", "MATCH", "ALLSMALLER", @@ -88,4 +89,5 @@ def _jupyter_nbextension_paths(): "Patch", "jupyter_dash", "ctx", + "hooks", ] diff --git a/dash/_callback.py b/dash/_callback.py index d9bae3d6ec..eb023ea1a3 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -68,10 +68,10 @@ def callback( *_args, background: bool = False, interval: int = 1000, - progress: Optional[Output] = None, + progress: Optional[Union[List[Output], Output]] = None, progress_default: Any = None, running: Optional[List[Tuple[Output, Any, Any]]] = None, - cancel: Optional[List[Input]] = None, + cancel: Optional[Union[List[Input], Input]] = None, manager: Optional[BaseBackgroundCallbackManager] = None, cache_args_to_ignore: Optional[list] = None, on_error: Optional[Callable[[Exception], Any]] = None, diff --git a/tests/integration/multi_page/test_pages_relative_path.py b/tests/integration/multi_page/test_pages_relative_path.py index 3d6345a4a8..6c505ac3f5 100644 --- a/tests/integration/multi_page/test_pages_relative_path.py +++ b/tests/integration/multi_page/test_pages_relative_path.py @@ -50,7 +50,11 @@ def test_pare001_relative_path(dash_duo, clear_pages_state): for page in dash.page_registry.values(): dash_duo.find_element("#" + page["id"]).click() dash_duo.wait_for_text_to_equal("#text_" + page["id"], "text for " + page["id"]) - assert dash_duo.driver.title == page["title"], "check that page title updates" + dash_duo._wait_for( + lambda _: dash_duo.driver.title == page["title"], + msg="check that page title updates", + timeout=3, + ) assert dash_duo.get_logs() == [], "browser console should contain no error"