Skip to content

Commit 476b8d3

Browse files
committed
Merge branch 'ipyplotly_integration' of https://github.com/plotly/plotly.py into ipyplotly_integration
merging from ipyplotly_integration
2 parents de23ce0 + f6a8575 commit 476b8d3

File tree

561 files changed

+7522
-5795
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

561 files changed

+7522
-5795
lines changed

_plotly_utils/basevalidators.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -1864,11 +1864,18 @@ def validate_coerce(self, v):
18641864

18651865
class BaseDataValidator(BaseValidator):
18661866

1867-
def __init__(self, class_strs_map, plotly_name, parent_name, **kwargs):
1867+
def __init__(self,
1868+
class_strs_map,
1869+
plotly_name,
1870+
parent_name,
1871+
set_uid=False,
1872+
**kwargs):
18681873
super(BaseDataValidator, self).__init__(
18691874
plotly_name=plotly_name, parent_name=parent_name, **kwargs)
1875+
18701876
self.class_strs_map = class_strs_map
18711877
self._class_map = None
1878+
self.set_uid = set_uid
18721879

18731880
def description(self):
18741881

@@ -1957,8 +1964,9 @@ def validate_coerce(self, v):
19571964
v = to_scalar_or_list(res)
19581965

19591966
# Set new UIDs
1960-
for trace in v:
1961-
trace.uid = str(uuid.uuid1())
1967+
if self.set_uid:
1968+
for trace in v:
1969+
trace.uid = str(uuid.uuid1())
19621970

19631971
else:
19641972
self.raise_invalid_val(v)

codegen/datatypes.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ def build_datatype_py(node):
8181
# -------
8282
buffer.write(
8383
f'from plotly.basedatatypes import {node.name_base_datatype}\n')
84+
buffer.write(
85+
f'import copy\n')
86+
8487

