From a80bfb84c8d3238fadbe9ec1248e365a65af86df Mon Sep 17 00:00:00 2001 From: Jay Shepherd Date: Fri, 5 Oct 2018 16:18:18 -0600 Subject: [PATCH 1/2] Setup pytest framework Can run command "python setup.py test" to run tests --- setup.cfg | 2 ++ setup.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..9af7e6f --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[aliases] +test=pytest \ No newline at end of file diff --git a/setup.py b/setup.py index 2ac2d0b..19a0b54 100644 --- a/setup.py +++ b/setup.py @@ -49,5 +49,7 @@ ], keywords="HaikuHome SenseMe fan light home automation bigassfans", python_requires=">=3.6", - scripts=['bin/senseme_cli'] + scripts=['bin/senseme_cli'], + tests_require=["pytest"], + setup_requires=["pytest-runner"] ) From e0e469e78ca9ecbb5634456f676a57016df17fe9 Mon Sep 17 00:00:00 2001 From: Jay Shepherd Date: Fri, 5 Oct 2018 16:32:50 -0600 Subject: [PATCH 2/2] Create helper function to decode discovery message Includes test for that decoder function --- .gitignore | 5 ++++- senseme/senseme.py | 33 ++++++++++++++++----------------- tests/test_senseme.py | 7 +++++++ 3 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 tests/test_senseme.py diff --git a/.gitignore b/.gitignore index 8731ea4..3637d4a 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,7 @@ venv.bak/ .mypy_cache/ # editor configs and cache -.vscode \ No newline at end of file +.vscode + +# ide stuff +/.idea \ No newline at end of file diff --git a/senseme/senseme.py b/senseme/senseme.py index 6314d6c..5ab0175 100644 --- a/senseme/senseme.py +++ b/senseme/senseme.py @@ -11,6 +11,7 @@ import re import socket import time +from typing import Tuple from .lib import MWT, BackgroundLoop from .lib.xml import data_to_xml @@ -65,7 +66,6 @@ def __init__(self, ip="", name="", model="", series="", mac="", **kwargs): self.ip = ip self.name = name self.mac = mac - self.details = "" self.model = model self.series = series self.monitor_frequency = kwargs.get("monitor_frequency", 45) @@ -283,14 +283,7 @@ def discover_single_device(self): if not m: LOGGER.error("Didn't receive response.") else: - self.details = m[0].decode("utf-8") - res = re.match("\((.*);DEVICE;ID;(.*);(.*),(.*)\)", self.details) - # TODO: Parse this properly rather than regex - self.name = res.group(1) - self.mac = res.group(2) - self.model = res.group(3) - self.series = res.group(4) - self.ip = m[1][0] + self.name, self.mac, self.model, self.series, self.ip = decode_discovery(m) LOGGER.info(self.name, self.mac, self.model, self.series) except OSError as e: LOGGER.critical("No device was found.\n%s" % e) @@ -584,14 +577,7 @@ def discover(devices_to_find=3, time_to_wait=5): message = b"" if message: LOGGER.info("Received a message") - message_decoded = message[0].decode("utf-8") - res = re.match("\((.*);DEVICE;ID;(.*);(.*),(.*)\)", message_decoded) - # TODO: Parse this properly rather than regex - name = res.group(1) - mac = res.group(2) - model = res.group(3) - series = res.group(4) - ip = message[1][0] + name, mac, model, series, ip = decode_discovery(message) devices.append( SenseMe(ip=ip, name=name, model=model, series=series, mac=mac) ) @@ -609,3 +595,16 @@ def discover(devices_to_find=3, time_to_wait=5): raise OSError("Couldn't get port 31415") finally: s.close() + + +def decode_discovery(message: Tuple[bytes, Tuple[str, str]]) -> Tuple: + """ Takes a message in the return format of socket.recvfrom and returns decoded SenseMe discovery information """ + message_decoded = message[0].decode("utf-8") + res = re.match("\((.*);DEVICE;ID;(.*);(.*),(.*)\)", message_decoded) + # TODO: Parse this properly rather than regex + name = res.group(1) + mac = res.group(2) + model = res.group(3) + series = res.group(4) + ip = message[1][0] + return name, mac, model, series, ip diff --git a/tests/test_senseme.py b/tests/test_senseme.py new file mode 100644 index 0000000..56f7db1 --- /dev/null +++ b/tests/test_senseme.py @@ -0,0 +1,7 @@ +from senseme.senseme import decode_discovery + + +def test_discovery_message_decoding(): + test_message = ("(NAME;DEVICE;ID;MAC;MODEL,SERIES)".encode("utf-8"), ("127.0.0.1", "3101")) + name, mac, model, series, ip = decode_discovery(test_message) + assert ("NAME", "MAC", "MODEL", "SERIES", "127.0.0.1") == (name, mac, model, series, ip)