Skip to content

Commit 197180c

Browse files
committed
Support plotly.Figure
1 parent fb8decb commit 197180c

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

dash/development/_py_components_generation.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from dash.exceptions import NonExistentEventException
1111
from ._all_keywords import python_keywords
1212
from ._collect_nodes import collect_nodes, filter_base_nodes
13-
from ._py_prop_typing import get_prop_typing, shapes
13+
from ._py_prop_typing import get_prop_typing, shapes, custom_imports
1414
from .base_component import Component
1515

1616

@@ -150,7 +150,7 @@ def __init__(
150150

151151
type_name = type_info.get("name")
152152

153-
typed = get_prop_typing(type_name, typename, prop_key, type_info)
153+
typed = get_prop_typing(type_name, typename, prop_key, type_info, namespace)
154154

155155
arg_value = f"{prop_key}: {typed} = {default_value}"
156156

@@ -220,6 +220,12 @@ def generate_class_file(
220220
class_string = generate_class_string(
221221
typename, props, description, namespace, prop_reorder_exceptions, max_props
222222
)
223+
224+
custom_imp = custom_imports[namespace][typename]
225+
if custom_imports:
226+
import_string += "\n".join(custom_imp)
227+
import_string += "\n\n"
228+
223229
file_name = f"{typename:s}.py"
224230

225231
file_path = os.path.join(namespace, file_name)

dash/development/_py_prop_typing.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import collections
12
import json
23
import string
34
import textwrap
5+
46
import stringcase
57

68

@@ -10,6 +12,7 @@
1012
{values}
1113
)
1214
"""
15+
custom_imports = collections.defaultdict(lambda: collections.defaultdict(list))
1316

1417

1518
def _clean_key(key):
@@ -115,10 +118,31 @@ def generate_enum(type_info, *_):
115118
return f"Literal[{', '.join(values)}]"
116119

117120

118-
def get_prop_typing(type_name: str, component_name: str, prop_name: str, type_info):
119-
return PROP_TYPING.get(type_name, generate_any)(
121+
def get_prop_typing(
122+
type_name: str, component_name: str, prop_name: str, type_info, namespace=None
123+
):
124+
if namespace:
125+
# Only check the namespace once
126+
special = (
127+
special_cases.get(namespace, {}).get(component_name, {}).get(prop_name)
128+
)
129+
if special:
130+
return special(type_info, component_name, prop_name)
131+
132+
prop_type = PROP_TYPING.get(type_name, generate_any)(
120133
type_info, component_name, prop_name
121134
)
135+
return prop_type
136+
137+
138+
def generate_plotly_figure(*_):
139+
custom_imports["dash_core_components"]["Graph"].append(
140+
"from plotly.graph_objects import Figure"
141+
)
142+
return "typing.Union[Figure, dict]"
143+
144+
145+
special_cases = {"dash_core_components": {"Graph": {"figure": generate_plotly_figure}}}
122146

123147

124148
PROP_TYPING = {

0 commit comments

Comments
 (0)