From e85b0ec052d70ba9217a70cfb306b5dd5997ccd8 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 23 Jul 2021 00:40:30 +0200 Subject: [PATCH] Move Sonos to upstream SoCo (#53351) --- homeassistant/components/sonos/__init__.py | 14 +++++++------- homeassistant/components/sonos/alarms.py | 6 +++--- homeassistant/components/sonos/config_flow.py | 4 ++-- homeassistant/components/sonos/entity.py | 4 ++-- homeassistant/components/sonos/favorites.py | 6 +++--- homeassistant/components/sonos/helpers.py | 2 +- .../components/sonos/household_coordinator.py | 2 +- homeassistant/components/sonos/manifest.json | 2 +- homeassistant/components/sonos/media_player.py | 4 ++-- homeassistant/components/sonos/speaker.py | 14 +++++++------- homeassistant/components/sonos/switch.py | 2 +- requirements_all.txt | 6 +++--- requirements_test_all.txt | 6 +++--- tests/components/sonos/conftest.py | 6 +++--- tests/components/sonos/test_config_flow.py | 2 +- tests/components/sonos/test_init.py | 6 +++--- tests/components/sonos/test_sensor.py | 2 +- 17 files changed, 44 insertions(+), 44 deletions(-) diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py index 26541db5fd8..b7f17752097 100644 --- a/homeassistant/components/sonos/__init__.py +++ b/homeassistant/components/sonos/__init__.py @@ -9,10 +9,10 @@ import logging import socket from urllib.parse import urlparse -import pysonos -from pysonos import events_asyncio -from pysonos.core import SoCo -from pysonos.exceptions import SoCoException +from soco import events_asyncio +import soco.config as soco_config +from soco.core import SoCo +from soco.exceptions import SoCoException import voluptuous as vol from homeassistant import config_entries @@ -109,7 +109,7 @@ async def async_setup(hass, config): async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Sonos from a config entry.""" - pysonos.config.EVENTS_MODULE = events_asyncio + soco_config.EVENTS_MODULE = events_asyncio if DATA_SONOS not in hass.data: hass.data[DATA_SONOS] = SonosData() @@ -121,7 +121,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: advertise_addr = config.get(CONF_ADVERTISE_ADDR) if advertise_addr: - pysonos.config.EVENT_ADVERTISE_IP = advertise_addr + soco_config.EVENT_ADVERTISE_IP = advertise_addr if deprecated_address := config.get(CONF_INTERFACE_ADDR): _LOGGER.warning( @@ -140,7 +140,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: def _create_soco(ip_address: str, source: SoCoCreationSource) -> SoCo | None: """Create a soco instance and return if successful.""" try: - soco = pysonos.SoCo(ip_address) + soco = SoCo(ip_address) # Ensure that the player is available and UID is cached _ = soco.uid _ = soco.volume diff --git a/homeassistant/components/sonos/alarms.py b/homeassistant/components/sonos/alarms.py index 98e4b752cad..215e4fede32 100644 --- a/homeassistant/components/sonos/alarms.py +++ b/homeassistant/components/sonos/alarms.py @@ -5,9 +5,9 @@ from collections.abc import Iterator import logging from typing import Any -from pysonos import SoCo -from pysonos.alarms import Alarm, get_alarms -from pysonos.exceptions import SoCoException +from soco import SoCo +from soco.alarms import Alarm, get_alarms +from soco.exceptions import SoCoException from homeassistant.helpers.dispatcher import async_dispatcher_send diff --git a/homeassistant/components/sonos/config_flow.py b/homeassistant/components/sonos/config_flow.py index 9ee571471bd..762dbc5f0ee 100644 --- a/homeassistant/components/sonos/config_flow.py +++ b/homeassistant/components/sonos/config_flow.py @@ -1,7 +1,7 @@ """Config flow for SONOS.""" import logging -import pysonos +import soco from homeassistant import config_entries from homeassistant.const import CONF_HOST @@ -18,7 +18,7 @@ _LOGGER = logging.getLogger(__name__) async def _async_has_devices(hass: HomeAssistant) -> bool: """Return if there are devices that can be discovered.""" - result = await hass.async_add_executor_job(pysonos.discover) + result = await hass.async_add_executor_job(soco.discover) return bool(result) diff --git a/homeassistant/components/sonos/entity.py b/homeassistant/components/sonos/entity.py index a2b0d7c5a64..b670ab96f2f 100644 --- a/homeassistant/components/sonos/entity.py +++ b/homeassistant/components/sonos/entity.py @@ -4,8 +4,8 @@ from __future__ import annotations import datetime import logging -from pysonos.core import SoCo -from pysonos.exceptions import SoCoException +from soco.core import SoCo +from soco.exceptions import SoCoException import homeassistant.helpers.device_registry as dr from homeassistant.helpers.dispatcher import ( diff --git a/homeassistant/components/sonos/favorites.py b/homeassistant/components/sonos/favorites.py index 25fc58ebba2..9695265b24d 100644 --- a/homeassistant/components/sonos/favorites.py +++ b/homeassistant/components/sonos/favorites.py @@ -5,9 +5,9 @@ from collections.abc import Iterator import logging from typing import Any -from pysonos import SoCo -from pysonos.data_structures import DidlFavorite -from pysonos.exceptions import SoCoException +from soco import SoCo +from soco.data_structures import DidlFavorite +from soco.exceptions import SoCoException from homeassistant.helpers.dispatcher import async_dispatcher_send diff --git a/homeassistant/components/sonos/helpers.py b/homeassistant/components/sonos/helpers.py index 675a3e8e9f2..0854361cd79 100644 --- a/homeassistant/components/sonos/helpers.py +++ b/homeassistant/components/sonos/helpers.py @@ -5,7 +5,7 @@ import functools as ft import logging from typing import Any, Callable -from pysonos.exceptions import SoCoException, SoCoUPnPException +from soco.exceptions import SoCoException, SoCoUPnPException from homeassistant.exceptions import HomeAssistantError diff --git a/homeassistant/components/sonos/household_coordinator.py b/homeassistant/components/sonos/household_coordinator.py index d24ab40b3db..da964e93984 100644 --- a/homeassistant/components/sonos/household_coordinator.py +++ b/homeassistant/components/sonos/household_coordinator.py @@ -6,7 +6,7 @@ from collections.abc import Callable, Coroutine import logging from typing import Any -from pysonos import SoCo +from soco import SoCo from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.debounce import Debouncer diff --git a/homeassistant/components/sonos/manifest.json b/homeassistant/components/sonos/manifest.json index a35faee4ad6..e571693c659 100644 --- a/homeassistant/components/sonos/manifest.json +++ b/homeassistant/components/sonos/manifest.json @@ -3,7 +3,7 @@ "name": "Sonos", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/sonos", - "requirements": ["pysonos==0.0.53"], + "requirements": ["soco==0.23.1"], "dependencies": ["ssdp"], "after_dependencies": ["plex", "zeroconf"], "zeroconf": ["_sonos._tcp.local."], diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index a4cc6e175ec..ecd22c89a87 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -6,8 +6,8 @@ import logging from typing import Any import urllib.parse -from pysonos import alarms -from pysonos.core import ( +from soco import alarms +from soco.core import ( MUSIC_SRC_LINE_IN, MUSIC_SRC_RADIO, PLAY_MODE_BY_MEANING, diff --git a/homeassistant/components/sonos/speaker.py b/homeassistant/components/sonos/speaker.py index d7bc1269ea1..af697836908 100644 --- a/homeassistant/components/sonos/speaker.py +++ b/homeassistant/components/sonos/speaker.py @@ -11,13 +11,13 @@ from typing import Any, Callable import urllib.parse import async_timeout -from pysonos.core import MUSIC_SRC_LINE_IN, MUSIC_SRC_RADIO, MUSIC_SRC_TV, SoCo -from pysonos.data_structures import DidlAudioBroadcast, DidlPlaylistContainer -from pysonos.events_base import Event as SonosEvent, SubscriptionBase -from pysonos.exceptions import SoCoException, SoCoUPnPException -from pysonos.music_library import MusicLibrary -from pysonos.plugins.sharelink import ShareLinkPlugin -from pysonos.snapshot import Snapshot +from soco.core import MUSIC_SRC_LINE_IN, MUSIC_SRC_RADIO, MUSIC_SRC_TV, SoCo +from soco.data_structures import DidlAudioBroadcast, DidlPlaylistContainer +from soco.events_base import Event as SonosEvent, SubscriptionBase +from soco.exceptions import SoCoException, SoCoUPnPException +from soco.music_library import MusicLibrary +from soco.plugins.sharelink import ShareLinkPlugin +from soco.snapshot import Snapshot from homeassistant.components import zeroconf from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN diff --git a/homeassistant/components/sonos/switch.py b/homeassistant/components/sonos/switch.py index 795eded6ec1..482780453af 100644 --- a/homeassistant/components/sonos/switch.py +++ b/homeassistant/components/sonos/switch.py @@ -4,7 +4,7 @@ from __future__ import annotations import datetime import logging -from pysonos.exceptions import SoCoException, SoCoUPnPException +from soco.exceptions import SoCoException, SoCoUPnPException from homeassistant.components.switch import ENTITY_ID_FORMAT, SwitchEntity from homeassistant.const import ATTR_TIME diff --git a/requirements_all.txt b/requirements_all.txt index bf342ef9cca..021a20daea2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1779,9 +1779,6 @@ pysnmp==4.4.12 # homeassistant.components.soma pysoma==0.0.10 -# homeassistant.components.sonos -pysonos==0.0.53 - # homeassistant.components.spc pyspcwebgw==0.4.0 @@ -2146,6 +2143,9 @@ smhi-pkg==1.0.15 # homeassistant.components.snapcast snapcast==2.1.3 +# homeassistant.components.sonos +soco==0.23.1 + # homeassistant.components.solaredge_local solaredge-local==0.2.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 787d30704ef..d27ea0a42b0 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1015,9 +1015,6 @@ pysmartthings==0.7.6 # homeassistant.components.soma pysoma==0.0.10 -# homeassistant.components.sonos -pysonos==0.0.53 - # homeassistant.components.spc pyspcwebgw==0.4.0 @@ -1175,6 +1172,9 @@ smarthab==0.21 # homeassistant.components.smhi smhi-pkg==1.0.15 +# homeassistant.components.sonos +soco==0.23.1 + # homeassistant.components.solaredge solaredge==0.0.2 diff --git a/tests/components/sonos/conftest.py b/tests/components/sonos/conftest.py index 7c5b4ac91ef..294e243901a 100644 --- a/tests/components/sonos/conftest.py +++ b/tests/components/sonos/conftest.py @@ -49,8 +49,8 @@ def config_entry_fixture(): @pytest.fixture(name="soco") def soco_fixture(music_library, speaker_info, battery_info, alarm_clock): - """Create a mock pysonos SoCo fixture.""" - with patch("pysonos.SoCo", autospec=True) as mock, patch( + """Create a mock soco SoCo fixture.""" + with patch("homeassistant.components.sonos.SoCo", autospec=True) as mock, patch( "socket.gethostbyname", return_value="192.168.42.2" ): mock_soco = mock.return_value @@ -76,7 +76,7 @@ def soco_fixture(music_library, speaker_info, battery_info, alarm_clock): @pytest.fixture(name="discover", autouse=True) def discover_fixture(soco): - """Create a mock pysonos discover fixture.""" + """Create a mock soco discover fixture.""" def do_callback(hass, callback, *args, **kwargs): callback( diff --git a/tests/components/sonos/test_config_flow.py b/tests/components/sonos/test_config_flow.py index 9dd308ae28f..90ffdb155ea 100644 --- a/tests/components/sonos/test_config_flow.py +++ b/tests/components/sonos/test_config_flow.py @@ -7,7 +7,7 @@ from homeassistant import config_entries, core, setup from homeassistant.components.sonos.const import DATA_SONOS_DISCOVERY_MANAGER, DOMAIN -@patch("homeassistant.components.sonos.config_flow.pysonos.discover", return_value=True) +@patch("homeassistant.components.sonos.config_flow.soco.discover", return_value=True) async def test_user_form(discover_mock: MagicMock, hass: core.HomeAssistant): """Test we get the user initiated form.""" await setup.async_setup_component(hass, "persistent_notification", {}) diff --git a/tests/components/sonos/test_init.py b/tests/components/sonos/test_init.py index 86ec90f32b8..bf4b5d5e7cc 100644 --- a/tests/components/sonos/test_init.py +++ b/tests/components/sonos/test_init.py @@ -13,7 +13,7 @@ async def test_creating_entry_sets_up_media_player(hass): with patch( "homeassistant.components.sonos.media_player.async_setup_entry", return_value=mock_coro(True), - ) as mock_setup, patch("pysonos.discover", return_value=True): + ) as mock_setup, patch("soco.discover", return_value=True): result = await hass.config_entries.flow.async_init( sonos.DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -33,7 +33,7 @@ async def test_configuring_sonos_creates_entry(hass): """Test that specifying config will create an entry.""" with patch( "homeassistant.components.sonos.async_setup_entry", return_value=mock_coro(True) - ) as mock_setup, patch("pysonos.discover", return_value=True): + ) as mock_setup, patch("soco.discover", return_value=True): await async_setup_component( hass, sonos.DOMAIN, @@ -48,7 +48,7 @@ async def test_not_configuring_sonos_not_creates_entry(hass): """Test that no config will not create an entry.""" with patch( "homeassistant.components.sonos.async_setup_entry", return_value=mock_coro(True) - ) as mock_setup, patch("pysonos.discover", return_value=True): + ) as mock_setup, patch("soco.discover", return_value=True): await async_setup_component(hass, sonos.DOMAIN, {}) await hass.async_block_till_done() diff --git a/tests/components/sonos/test_sensor.py b/tests/components/sonos/test_sensor.py index 80f050fe6fc..18cd87ca9be 100644 --- a/tests/components/sonos/test_sensor.py +++ b/tests/components/sonos/test_sensor.py @@ -1,5 +1,5 @@ """Tests for the Sonos battery sensor platform.""" -from pysonos.exceptions import NotSupportedException +from soco.exceptions import NotSupportedException from homeassistant.components.sonos import DOMAIN from homeassistant.components.sonos.binary_sensor import ATTR_BATTERY_POWER_SOURCE