From b8f6651d9b8ac61e5cb7b228d9d1d2f0957b6539 Mon Sep 17 00:00:00 2001 From: "Steven B." <51370195+sdb9696@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:55:02 +0000 Subject: [PATCH] Remove experimental support (#1256) --- devtools/dump_devinfo.py | 7 +----- kasa/cli/main.py | 20 ---------------- kasa/discover.py | 4 +--- kasa/experimental/__init__.py | 28 ----------------------- pyproject.toml | 3 --- tests/test_cli.py | 43 +++-------------------------------- 6 files changed, 5 insertions(+), 100 deletions(-) delete mode 100644 kasa/experimental/__init__.py diff --git a/devtools/dump_devinfo.py b/devtools/dump_devinfo.py index 7316809a..fca2d35c 100644 --- a/devtools/dump_devinfo.py +++ b/devtools/dump_devinfo.py @@ -309,10 +309,6 @@ async def cli( if debug: logging.basicConfig(level=logging.DEBUG) - from kasa.experimental import Experimental - - Experimental.set_enabled(True) - credentials = Credentials(username=username, password=password) if host is not None: if discovery_info: @@ -356,8 +352,7 @@ async def cli( await handle_device(basedir, autosave, protocol, batch_size=batch_size) else: raise KasaException( - "Could not find a protocol for the given parameters. " - + "Maybe you need to enable --experimental." + "Could not find a protocol for the given parameters." ) else: click.echo("Host given, performing discovery on %s." % host) diff --git a/kasa/cli/main.py b/kasa/cli/main.py index d6b9fa9d..f20642b8 100755 --- a/kasa/cli/main.py +++ b/kasa/cli/main.py @@ -16,7 +16,6 @@ if TYPE_CHECKING: from kasa import Device from kasa.deviceconfig import DeviceEncryptionType -from kasa.experimental import Experimental from .common import ( SKIP_UPDATE_COMMANDS, @@ -220,14 +219,6 @@ def _legacy_type_to_class(_type: str) -> Any: envvar="KASA_CREDENTIALS_HASH", help="Hashed credentials used to authenticate to the device.", ) -@click.option( - "--experimental/--no-experimental", - default=None, - is_flag=True, - type=bool, - envvar=Experimental.ENV_VAR, - help="Enable experimental mode for devices not yet fully supported.", -) @click.version_option(package_name="python-kasa") @click.pass_context async def cli( @@ -249,7 +240,6 @@ async def cli( username, password, credentials_hash, - experimental, ): """A tool for controlling TP-Link smart home devices.""" # noqa # no need to perform any checks if we are just displaying the help @@ -261,12 +251,6 @@ async def cli( if target != DEFAULT_TARGET and host: error("--target is not a valid option for single host discovery") - if experimental is not None: - Experimental.set_enabled(experimental) - - if Experimental.enabled(): - echo("Experimental support is enabled") - logging_config: dict[str, Any] = { "level": logging.DEBUG if debug > 0 else logging.INFO } @@ -332,10 +316,6 @@ async def cli( dev = _legacy_type_to_class(type)(host, config=config) elif type in {"smart", "camera"} or (device_family and encrypt_type): if type == "camera": - if not experimental: - error( - "Camera is an experimental type, please enable with --experimental" - ) encrypt_type = "AES" https = True device_family = "SMART.IPCAMERA" diff --git a/kasa/discover.py b/kasa/discover.py index 99adf504..14a32472 100755 --- a/kasa/discover.py +++ b/kasa/discover.py @@ -129,7 +129,6 @@ from kasa.exceptions import ( TimeoutError, UnsupportedDeviceError, ) -from kasa.experimental import Experimental from kasa.iot.iotdevice import IotDevice from kasa.json import DataClassJSONMixin from kasa.json import dumps as json_dumps @@ -589,9 +588,8 @@ class Discover: main_device_families = { Device.Family.SmartTapoPlug, Device.Family.IotSmartPlugSwitch, + Device.Family.SmartIpCamera, } - if Experimental.enabled(): - main_device_families.add(Device.Family.SmartIpCamera) candidates: dict[ tuple[type[BaseProtocol], type[BaseTransport], type[Device]], tuple[BaseProtocol, DeviceConfig], diff --git a/kasa/experimental/__init__.py b/kasa/experimental/__init__.py deleted file mode 100644 index a866787e..00000000 --- a/kasa/experimental/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Package for experimental.""" - -from __future__ import annotations - -import os - - -class Experimental: - """Class for enabling experimental functionality.""" - - _enabled: bool | None = None - ENV_VAR = "KASA_EXPERIMENTAL" - - @classmethod - def set_enabled(cls, enabled: bool) -> None: - """Set the enabled value.""" - cls._enabled = enabled - - @classmethod - def enabled(cls) -> bool: - """Get the enabled value.""" - if cls._enabled is not None: - return cls._enabled - - if env_var := os.getenv(cls.ENV_VAR): - return env_var.lower() in {"true", "1", "t", "on"} - - return False diff --git a/pyproject.toml b/pyproject.toml index 44959c6f..fde4a7c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,9 +84,6 @@ include = [ [tool.coverage.run] source = ["kasa"] branch = true -omit = [ - "kasa/experimental/*" -] [tool.coverage.report] exclude_lines = [ diff --git a/tests/test_cli.py b/tests/test_cli.py index 1ab0dc31..78cfb34c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -861,9 +861,6 @@ async def test_host_auth_failed(discovery_mock, mocker, runner): @pytest.mark.parametrize("device_type", TYPES) async def test_type_param(device_type, mocker, runner): """Test for handling only one of username or password supplied.""" - if device_type == "camera": - pytest.skip(reason="camera is experimental") - result_device = FileNotFoundError pass_dev = click.make_pass_decorator(Device) @@ -873,7 +870,9 @@ async def test_type_param(device_type, mocker, runner): result_device = dev mocker.patch("kasa.cli.device.state", new=_state) - if device_type == "smart": + if device_type == "camera": + expected_type = SmartCamera + elif device_type == "smart": expected_type = SmartDevice else: expected_type = _legacy_type_to_class(device_type) @@ -1253,39 +1252,3 @@ async def test_discover_config_invalid(mocker, runner): ) assert res.exit_code == 1 assert "--target is not a valid option for single host discovery" in res.output - - -@pytest.mark.parametrize( - ("option", "env_var_value", "expectation"), - [ - pytest.param("--experimental", None, True), - pytest.param("--experimental", "false", True), - pytest.param(None, None, False), - pytest.param(None, "true", True), - pytest.param(None, "false", False), - pytest.param("--no-experimental", "true", False), - ], -) -async def test_experimental_flags(mocker, option, env_var_value, expectation): - """Test the experimental flag is set correctly.""" - mocker.patch("kasa.discover.Discover.try_connect_all", return_value=None) - - # reset the class internal variable - from kasa.experimental import Experimental - - Experimental._enabled = None - - KASA_VARS = {k: None for k, v in os.environ.items() if k.startswith("KASA_")} - if env_var_value: - KASA_VARS["KASA_EXPERIMENTAL"] = env_var_value - args = [ - "--host", - "127.0.0.2", - "discover", - "config", - ] - if option: - args.insert(0, option) - runner = CliRunner(env=KASA_VARS) - res = await runner.invoke(cli, args) - assert ("Experimental support is enabled" in res.output) is expectation