8588
# Write class definition
8689
# ----------------------
@@ -210,12 +213,14 @@ def __init__(self""")
210213
arg = {{}}
211214
elif isinstance(arg, self.__class__):
212215
arg = arg.to_plotly_json()
213-
elif not isinstance(arg, dict):
216+
elif isinstance(arg, dict):
217+
arg = copy.copy(arg)
218+
else:
214219
raise ValueError(\"\"\"\\
215220
The first argument to the {class_name}
216221
constructor must be a dict or
217222
an instance of {class_name}\"\"\")
218-
223+
219224
# Import validators
220225
# -----------------
221226
from plotly.validators{node.parent_dotpath_str} import (
@@ -237,7 +242,7 @@ def __init__(self""")
237242
name_prop = subtype_node.name_property
238243
buffer.write(f"""
239244
v = arg.pop('{name_prop}', None)
240-
self.{name_prop} = {name_prop} or v""")
245+
self.{name_prop} = {name_prop} if {name_prop} is not None else v""")
241246

242247
# ### Literals ###
243248
if literal_nodes:

plotly/basedatatypes.py

+41-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class is a subclass of both BaseFigure and widgets.DOMWidget.
119119
# ### Construct data validator ###
120120
# This is the validator that handles importing sequences of trace
121121
# objects
122-
self._data_validator = DataValidator()
122+
self._data_validator = DataValidator(set_uid=True)
123123

124124
# ### Import traces ###
125125
data = self._data_validator.validate_coerce(data)
@@ -3846,3 +3846,43 @@ def _send_prop_set(self, prop_path_str, val):
38463846
def on_change(self, callback, *args):
38473847
raise NotImplementedError(
38483848
'Change callbacks are not supported on Frames')
3849+
3850+
def _get_child_props(self, child):
3851+
"""
3852+
Return the properties dict for a child trace or child layout
3853+
3854+
Note: this method must match the name/signature of one on
3855+
BasePlotlyType
3856+
3857+
Parameters
3858+
----------
3859+
child : BaseTraceType | BaseLayoutType
3860+
3861+
Returns
3862+
-------
3863+
dict
3864+
"""
3865+
# Try to find index of child as a trace
3866+
# -------------------------------------
3867+
try:
3868+
trace_index = BaseFigure._index_is(self.data, child)
3869+
except ValueError as _:
3870+
trace_index = None
3871+
3872+
# Child is a trace
3873+
# ----------------
3874+
if trace_index is not None:
3875+
if 'data' in self._props:
3876+
return self._props['data'][trace_index]
3877+
else:
3878+
return None
3879+
3880+
# Child is the layout
3881+
# -------------------
3882+
elif child is self.layout:
3883+
return self._props.get('layout', None)
3884+
3885+
# Unknown child
3886+
# -------------
3887+
else:
3888+
raise ValueError('Unrecognized child: %s' % child)

plotly/graph_objs/_area.py

+24-21
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from plotly.basedatatypes import BaseTraceType
2+
import copy
23

34

45
class Area(BaseTraceType):
@@ -699,7 +700,9 @@ def __init__(
699700
arg = {}
700701
elif isinstance(arg, self.__class__):
701702
arg = arg.to_plotly_json()
702-
elif not isinstance(arg, dict):
703+
elif isinstance(arg, dict):
704+
arg = copy.copy(arg)
705+
else:
703706
raise ValueError(
704707
"""\
705708
The first argument to the plotly.graph_objs.Area
@@ -737,45 +740,45 @@ def __init__(
737740
# Populate data dict with properties
738741
# ----------------------------------
739742
v = arg.pop('customdata', None)
740-
self.customdata = customdata or v
743+
self.customdata = customdata if customdata is not None else v
741744
v = arg.pop('customdatasrc', None)
742-
self.customdatasrc = customdatasrc or v
745+
self.customdatasrc = customdatasrc if customdatasrc is not None else v
743746
v = arg.pop('hoverinfo', None)
744-
self.hoverinfo = hoverinfo or v
747+
self.hoverinfo = hoverinfo if hoverinfo is not None else v
745748
v = arg.pop('hoverinfosrc', None)
746-
self.hoverinfosrc = hoverinfosrc or v
749+
self.hoverinfosrc = hoverinfosrc if hoverinfosrc is not None else v
747750
v = arg.pop('hoverlabel', None)
748-
self.hoverlabel = hoverlabel or v
751+
self.hoverlabel = hoverlabel if hoverlabel is not None else v
749752
v = arg.pop('ids', None)
750-
self.ids = ids or v
753+
self.ids = ids if ids is not None else v
751754
v = arg.pop('idssrc', None)
752-
self.idssrc = idssrc or v
755+
self.idssrc = idssrc if idssrc is not None else v
753756
v = arg.pop('legendgroup', None)
754-
self.legendgroup = legendgroup or v
757+
self.legendgroup = legendgroup if legendgroup is not None else v
755758
v = arg.pop('marker', None)
756-
self.marker = marker or v
759+
self.marker = marker if marker is not None else v
757760
v = arg.pop('name', None)
758-
self.name = name or v
761+
self.name = name if name is not None else v
759762
v = arg.pop('opacity', None)
760-
self.opacity = opacity or v
763+
self.opacity = opacity if opacity is not None else v
761764
v = arg.pop('r', None)
762-
self.r = r or v
765+
self.r = r if r is not None else v
763766
v = arg.pop('rsrc', None)
764-
self.rsrc = rsrc or v
767+
self.rsrc = rsrc if rsrc is not None else v
765768
v = arg.pop('selectedpoints', None)
766-
self.selectedpoints = selectedpoints or v
769+
self.selectedpoints = selectedpoints if selectedpoints is not None else v
767770
v = arg.pop('showlegend', None)
768-
self.showlegend = showlegend or v
771+
self.showlegend = showlegend if showlegend is not None else v
769772
v = arg.pop('stream', None)
770-
self.stream = stream or v
773+
self.stream = stream if stream is not None else v
771774
v = arg.pop('t', None)
772-
self.t = t or v
775+
self.t = t if t is not None else v
773776
v = arg.pop('tsrc', None)
774-
self.tsrc = tsrc or v
777+
self.tsrc = tsrc if tsrc is not None else v
775778
v = arg.pop('uid', None)
776-
self.uid = uid or v
779+
self.uid = uid if uid is not None else v
777780
v = arg.pop('visible', None)
778-
self.visible = visible or v
781+
self.visible = visible if visible is not None else v
779782

780783
# Read-only literals
781784
# ------------------

plotly/graph_objs/_bar.py

+58-55
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from plotly.basedatatypes import BaseTraceType
2+
import copy
23

34

45
class Bar(BaseTraceType):
@@ -1984,7 +1985,9 @@ def __init__(
19841985
arg = {}
19851986
elif isinstance(arg, self.__class__):
19861987
arg = arg.to_plotly_json()
1987-
elif not isinstance(arg, dict):
1988+
elif isinstance(arg, dict):
1989+
arg = copy.copy(arg)
1990+
else:
19881991
raise ValueError(
19891992
"""\
19901993
The first argument to the plotly.graph_objs.Bar
@@ -2056,113 +2059,113 @@ def __init__(
20562059
# Populate data dict with properties
20572060
# ----------------------------------
20582061
v = arg.pop('base', None)
2059-
self.base = base or v
2062+
self.base = base if base is not None else v
20602063
v = arg.pop('basesrc', None)
2061-
self.basesrc = basesrc or v
2064+
self.basesrc = basesrc if basesrc is not None else v
20622065
v = arg.pop('cliponaxis', None)
2063-
self.cliponaxis = cliponaxis or v
2066+
self.cliponaxis = cliponaxis if cliponaxis is not None else v
20642067
v = arg.pop('constraintext', None)
2065-
self.constraintext = constraintext or v
2068+
self.constraintext = constraintext if constraintext is not None else v
20662069
v = arg.pop('customdata', None)
2067-
self.customdata = customdata or v
2070+
self.customdata = customdata if customdata is not None else v
20682071
v = arg.pop('customdatasrc', None)
2069-
self.customdatasrc = customdatasrc or v
2072+
self.customdatasrc = customdatasrc if customdatasrc is not None else v
20702073
v = arg.pop('dx', None)
2071-
self.dx = dx or v
2074+
self.dx = dx if dx is not None else v
20722075
v = arg.pop('dy', None)
2073-
self.dy = dy or v
2076+
self.dy = dy if dy is not None else v
20742077
v = arg.pop('error_x', None)
2075-
self.error_x = error_x or v
2078+
self.error_x = error_x if error_x is not None else v
20762079
v = arg.pop('error_y', None)
2077-
self.error_y = error_y or v
2080+
self.error_y = error_y if error_y is not None else v
20782081
v = arg.pop('hoverinfo', None)
2079-
self.hoverinfo = hoverinfo or v
2082+
self.hoverinfo = hoverinfo if hoverinfo is not None else v
20802083
v = arg.pop('hoverinfosrc', None)
2081-
self.hoverinfosrc = hoverinfosrc or v
2084+
self.hoverinfosrc = hoverinfosrc if hoverinfosrc is not None else v
20822085
v = arg.pop('hoverlabel', None)
2083-
self.hoverlabel = hoverlabel or v
2086+
self.hoverlabel = hoverlabel if hoverlabel is not None else v
20842087
v = arg.pop('hovertext', None)
2085-
self.hovertext = hovertext or v
2088+
self.hovertext = hovertext if hovertext is not None else v
20862089
v = arg.pop('hovertextsrc', None)
2087-
self.hovertextsrc = hovertextsrc or v
2090+
self.hovertextsrc = hovertextsrc if hovertextsrc is not None else v
20882091
v = arg.pop('ids', None)
2089-
self.ids = ids or v
2092+
self.ids = ids if ids is not None else v
20902093
v = arg.pop('idssrc', None)
2091-
self.idssrc = idssrc or v
2094+
self.idssrc = idssrc if idssrc is not None else v
20922095
v = arg.pop('insidetextfont', None)
2093-
self.insidetextfont = insidetextfont or v
2096+
self.insidetextfont = insidetextfont if insidetextfont is not None else v
20942097
v = arg.pop('legendgroup', None)
2095-
self.legendgroup = legendgroup or v
2098+
self.legendgroup = legendgroup if legendgroup is not None else v
20962099
v = arg.pop('marker', None)
2097-
self.marker = marker or v
2100+
self.marker = marker if marker is not None else v
20982101
v = arg.pop('name', None)
2099-
self.name = name or v
2102+
self.name = name if name is not None else v
21002103
v = arg.pop('offset', None)
2101-
self.offset = offset or v
2104+
self.offset = offset if offset is not None else v
21022105
v = arg.pop('offsetsrc', None)
2103-
self.offsetsrc = offsetsrc or v
2106+
self.offsetsrc = offsetsrc if offsetsrc is not None else v
21042107
v = arg.pop('opacity', None)
2105-
self.opacity = opacity or v
2108+
self.opacity = opacity if opacity is not None else v
21062109
v = arg.pop('orientation', None)
2107-
self.orientation = orientation or v
2110+
self.orientation = orientation if orientation is not None else v
21082111
v = arg.pop('outsidetextfont', None)
2109-
self.outsidetextfont = outsidetextfont or v
2112+
self.outsidetextfont = outsidetextfont if outsidetextfont is not None else v
21102113
v = arg.pop('r', None)
2111-
self.r = r or v
2114+
self.r = r if r is not None else v
21122115
v = arg.pop('rsrc', None)
2113-
self.rsrc = rsrc or v
2116+
self.rsrc = rsrc if rsrc is not None else v
21142117
v = arg.pop('selected', None)
2115-
self.selected = selected or v
2118+
self.selected = selected if selected is not None else v
21162119
v = arg.pop('selectedpoints', None)
2117-
self.selectedpoints = selectedpoints or v
2120+
self.selectedpoints = selectedpoints if selectedpoints is not None else v
21182121
v = arg.pop('showlegend', None)
2119-
self.showlegend = showlegend or v
2122+
self.showlegend = showlegend if showlegend is not None else v
21202123
v = arg.pop('stream', None)
2121-
self.stream = stream or v
2124+
self.stream = stream if stream is not None else v
21222125
v = arg.pop('t', None)
2123-
self.t = t or v
2126+
self.t = t if t is not None else v
21242127
v = arg.pop('text', None)
2125-
self.text = text or v
2128+
self.text = text if text is not None else v
21262129
v = arg.pop('textfont', None)
2127-
self.textfont = textfont or v
2130+
self.textfont = textfont if textfont is not None else v
21282131
v = arg.pop('textposition', None)
2129-
self.textposition = textposition or v
2132+
self.textposition = textposition if textposition is not None else v
21302133
v = arg.pop('textpositionsrc', None)
2131-
self.textpositionsrc = textpositionsrc or v
2134+
self.textpositionsrc = textpositionsrc if textpositionsrc is not None else v
21322135
v = arg.pop('textsrc', None)
2133-
self.textsrc = textsrc or v
2136+
self.textsrc = textsrc if textsrc is not None else v
21342137
v = arg.pop('tsrc', None)
2135-
self.tsrc = tsrc or v
2138+
self.tsrc = tsrc if tsrc is not None else v
21362139
v = arg.pop('uid', None)
2137-
self.uid = uid or v
2140+
self.uid = uid if uid is not None else v
21382141
v = arg.pop('unselected', None)
2139-
self.unselected = unselected or v
2142+
self.unselected = unselected if unselected is not None else v
21402143
v = arg.pop('visible', None)
2141-
self.visible = visible or v
2144+
self.visible = visible if visible is not None else v
21422145
v = arg.pop('width', None)
2143-
self.width = width or v
2146+
self.width = width if width is not None else v
21442147
v = arg.pop('widthsrc', None)
2145-
self.widthsrc = widthsrc or v
2148+
self.widthsrc = widthsrc if widthsrc is not None else v
21462149
v = arg.pop('x', None)
2147-
self.x = x or v
2150+
self.x = x if x is not None else v
21482151
v = arg.pop('x0', None)
2149-
self.x0 = x0 or v
2152+
self.x0 = x0 if x0 is not None else v
21502153
v = arg.pop('xaxis', None)
2151-
self.xaxis = xaxis or v
2154+
self.xaxis = xaxis if xaxis is not None else v
21522155
v = arg.pop('xcalendar', None)
2153-
self.xcalendar = xcalendar or v
2156+
self.xcalendar = xcalendar if xcalendar is not None else v
21542157
v = arg.pop('xsrc', None)
2155-
self.xsrc = xsrc or v
2158+
self.xsrc = xsrc if xsrc is not None else v
21562159
v = arg.pop('y', None)
2157-
self.y = y or v
2160+
self.y = y if y is not None else v
21582161
v = arg.pop('y0', None)
2159-
self.y0 = y0 or v
2162+
self.y0 = y0 if y0 is not None else v
21602163
v = arg.pop('yaxis', None)
2161-
self.yaxis = yaxis or v
2164+
self.yaxis = yaxis if yaxis is not None else v
21622165
v = arg.pop('ycalendar', None)
2163-
self.ycalendar = ycalendar or v
2166+
self.ycalendar = ycalendar if ycalendar is not None else v
21642167
v = arg.pop('ysrc', None)
2165-
self.ysrc = ysrc or v
2168+
self.ysrc = ysrc if ysrc is not None else v
21662169

21672170
# Read-only literals
21682171
# ------------------

0 commit comments

Comments
 (0)