mirror of
https://github.com/home-assistant/core.git
synced 2025-04-25 09:47:52 +00:00
Update hdate dependency to 1.0.3 (#137247)
* Update hdate version * Update code to reflect changes from hdate==1.0.0 * Fix some tests * Fix parasha tests * Fix holiday tests * Cleanup holidays changes * Zmanim objects should now access the local attribute * Fix binary sensors * Update test values on upcoming shabbat times * Update hdate to 1.0.1 * Adapt to changes from 1.0.0 -> 1.0.1 * Change shabbat candle lighthing test scenario to 40 minutes as expected in Jerusalem * Update to version 1.0.2 * Update keys based on updated nomenclature in library * Update HolidayDatabase .get_all_names in test * Make holiday type an ordered set * Fix freeze_time * Fix imports * Fix tests and minor change * Update hdate version 1.0.3, add migration method * Fix migration code * Add test for migration * The change is not backwards compatible if config is not restored
This commit is contained in:
parent
3b115506b9
commit
52408e67b2
@ -3,6 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from functools import partial
|
||||
import logging
|
||||
|
||||
from hdate import Location
|
||||
|
||||
@ -14,7 +15,8 @@ from homeassistant.const import (
|
||||
CONF_TIME_ZONE,
|
||||
Platform,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers import entity_registry as er
|
||||
|
||||
from .const import (
|
||||
CONF_CANDLE_LIGHT_MINUTES,
|
||||
@ -27,6 +29,7 @@ from .const import (
|
||||
)
|
||||
from .entity import JewishCalendarConfigEntry, JewishCalendarData
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.SENSOR]
|
||||
|
||||
|
||||
@ -80,3 +83,49 @@ async def async_unload_entry(
|
||||
) -> bool:
|
||||
"""Unload a config entry."""
|
||||
return await hass.config_entries.async_unload_platforms(config_entry, PLATFORMS)
|
||||
|
||||
|
||||
async def async_migrate_entry(
|
||||
hass: HomeAssistant, config_entry: JewishCalendarConfigEntry
|
||||
) -> bool:
|
||||
"""Migrate old entry."""
|
||||
|
||||
_LOGGER.debug("Migrating from version %s", config_entry.version)
|
||||
|
||||
@callback
|
||||
def update_unique_id(
|
||||
entity_entry: er.RegistryEntry,
|
||||
) -> dict[str, str] | None:
|
||||
"""Update unique ID of entity entry."""
|
||||
key_translations = {
|
||||
"first_light": "alot_hashachar",
|
||||
"talit": "talit_and_tefillin",
|
||||
"sunrise": "netz_hachama",
|
||||
"gra_end_shma": "sof_zman_shema_gra",
|
||||
"mga_end_shma": "sof_zman_shema_mga",
|
||||
"gra_end_tfila": "sof_zman_tfilla_gra",
|
||||
"mga_end_tfila": "sof_zman_tfilla_mga",
|
||||
"midday": "chatzot_hayom",
|
||||
"big_mincha": "mincha_gedola",
|
||||
"small_mincha": "mincha_ketana",
|
||||
"plag_mincha": "plag_hamincha",
|
||||
"sunset": "shkia",
|
||||
"first_stars": "tset_hakohavim_tsom",
|
||||
"three_stars": "tset_hakohavim_shabbat",
|
||||
}
|
||||
new_keys = tuple(key_translations.values())
|
||||
if not entity_entry.unique_id.endswith(new_keys):
|
||||
old_key = entity_entry.unique_id.split("-")[1]
|
||||
new_unique_id = f"{config_entry.entry_id}-{key_translations[old_key]}"
|
||||
return {"new_unique_id": new_unique_id}
|
||||
return None
|
||||
|
||||
if config_entry.version > 1:
|
||||
# This means the user has downgraded from a future version
|
||||
return False
|
||||
|
||||
if config_entry.version == 1:
|
||||
await er.async_migrate_entries(hass, config_entry.entry_id, update_unique_id)
|
||||
hass.config_entries.async_update_entry(config_entry, version=2)
|
||||
|
||||
return True
|
||||
|
@ -5,9 +5,7 @@ from __future__ import annotations
|
||||
from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
import datetime as dt
|
||||
from datetime import datetime
|
||||
|
||||
import hdate
|
||||
from hdate.zmanim import Zmanim
|
||||
|
||||
from homeassistant.components.binary_sensor import (
|
||||
@ -27,7 +25,7 @@ from .entity import JewishCalendarConfigEntry, JewishCalendarEntity
|
||||
class JewishCalendarBinarySensorMixIns(BinarySensorEntityDescription):
|
||||
"""Binary Sensor description mixin class for Jewish Calendar."""
|
||||
|
||||
is_on: Callable[[Zmanim], bool] = lambda _: False
|
||||
is_on: Callable[[Zmanim, dt.datetime], bool] = lambda _, __: False
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@ -42,18 +40,18 @@ BINARY_SENSORS: tuple[JewishCalendarBinarySensorEntityDescription, ...] = (
|
||||
key="issur_melacha_in_effect",
|
||||
name="Issur Melacha in Effect",
|
||||
icon="mdi:power-plug-off",
|
||||
is_on=lambda state: bool(state.issur_melacha_in_effect),
|
||||
is_on=lambda state, now: bool(state.issur_melacha_in_effect(now)),
|
||||
),
|
||||
JewishCalendarBinarySensorEntityDescription(
|
||||
key="erev_shabbat_hag",
|
||||
name="Erev Shabbat/Hag",
|
||||
is_on=lambda state: bool(state.erev_shabbat_chag),
|
||||
is_on=lambda state, now: bool(state.erev_shabbat_chag(now)),
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
JewishCalendarBinarySensorEntityDescription(
|
||||
key="motzei_shabbat_hag",
|
||||
name="Motzei Shabbat/Hag",
|
||||
is_on=lambda state: bool(state.motzei_shabbat_chag),
|
||||
is_on=lambda state, now: bool(state.motzei_shabbat_chag(now)),
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
)
|
||||
@ -84,16 +82,16 @@ class JewishCalendarBinarySensor(JewishCalendarEntity, BinarySensorEntity):
|
||||
def is_on(self) -> bool:
|
||||
"""Return true if sensor is on."""
|
||||
zmanim = self._get_zmanim()
|
||||
return self.entity_description.is_on(zmanim)
|
||||
return self.entity_description.is_on(zmanim, dt_util.now())
|
||||
|
||||
def _get_zmanim(self) -> Zmanim:
|
||||
"""Return the Zmanim object for now()."""
|
||||
return hdate.Zmanim(
|
||||
date=dt_util.now(),
|
||||
return Zmanim(
|
||||
date=dt.date.today(),
|
||||
location=self._location,
|
||||
candle_lighting_offset=self._candle_lighting_offset,
|
||||
havdalah_offset=self._havdalah_offset,
|
||||
hebrew=self._hebrew,
|
||||
language=self._language,
|
||||
)
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
@ -109,7 +107,7 @@ class JewishCalendarBinarySensor(JewishCalendarEntity, BinarySensorEntity):
|
||||
return await super().async_will_remove_from_hass()
|
||||
|
||||
@callback
|
||||
def _update(self, now: datetime | None = None) -> None:
|
||||
def _update(self, now: dt.datetime | None = None) -> None:
|
||||
"""Update the state of the sensor."""
|
||||
self._update_unsub = None
|
||||
self._schedule_update()
|
||||
@ -119,7 +117,7 @@ class JewishCalendarBinarySensor(JewishCalendarEntity, BinarySensorEntity):
|
||||
"""Schedule the next update of the sensor."""
|
||||
now = dt_util.now()
|
||||
zmanim = self._get_zmanim()
|
||||
update = zmanim.zmanim["sunrise"] + dt.timedelta(days=1)
|
||||
update = zmanim.netz_hachama.local + dt.timedelta(days=1)
|
||||
candle_lighting = zmanim.candle_lighting
|
||||
if candle_lighting is not None and now < candle_lighting < update:
|
||||
update = candle_lighting
|
||||
|
@ -86,7 +86,7 @@ def _get_data_schema(hass: HomeAssistant) -> vol.Schema:
|
||||
class JewishCalendarConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
"""Handle a config flow for Jewish calendar."""
|
||||
|
||||
VERSION = 1
|
||||
VERSION = 2
|
||||
|
||||
@staticmethod
|
||||
@callback
|
||||
|
@ -3,6 +3,7 @@
|
||||
from dataclasses import dataclass
|
||||
|
||||
from hdate import Location
|
||||
from hdate.translator import Language
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
|
||||
@ -17,7 +18,7 @@ type JewishCalendarConfigEntry = ConfigEntry[JewishCalendarData]
|
||||
class JewishCalendarData:
|
||||
"""Jewish Calendar runtime dataclass."""
|
||||
|
||||
language: str
|
||||
language: Language
|
||||
diaspora: bool
|
||||
location: Location
|
||||
candle_lighting_offset: int
|
||||
@ -43,7 +44,6 @@ class JewishCalendarEntity(Entity):
|
||||
)
|
||||
data = config_entry.runtime_data
|
||||
self._location = data.location
|
||||
self._hebrew = data.language == "hebrew"
|
||||
self._language = data.language
|
||||
self._candle_lighting_offset = data.candle_lighting_offset
|
||||
self._havdalah_offset = data.havdalah_offset
|
||||
|
@ -6,6 +6,6 @@
|
||||
"documentation": "https://www.home-assistant.io/integrations/jewish_calendar",
|
||||
"iot_class": "calculated",
|
||||
"loggers": ["hdate"],
|
||||
"requirements": ["hdate==0.11.1"],
|
||||
"requirements": ["hdate[astral]==1.0.3"],
|
||||
"single_config_entry": true
|
||||
}
|
||||
|
@ -2,12 +2,13 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import date as Date
|
||||
import datetime as dt
|
||||
import logging
|
||||
from typing import Any, cast
|
||||
from typing import Any
|
||||
|
||||
from hdate import HDate, HebrewDate, htables
|
||||
from hdate.zmanim import Zmanim
|
||||
from hdate import HDateInfo, Zmanim
|
||||
from hdate.holidays import HolidayDatabase
|
||||
from hdate.parasha import Parasha
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
SensorDeviceClass,
|
||||
@ -59,83 +60,83 @@ INFO_SENSORS: tuple[SensorEntityDescription, ...] = (
|
||||
|
||||
TIME_SENSORS: tuple[SensorEntityDescription, ...] = (
|
||||
SensorEntityDescription(
|
||||
key="first_light",
|
||||
key="alot_hashachar",
|
||||
name="Alot Hashachar", # codespell:ignore alot
|
||||
icon="mdi:weather-sunset-up",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="talit",
|
||||
key="talit_and_tefillin",
|
||||
name="Talit and Tefillin",
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="sunrise",
|
||||
key="netz_hachama",
|
||||
name="Hanetz Hachama",
|
||||
icon="mdi:calendar-clock",
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="gra_end_shma",
|
||||
key="sof_zman_shema_gra",
|
||||
name='Latest time for Shma Gr"a',
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="mga_end_shma",
|
||||
key="sof_zman_shema_mga",
|
||||
name='Latest time for Shma MG"A',
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="gra_end_tfila",
|
||||
key="sof_zman_tfilla_gra",
|
||||
name='Latest time for Tefilla Gr"a',
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="mga_end_tfila",
|
||||
key="sof_zman_tfilla_mga",
|
||||
name='Latest time for Tefilla MG"A',
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="midday",
|
||||
key="chatzot_hayom",
|
||||
name="Chatzot Hayom",
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="big_mincha",
|
||||
key="mincha_gedola",
|
||||
name="Mincha Gedola",
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="small_mincha",
|
||||
key="mincha_ketana",
|
||||
name="Mincha Ketana",
|
||||
icon="mdi:calendar-clock",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="plag_mincha",
|
||||
key="plag_hamincha",
|
||||
name="Plag Hamincha",
|
||||
icon="mdi:weather-sunset-down",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="sunset",
|
||||
key="shkia",
|
||||
name="Shkia",
|
||||
icon="mdi:weather-sunset",
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="first_stars",
|
||||
key="tset_hakohavim_tsom",
|
||||
name="T'set Hakochavim",
|
||||
icon="mdi:weather-night",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="three_stars",
|
||||
key="tset_hakohavim_shabbat",
|
||||
name="T'set Hakochavim, 3 stars",
|
||||
icon="mdi:weather-night",
|
||||
entity_registry_enabled_default=False,
|
||||
@ -212,7 +213,9 @@ class JewishCalendarSensor(JewishCalendarEntity, SensorEntity):
|
||||
|
||||
_LOGGER.debug("Now: %s Sunset: %s", now, sunset)
|
||||
|
||||
daytime_date = HDate(today, diaspora=self._diaspora, hebrew=self._hebrew)
|
||||
daytime_date = HDateInfo(
|
||||
today, diaspora=self._diaspora, language=self._language
|
||||
)
|
||||
|
||||
# The Jewish day starts after darkness (called "tzais") and finishes at
|
||||
# sunset ("shkia"). The time in between is a gray area
|
||||
@ -238,14 +241,14 @@ class JewishCalendarSensor(JewishCalendarEntity, SensorEntity):
|
||||
"New value for %s: %s", self.entity_description.key, self._attr_native_value
|
||||
)
|
||||
|
||||
def make_zmanim(self, date: Date) -> Zmanim:
|
||||
def make_zmanim(self, date: dt.date) -> Zmanim:
|
||||
"""Create a Zmanim object."""
|
||||
return Zmanim(
|
||||
date=date,
|
||||
location=self._location,
|
||||
candle_lighting_offset=self._candle_lighting_offset,
|
||||
havdalah_offset=self._havdalah_offset,
|
||||
hebrew=self._hebrew,
|
||||
language=self._language,
|
||||
)
|
||||
|
||||
@property
|
||||
@ -254,43 +257,40 @@ class JewishCalendarSensor(JewishCalendarEntity, SensorEntity):
|
||||
return self._attrs
|
||||
|
||||
def get_state(
|
||||
self, daytime_date: HDate, after_shkia_date: HDate, after_tzais_date: HDate
|
||||
self,
|
||||
daytime_date: HDateInfo,
|
||||
after_shkia_date: HDateInfo,
|
||||
after_tzais_date: HDateInfo,
|
||||
) -> Any | None:
|
||||
"""For a given type of sensor, return the state."""
|
||||
# Terminology note: by convention in py-libhdate library, "upcoming"
|
||||
# refers to "current" or "upcoming" dates.
|
||||
if self.entity_description.key == "date":
|
||||
hdate = cast(HebrewDate, after_shkia_date.hdate)
|
||||
month = htables.MONTHS[hdate.month.value - 1]
|
||||
hdate = after_shkia_date.hdate
|
||||
hdate.month.set_language(self._language)
|
||||
self._attrs = {
|
||||
"hebrew_year": hdate.year,
|
||||
"hebrew_month_name": month.hebrew if self._hebrew else month.english,
|
||||
"hebrew_day": hdate.day,
|
||||
"hebrew_year": str(hdate.year),
|
||||
"hebrew_month_name": str(hdate.month),
|
||||
"hebrew_day": str(hdate.day),
|
||||
}
|
||||
return after_shkia_date.hebrew_date
|
||||
return after_shkia_date.hdate
|
||||
if self.entity_description.key == "weekly_portion":
|
||||
self._attr_options = [
|
||||
(p.hebrew if self._hebrew else p.english) for p in htables.PARASHAOT
|
||||
]
|
||||
self._attr_options = list(Parasha)
|
||||
# Compute the weekly portion based on the upcoming shabbat.
|
||||
return after_tzais_date.upcoming_shabbat.parasha
|
||||
if self.entity_description.key == "holiday":
|
||||
_id = _type = _type_id = ""
|
||||
_holiday_type = after_shkia_date.holiday_type
|
||||
if isinstance(_holiday_type, list):
|
||||
_id = ", ".join(after_shkia_date.holiday_name)
|
||||
_type = ", ".join([_htype.name for _htype in _holiday_type])
|
||||
_type_id = ", ".join([str(_htype.value) for _htype in _holiday_type])
|
||||
else:
|
||||
_id = after_shkia_date.holiday_name
|
||||
_type = _holiday_type.name
|
||||
_type_id = _holiday_type.value
|
||||
self._attrs = {"id": _id, "type": _type, "type_id": _type_id}
|
||||
self._attr_options = htables.get_all_holidays(self._language)
|
||||
|
||||
return after_shkia_date.holiday_description
|
||||
_holidays = after_shkia_date.holidays
|
||||
_id = ", ".join(holiday.name for holiday in _holidays)
|
||||
_type = ", ".join(
|
||||
dict.fromkeys(_holiday.type.name for _holiday in _holidays)
|
||||
)
|
||||
self._attrs = {"id": _id, "type": _type}
|
||||
self._attr_options = HolidayDatabase(self._diaspora).get_all_names(
|
||||
self._language
|
||||
)
|
||||
return ", ".join(str(holiday) for holiday in _holidays) if _holidays else ""
|
||||
if self.entity_description.key == "omer_count":
|
||||
return after_shkia_date.omer_day
|
||||
return after_shkia_date.omer.total_days if after_shkia_date.omer else 0
|
||||
if self.entity_description.key == "daf_yomi":
|
||||
return daytime_date.daf_yomi
|
||||
|
||||
@ -303,7 +303,10 @@ class JewishCalendarTimeSensor(JewishCalendarSensor):
|
||||
_attr_device_class = SensorDeviceClass.TIMESTAMP
|
||||
|
||||
def get_state(
|
||||
self, daytime_date: HDate, after_shkia_date: HDate, after_tzais_date: HDate
|
||||
self,
|
||||
daytime_date: HDateInfo,
|
||||
after_shkia_date: HDateInfo,
|
||||
after_tzais_date: HDateInfo,
|
||||
) -> Any | None:
|
||||
"""For a given type of sensor, return the state."""
|
||||
if self.entity_description.key == "upcoming_shabbat_candle_lighting":
|
||||
@ -325,5 +328,5 @@ class JewishCalendarTimeSensor(JewishCalendarSensor):
|
||||
)
|
||||
return times.havdalah
|
||||
|
||||
times = self.make_zmanim(dt_util.now()).zmanim
|
||||
return times[self.entity_description.key]
|
||||
times = self.make_zmanim(dt_util.now().date())
|
||||
return times.zmanim[self.entity_description.key].local
|
||||
|
2
requirements_all.txt
generated
2
requirements_all.txt
generated
@ -1121,7 +1121,7 @@ hass-splunk==0.1.1
|
||||
hassil==2.2.3
|
||||
|
||||
# homeassistant.components.jewish_calendar
|
||||
hdate==0.11.1
|
||||
hdate[astral]==1.0.3
|
||||
|
||||
# homeassistant.components.heatmiser
|
||||
heatmiserV3==2.0.3
|
||||
|
2
requirements_test_all.txt
generated
2
requirements_test_all.txt
generated
@ -959,7 +959,7 @@ hass-nabucasa==0.94.0
|
||||
hassil==2.2.3
|
||||
|
||||
# homeassistant.components.jewish_calendar
|
||||
hdate==0.11.1
|
||||
hdate[astral]==1.0.3
|
||||
|
||||
# homeassistant.components.here_travel_time
|
||||
here-routing==1.0.1
|
||||
|
@ -3,8 +3,6 @@
|
||||
from collections import namedtuple
|
||||
from datetime import datetime
|
||||
|
||||
from freezegun import freeze_time as alter_time # noqa: F401
|
||||
|
||||
from homeassistant.components import jewish_calendar
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
@ -49,7 +47,7 @@ def make_jerusalem_test_params(dtime, results, havdalah_offset=0):
|
||||
}
|
||||
return (
|
||||
dtime,
|
||||
jewish_calendar.DEFAULT_CANDLE_LIGHT,
|
||||
40,
|
||||
havdalah_offset,
|
||||
False,
|
||||
"Asia/Jerusalem",
|
||||
|
@ -3,6 +3,7 @@
|
||||
from datetime import datetime as dt, timedelta
|
||||
import logging
|
||||
|
||||
from freezegun import freeze_time
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||
@ -18,7 +19,7 @@ from homeassistant.core import HomeAssistant
|
||||
from homeassistant.setup import async_setup_component
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import alter_time, make_jerusalem_test_params, make_nyc_test_params
|
||||
from . import make_jerusalem_test_params, make_nyc_test_params
|
||||
|
||||
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||
|
||||
@ -191,7 +192,7 @@ async def test_issur_melacha_sensor(
|
||||
hass.config.latitude = latitude
|
||||
hass.config.longitude = longitude
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(
|
||||
title=DEFAULT_NAME,
|
||||
domain=DOMAIN,
|
||||
@ -213,7 +214,7 @@ async def test_issur_melacha_sensor(
|
||||
== result["state"]
|
||||
)
|
||||
|
||||
with alter_time(result["update"]):
|
||||
with freeze_time(result["update"]):
|
||||
async_fire_time_changed(hass, result["update"])
|
||||
await hass.async_block_till_done()
|
||||
assert (
|
||||
@ -264,7 +265,7 @@ async def test_issur_melacha_sensor_update(
|
||||
hass.config.latitude = latitude
|
||||
hass.config.longitude = longitude
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(
|
||||
title=DEFAULT_NAME,
|
||||
domain=DOMAIN,
|
||||
@ -286,7 +287,7 @@ async def test_issur_melacha_sensor_update(
|
||||
)
|
||||
|
||||
test_time += timedelta(microseconds=1)
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
async_fire_time_changed(hass, test_time)
|
||||
await hass.async_block_till_done()
|
||||
assert (
|
||||
|
@ -1 +1,44 @@
|
||||
"""Tests for the Jewish Calendar component's init."""
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.jewish_calendar.const import DOMAIN
|
||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers import entity_registry as er
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("old_key", "new_key"),
|
||||
[
|
||||
("first_light", "alot_hashachar"),
|
||||
("sunset", "shkia"),
|
||||
("havdalah", "havdalah"), # Test no change
|
||||
],
|
||||
)
|
||||
async def test_migrate_unique_id(
|
||||
hass: HomeAssistant,
|
||||
entity_registry: er.EntityRegistry,
|
||||
old_key: str,
|
||||
new_key: str,
|
||||
) -> None:
|
||||
"""Test unique id migration."""
|
||||
entry = MockConfigEntry(domain=DOMAIN, data={})
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
entity: er.RegistryEntry = entity_registry.async_get_or_create(
|
||||
domain=SENSOR_DOMAIN,
|
||||
platform=DOMAIN,
|
||||
unique_id=f"{entry.entry_id}-{old_key}",
|
||||
config_entry=entry,
|
||||
)
|
||||
assert entity.unique_id.endswith(f"-{old_key}")
|
||||
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
entity_migrated = entity_registry.async_get(entity.entity_id)
|
||||
assert entity_migrated
|
||||
assert entity_migrated.unique_id == f"{entry.entry_id}-{new_key}"
|
||||
|
@ -2,10 +2,11 @@
|
||||
|
||||
from datetime import datetime as dt, timedelta
|
||||
|
||||
from hdate import htables
|
||||
from freezegun import freeze_time
|
||||
from hdate.holidays import HolidayDatabase
|
||||
from hdate.parasha import Parasha
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.binary_sensor import DOMAIN as SENSOR_DOMAIN
|
||||
from homeassistant.components.jewish_calendar.const import (
|
||||
CONF_CANDLE_LIGHT_MINUTES,
|
||||
CONF_DIASPORA,
|
||||
@ -13,12 +14,13 @@ from homeassistant.components.jewish_calendar.const import (
|
||||
DEFAULT_NAME,
|
||||
DOMAIN,
|
||||
)
|
||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||
from homeassistant.const import CONF_LANGUAGE, CONF_PLATFORM
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.setup import async_setup_component
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import alter_time, make_jerusalem_test_params, make_nyc_test_params
|
||||
from . import make_jerusalem_test_params, make_nyc_test_params
|
||||
|
||||
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||
|
||||
@ -92,8 +94,7 @@ TEST_PARAMS = [
|
||||
"icon": "mdi:calendar-star",
|
||||
"id": "rosh_hashana_i",
|
||||
"type": "YOM_TOV",
|
||||
"type_id": 1,
|
||||
"options": htables.get_all_holidays("english"),
|
||||
"options": HolidayDatabase(False).get_all_names("english"),
|
||||
},
|
||||
),
|
||||
(
|
||||
@ -111,8 +112,7 @@ TEST_PARAMS = [
|
||||
"icon": "mdi:calendar-star",
|
||||
"id": "chanukah, rosh_chodesh",
|
||||
"type": "MELACHA_PERMITTED_HOLIDAY, ROSH_CHODESH",
|
||||
"type_id": "4, 10",
|
||||
"options": htables.get_all_holidays("english"),
|
||||
"options": HolidayDatabase(False).get_all_names("english"),
|
||||
},
|
||||
),
|
||||
(
|
||||
@ -128,7 +128,7 @@ TEST_PARAMS = [
|
||||
"device_class": "enum",
|
||||
"friendly_name": "Jewish Calendar Parshat Hashavua",
|
||||
"icon": "mdi:book-open-variant",
|
||||
"options": [p.hebrew for p in htables.PARASHAOT],
|
||||
"options": list(Parasha),
|
||||
},
|
||||
),
|
||||
(
|
||||
@ -139,7 +139,7 @@ TEST_PARAMS = [
|
||||
"hebrew",
|
||||
"t_set_hakochavim",
|
||||
True,
|
||||
dt(2018, 9, 8, 19, 45),
|
||||
dt(2018, 9, 8, 19, 47),
|
||||
None,
|
||||
),
|
||||
(
|
||||
@ -150,7 +150,7 @@ TEST_PARAMS = [
|
||||
"hebrew",
|
||||
"t_set_hakochavim",
|
||||
False,
|
||||
dt(2018, 9, 8, 19, 19),
|
||||
dt(2018, 9, 8, 19, 21),
|
||||
None,
|
||||
),
|
||||
(
|
||||
@ -185,9 +185,9 @@ TEST_PARAMS = [
|
||||
False,
|
||||
"ו' מרחשוון ה' תשע\"ט",
|
||||
{
|
||||
"hebrew_year": 5779,
|
||||
"hebrew_year": "5779",
|
||||
"hebrew_month_name": "מרחשוון",
|
||||
"hebrew_day": 6,
|
||||
"hebrew_day": "6",
|
||||
"icon": "mdi:star-david",
|
||||
"friendly_name": "Jewish Calendar Date",
|
||||
},
|
||||
@ -245,7 +245,7 @@ async def test_jewish_calendar_sensor(
|
||||
hass.config.latitude = latitude
|
||||
hass.config.longitude = longitude
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(
|
||||
title=DEFAULT_NAME,
|
||||
domain=DOMAIN,
|
||||
@ -258,7 +258,7 @@ async def test_jewish_calendar_sensor(
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
future = dt_util.utcnow() + timedelta(seconds=30)
|
||||
future = test_time + timedelta(seconds=30)
|
||||
async_fire_time_changed(hass, future)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
@ -424,9 +424,9 @@ SHABBAT_PARAMS = [
|
||||
make_jerusalem_test_params(
|
||||
dt(2018, 9, 29, 21, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2018, 9, 30, 18, 7),
|
||||
"english_upcoming_candle_lighting": dt(2018, 9, 30, 17, 45),
|
||||
"english_upcoming_havdalah": dt(2018, 10, 1, 19, 1),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 18, 1),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 17, 39),
|
||||
"english_upcoming_shabbat_havdalah": dt(2018, 10, 6, 18, 54),
|
||||
"english_parshat_hashavua": "Bereshit",
|
||||
"hebrew_parshat_hashavua": "בראשית",
|
||||
@ -437,22 +437,22 @@ SHABBAT_PARAMS = [
|
||||
make_jerusalem_test_params(
|
||||
dt(2018, 9, 30, 21, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2018, 9, 30, 18, 7),
|
||||
"english_upcoming_candle_lighting": dt(2018, 9, 30, 17, 45),
|
||||
"english_upcoming_havdalah": dt(2018, 10, 1, 19, 1),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 18, 1),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 17, 39),
|
||||
"english_upcoming_shabbat_havdalah": dt(2018, 10, 6, 18, 54),
|
||||
"english_parshat_hashavua": "Bereshit",
|
||||
"hebrew_parshat_hashavua": "בראשית",
|
||||
"english_holiday": "Shmini Atzeret",
|
||||
"hebrew_holiday": "שמיני עצרת",
|
||||
"english_holiday": "Shmini Atzeret, Simchat Torah",
|
||||
"hebrew_holiday": "שמיני עצרת, שמחת תורה",
|
||||
},
|
||||
),
|
||||
make_jerusalem_test_params(
|
||||
dt(2018, 10, 1, 21, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2018, 10, 5, 18, 1),
|
||||
"english_upcoming_candle_lighting": dt(2018, 10, 5, 17, 39),
|
||||
"english_upcoming_havdalah": dt(2018, 10, 6, 18, 54),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 18, 1),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2018, 10, 5, 17, 39),
|
||||
"english_upcoming_shabbat_havdalah": dt(2018, 10, 6, 18, 54),
|
||||
"english_parshat_hashavua": "Bereshit",
|
||||
"hebrew_parshat_hashavua": "בראשית",
|
||||
@ -487,9 +487,9 @@ SHABBAT_PARAMS = [
|
||||
make_jerusalem_test_params(
|
||||
dt(2017, 9, 21, 8, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 18, 20),
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 17, 58),
|
||||
"english_upcoming_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 19, 12),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 17, 56),
|
||||
"english_upcoming_shabbat_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_parshat_hashavua": "Ha'Azinu",
|
||||
"hebrew_parshat_hashavua": "האזינו",
|
||||
@ -500,9 +500,9 @@ SHABBAT_PARAMS = [
|
||||
make_jerusalem_test_params(
|
||||
dt(2017, 9, 22, 8, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 18, 20),
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 17, 58),
|
||||
"english_upcoming_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 19, 12),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 17, 56),
|
||||
"english_upcoming_shabbat_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_parshat_hashavua": "Ha'Azinu",
|
||||
"hebrew_parshat_hashavua": "האזינו",
|
||||
@ -513,9 +513,9 @@ SHABBAT_PARAMS = [
|
||||
make_jerusalem_test_params(
|
||||
dt(2017, 9, 23, 8, 25),
|
||||
{
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 18, 20),
|
||||
"english_upcoming_candle_lighting": dt(2017, 9, 20, 17, 58),
|
||||
"english_upcoming_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 19, 12),
|
||||
"english_upcoming_shabbat_candle_lighting": dt(2017, 9, 22, 17, 56),
|
||||
"english_upcoming_shabbat_havdalah": dt(2017, 9, 23, 19, 11),
|
||||
"english_parshat_hashavua": "Ha'Azinu",
|
||||
"hebrew_parshat_hashavua": "האזינו",
|
||||
@ -587,7 +587,7 @@ async def test_shabbat_times_sensor(
|
||||
hass.config.latitude = latitude
|
||||
hass.config.longitude = longitude
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(
|
||||
title=DEFAULT_NAME,
|
||||
domain=DOMAIN,
|
||||
@ -604,7 +604,7 @@ async def test_shabbat_times_sensor(
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
future = dt_util.utcnow() + timedelta(seconds=30)
|
||||
future = test_time + timedelta(seconds=30)
|
||||
async_fire_time_changed(hass, future)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
@ -649,13 +649,13 @@ async def test_omer_sensor(hass: HomeAssistant, test_time, result) -> None:
|
||||
"""Test Omer Count sensor output."""
|
||||
test_time = test_time.replace(tzinfo=dt_util.get_time_zone(hass.config.time_zone))
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(title=DEFAULT_NAME, domain=DOMAIN)
|
||||
entry.add_to_hass(hass)
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
future = dt_util.utcnow() + timedelta(seconds=30)
|
||||
future = test_time + timedelta(seconds=30)
|
||||
async_fire_time_changed(hass, future)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
@ -684,13 +684,13 @@ async def test_dafyomi_sensor(hass: HomeAssistant, test_time, result) -> None:
|
||||
"""Test Daf Yomi sensor output."""
|
||||
test_time = test_time.replace(tzinfo=dt_util.get_time_zone(hass.config.time_zone))
|
||||
|
||||
with alter_time(test_time):
|
||||
with freeze_time(test_time):
|
||||
entry = MockConfigEntry(title=DEFAULT_NAME, domain=DOMAIN)
|
||||
entry.add_to_hass(hass)
|
||||
await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
future = dt_util.utcnow() + timedelta(seconds=30)
|
||||
future = test_time + timedelta(seconds=30)
|
||||
async_fire_time_changed(hass, future)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user