@@ -69,11 +69,10 @@ def build_datatype_py(node):
69
69
"""
70
70
71
71
# Validate inputs
72
- # ---------------
73
72
assert node .is_compound
74
73
75
74
# Handle template traces
76
- # ----------------------
75
+ #
77
76
# We want template trace/layout classes like
78
77
# plotly.graph_objs.layout.template.data.Scatter to map to the
79
78
# corresponding trace/layout class (e.g. plotly.graph_objs.Scatter).
@@ -85,17 +84,14 @@ def build_datatype_py(node):
85
84
return "from plotly.graph_objs import Layout"
86
85
87
86
# Extract node properties
88
- # -----------------------
89
87
undercase = node .name_undercase
90
88
datatype_class = node .name_datatype_class
91
89
literal_nodes = [n for n in node .child_literals if n .plotly_name in ["type" ]]
92
90
93
91
# Initialze source code buffer
94
- # ----------------------------
95
92
buffer = StringIO ()
96
93
97
94
# Imports
98
- # -------
99
95
buffer .write (
100
96
f"from plotly.basedatatypes "
101
97
f"import { node .name_base_datatype } as _{ node .name_base_datatype } \n "
@@ -106,14 +102,13 @@ def build_datatype_py(node):
106
102
buffer .write (f"from warnings import warn\n " )
107
103
108
104
# Write class definition
109
- # ----------------------
110
105
buffer .write (
111
106
f"""
112
107
113
108
class { datatype_class } (_{ node .name_base_datatype } ):\n """
114
109
)
115
110
116
- # ### Layout subplot properties ###
111
+ ### Layout subplot properties
117
112
if datatype_class == "Layout" :
118
113
subplot_nodes = [
119
114
node
@@ -168,17 +163,16 @@ def _subplot_re_match(self, prop):
168
163
valid_props_list = sorted (
169
164
[node .name_property for node in subtype_nodes + literal_nodes ]
170
165
)
166
+ # class properties
171
167
buffer .write (
172
168
f"""
173
- # class properties
174
- # --------------------
175
169
_parent_path_str = '{ node .parent_path_str } '
176
170
_path_str = '{ node .path_str } '
177
171
_valid_props = {{"{ '", "' .join (valid_props_list )} "}}
178
172
"""
179
173
)
180
174
181
- # ### Property definitions ###
175
+ ### Property definitions
182
176
for subtype_node in subtype_nodes :
183
177
if subtype_node .is_array_element :
184
178
prop_type = (
@@ -199,7 +193,7 @@ def _subplot_re_match(self, prop):
199
193
else :
200
194
prop_type = get_typing_type (subtype_node .datatype , subtype_node .is_array_ok )
201
195
202
- # # ### Get property description ####
196
+ #### Get property description ####
203
197
raw_description = subtype_node .description
204
198
property_description = "\n " .join (
205
199
textwrap .wrap (
@@ -210,12 +204,12 @@ def _subplot_re_match(self, prop):
210
204
)
211
205
)
212
206
213
- # # # ### Get validator description ####
207
+ # #### Get validator description ####
214
208
validator = subtype_node .get_validator_instance ()
215
209
if validator :
216
210
validator_description = reindent_validator_description (validator , 4 )
217
211
218
- # # ### Combine to form property docstring ####
212
+ #### Combine to form property docstring ####
219
213
if property_description .strip ():
220
214
property_docstring = f"""{ property_description }
221
215
@@ -225,12 +219,10 @@ def _subplot_re_match(self, prop):
225
219
else :
226
220
property_docstring = property_description
227
221
228
- # # ### Write get property ####
222
+ #### Write get property ####
229
223
buffer .write (
230
224
f"""\
231
225
232
- # { subtype_node .name_property }
233
- # { '-' * len (subtype_node .name_property )}
234
226
@property
235
227
def { subtype_node .name_property } (self):
236
228
\" \" \"
@@ -243,7 +235,7 @@ def {subtype_node.name_property}(self):
243
235
return self['{ subtype_node .name_property } ']"""
244
236
)
245
237
246
- # # ### Write set property ####
238
+ #### Write set property ####
247
239
buffer .write (
248
240
f"""
249
241
@@ -252,24 +244,20 @@ def {subtype_node.name_property}(self, val):
252
244
self['{ subtype_node .name_property } '] = val\n """
253
245
)
254
246
255
- # ### Literals ###
247
+ ### Literals
256
248
for literal_node in literal_nodes :
257
249
buffer .write (
258
250
f"""\
259
251
260
- # { literal_node .name_property }
261
- # { '-' * len (literal_node .name_property )}
262
252
@property
263
253
def { literal_node .name_property } (self):
264
254
return self._props['{ literal_node .name_property } ']\n """
265
255
)
266
256
267
- # ### Private properties descriptions ###
257
+ ### Private properties descriptions
268
258
valid_props = {node .name_property for node in subtype_nodes }
269
259
buffer .write (
270
260
f"""
271
- # Self properties description
272
- # ---------------------------
273
261
@property
274
262
def _prop_descriptions(self):
275
263
return \" \" \" \\ """
@@ -291,15 +279,15 @@ def _prop_descriptions(self):
291
279
_mapped_properties = { repr (mapped_properties )} """
292
280
)
293
281
294
- # ### Constructor ###
282
+ ### Constructor
295
283
buffer .write (
296
284
f"""
297
285
def __init__(self"""
298
286
)
299
287
300
288
add_constructor_params (buffer , subtype_nodes , prepend_extras = ["arg" ])
301
289
302
- # ### Constructor Docstring ###
290
+ ### Constructor Docstring
303
291
header = f"Construct a new { datatype_class } object"
304
292
class_name = (
305
293
f"plotly.graph_objs" f"{ node .parent_dotpath_str } ." f"{ node .name_datatype_class } "
@@ -331,18 +319,17 @@ def __init__(self"""
331
319
)
332
320
333
321
if datatype_class == "Layout" :
334
- buffer .write (
335
- f"""
336
322
# Override _valid_props for instance so that instance can mutate set
337
323
# to support subplot properties (e.g. xaxis2)
324
+ buffer .write (
325
+ f"""
338
326
self._valid_props = {{"{ '", "' .join (valid_props_list )} "}}
339
327
"""
340
328
)
341
329
330
+ # Validate arg
342
331
buffer .write (
343
332
f"""
344
- # Validate arg
345
- # ------------
346
333
if arg is None:
347
334
arg = {{}}
348
335
elif isinstance(arg, self.__class__):
@@ -355,35 +342,22 @@ def __init__(self"""
355
342
constructor must be a dict or
356
343
an instance of :class:`{ class_name } `\" \" \" )
357
344
358
- # Handle skip_invalid
359
- # -------------------
360
345
self._skip_invalid = kwargs.pop('skip_invalid', False)
361
346
self._validate = kwargs.pop('_validate', True)
362
347
"""
363
348
)
364
349
365
- buffer .write (
366
- f"""
367
-
368
- # Populate data dict with properties
369
- # ----------------------------------"""
370
- )
350
+ buffer .write ("\n \n " )
371
351
for subtype_node in subtype_nodes :
372
352
name_prop = subtype_node .name_property
373
353
buffer .write (
374
354
f"""
375
355
self._init_provided('{ name_prop } ', arg, { name_prop } )"""
376
356
)
377
357
378
- # ### Literals ###
358
+ ### Literals
379
359
if literal_nodes :
380
- buffer .write (
381
- f"""
382
-
383
- # Read-only literals
384
- # ------------------
385
- """
386
- )
360
+ buffer .write ("\n \n " )
387
361
for literal_node in literal_nodes :
388
362
lit_name = literal_node .name_property
389
363
lit_val = repr (literal_node .node_data )
@@ -395,13 +369,7 @@ def __init__(self"""
395
369
396
370
buffer .write (
397
371
f"""
398
-
399
- # Process unknown kwargs
400
- # ----------------------
401
372
self._process_kwargs(**dict(arg, **kwargs))
402
-
403
- # Reset skip_invalid
404
- # ------------------
405
373
self._skip_invalid = False
406
374
"""
407
375
)
@@ -420,7 +388,6 @@ def __init__(self"""
420
388
)
421
389
422
390
# Return source string
423
- # --------------------
424
391
return buffer .getvalue ()
425
392
426
393
@@ -527,11 +494,9 @@ def add_docstring(
527
494
528
495
"""
529
496
# Validate inputs
530
- # ---------------
531
497
assert node .is_compound
532
498
533
499
# Build wrapped description
534
- # -------------------------
535
500
node_description = node .description
536
501
if node_description :
537
502
description_lines = textwrap .wrap (
@@ -544,7 +509,6 @@ def add_docstring(
544
509
node_description = "\n " .join (description_lines ) + "\n \n "
545
510
546
511
# Write header and description
547
- # ----------------------------
548
512
buffer .write (
549
513
f"""
550
514
\" \" \"
@@ -555,7 +519,7 @@ def add_docstring(
555
519
)
556
520
557
521
# Write parameter descriptions
558
- # ----------------------------
522
+
559
523
# Write any prepend extras
560
524
for p , v in prepend_extras :
561
525
v_wrapped = "\n " .join (
@@ -594,7 +558,6 @@ def add_docstring(
594
558
)
595
559
596
560
# Write return block and close docstring
597
- # --------------------------------------
598
561
buffer .write (
599
562
f"""
600
563
@@ -623,16 +586,13 @@ def write_datatype_py(outdir, node):
623
586
"""
624
587
625
588
# Build file path
626
- # ---------------
627
589
# filepath = opath.join(outdir, "graph_objs", *node.parent_path_parts, "__init__.py")
628
590
filepath = opath .join (
629
591
outdir , "graph_objs" , * node .parent_path_parts , "_" + node .name_undercase + ".py"
630
592
)
631
593
632
594
# Generate source code
633
- # --------------------
634
595
datatype_source = build_datatype_py (node )
635
596
636
597
# Write file
637
- # ----------
638
598
write_source_py (datatype_source , filepath , leading_newlines = 2 )
0 commit comments