Language schema 202204 (#3492)

This commit is contained in:
Guillermo Ruffino
2022-06-16 22:46:20 -03:00
committed by GitHub
parent 29d6d0a906
commit f002a23d2d
8 changed files with 188 additions and 904 deletions
+6 -9
View File
@@ -12,7 +12,7 @@ from esphome.const import (
CONF_TYPE_ID,
CONF_TIME,
)
from esphome.jsonschema import jschema_extractor
from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
from esphome.util import Registry
@@ -23,11 +23,10 @@ def maybe_simple_id(*validators):
def maybe_conf(conf, *validators):
validator = cv.All(*validators)
@jschema_extractor("maybe")
@schema_extractor("maybe")
def validate(value):
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
return validator
if value == SCHEMA_EXTRACT:
return (validator, conf)
if isinstance(value, dict):
return validator(value)
@@ -111,11 +110,9 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
# This should only happen with invalid configs, but let's have a nice error message.
return [schema(value)]
@jschema_extractor("automation")
@schema_extractor("automation")
def validator(value):
# hack to get the schema
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
if value == SCHEMA_EXTRACT:
return schema
value = validator_(value)
+4 -4
View File
@@ -1,4 +1,4 @@
from esphome.jsonschema import jschema_extractor
from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome import automation
@@ -479,11 +479,11 @@ async def addressable_flicker_effect_to_code(config, effect_id):
def validate_effects(allowed_effects):
@jschema_extractor("effects")
@schema_extractor("effects")
def validator(value):
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
if value == SCHEMA_EXTRACT:
return (allowed_effects, EFFECTS_REGISTRY)
value = cv.validate_registry("effect", EFFECTS_REGISTRY)(value)
errors = []
names = set()
+4 -4
View File
@@ -32,7 +32,7 @@ from esphome.const import (
CONF_LEVEL,
)
from esphome.core import coroutine
from esphome.jsonschema import jschema_extractor
from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
from esphome.util import Registry, SimpleRegistry
AUTO_LOAD = ["binary_sensor"]
@@ -195,14 +195,14 @@ def validate_dumpers(value):
def validate_triggers(base_schema):
assert isinstance(base_schema, cv.Schema)
@jschema_extractor("triggers")
@schema_extractor("triggers")
def validator(config):
added_keys = {}
for key, (_, valid) in TRIGGER_REGISTRY.items():
added_keys[cv.Optional(key)] = valid
new_schema = base_schema.extend(added_keys)
# pylint: disable=comparison-with-callable
if config == jschema_extractor:
if config == SCHEMA_EXTRACT:
return new_schema
return new_schema(config)
+28 -18
View File
@@ -57,11 +57,12 @@ from esphome.core import (
TimePeriodMinutes,
)
from esphome.helpers import list_starts_with, add_class_to_obj
from esphome.jsonschema import (
jschema_list,
jschema_extractor,
jschema_registry,
jschema_typed,
from esphome.schema_extractors import (
SCHEMA_EXTRACT,
schema_extractor_list,
schema_extractor,
schema_extractor_registry,
schema_extractor_typed,
)
from esphome.util import parse_esphome_version
from esphome.voluptuous_schema import _Schema
@@ -327,7 +328,7 @@ def boolean(value):
)
@jschema_list
@schema_extractor_list
def ensure_list(*validators):
"""Validate this configuration option to be a list.
@@ -452,7 +453,11 @@ def validate_id_name(value):
def use_id(type):
"""Declare that this configuration option should point to an ID with the given type."""
@schema_extractor("use_id")
def validator(value):
if value == SCHEMA_EXTRACT:
return type
check_not_templatable(value)
if value is None:
return core.ID(None, is_declaration=False, type=type)
@@ -475,7 +480,11 @@ def declare_id(type):
If two IDs with the same name exist, a validation error is thrown.
"""
@schema_extractor("declare_id")
def validator(value):
if value == SCHEMA_EXTRACT:
return type
check_not_templatable(value)
if value is None:
return core.ID(None, is_declaration=True, type=type)
@@ -494,11 +503,11 @@ def templatable(other_validators):
"""
schema = Schema(other_validators)
@jschema_extractor("templatable")
@schema_extractor("templatable")
def validator(value):
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
if value == SCHEMA_EXTRACT:
return other_validators
if isinstance(value, Lambda):
return returning_lambda(value)
if isinstance(other_validators, dict):
@@ -1177,10 +1186,9 @@ def one_of(*values, **kwargs):
if kwargs:
raise ValueError
@jschema_extractor("one_of")
@schema_extractor("one_of")
def validator(value):
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
if value == SCHEMA_EXTRACT:
return values
if string_:
@@ -1220,10 +1228,9 @@ def enum(mapping, **kwargs):
assert isinstance(mapping, dict)
one_of_validator = one_of(*mapping, **kwargs)
@jschema_extractor("enum")
@schema_extractor("enum")
def validator(value):
# pylint: disable=comparison-with-callable
if value == jschema_extractor:
if value == SCHEMA_EXTRACT:
return mapping
value = one_of_validator(value)
@@ -1396,7 +1403,7 @@ def extract_keys(schema):
return keys
@jschema_typed
@schema_extractor_typed
def typed_schema(schemas, **kwargs):
"""Create a schema that has a key to distinguish between schemas"""
key = kwargs.pop("key", CONF_TYPE)
@@ -1510,7 +1517,7 @@ def validate_registry_entry(name, registry):
)
ignore_keys = extract_keys(base_schema)
@jschema_registry(registry)
@schema_extractor_registry(registry)
def validator(value):
if isinstance(value, str):
value = {value: {}}
@@ -1555,12 +1562,15 @@ def validate_registry(name, registry):
return ensure_list(validate_registry_entry(name, registry))
@jschema_list
def maybe_simple_value(*validators, **kwargs):
key = kwargs.pop("key", CONF_VALUE)
validator = All(*validators)
@schema_extractor("maybe")
def validate(value):
if value == SCHEMA_EXTRACT:
return (validator, key)
if isinstance(value, dict) and key in value:
return validator(value)
return validator({key: value})
@@ -9,9 +9,9 @@ However there is a property to further disable decorator
impact."""
# This is set to true by script/build_jsonschema.py
# This is set to true by script/build_language_schema.py
# only, so data is collected (again functionality is not modified)
EnableJsonSchemaCollect = False
EnableSchemaExtraction = False
extended_schemas = {}
list_schemas = {}
@@ -19,9 +19,12 @@ registry_schemas = {}
hidden_schemas = {}
typed_schemas = {}
# This key is used to generate schema files of Esphome configuration.
SCHEMA_EXTRACT = object()
def jschema_extractor(validator_name):
if EnableJsonSchemaCollect:
def schema_extractor(validator_name):
if EnableSchemaExtraction:
def decorator(func):
hidden_schemas[repr(func)] = validator_name
@@ -35,8 +38,8 @@ def jschema_extractor(validator_name):
return dummy
def jschema_extended(func):
if EnableJsonSchemaCollect:
def schema_extractor_extended(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
@@ -49,8 +52,8 @@ def jschema_extended(func):
return func
def jschema_list(func):
if EnableJsonSchemaCollect:
def schema_extractor_list(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
@@ -63,8 +66,8 @@ def jschema_list(func):
return func
def jschema_registry(registry):
if EnableJsonSchemaCollect:
def schema_extractor_registry(registry):
if EnableSchemaExtraction:
def decorator(func):
registry_schemas[repr(func)] = registry
@@ -78,8 +81,8 @@ def jschema_registry(registry):
return dummy
def jschema_typed(func):
if EnableJsonSchemaCollect:
def schema_extractor_typed(func):
if EnableSchemaExtraction:
def decorate(*args, **kwargs):
ret = func(*args, **kwargs)
+2 -2
View File
@@ -2,7 +2,7 @@ import difflib
import itertools
import voluptuous as vol
from esphome.jsonschema import jschema_extended
from esphome.schema_extractors import schema_extractor_extended
class ExtraKeysInvalid(vol.Invalid):
@@ -203,7 +203,7 @@ class _Schema(vol.Schema):
self._extra_schemas.append(validator)
return self
@jschema_extended
@schema_extractor_extended
# pylint: disable=signature-differs
def extend(self, *schemas, **kwargs):
extra = kwargs.pop("extra", None)