65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
"""Script variables."""
|
|
from typing import Any, Dict, Mapping, Optional
|
|
|
|
from homeassistant.core import HomeAssistant, callback
|
|
|
|
from . import template
|
|
|
|
|
|
class ScriptVariables:
|
|
"""Class to hold and render script variables."""
|
|
|
|
def __init__(self, variables: Dict[str, Any]):
|
|
"""Initialize script variables."""
|
|
self.variables = variables
|
|
self._has_template: Optional[bool] = None
|
|
|
|
@callback
|
|
def async_render(
|
|
self,
|
|
hass: HomeAssistant,
|
|
run_variables: Optional[Mapping[str, Any]],
|
|
*,
|
|
render_as_defaults: bool = True,
|
|
) -> Dict[str, Any]:
|
|
"""Render script variables.
|
|
|
|
The run variables are used to compute the static variables.
|
|
|
|
If `render_as_defaults` is True, the run variables will not be overridden.
|
|
|
|
"""
|
|
if self._has_template is None:
|
|
self._has_template = template.is_complex(self.variables)
|
|
template.attach(hass, self.variables)
|
|
|
|
if not self._has_template:
|
|
if render_as_defaults:
|
|
rendered_variables = dict(self.variables)
|
|
|
|
if run_variables is not None:
|
|
rendered_variables.update(run_variables)
|
|
else:
|
|
rendered_variables = (
|
|
{} if run_variables is None else dict(run_variables)
|
|
)
|
|
rendered_variables.update(self.variables)
|
|
|
|
return rendered_variables
|
|
|
|
rendered_variables = {} if run_variables is None else dict(run_variables)
|
|
|
|
for key, value in self.variables.items():
|
|
# We can skip if we're going to override this key with
|
|
# run variables anyway
|
|
if render_as_defaults and key in rendered_variables:
|
|
continue
|
|
|
|
rendered_variables[key] = template.render_complex(value, rendered_variables)
|
|
|
|
return rendered_variables
|
|
|
|
def as_dict(self) -> dict:
|
|
"""Return dict version of this class."""
|
|
return self.variables
|