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.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)

View file

@ -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"
]
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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)