esphome/esphome/schema_extractors.py

95 lines
2.1 KiB
Python

"""Helpers to retrieve schema from voluptuous validators.
These are a helper decorators to help get schema from some
components which uses voluptuous in a way where validation
is hidden in local functions
These decorators should not modify at all what the functions
originally do.
However there is a property to further disable decorator
impact."""
# This is set to true by script/build_language_schema.py
# only, so data is collected (again functionality is not modified)
EnableSchemaExtraction = False
extended_schemas = {}
list_schemas = {}
registry_schemas = {}
hidden_schemas = {}
typed_schemas = {}
# This key is used to generate schema files of Esphome configuration.
SCHEMA_EXTRACT = object()
def schema_extractor(validator_name):
if EnableSchemaExtraction:
def decorator(func):
hidden_schemas[repr(func)] = validator_name
return func
return decorator
def dummy(f):
return f
return dummy
def schema_extractor_extended(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
assert len(args) == 2
extended_schemas[repr(ret)] = args
return ret
return decorate
return func
def schema_extractor_list(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
# args length might be 2, but 2nd is always validator
list_schemas[repr(ret)] = args
return ret
return decorate
return func
def schema_extractor_registry(registry):
if EnableSchemaExtraction:
def decorator(func):
registry_schemas[repr(func)] = registry
return func
return decorator
def dummy(f):
return f
return dummy
def schema_extractor_typed(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
typed_schemas[repr(ret)] = (args, kwargs)
return ret
return decorate
return func