Skip to content

Commit e230527

Browse files
committed
merge from remote branch
2 parents 25427cc + fa659c4 commit e230527

File tree

563 files changed

+21624
-6135
lines changed

Some content is hidden

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

563 files changed

+21624
-6135
lines changed

codegen/datatypes.py

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,37 @@ def _prop_descriptions(self):
185185
buffer.write(f"""
186186
def __init__(self""")
187187

188-
add_constructor_params(buffer, subtype_nodes)
189-
header = f"Construct a new {datatype_class} object"
190-
add_docstring(buffer, node, header=header)
188+
add_constructor_params(buffer,
189+
subtype_nodes,
190+
prepend_extras=['arg'])
191+
192+
# ### Constructor Docstring ###
193+
header = f'Construct a new {datatype_class} object'
194+
class_name = (f'plotly.graph_objs'
195+
f'{node.parent_dotpath_str}.'
196+
f'{node.name_datatype_class}')
197+
198+
extras = [(f'arg',
199+
f'dict of properties compatible with this constructor '
200+
f'or an instance of {class_name}')]
201+
202+
add_docstring(buffer, node, header=header, prepend_extras=extras)
191203

192204
buffer.write(f"""
193205
super({datatype_class}, self).__init__('{node.name_property}')
194206
207+
# Validate arg
208+
# ------------
209+
if arg is None:
210+
arg = {{}}
211+
elif isinstance(arg, self.__class__):
212+
arg = arg.to_plotly_json()
213+
elif not isinstance(arg, dict):
214+
raise ValueError(\"\"\"\\
215+
The first argument to the {class_name}
216+
constructor must be a dict or
217+
an instance of {class_name}\"\"\")
218+
195219
# Import validators
196220
# -----------------
197221
from plotly.validators{node.parent_dotpath_str} import (
@@ -210,8 +234,10 @@ def __init__(self""")
210234
# Populate data dict with properties
211235
# ----------------------------------""")
212236
for subtype_node in subtype_nodes:
237+
name_prop = subtype_node.name_property
213238
buffer.write(f"""
214-
self.{subtype_node.name_property} = {subtype_node.name_property}""")
239+
v = arg.pop('{name_prop}', None)
240+
self.{name_prop} = {name_prop} or v""")
215241

216242
# ### Literals ###
217243
if literal_nodes:
@@ -233,7 +259,7 @@ def __init__(self""")
233259
234260
# Process unknown kwargs
235261
# ----------------------
236-
self._process_kwargs(**kwargs)
262+
self._process_kwargs(**dict(arg, **kwargs))
237263
""")
238264

239265
# Return source string
@@ -266,7 +292,10 @@ def reindent_validator_description(validator, extra_indent):
266292
validator.description().strip().split('\n'))
267293

268294

269-
def add_constructor_params(buffer, subtype_nodes, extras=()):
295+
def add_constructor_params(buffer,
296+
subtype_nodes,
297+
prepend_extras=(),
298+
append_extras=()):
270299
"""
271300
Write datatype constructor params to a buffer
272301
@@ -276,17 +305,23 @@ def add_constructor_params(buffer, subtype_nodes, extras=()):
276305
Buffer to write to
277306
subtype_nodes : list of PlotlyNode
278307
List of datatype nodes to be written as constructor params
279-
extras : list[str]
308+
prepend_extras : list[str]
309+
List of extra parameters to include at the beginning of the params
310+
append_extras : list[str]
280311
List of extra parameters to include at the end of the params
281312
Returns
282313
-------
283314
None
284315
"""
316+
for extra in prepend_extras:
317+
buffer.write(f""",
318+
{extra}=None""")
319+
285320
for i, subtype_node in enumerate(subtype_nodes):
286321
buffer.write(f""",
287322
{subtype_node.name_property}=None""")
288323

289-
for extra in extras:
324+
for extra in append_extras:
290325
buffer.write(f""",
291326
{extra}=None""")
292327

@@ -296,7 +331,7 @@ def add_constructor_params(buffer, subtype_nodes, extras=()):
296331
):""")
297332

298333

