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
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