Example #1
0
class Bus(Generic[T], Closeable, ABC):
    def __init__(self, serial: Serial, scanner: BusScanner) -> None:
        super().__init__()

        self.__serial = serial
        self.__scanner = scanner
        self.__added_devices: Subject[Device[T]] = Subject()
        self.__device_list: List[Device[T]] = list()

        self.__disposable = CompositeDisposable()
        self.__disposable.add(self.__added_devices)

        self.__disposable.add(self.__scanner.scan().subscribe(
            on_next=self.__add_device,
            on_error=self.close,
            scheduler=NewThreadScheduler()))

    def __add_device(self, device: Device[T]) -> None:

        assert device not in self.__device_list

        self.__device_list.append(device)
        self.__added_devices.on_next(device)

        self.__disposable.add(device.on_close().subscribe(
            lambda _: self.__remove_device(device)))

    def __remove_device(self, device: Device[T]) -> None:
        self.__device_list.remove(device)

    def close(self, reason: str = None) -> None:
        super().close(reason)

        self.__disposable.dispose()

        for device in self.__device_list:
            device.close(reason)

    def get_devices(self) -> Observable:

        return rx.concat(rx.from_list(self.__device_list),
                         self.__added_devices)

    @property
    def serial(self) -> Serial:
        return self.__serial
Example #2
0
def test_groupdisposable_addafterdispose():
    disp1 = [False]
    disp2 = [False]

    def action1():
        disp1[0] = True

    d1 = Disposable(action1)

    def action2():
        disp2[0] = True

    d2 = Disposable(action2)

    g = CompositeDisposable(d1)
    assert g.length == 1
    g.dispose()
    assert disp1[0]
    assert g.length == 0
    g.add(d2)
    assert disp2[0]
    assert g.length == 0
def test_groupdisposable_addafterdispose():
    disp1 = [False]
    disp2 = [False]

    def action1():
        disp1[0] = True

    d1 = Disposable(action1)

    def action2():
        disp2[0] = True

    d2 = Disposable(action2)

    g = CompositeDisposable(d1)
    assert g.length == 1
    g.dispose()
    assert disp1[0]
    assert g.length == 0
    g.add(d2)
    assert disp2[0]
    assert g.length == 0