Skip to content

Commit 65aac69

Browse files
authored
Merge pull request #3 from Lei-k/dev
Bump version to 0.1.3
2 parents ab81b3d + 8f7f415 commit 65aac69

File tree

8 files changed

+99
-19
lines changed

8 files changed

+99
-19
lines changed

async_pyserial/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from async_pyserial.common import *
44

5-
__version__ = '0.1.2'
5+
__version__ = '0.1.3'
66

77
VERSION = __version__
88

async_pyserial/common.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from typing import Callable
2+
13
class EventEmitter:
24
def __init__(self) -> None:
3-
self.listeners: dict[str, list] = {}
5+
self.listeners: dict[str, list[Callable]] = {}
46

57
def emit(self, evt: str, *args, **kwargs):
68
if evt not in self.listeners:
@@ -11,11 +13,38 @@ def emit(self, evt: str, *args, **kwargs):
1113
for listener in listeners:
1214
listener(*args, **kwargs)
1315

14-
def on(self, evt: str, listener):
15-
if evt not in self.listeners:
16-
self.listeners[evt] = []
16+
def on(self, evt: str, listener: Callable | None = None):
17+
18+
def decorator(listener: Callable):
19+
if evt not in self.listeners:
20+
self.listeners[evt] = []
1721

18-
self.listeners[evt].append(listener)
22+
self.listeners[evt].append(listener)
23+
24+
if listener is None:
25+
return decorator
26+
27+
decorator(listener=listener)
28+
29+
def remove_all_listeners(self, evt: str):
30+
if evt not in self.listeners:
31+
return
32+
33+
del self.listeners[evt]
34+
35+
def remove_listener(self, evt: str, listener: Callable):
36+
if evt not in self.listeners:
37+
return
38+
39+
self.listeners[evt].remove(listener)
40+
41+
if len(self.listeners[evt]) == 0:
42+
del self.listeners[evt]
43+
44+
def off(self, evt: str, listener: Callable):
45+
""" alias for remove_listener
46+
"""
47+
self.remove_listener(evt, listener=listener)
1948

2049
class PlatformNotSupported(Exception):
2150
def __init__(self, *args: object) -> None:

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
project = 'async-pyserial'
1010
copyright = '2024, Neil Lei'
1111
author = 'Neil Lei'
12-
release = '0.1.2'
12+
release = '0.1.3'
1313

1414
# -- General configuration ---------------------------------------------------
1515
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

poetry.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "async_pyserial"
3-
version = "0.1.2"
3+
version = "0.1.3"
44
description = "Python bindings for a C++ serial port library"
55
authors = ["Neil Lei <[email protected]>"]
66
readme = "README.rst"
@@ -10,7 +10,7 @@ python = "^3.10"
1010

1111
[project]
1212
name = "async_pyserial"
13-
version = "0.1.2"
13+
version = "0.1.3"
1414
description = "Python bindings for a C++ serial port library"
1515
authors = [
1616
{name = "Neil Lei", email = "[email protected]"}

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def get_pybind_include(user=False):
4949

5050
setup(
5151
name='async_pyserial',
52-
version='0.1.2',
52+
version='0.1.3',
5353
author='Neil Lei',
5454
author_email='[email protected]',
5555
description='Python bindings for a C++ serial port library',

tests/test_event.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from async_pyserial import EventEmitter
22

3-
def test_event_emitter():
3+
def test_emit_event():
44
emitter = EventEmitter()
55

66
expected = b'Hello!'
@@ -10,4 +10,54 @@ def on_data(d):
1010

1111
emitter.on('data', on_data)
1212

13-
emitter.emit('data', expected)
13+
emitter.emit('data', expected)
14+
15+
def test_decorator():
16+
emitter = EventEmitter()
17+
18+
expected = b'Hello!'
19+
20+
@emitter.on('data')
21+
def on_data(d):
22+
assert d == expected
23+
24+
emitter.emit('data', expected)
25+
26+
def test_remove_listener():
27+
emitter = EventEmitter()
28+
29+
def on_data():
30+
# this func should not be call
31+
assert False
32+
33+
emitter.on('data', on_data)
34+
35+
emitter.remove_listener('data', on_data)
36+
37+
emitter.emit('data')
38+
39+
def test_off():
40+
emitter = EventEmitter()
41+
42+
def on_data():
43+
# this func should not be call
44+
assert False
45+
46+
emitter.on('data', on_data)
47+
48+
emitter.off('data', on_data)
49+
50+
emitter.emit('data')
51+
52+
def test_remove_all_listener():
53+
emitter = EventEmitter()
54+
55+
def on_data():
56+
# this func should not be call
57+
assert False
58+
59+
emitter.on('data', on_data)
60+
61+
emitter.remove_all_listeners('data')
62+
63+
emitter.emit('data')

tests/test_serialport.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ def test_serialport_open_close(virtual_serial_ports):
4343
options = SerialPortOptions()
4444
serial_port = SerialPort(port1, options)
4545
serial_port.open()
46-
assert os.path.exists(port1) # Ensure the port is created
4746
serial_port.close()
4847

4948
# Test case for writing to SerialPort
@@ -57,7 +56,9 @@ def test_serialport_write(virtual_serial_ports):
5756

5857
with open(port2, 'rb') as f:
5958
written_data = f.read(len(test_data))
59+
6060
assert written_data == test_data
61+
6162
serial_port.close()
6263

6364

0 commit comments

Comments
 (0)