diff --git a/homeassistant/components/profiler/__init__.py b/homeassistant/components/profiler/__init__.py index 9b4164c9f41..fab6932edd2 100644 --- a/homeassistant/components/profiler/__init__.py +++ b/homeassistant/components/profiler/__init__.py @@ -15,6 +15,7 @@ from homeassistant.components import persistent_notification from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE from homeassistant.core import HomeAssistant, ServiceCall +from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import async_track_time_interval 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 # in memory since usually only one part of this # 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 start_time = int(time.time() * 1000000) diff --git a/homeassistant/components/profiler/manifest.json b/homeassistant/components/profiler/manifest.json index 11896c02fdd..81eb77537fb 100644 --- a/homeassistant/components/profiler/manifest.json +++ b/homeassistant/components/profiler/manifest.json @@ -5,5 +5,9 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/profiler", "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" + ] } diff --git a/requirements_all.txt b/requirements_all.txt index 13b0e6874f0..9cc38659d9c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -849,7 +849,7 @@ gspread==5.5.0 gstreamer-player==1.1.2 # homeassistant.components.profiler -guppy3==3.1.2 +guppy3==3.1.2;python_version<'3.11' # homeassistant.components.iaqualink h2==4.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 78e49f2b24e..03b0a9ec0fc 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -644,7 +644,7 @@ growattServer==1.3.0 gspread==5.5.0 # homeassistant.components.profiler -guppy3==3.1.2 +guppy3==3.1.2;python_version<'3.11' # homeassistant.components.iaqualink h2==4.1.0 diff --git a/script/hassfest/requirements.py b/script/hassfest/requirements.py index 8e4ac524b2f..8b9f73336fe 100644 --- a/script/hassfest/requirements.py +++ b/script/hassfest/requirements.py @@ -90,7 +90,7 @@ def validate_requirements_format(integration: Integration) -> bool: if not version: continue - for part in version.split(","): + for part in version.split(";", 1)[0].split(","): version_part = PIP_VERSION_RANGE_SEPARATOR.match(part) if ( version_part diff --git a/tests/components/profiler/test_init.py b/tests/components/profiler/test_init.py index a83bd3b2b1b..636067341e1 100644 --- a/tests/components/profiler/test_init.py +++ b/tests/components/profiler/test_init.py @@ -1,6 +1,7 @@ """Test the Profiler config flow.""" from datetime import timedelta import os +import sys from unittest.mock import patch import pytest @@ -18,6 +19,7 @@ from homeassistant.components.profiler import ( from homeassistant.components.profiler.const import DOMAIN from homeassistant.const import CONF_SCAN_INTERVAL, CONF_TYPE from homeassistant.core import HomeAssistant +from homeassistant.exceptions import HomeAssistantError import homeassistant.util.dt as dt_util 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() +@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: """Test we can setup and the service is registered.""" test_dir = tmpdir.mkdir("profiles") @@ -83,6 +88,24 @@ async def test_memory_usage(hass: HomeAssistant, tmpdir) -> None: 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( hass: HomeAssistant, caplog: pytest.LogCaptureFixture ) -> None: diff --git a/tests/hassfest/test_requirements.py b/tests/hassfest/test_requirements.py index cb73e5b9603..174bf841788 100644 --- a/tests/hassfest/test_requirements.py +++ b/tests/hassfest/test_requirements.py @@ -52,6 +52,7 @@ def test_validate_requirements_format_ignore_pin_for_custom(integration: Integra "test_package~=0.5.0", "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;python_version<'3.11'", ] integration.path = Path("") assert validate_requirements_format(integration)