1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 21:06:19 +00:00

Split out storage delay save (#16017)

* Split out storage delayed write

* Update code using delayed save

* Fix tests

* Fix typing test

* Add callback decorator
This commit is contained in:
Paulus Schoutsen
2018-08-17 20:18:21 +02:00
committed by GitHub
parent fdbab3e20c
commit 2ad0bd4036
4 changed files with 65 additions and 38 deletions

View File

@@ -2,7 +2,7 @@
import asyncio
import logging
import os
from typing import Dict, Optional
from typing import Dict, Optional, Callable
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
from homeassistant.core import callback
@@ -76,8 +76,13 @@ class Store:
async def _async_load(self):
"""Helper to load the data."""
# Check if we have a pending write
if self._data is not None:
data = self._data
# If we didn't generate data yet, do it now.
if 'data_func' in data:
data['data'] = data.pop('data_func')()
else:
data = await self.hass.async_add_executor_job(
json.load_json, self.path)
@@ -95,8 +100,8 @@ class Store:
self._load_task = None
return stored
async def async_save(self, data: Dict, *, delay: Optional[int] = None):
"""Save data with an optional delay."""
async def async_save(self, data):
"""Save data."""
self._data = {
'version': self.version,
'key': self.key,
@@ -104,11 +109,20 @@ class Store:
}
self._async_cleanup_delay_listener()
self._async_cleanup_stop_listener()
await self._async_handle_write_data()
if delay is None:
self._async_cleanup_stop_listener()
await self._async_handle_write_data()
return
@callback
def async_delay_save(self, data_func: Callable[[], Dict],
delay: Optional[int] = None):
"""Save data with an optional delay."""
self._data = {
'version': self.version,
'key': self.key,
'data_func': data_func,
}
self._async_cleanup_delay_listener()
self._unsub_delay_listener = async_call_later(
self.hass, delay, self._async_callback_delayed_write)
@@ -151,6 +165,10 @@ class Store:
async def _async_handle_write_data(self, *_args):
"""Handler to handle writing the config."""
data = self._data
if 'data_func' in data:
data['data'] = data.pop('data_func')()
self._data = None
async with self._write_lock: