Skip to content

Commit 33b13cd

Browse files
committed
Remove global go.validate object and replace with Figure-level validate property
1 parent 045361b commit 33b13cd

File tree

5 files changed

+38
-40
lines changed

5 files changed

+38
-40
lines changed

Diff for: packages/python/plotly/_plotly_utils/basevalidators.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -2438,12 +2438,12 @@ def description(self):
24382438

24392439
return desc
24402440

2441-
def validate_coerce(self, v, skip_invalid=False):
2441+
def validate_coerce(self, v, skip_invalid=False, validate=True):
24422442
if v is None:
24432443
v = self.data_class()
24442444

24452445
elif isinstance(v, dict):
2446-
v = self.data_class(v, skip_invalid=skip_invalid)
2446+
v = self.data_class(v, skip_invalid=skip_invalid, validate=validate)
24472447

24482448
elif isinstance(v, self.data_class):
24492449
# Copy object
@@ -2614,7 +2614,7 @@ def get_trace_class(self, trace_name):
26142614

26152615
return self._class_map[trace_name]
26162616

2617-
def validate_coerce(self, v, skip_invalid=False):
2617+
def validate_coerce(self, v, skip_invalid=False, validate=True):
26182618
from plotly.basedatatypes import BaseTraceType
26192619

26202620
# Import Histogram2dcontour, this is the deprecated name of the
@@ -2649,15 +2649,15 @@ def validate_coerce(self, v, skip_invalid=False):
26492649
if skip_invalid:
26502650
# Treat as scatter trace
26512651
trace = self.get_trace_class("scatter")(
2652-
skip_invalid=skip_invalid, **v_copy
2652+
skip_invalid=skip_invalid, validate=validate, **v_copy
26532653
)
26542654
res.append(trace)
26552655
else:
26562656
res.append(None)
26572657
invalid_els.append(v_el)
26582658
else:
26592659
trace = self.get_trace_class(trace_type)(
2660-
skip_invalid=skip_invalid, **v_copy
2660+
skip_invalid=skip_invalid, validate=validate, **v_copy
26612661
)
26622662
res.append(trace)
26632663
else:

Diff for: packages/python/plotly/plotly/_validate.py

-12
This file was deleted.

Diff for: packages/python/plotly/plotly/basedatatypes.py

+29-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from copy import deepcopy, copy
1111

1212
from _plotly_utils.utils import _natural_sort_strings
13-
from plotly._validate import validate
1413
from .optional_imports import get_module
1514

1615
# Create Undefined sentinel value
@@ -92,6 +91,9 @@ class is a subclass of both BaseFigure and widgets.DOMWidget.
9291

9392
super(BaseFigure, self).__init__()
9493

94+
# Initialize validation
95+
self._validate = kwargs.pop("validate", True)
96+
9597
# Assign layout_plotly to layout
9698
# ------------------------------
9799
# See docstring note for explanation
@@ -140,7 +142,9 @@ class is a subclass of both BaseFigure and widgets.DOMWidget.
140142
self._data_validator = DataValidator(set_uid=self._set_trace_uid)
141143

142144
# ### Import traces ###
143-
data = self._data_validator.validate_coerce(data, skip_invalid=skip_invalid)
145+
data = self._data_validator.validate_coerce(
146+
data, skip_invalid=skip_invalid, validate=self._validate
147+
)
144148

145149
# ### Save tuple of trace objects ###
146150
self._data_objs = data
@@ -182,7 +186,7 @@ class is a subclass of both BaseFigure and widgets.DOMWidget.
182186

183187
# ### Import Layout ###
184188
self._layout_obj = self._layout_validator.validate_coerce(
185-
layout, skip_invalid=skip_invalid
189+
layout, skip_invalid=skip_invalid, validate=self._validate
186190
)
187191

188192
# ### Import clone of layout properties ###
@@ -314,6 +318,8 @@ def __setitem__(self, prop, value):
314318
for p in prop[:-1]:
315319
res = res[p]
316320

321+
res._validate = self._validate
322+
317323
res[prop[-1]] = value
318324

319325
def __setattr__(self, prop, value):
@@ -1940,10 +1946,14 @@ def _initialize_layout_template(self):
19401946

