Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Move protocol modules into protocols package #1254

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion devtools/dump_devinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
SmartCameraProtocol,
_ChildCameraProtocolWrapper,
)
from kasa.protocols.smartprotocol import SmartProtocol, _ChildProtocolWrapper
from kasa.smart import SmartChildDevice
from kasa.smartprotocol import SmartProtocol, _ChildProtocolWrapper

Call = namedtuple("Call", "module method")
FixtureResult = namedtuple("FixtureResult", "filename, folder, data")
Expand Down
3 changes: 1 addition & 2 deletions devtools/parse_pcap_klap.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,13 @@
import pyshark
from cryptography.hazmat.primitives import padding

from kasa.credentials import Credentials
from kasa.credentials import DEFAULT_CREDENTIALS, Credentials, get_default_credentials
from kasa.deviceconfig import (
DeviceConfig,
DeviceConnectionParameters,
DeviceEncryptionType,
DeviceFamily,
)
from kasa.protocol import DEFAULT_CREDENTIALS, get_default_credentials
from kasa.transports.klaptransport import KlapEncryptionSession, KlapTransportV2


Expand Down
6 changes: 3 additions & 3 deletions docs/source/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,21 +86,21 @@
## Protocols and transports

```{eval-rst}
.. autoclass:: kasa.protocol.BaseProtocol
.. autoclass:: kasa.protocols.BaseProtocol
:members:
:inherited-members:
:undoc-members:
```

```{eval-rst}
.. autoclass:: kasa.iotprotocol.IotProtocol
.. autoclass:: kasa.protocols.IotProtocol
:members:
:inherited-members:
:undoc-members:
```

