Disable profiler.memory service with python 3.11 (#88136)

This commit is contained in:
J. Nick Koston 2023-02-15 09:20:47 -06:00 committed by GitHub
parent 6254200b37
commit 61539686a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 38 additions and 4 deletions

View File

@ -15,6 +15,7 @@ from homeassistant.components import persistent_notification
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE
from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.exceptions import HomeAssistantError
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.event import async_track_time_interval
from homeassistant.helpers.service import async_register_admin_service from homeassistant.helpers.service import async_register_admin_service
@ -269,6 +270,11 @@ async def _async_generate_memory_profile(hass: HomeAssistant, call: ServiceCall)
# Imports deferred to avoid loading modules # Imports deferred to avoid loading modules
# in memory since usually only one part of this # in memory since usually only one part of this
# integration is used at a time # integration is used at a time
if sys.version_info >= (3, 11):
raise HomeAssistantError(
"Memory profiling is not supported on Python 3.11. Please use Python 3.10."
)
from guppy import hpy # pylint: disable=import-outside-toplevel from guppy import hpy # pylint: disable=import-outside-toplevel
start_time = int(time.time() * 1000000) start_time = int(time.time() * 1000000)

View File

@ -5,5 +5,9 @@
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/profiler", "documentation": "https://www.home-assistant.io/integrations/profiler",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["pyprof2calltree==1.4.5", "guppy3==3.1.2", "objgraph==3.5.0"] "requirements": [
"pyprof2calltree==1.4.5",
"guppy3==3.1.2;python_version<'3.11'",
"objgraph==3.5.0"
]
} }

View File

@ -849,7 +849,7 @@ gspread==5.5.0
gstreamer-player==1.1.2 gstreamer-player==1.1.2
# homeassistant.components.profiler # homeassistant.components.profiler
guppy3==3.1.2 guppy3==3.1.2;python_version<'3.11'
# homeassistant.components.iaqualink # homeassistant.components.iaqualink
h2==4.1.0 h2==4.1.0

View File

@ -644,7 +644,7 @@ growattServer==1.3.0
gspread==5.5.0 gspread==5.5.0
# homeassistant.components.profiler # homeassistant.components.profiler
guppy3==3.1.2 guppy3==3.1.2;python_version<'3.11'
# homeassistant.components.iaqualink # homeassistant.components.iaqualink
h2==4.1.0 h2==4.1.0

View File

@ -90,7 +90,7 @@ def validate_requirements_format(integration: Integration) -> bool:
if not version: if not version:
continue continue
for part in version.split(","): for part in version.split(";", 1)[0].split(","):
version_part = PIP_VERSION_RANGE_SEPARATOR.match(part) version_part = PIP_VERSION_RANGE_SEPARATOR.match(part)
if ( if (
version_part version_part

View File

@ -1,6 +1,7 @@
"""Test the Profiler config flow.""" """Test the Profiler config flow."""
from datetime import timedelta from datetime import timedelta
import os import os
import sys
from unittest.mock import patch from unittest.mock import patch
import pytest import pytest
@ -18,6 +19,7 @@ from homeassistant.components.profiler import (
from homeassistant.components.profiler.const import DOMAIN from homeassistant.components.profiler.const import DOMAIN
from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from tests.common import MockConfigEntry, async_fire_time_changed from tests.common import MockConfigEntry, async_fire_time_changed
@ -53,6 +55,9 @@ async def test_basic_usage(hass: HomeAssistant, tmpdir) -> None:
await hass.async_block_till_done() await hass.async_block_till_done()
@pytest.mark.skipif(
sys.version_info >= (3, 11), reason="not yet available on python 3.11"
)
async def test_memory_usage(hass: HomeAssistant, tmpdir) -> None: async def test_memory_usage(hass: HomeAssistant, tmpdir) -> None:
"""Test we can setup and the service is registered.""" """Test we can setup and the service is registered."""
test_dir = tmpdir.mkdir("profiles") test_dir = tmpdir.mkdir("profiles")
@ -83,6 +88,24 @@ async def test_memory_usage(hass: HomeAssistant, tmpdir) -> None:
await hass.async_block_till_done() await hass.async_block_till_done()
@pytest.mark.skipif(sys.version_info < (3, 11), reason="still works on python 3.10")
async def test_memory_usage_py311(hass: HomeAssistant, tmpdir) -> None:
"""Test raise an error on python3.11."""
entry = MockConfigEntry(domain=DOMAIN)
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.services.has_service(DOMAIN, SERVICE_MEMORY)
with pytest.raises(
HomeAssistantError,
match="Memory profiling is not supported on Python 3.11. Please use Python 3.10.",
):
await hass.services.async_call(
DOMAIN, SERVICE_MEMORY, {CONF_SECONDS: 0.000001}, blocking=True
)
async def test_object_growth_logging( async def test_object_growth_logging(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None: ) -> None:

View File

@ -52,6 +52,7 @@ def test_validate_requirements_format_ignore_pin_for_custom(integration: Integra
"test_package~=0.5.0", "test_package~=0.5.0",
"test_package>=1.4.2,<1.4.99,>=1.7,<1.8.99", "test_package>=1.4.2,<1.4.99,>=1.7,<1.8.99",
"test_package>=1.4.2,<1.9,!=1.5", "test_package>=1.4.2,<1.9,!=1.5",
"test_package>=1.4.2;python_version<'3.11'",
] ]
integration.path = Path("") integration.path = Path("")
assert validate_requirements_format(integration) assert validate_requirements_format(integration)