mirror of
https://github.com/esphome/esphome.git
synced 2025-09-28 08:02:23 +01:00
@@ -2,6 +2,7 @@ from __future__ import print_function
|
||||
|
||||
import fnmatch
|
||||
import functools
|
||||
import inspect
|
||||
import logging
|
||||
import math
|
||||
import os
|
||||
@@ -13,6 +14,7 @@ import yaml.constructor
|
||||
from esphome import core
|
||||
from esphome.config_helpers import read_config_file
|
||||
from esphome.core import EsphomeError, IPAddress, Lambda, MACAddress, TimePeriod, DocumentRange
|
||||
from esphome.helpers import add_class_to_obj
|
||||
from esphome.py_compat import text_type, IS_PY2
|
||||
from esphome.util import OrderedDict, filter_yaml_files
|
||||
|
||||
@@ -26,14 +28,6 @@ _SECRET_CACHE = {}
|
||||
_SECRET_VALUES = {}
|
||||
|
||||
|
||||
class NodeListClass(list):
|
||||
pass
|
||||
|
||||
|
||||
class NodeStrClass(text_type):
|
||||
pass
|
||||
|
||||
|
||||
class ESPHomeDataBase(object):
|
||||
@property
|
||||
def esp_range(self):
|
||||
@@ -44,56 +38,25 @@ class ESPHomeDataBase(object):
|
||||
self._esp_range = DocumentRange.from_marks(node.start_mark, node.end_mark)
|
||||
|
||||
|
||||
class ESPInt(int, ESPHomeDataBase):
|
||||
class ESPForceValue(object):
|
||||
pass
|
||||
|
||||
|
||||
class ESPFloat(float, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
|
||||
class ESPStr(str, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
|
||||
class ESPDict(OrderedDict, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
|
||||
class ESPList(list, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
|
||||
class ESPLambda(Lambda, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
|
||||
ESP_TYPES = {
|
||||
int: ESPInt,
|
||||
float: ESPFloat,
|
||||
str: ESPStr,
|
||||
dict: ESPDict,
|
||||
list: ESPList,
|
||||
Lambda: ESPLambda,
|
||||
}
|
||||
if IS_PY2:
|
||||
class ESPUnicode(unicode, ESPHomeDataBase):
|
||||
pass
|
||||
|
||||
ESP_TYPES[unicode] = ESPUnicode
|
||||
|
||||
|
||||
def make_data_base(value):
|
||||
for typ, cons in ESP_TYPES.items():
|
||||
if isinstance(value, typ):
|
||||
return cons(value)
|
||||
return value
|
||||
return add_class_to_obj(value, ESPHomeDataBase)
|
||||
|
||||
|
||||
def _add_data_ref(fn):
|
||||
@functools.wraps(fn)
|
||||
def wrapped(loader, node):
|
||||
res = fn(loader, node)
|
||||
# newer PyYAML versions use generators, resolve them
|
||||
if inspect.isgenerator(res):
|
||||
generator = res
|
||||
res = next(generator)
|
||||
# Let generator finish
|
||||
for _ in generator:
|
||||
pass
|
||||
res = make_data_base(res)
|
||||
if isinstance(res, ESPHomeDataBase):
|
||||
res.from_node(node)
|
||||
@@ -296,6 +259,11 @@ class ESPHomeLoader(yaml.SafeLoader): # pylint: disable=too-many-ancestors
|
||||
def construct_lambda(self, node):
|
||||
return Lambda(text_type(node.value))
|
||||
|
||||
@_add_data_ref
|
||||
def construct_force(self, node):
|
||||
obj = self.construct_scalar(node)
|
||||
return add_class_to_obj(obj, ESPForceValue)
|
||||
|
||||
|
||||
ESPHomeLoader.add_constructor(u'tag:yaml.org,2002:int', ESPHomeLoader.construct_yaml_int)
|
||||
ESPHomeLoader.add_constructor(u'tag:yaml.org,2002:float', ESPHomeLoader.construct_yaml_float)
|
||||
@@ -314,6 +282,7 @@ ESPHomeLoader.add_constructor('!include_dir_named', ESPHomeLoader.construct_incl
|
||||
ESPHomeLoader.add_constructor('!include_dir_merge_named',
|
||||
ESPHomeLoader.construct_include_dir_merge_named)
|
||||
ESPHomeLoader.add_constructor('!lambda', ESPHomeLoader.construct_lambda)
|
||||
ESPHomeLoader.add_constructor('!force', ESPHomeLoader.construct_force)
|
||||
|
||||
|
||||
def load_yaml(fname):
|
||||
|
Reference in New Issue
Block a user