```{eval-rst}
.. autoclass:: kasa.smartprotocol.SmartProtocol
.. autoclass:: kasa.protocols.SmartProtocol
:members:
:inherited-members:
:undoc-members:
Expand Down
32 changes: 16 additions & 16 deletions docs/source/topics.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,15 @@ In order to support these different configurations the library migrated from a s
to support pluggable transports and protocols.
The classes providing this functionality are:

- {class}`BaseProtocol <kasa.protocol.BaseProtocol>`
- {class}`IotProtocol <kasa.iotprotocol.IotProtocol>`
- {class}`SmartProtocol <kasa.smartprotocol.SmartProtocol>`
- {class}`BaseProtocol <kasa.protocols.BaseProtocol>`
- {class}`IotProtocol <kasa.protocols.IotProtocol>`
- {class}`SmartProtocol <kasa.protocols.SmartProtocol>`

- {class}`BaseTransport <kasa.protocol.BaseTransport>`
- {class}`XorTransport <kasa.xortransport.XorTransport>`
- {class}`AesTransport <kasa.aestransport.AesTransport>`
- {class}`KlapTransport <kasa.klaptransport.KlapTransport>`
- {class}`KlapTransportV2 <kasa.klaptransport.KlapTransportV2>`
- {class}`BaseTransport <kasa.transports.BaseTransport>`
- {class}`XorTransport <kasa.transports.XorTransport>`
- {class}`AesTransport <kasa.transports.AesTransport>`
- {class}`KlapTransport <kasa.transports.KlapTransport>`
- {class}`KlapTransportV2 <kasa.transports.KlapTransportV2>`

(topics-errors-and-exceptions)=
## Errors and Exceptions
Expand Down Expand Up @@ -166,42 +166,42 @@ API documentation for modules and features
API documentation for protocols and transports
**********************************************

.. autoclass:: kasa.protocol.BaseProtocol
.. autoclass:: kasa.protocols.BaseProtocol
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.iotprotocol.IotProtocol
.. autoclass:: kasa.protocols.IotProtocol
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.smartprotocol.SmartProtocol
.. autoclass:: kasa.protocols.SmartProtocol
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.protocol.BaseTransport
.. autoclass:: kasa.transports.BaseTransport
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.xortransport.XorTransport
.. autoclass:: kasa.transports.XorTransport
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.klaptransport.KlapTransport
.. autoclass:: kasa.transports.KlapTransport
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.klaptransport.KlapTransportV2
.. autoclass:: kasa.transports.KlapTransportV2
:members:
:inherited-members:
:undoc-members:

.. autoclass:: kasa.aestransport.AesTransport
.. autoclass:: kasa.transports.AesTransport
:members:
:inherited-members:
:undoc-members:
Expand Down
8 changes: 2 additions & 6 deletions kasa/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,9 @@
)
from kasa.feature import Feature
from kasa.interfaces.light import HSV, ColorTempRange, Light, LightState
from kasa.iotprotocol import (
IotProtocol,
_deprecated_TPLinkSmartHomeProtocol, # noqa: F401
)
from kasa.module import Module
from kasa.protocol import BaseProtocol
from kasa.smartprotocol import SmartProtocol
from kasa.protocols import BaseProtocol, IotProtocol, SmartProtocol
from kasa.protocols.iotprotocol import _deprecated_TPLinkSmartHomeProtocol # noqa: F401
from kasa.transports import BaseTransport

__version__ = version("python-kasa")
Expand Down
17 changes: 17 additions & 0 deletions kasa/credentials.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
"""Credentials class for username / passwords."""

from __future__ import annotations

import base64
from dataclasses import dataclass, field


Expand All @@ -11,3 +14,17 @@ class Credentials:
username: str = field(default="", repr=False)
#: Password of the cloud account
password: str = field(default="", repr=False)


def get_default_credentials(tuple: tuple[str, str]) -> Credentials:
"""Return decoded default credentials."""
un = base64.b64decode(tuple[0].encode()).decode()
pw = base64.b64decode(tuple[1].encode()).decode()
return Credentials(un, pw)


DEFAULT_CREDENTIALS = {
"KASA": ("a2FzYUB0cC1saW5rLm5ldA==", "a2FzYVNldHVw"),
"TAPO": ("dGVzdEB0cC1saW5rLm5ldA==", "dGVzdA=="),
"TAPOCAMERA": ("YWRtaW4=", "YWRtaW4="),
}
3 changes: 1 addition & 2 deletions kasa/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,8 @@
)
from .exceptions import KasaException
from .feature import Feature
from .iotprotocol import IotProtocol
from .module import Module
from .protocol import BaseProtocol
from .protocols import BaseProtocol, IotProtocol
from .transports import XorTransport

if TYPE_CHECKING:
Expand Down
6 changes: 3 additions & 3 deletions kasa/device_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
IotStrip,
IotWallSwitch,
)
from .iotprotocol import IotProtocol
from .protocol import (
from .protocols import (
BaseProtocol,
IotProtocol,
SmartProtocol,
)
from .smart import SmartDevice
from .smartprotocol import SmartProtocol
from .transports import (
AesTransport,
BaseTransport,
Expand Down
4 changes: 2 additions & 2 deletions kasa/discover.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,11 @@
)
from kasa.experimental import Experimental
from kasa.iot.iotdevice import IotDevice
from kasa.iotprotocol import REDACTORS as IOT_REDACTORS
from kasa.json import DataClassJSONMixin
from kasa.json import dumps as json_dumps
from kasa.json import loads as json_loads
from kasa.protocol import mask_mac, redact_data
from kasa.protocols.iotprotocol import REDACTORS as IOT_REDACTORS
from kasa.protocols.protocol import mask_mac, redact_data
from kasa.transports.aestransport import AesEncyptionSession, KeyPair
from kasa.transports.xortransport import XorEncryption

Expand Down
2 changes: 1 addition & 1 deletion kasa/experimental/smartcameraprotocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
_RetryableError,
)
from ..json import dumps as json_dumps
from ..smartprotocol import SmartProtocol
from ..protocols import SmartProtocol
from .sslaestransport import (
SMART_AUTHENTICATION_ERRORS,
SMART_RETRYABLE_ERRORS,
Expand Down
3 changes: 1 addition & 2 deletions kasa/experimental/sslaestransport.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

from yarl import URL

from ..credentials import Credentials
from ..credentials import DEFAULT_CREDENTIALS, Credentials, get_default_credentials
from ..deviceconfig import DeviceConfig
from ..exceptions import (
SMART_AUTHENTICATION_ERRORS,
Expand All @@ -27,7 +27,6 @@
from ..httpclient import HttpClient
from ..json import dumps as json_dumps
from ..json import loads as json_loads
from ..protocol import DEFAULT_CREDENTIALS, get_default_credentials
from ..transports import AesEncyptionSession, BaseTransport

_LOGGER = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotbulb.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from ..deviceconfig import DeviceConfig
from ..interfaces.light import HSV, ColorTempRange
from ..module import Module
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotdevice import IotDevice, KasaException, requires_update
from .modules import (
Antitheft,
Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotdevice.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
from ..feature import Feature
from ..module import Module
from ..modulemapping import ModuleMapping, ModuleName
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotmodule import IotModule, merge
from .modules import Emeter

Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotdimmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ..device_type import DeviceType
from ..deviceconfig import DeviceConfig
from ..module import Module
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotdevice import KasaException, requires_update
from .iotplug import IotPlug
from .modules import AmbientLight, Light, Motion
Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotlightstrip.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from ..device_type import DeviceType
from ..deviceconfig import DeviceConfig
from ..module import Module
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotbulb import IotBulb
from .iotdevice import requires_update
from .modules.lighteffect import LightEffect
Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotplug.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ..device_type import DeviceType
from ..deviceconfig import DeviceConfig
from ..module import Module
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotdevice import IotDevice, requires_update
from .modules import AmbientLight, Antitheft, Cloud, Led, Motion, Schedule, Time, Usage

Expand Down
2 changes: 1 addition & 1 deletion kasa/iot/iotstrip.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from ..feature import Feature
from ..interfaces import Energy
from ..module import Module
from ..protocol import BaseProtocol
from ..protocols import BaseProtocol
from .iotdevice import (
IotDevice,
requires_update,
Expand Down
12 changes: 12 additions & 0 deletions kasa/protocols/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""Package containing all supported protocols."""

from .iotprotocol import IotProtocol
from .protocol import BaseProtocol
from .smartprotocol import SmartErrorCode, SmartProtocol

__all__ = [
"BaseProtocol",
"IotProtocol",
"SmartErrorCode",
"SmartProtocol",
]
10 changes: 5 additions & 5 deletions kasa/iotprotocol.py → kasa/protocols/iotprotocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@
from pprint import pformat as pf
from typing import TYPE_CHECKING, Any, Callable

from .deviceconfig import DeviceConfig
from .exceptions import (
from ..deviceconfig import DeviceConfig
from ..exceptions import (
AuthenticationError,
KasaException,
TimeoutError,
_ConnectionError,
_RetryableError,
)
from .json import dumps as json_dumps
from ..json import dumps as json_dumps
from ..transports import XorEncryption, XorTransport
from .protocol import BaseProtocol, mask_mac, redact_data
from .transports import XorEncryption, XorTransport

if TYPE_CHECKING:
from .transports import BaseTransport
from ..transports import BaseTransport

_LOGGER = logging.getLogger(__name__)

Expand Down
20 changes: 2 additions & 18 deletions kasa/protocol.py → kasa/protocols/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

from __future__ import annotations

import base64
import errno
import hashlib
import logging
Expand All @@ -22,8 +21,7 @@

# When support for cpython older than 3.11 is dropped
# async_timeout can be replaced with asyncio.timeout
from .credentials import Credentials
from .deviceconfig import DeviceConfig
from ..deviceconfig import DeviceConfig

_LOGGER = logging.getLogger(__name__)
_NO_RETRY_ERRORS = {errno.EHOSTDOWN, errno.EHOSTUNREACH, errno.ECONNREFUSED}
Expand All @@ -33,7 +31,7 @@


if TYPE_CHECKING:
from .transports import BaseTransport
from ..transports import BaseTransport


def redact_data(data: _T, redactors: dict[str, Callable[[Any], Any] | None]) -> _T:
Expand Down Expand Up @@ -106,17 +104,3 @@ async def query(self, request: str | dict, retry_count: int = 3) -> dict:
@abstractmethod
async def close(self) -> None:
"""Close the protocol. Abstract method to be overriden."""


def get_default_credentials(tuple: tuple[str, str]) -> Credentials:
"""Return decoded default credentials."""
un = base64.b64decode(tuple[0].encode()).decode()
pw = base64.b64decode(tuple[1].encode()).decode()
return Credentials(un, pw)


DEFAULT_CREDENTIALS = {
"KASA": ("a2FzYUB0cC1saW5rLm5ldA==", "a2FzYVNldHVw"),
"TAPO": ("dGVzdEB0cC1saW5rLm5ldA==", "dGVzdA=="),
"TAPOCAMERA": ("YWRtaW4=", "YWRtaW4="),
}
6 changes: 3 additions & 3 deletions kasa/smartprotocol.py → kasa/protocols/smartprotocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from pprint import pformat as pf
from typing import TYPE_CHECKING, Any, Callable

from .exceptions import (
from ..exceptions import (
SMART_AUTHENTICATION_ERRORS,
SMART_RETRYABLE_ERRORS,
AuthenticationError,
Expand All @@ -25,11 +25,11 @@
_ConnectionError,
_RetryableError,
)
from .json import dumps as json_dumps
from ..json import dumps as json_dumps
from .protocol import BaseProtocol, mask_mac, md5, redact_data

if TYPE_CHECKING:
from .transports import BaseTransport
from ..transports import BaseTransport


_LOGGER = logging.getLogger(__name__)
Expand Down
Loading
Loading