1
- import importlib
2
1
from _plotly_utils .basevalidators import LiteralValidator
3
-
2
+ from plotly .validators ._data import DataValidator
3
+ import _plotly_utils .basevalidators as basevalidators
4
+ import json
5
+ import os .path as opath
4
6
5
7
class ValidatorCache (object ):
6
8
_cache = {}
9
+ _json_cache = None
7
10
8
11
@staticmethod
9
12
def get_validator (parent_path , prop_name ):
13
+ if ValidatorCache ._json_cache is None :
14
+ # Load the JSON validator params from the file
15
+ validator_json_path = opath .join (
16
+ opath .dirname (__file__ ), "validators" , "_validators.json"
17
+ )
18
+ if not opath .exists (validator_json_path ):
19
+ raise FileNotFoundError (
20
+ f"Validator JSON file not found: { validator_json_path } "
21
+ )
22
+ with open (validator_json_path , "r" ) as f :
23
+ ValidatorCache ._json_cache = json .load (f )
10
24
11
25
key = (parent_path , prop_name )
12
26
if key not in ValidatorCache ._cache :
13
27
14
28
if "." not in parent_path and prop_name == "type" :
15
29
# Special case for .type property of traces
16
30
validator = LiteralValidator ("type" , parent_path , parent_path )
31
+ elif parent_path == "" and prop_name == "data" :
32
+ # Special case for .data property of Figure
33
+ validator = DataValidator
17
34
else :
18
35
lookup_name = None
19
36
if parent_path == "layout" :
@@ -24,11 +41,14 @@ def get_validator(parent_path, prop_name):
24
41
lookup_name = match .group (1 )
25
42
26
43
lookup_name = lookup_name or prop_name
27
- class_name = lookup_name .title () + "Validator"
28
- validator = getattr (
29
- importlib .import_module ("plotly.validators." + parent_path ),
30
- class_name ,
31
- )(plotly_name = prop_name )
44
+ lookup = f"{ parent_path } .{ lookup_name } " if parent_path else lookup_name
45
+ validator_item = ValidatorCache ._json_cache .get (lookup )
46
+ print ("validator_item" , key , validator_item )
47
+ validator = generate_validator (validator_item ["params" ], validator_item ["superclass" ])
32
48
ValidatorCache ._cache [key ] = validator
33
49
34
50
return ValidatorCache ._cache [key ]
51
+
52
+ def generate_validator (params : dict , superclass_name : str ):
53
+ superclass = getattr (basevalidators , superclass_name )
54
+ return superclass (** params )
0 commit comments