Skip to content

Commit 16dd6a3

Browse files
authored
Merge pull request plotly#4612 from plotly/handle-extras-integer-validator
Handle `extras` option in `IntegerValidator`
2 parents 97def55 + 751092e commit 16dd6a3

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
66

77
### Updated
88
- Specify Python version 3.8-3.11 for development virtual environments and pin `pytest` at version 8.1.1 to match.
9+
- Update `IntegerValidator` to handle `extras` option to allow supporting additional keyword values. For example, 'bold' and 'normal' as well as integers as used in font weights [#4612].
910

1011
## [5.22.0] - 2024-05-01
1112

packages/python/plotly/_plotly_utils/basevalidators.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -824,13 +824,21 @@ class IntegerValidator(BaseValidator):
824824
"dflt",
825825
"min",
826826
"max",
827+
"extras",
827828
"arrayOk"
828829
]
829830
},
830831
"""
831832

832833
def __init__(
833-
self, plotly_name, parent_name, min=None, max=None, array_ok=False, **kwargs
834+
self,
835+
plotly_name,
836+
parent_name,
837+
min=None,
838+
max=None,
839+
extras=None,
840+
array_ok=False,
841+
**kwargs,
834842
):
835843
super(IntegerValidator, self).__init__(
836844
plotly_name=plotly_name, parent_name=parent_name, **kwargs
@@ -855,6 +863,7 @@ def __init__(
855863
else:
856864
self.has_min_max = False
857865

866+
self.extras = extras if extras is not None else []
858867
self.array_ok = array_ok
859868

860869
def description(self):
@@ -878,6 +887,16 @@ def description(self):
878887
)
879888
)
880889

890+
# Extras
891+
if self.extras:
892+
desc = (
893+
desc
894+
+ (
895+
"""
896+
OR exactly one of {extras} (e.g. '{eg_extra}')"""
897+
).format(extras=self.extras, eg_extra=self.extras[-1])
898+
)
899+
881900
if self.array_ok:
882901
desc = (
883902
desc
@@ -891,6 +910,8 @@ def validate_coerce(self, v):
891910
if v is None:
892911
# Pass None through
893912
pass
913+
elif v in self.extras:
914+
return v
894915
elif self.array_ok and is_homogeneous_array(v):
895916
np = get_module("numpy")
896917
v_array = copy_to_readonly_numpy_array(
@@ -917,14 +938,20 @@ def validate_coerce(self, v):
917938
v = v_array
918939
elif self.array_ok and is_simple_array(v):
919940
# Check integer type
920-
invalid_els = [e for e in v if not isinstance(e, int)]
941+
invalid_els = [
942+
e for e in v if not isinstance(e, int) and e not in self.extras
943+
]
921944

922945
if invalid_els:
923946
self.raise_invalid_elements(invalid_els[:10])
924947

925948
# Check min/max
926949
if self.has_min_max:
927-
invalid_els = [e for e in v if not (self.min_val <= e <= self.max_val)]
950+
invalid_els = [
951+
e
952+
for e in v
953+
if not (self.min_val <= e <= self.max_val) and e not in self.extras
954+
]
928955

929956
if invalid_els:
930957
self.raise_invalid_elements(invalid_els[:10])

0 commit comments

Comments
 (0)