299-
def add_docstring(buffer, node, header, extras=()):
334+
def add_docstring(buffer, node, header, prepend_extras=(), append_extras=()):
300335
"""
301336
Write docstring for a compound datatype node
302337
@@ -309,6 +344,12 @@ def add_docstring(buffer, node, header, extras=()):
309344
header :
310345
Top-level header for docstring that will preceded the input node's
311346
own description. Header should be < 71 characters long
347+
prepend_extras :
348+
List or tuple of propery name / description pairs that should be
349+
included at the beginning of the docstring
350+
append_extras :
351+
List or tuple of propery name / description pairs that should be
352+
included at the end of the docstring
312353
Returns
313354
-------
314355
@@ -340,11 +381,23 @@ def add_docstring(buffer, node, header, extras=()):
340381

341382
# Write parameter descriptions
342383
# ----------------------------
384+
# Write any prepend extras
385+
for p, v in prepend_extras:
386+
v_wrapped = '\n'.join(textwrap.wrap(
387+
v,
388+
width=79 - 12,
389+
initial_indent=' ' * 12,
390+
subsequent_indent=' ' * 12))
391+
buffer.write(f"""
392+
{p}
393+
{v_wrapped}""")
394+
395+
# Write core docstring
343396
buffer.write(node.get_constructor_params_docstring(
344397
indent=8))
345398

346-
# Write any extras
347-
for p, v in extras:
399+
# Write any append extras
400+
for p, v in append_extras:
348401
v_wrapped = '\n'.join(textwrap.wrap(
349402
v,
350403
width=79-12,

codegen/figure.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ def __init__(self, data=None, layout=None, frames=None):
9191
def add_{trace_node.plotly_name}(self""")
9292

9393
# #### Function params####
94-
add_constructor_params(buffer, trace_node.child_datatypes,
95-
['row', 'col'])
94+
add_constructor_params(buffer,
95+
trace_node.child_datatypes,
96+
append_extras=['row', 'col'])
9697