19411947
if self._layout_obj._props.get("template", None) is None:
19421948
if pio.templates.default is not None:
1943-
with validate(False):
1944-
# Assume default template is already validated
1949+
# Assume default template is already validated
1950+
self._layout_obj._validate = False
1951+
try:
19451952
template_dict = pio.templates[pio.templates.default]
19461953
self._layout_obj.template = template_dict
1954+
except Exception:
1955+
self._layout_obj._validate = self._validate
1956+
raise
19471957

19481958
@property
19491959
def layout(self):
@@ -3339,6 +3349,8 @@ def __init__(self, plotly_name, **kwargs):
33393349
# invalid properties will result in an exception
33403350
self._skip_invalid = False
33413351

3352+
self._validate = True
3353+
33423354
# Validate inputs
33433355
# ---------------
33443356
self._process_kwargs(**kwargs)
@@ -3378,6 +3390,14 @@ def __init__(self, plotly_name, **kwargs):
33783390
# ### Backing property for backward compatible _validator property ##
33793391
self.__validators = None
33803392

3393+
# @property
3394+
# def _validate(self):
3395+
# fig = self.figure
3396+
# if fig is None:
3397+
# return True
3398+
# else:
3399+
# return fig._validate
3400+
33813401
def _get_validator(self, prop):
33823402
from .validator_cache import ValidatorCache
33833403

@@ -3425,7 +3445,7 @@ def _process_kwargs(self, **kwargs):
34253445
if k in self:
34263446
# e.g. underscore kwargs like marker_line_color
34273447
self[k] = v
3428-
elif not validate._should_validate:
3448+
elif not self._validate:
34293449
# Set extra property as-is
34303450
self[k] = v
34313451
else:
@@ -3885,7 +3905,7 @@ def __setitem__(self, prop, value):
38853905
# ### Unwrap scalar tuple ###
38863906
prop = prop[0]
38873907

3888-
if validate._should_validate:
3908+
if self._validate:
38893909
if prop not in self._valid_props:
38903910
self._raise_on_invalid_property_error(prop)
38913911

@@ -3937,6 +3957,8 @@ def __setitem__(self, prop, value):
39373957
for p in prop[:-1]:
39383958
res = res[p]
39393959

3960+
res._validate = self._validate
3961+
39403962
res[prop[-1]] = value
39413963

39423964
def __setattr__(self, prop, value):

Diff for: packages/python/plotly/plotly/io/_templates.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __getitem__(self, item):
8888
)
8989
template_str = pkgutil.get_data("plotly", path).decode("utf-8")
9090
template_dict = json.loads(template_str)
91-
template = Template(template_dict)
91+
template = Template(template_dict, validate=False)
9292

9393
self._templates[template_name] = template
9494
templates.append(self._templates[template_name])

Diff for: packages/python/plotly/plotly/tests/test_core/test_graph_objs/test_validate.py

+3-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
def build_invalid_fig():
8-
return go.Figure(
8+
return dict(
99
data=[{"type": "bar", "y": "not_a_list", "bogus": 23}],
1010
layout_title_text="valid title",
1111
layout_colorway="not a dict",
@@ -20,29 +20,17 @@ def build_invalid_fig():
2020

2121
def test_validate_false():
2222
template = pio.templates.default
23-
should_validate = go.validate._should_validate
2423
try:
2524
pio.templates.default = None
2625

2726
# Build figure with variety of invalid properties (both name and value),
2827
# make sure underscore notation is still applied properly
29-
with go.validate(False):
30-
fig = build_invalid_fig()
31-
assert json.loads(fig.to_json()) == expected_invalid_dict
3228

33-
with go.validate(True):
34-
with pytest.raises(ValueError):
35-
build_invalid_fig()
36-
37-
# Use validate as callable
38-
go.validate(False)
39-
fig = build_invalid_fig()
29+
fig = go.Figure(**build_invalid_fig(), validate=False)
4030
assert json.loads(fig.to_json()) == expected_invalid_dict
4131

42-
go.validate(True)
4332
with pytest.raises(ValueError):
44-
build_invalid_fig()
33+
go.Figure(**build_invalid_fig(), validate=True)
4534

4635
finally:
4736
pio.templates.default = template
48-
go.validate(should_validate)

0 commit comments

Comments
 (0)