(parent_path, prop_name)
| 15 | |
| 16 | @staticmethod |
| 17 | def get_validator(parent_path, prop_name): |
| 18 | if ValidatorCache._json_cache is None: |
| 19 | # Load the JSON validator params from the file |
| 20 | validator_json_path = opath.join( |
| 21 | opath.dirname(__file__), "validators", "_validators.json" |
| 22 | ) |
| 23 | if not opath.exists(validator_json_path): |
| 24 | raise FileNotFoundError( |
| 25 | f"Validator JSON file not found: {validator_json_path}" |
| 26 | ) |
| 27 | with open(validator_json_path, "r") as f: |
| 28 | ValidatorCache._json_cache = json.load(f) |
| 29 | |
| 30 | key = (parent_path, prop_name) |
| 31 | if key not in ValidatorCache._cache: |
| 32 | if "." not in parent_path and prop_name == "type": |
| 33 | # Special case for .type property of traces |
| 34 | validator = LiteralValidator("type", parent_path, parent_path) |
| 35 | else: |
| 36 | lookup_name = None |
| 37 | if parent_path == "layout": |
| 38 | from .graph_objects import Layout |
| 39 | |
| 40 | match = Layout._subplotid_prop_re.match(prop_name) |
| 41 | if match: |
| 42 | lookup_name = match.group(1) |
| 43 | |
| 44 | lookup_name = lookup_name or prop_name |
| 45 | lookup = f"{parent_path}.{lookup_name}" if parent_path else lookup_name |
| 46 | |
| 47 | validator_item = ValidatorCache._json_cache.get(lookup) |
| 48 | validator_classname = validator_item["superclass"] |
| 49 | if validator_classname in DERIVED_CLASSES: |
| 50 | # If the superclass is a derived class, we need to get the base class |
| 51 | # and pass the derived class name as a parameter |
| 52 | base_item = ValidatorCache._json_cache.get( |
| 53 | DERIVED_CLASSES[validator_classname] |
| 54 | ) |
| 55 | validator_params = base_item["params"] |
| 56 | validator_params.update(validator_item["params"]) |
| 57 | validator_classname = base_item["superclass"] |
| 58 | else: |
| 59 | validator_params = validator_item["params"] |
| 60 | validator_params["plotly_name"] = prop_name |
| 61 | validator_class = getattr(basevalidators, validator_classname) |
| 62 | |
| 63 | validator = validator_class(**validator_params) |
| 64 | ValidatorCache._cache[key] = validator |
| 65 | |
| 66 | return ValidatorCache._cache[key] |
no test coverage detected