Skip to content

Commit 9323c28

Browse files
authored
Merge pull request #2841 from DanielIskandar/dev
fix some typing issues
2 parents f04613c + 158ae46 commit 9323c28

File tree

4 files changed

+1350
-1137
lines changed

4 files changed

+1350
-1137
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
88

99
- [#2987](https://github.com/plotly/dash/pull/2987) Fix multioutput requiring same number of no_update. Fixes [#2986](https://github.com/plotly/dash/issues/2986)
1010
- [2988](https://github.com/plotly/dash/pull/2988) Fix error handler and grouped outputs. Fixes [#2983](https://github.com/plotly/dash/issues/2983)
11+
- [#2841](https://github.com/plotly/dash/pull/2841) Fix typing on Dash init.
1112

1213
## Deprecated
1314

dash/_jupyter.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import threading
1010
import time
1111

12+
from typing import Optional
1213
from typing_extensions import Literal
1314

1415
from werkzeug.serving import make_server
@@ -228,7 +229,7 @@ def _receive_message(msg):
228229
def run_app(
229230
self,
230231
app,
231-
mode: JupyterDisplayMode = None,
232+
mode: Optional[JupyterDisplayMode] = None,
232233
width="100%",
233234
height=650,
234235
host="127.0.0.1",
@@ -266,7 +267,7 @@ def run_app(
266267
f" Received value of type {type(mode)}: {repr(mode)}"
267268
)
268269
else:
269-
mode = mode.lower()
270+
mode = mode.lower() # type: ignore
270271
if mode not in valid_display_values:
271272
raise ValueError(
272273
f"Invalid display argument {mode}\n"

dash/dash.py

+50-40
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import base64
1717
import traceback
1818
from urllib.parse import urlparse
19-
from typing import Any, Callable, Dict, Optional, Union
19+
from typing import Any, Callable, Dict, Optional, Union, List
2020

2121
import flask
2222

@@ -175,11 +175,13 @@ def _do_skip(error):
175175

176176
# werkzeug<2.1.0
177177
if hasattr(tbtools, "get_current_traceback"):
178-
return tbtools.get_current_traceback(skip=_get_skip(error)).render_full()
178+
return tbtools.get_current_traceback( # type: ignore
179+
skip=_get_skip(error)
180+
).render_full()
179181

180182
if hasattr(tbtools, "DebugTraceback"):
181183
# pylint: disable=no-member
182-
return tbtools.DebugTraceback(
184+
return tbtools.DebugTraceback( # type: ignore
183185
error, skip=_get_skip(error)
184186
).render_debugger_html(True, secret, True)
185187

@@ -378,41 +380,47 @@ class Dash:
378380
_plotlyjs_url: str
379381
STARTUP_ROUTES: list = []
380382

383+
server: flask.Flask
384+
381385
def __init__( # pylint: disable=too-many-statements
382386
self,
383-
name=None,
384-
server=True,
385-
assets_folder="assets",
386-
pages_folder="pages",
387-
use_pages=None,
388-
assets_url_path="assets",
389-
assets_ignore="",
390-
assets_external_path=None,
391-
eager_loading=False,
392-
include_assets_files=True,
393-
include_pages_meta=True,
394-
url_base_pathname=None,
395-
requests_pathname_prefix=None,
396-
routes_pathname_prefix=None,
397-
serve_locally=True,
398-
compress=None,
399-
meta_tags=None,
400-
index_string=_default_index,
401-
external_scripts=None,
402-
external_stylesheets=None,
403-
suppress_callback_exceptions=None,
404-
prevent_initial_callbacks=False,
405-
show_undo_redo=False,
406-
extra_hot_reload_paths=None,
407-
plugins=None,
408-
title="Dash",
409-
update_title="Updating...",
410-
long_callback_manager=None,
411-
background_callback_manager=None,
412-
add_log_handler=True,
413-
hooks: Union[RendererHooks, None] = None,
387+
name: Optional[str] = None,
388+
server: Union[bool, flask.Flask] = True,
389+
assets_folder: str = "assets",
390+
pages_folder: str = "pages",
391+
use_pages: Optional[bool] = None,
392+
assets_url_path: str = "assets",
393+
assets_ignore: str = "",
394+
assets_external_path: Optional[str] = None,
395+
eager_loading: bool = False,
396+
include_assets_files: bool = True,
397+
include_pages_meta: bool = True,
398+
url_base_pathname: Optional[str] = None,
399+
requests_pathname_prefix: Optional[str] = None,
400+
routes_pathname_prefix: Optional[str] = None,
401+
serve_locally: bool = True,
402+
compress: Optional[bool] = None,
403+
meta_tags: Optional[List[Dict[str, Any]]] = None,
404+
index_string: str = _default_index,
405+
external_scripts: Optional[List[Union[str, Dict[str, Any]]]] = None,
406+
external_stylesheets: Optional[List[Union[str, Dict[str, Any]]]] = None,
407+
suppress_callback_exceptions: Optional[bool] = None,
408+
prevent_initial_callbacks: bool = False,
409+
show_undo_redo: bool = False,
410+
extra_hot_reload_paths: Optional[List[str]] = None,
411+
plugins: Optional[list] = None,
412+
title: str = "Dash",
413+
update_title: str = "Updating...",
414+
long_callback_manager: Optional[
415+
Any
416+
] = None, # Type should be specified if possible
417+
background_callback_manager: Optional[
418+
Any
419+
] = None, # Type should be specified if possible
420+
add_log_handler: bool = True,
421+
hooks: Optional[RendererHooks] = None,
414422
routing_callback_inputs: Optional[Dict[str, Union[Input, State]]] = None,
415-
description=None,
423+
description: Optional[str] = None,
416424
on_error: Optional[Callable[[Exception], Any]] = None,
417425
**obsolete,
418426
):
@@ -428,7 +436,7 @@ def __init__( # pylint: disable=too-many-statements
428436
name = getattr(server, "name", caller_name)
429437
elif isinstance(server, bool):
430438
name = name if name else caller_name
431-
self.server = flask.Flask(name) if server else None
439+
self.server = flask.Flask(name) if server else None # type: ignore
432440
else:
433441
raise ValueError("server must be a Flask app or a boolean")
434442

@@ -440,7 +448,7 @@ def __init__( # pylint: disable=too-many-statements
440448
name=name,
441449
assets_folder=os.path.join(
442450
flask.helpers.get_root_path(name), assets_folder
443-
),
451+
), # type: ignore
444452
assets_url_path=assets_url_path,
445453
assets_ignore=assets_ignore,
446454
assets_external_path=get_combined_config(
@@ -546,7 +554,9 @@ def __init__( # pylint: disable=too-many-statements
546554
if not self.logger.handlers and add_log_handler:
547555
self.logger.addHandler(logging.StreamHandler(stream=sys.stdout))
548556

549-
if isinstance(plugins, patch_collections_abc("Iterable")):
557+
if plugins is not None and isinstance(
558+
plugins, patch_collections_abc("Iterable")
559+
):
550560
for plugin in plugins:
551561
plugin.plug(self)
552562

@@ -1961,7 +1971,7 @@ def run(
19611971
port="8050",
19621972
proxy=None,
19631973
debug=None,
1964-
jupyter_mode: JupyterDisplayMode = None,
1974+
jupyter_mode: Optional[JupyterDisplayMode] = None,
19651975
jupyter_width="100%",
19661976
jupyter_height=650,
19671977
jupyter_server_url=None,
@@ -2096,7 +2106,7 @@ def run(
20962106
port = int(port)
20972107
assert port in range(1, 65536)
20982108
except Exception as e:
2099-
e.args = [f"Expecting an integer from 1 to 65535, found port={repr(port)}"]
2109+
e.args = (f"Expecting an integer from 1 to 65535, found port={repr(port)}",)
21002110
raise
21012111

21022112
# so we only see the "Running on" message once with hot reloading

0 commit comments

Comments
 (0)