9798
# #### Docstring ####
9899
header = f"Add a new {trace_node.name_datatype_class} trace"
@@ -106,7 +107,7 @@ def add_{trace_node.plotly_name}(self""")
106107
'added. Only valid if figure was created using '
107108
'`plotly.tools.make_subplots`'))
108109

109-
add_docstring(buffer, trace_node, header, extras=extras)
110+
add_docstring(buffer, trace_node, header, append_extras=extras)
110111

111112
# #### Function body ####
112113
buffer.write(f"""

plotly/basedatatypes.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from . import offline as pyo
1313
from _plotly_utils.basevalidators import (
1414
CompoundValidator, CompoundArrayValidator, BaseDataValidator,
15-
BaseValidator
15+
BaseValidator, LiteralValidator
1616
)
1717
from . import animation
1818
from .callbacks import (Points, BoxSelector, LassoSelector,
@@ -2734,7 +2734,7 @@ def _build_repr_for_class(props, class_name, parent_path_str=None):
27342734
# complaint indent
27352735
body = ' ' + pprint_res[1:-1].replace('\n', '\n ')
27362736

2737-
repr_str = class_name + '(**{\n ' + body + '\n})'
2737+
repr_str = class_name + '({\n ' + body + '\n})'
27382738

27392739
return repr_str
27402740

@@ -2743,8 +2743,18 @@ def __repr__(self):
27432743
Customize object representation when displayed in the
27442744
terminal/notebook
27452745
"""
2746+
2747+
# Get all properties
2748+
props = self._props if self._props is not None else {}
2749+
2750+
# Remove literals (These can't be specified in the constructor)
2751+
props = {p: v for p, v in props.items()
2752+
if p in self._validators and
2753+
not isinstance(self._validators[p], LiteralValidator)}
2754+
2755+
# Build repr string
27462756
repr_str = BasePlotlyType._build_repr_for_class(
2747-
props=self._props if self._props is not None else {},
2757+
props=props,
27482758
class_name=self.__class__.__name__,
27492759
parent_path_str=self._parent_path_str)
27502760

plotly/graph_objs/_area.py

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ def _prop_descriptions(self):
590590

591591
def __init__(
592592
self,
593+
arg=None,
593594
customdata=None,
594595
customdatasrc=None,
595596
hoverinfo=None,
@@ -617,6 +618,9 @@ def __init__(
617618
618619
Parameters
619620
----------
621+
arg
622+
dict of properties compatible with this constructor or
623+
an instance of plotly.graph_objs.Area
620624
customdata
621625
Assigns extra data each datum. This may be useful when
622626
listening to hover, click and selection events. Note
@@ -689,6 +693,20 @@ def __init__(
689693
"""
690694
super(Area, self).__init__('area')
691695

696+
# Validate arg
697+
# ------------
698+
if arg is None:
699+
arg = {}
700+
elif isinstance(arg, self.__class__):
701+
arg = arg.to_plotly_json()
702+
elif not isinstance(arg, dict):
703+
raise ValueError(
704+
"""\
705+
The first argument to the plotly.graph_objs.Area
706+
constructor must be a dict or
707+
an instance of plotly.graph_objs.Area"""
708+
)
709+
692710
# Import validators
693711
# -----------------
694712
from plotly.validators import (area as v_area)
@@ -718,26 +736,46 @@ def __init__(
718736

719737
# Populate data dict with properties
720738
# ----------------------------------
721-
self.customdata = customdata
722-
self.customdatasrc = customdatasrc
723-
self.hoverinfo = hoverinfo
724-
self.hoverinfosrc = hoverinfosrc
725-
self.hoverlabel = hoverlabel
726-
self.ids = ids
727-
self.idssrc = idssrc
728-
self.legendgroup = legendgroup
729-
self.marker = marker
730-
self.name = name
731-
self.opacity = opacity
732-
self.r = r
733-
self.rsrc = rsrc
734-
self.selectedpoints = selectedpoints
735-
self.showlegend = showlegend
736-
self.stream = stream
737-
self.t = t
738-
self.tsrc = tsrc
739-
self.uid = uid
740-
self.visible = visible
739+
v = arg.pop('customdata', None)
740+
self.customdata = customdata or v
741+
v = arg.pop('customdatasrc', None)
742+
self.customdatasrc = customdatasrc or v
743+
v = arg.pop('hoverinfo', None)
744+
self.hoverinfo = hoverinfo or v
745+
v = arg.pop('hoverinfosrc', None)
746+
self.hoverinfosrc = hoverinfosrc or v
747+
v = arg.pop('hoverlabel', None)
748+
self.hoverlabel = hoverlabel or v
749+
v = arg.pop('ids', None)
750+
self.ids = ids or v
751+
v = arg.pop('idssrc', None)
752+
self.idssrc = idssrc or v
753+
v = arg.pop('legendgroup', None)
754+
self.legendgroup = legendgroup or v
755+
v = arg.pop('marker', None)
756+
self.marker = marker or v
757+
v = arg.pop('name', None)
758+
self.name = name or v
759+
v = arg.pop('opacity', None)
760+
self.opacity = opacity or v
761+
v = arg.pop('r', None)
762+
self.r = r or v
763+
v = arg.pop('rsrc', None)
764+
self.rsrc = rsrc or v
765+
v = arg.pop('selectedpoints', None)
766+
self.selectedpoints = selectedpoints or v
767+
v = arg.pop('showlegend', None)
768+
self.showlegend = showlegend or v
769+
v = arg.pop('stream', None)
770+
self.stream = stream or v
771+
v = arg.pop('t', None)
772+
self.t = t or v
773+
v = arg.pop('tsrc', None)
774+
self.tsrc = tsrc or v
775+
v = arg.pop('uid', None)
776+
self.uid = uid or v
777+
v = arg.pop('visible', None)
778+
self.visible = visible or v
741779

742780
# Read-only literals
743781
# ------------------
@@ -749,4 +787,4 @@ def __init__(
749787

750788
# Process unknown kwargs
751789
# ----------------------
752-
self._process_kwargs(**kwargs)
790+
self._process_kwargs(**dict(arg, **kwargs))

0 commit comments

Comments
 (0)