diff --git a/CHANGELOG.md b/CHANGELOG.md index fe08aa8523e840f04dbd2f7ce22c3f195eb4d081..516c3e9d6f9e88b8cdec31c86b319a7cb788460a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The software * added satella.instrumentation.cpu_time.get_own_cpu_time() * better documentation for satella.time.sleep() * fixed behaviour of PIDFileLock +* multiple minor code changes to improve pylint statistics Build process ------------- diff --git a/satella/coding/structures/syncable_droppable.py b/satella/coding/structures/syncable_droppable.py index df6241589bac9213bf5d750216627ceedf9c0134..9c05d684eadeca24c68016de4dffb3dbb644eb21 100644 --- a/satella/coding/structures/syncable_droppable.py +++ b/satella/coding/structures/syncable_droppable.py @@ -5,7 +5,6 @@ from abc import ABCMeta, abstractmethod import typing as tp from satella.coding.concurrent.monitor import RMonitor -from satella.coding.recast_exceptions import silence_excs from satella.coding.sequences import try_close from satella.coding.typing import V, K, KVTuple @@ -310,6 +309,60 @@ class SyncableDroppable(RMonitor, tp.Generic[K, V]): if self.start_entry is None: self.start_entry = key + def _assert_correctness(self, maximum_entries): + if not self.start_entry: + raise ValueError('Nothing to synchronize!') + if self.synced_up_to == self.data_in_memory[-1][0]: + raise ValueError('Nothing to synchronize!') + + def _on_sync_request_synced_up_none(self, maximum_entries): + # Sync everything + iterator = self.db_storage.iterate(None) + try: + data = list(iterator) + if len(data) < maximum_entries: + entries_left = maximum_entries - len(data) + if entries_left == math.inf: + data = itertools.chain(data, self.data_in_memory) + else: + data = itertools.chain(data, self.data_in_memory[:entries_left]) + return data + finally: + try_close(iterator) + + def _on_sync_request_synced_up_is_not_none(self, maximum_entries): + if self.first_key_in_memory <= self.synced_up_to: + # Means we have to sync from memory + if self.synced_up_to is None: + v = self.data_in_memory + else: + index = bisect.bisect_right([y[0] for y in self.data_in_memory], + self.synced_up_to) + if maximum_entries == math.inf: + v = self.data_in_memory[index:] + else: + v = self.data_in_memory[index:index + maximum_entries] + else: + # We have to start off the disk + data = [] + iterator = self.db_storage.iterate(self.start_entry) + try: + while len(data) < maximum_entries: + try: + data.append(next(iterator)) + except StopIteration: + for index, tpl in enumerate(self.data_in_memory): + if len(data) >= maximum_entries: + break + if self.synced_up_to is not None: + if tpl[0] > self.synced_up_to: + break + v = itertools.chain(data, self.data_in_memory[:index]) + break + finally: + try_close(iterator) + return v + def on_sync_request(self, maximum_entries: tp.Optional[int] = math.inf) -> tp.Iterator[KVTuple]: """ Return an iterator that will provide the source of the data for synchronization. @@ -321,57 +374,12 @@ class SyncableDroppable(RMonitor, tp.Generic[K, V]): :return: an iterator of (KVTuple) that should be synchronized against the server :raise ValueError: nothing to synchronize! """ - if not self.start_entry: - raise ValueError('Nothing to synchronize!') - if self.synced_up_to == self.data_in_memory[-1][0]: - raise ValueError('Nothing to synchronize!') + self._assert_correctness(maximum_entries) + if self.synced_up_to is None: - # Sync everything - iterator = self.db_storage.iterate(None) - try: - data = list(iterator) - if len(data) < maximum_entries: - entries_left = maximum_entries - len(data) - if entries_left == math.inf: - data = itertools.chain(data, self.data_in_memory) - else: - data = itertools.chain(data, self.data_in_memory[:entries_left]) - v = data - finally: - try_close(iterator) + v = self._on_sync_request_synced_up_none(maximum_entries) else: - if self.first_key_in_memory <= self.synced_up_to: - # Means we have to sync from memory - if self.synced_up_to is None: - v = self.data_in_memory - else: - index = bisect.bisect_right([y[0] for y in self.data_in_memory], - self.synced_up_to) - if maximum_entries == math.inf: - v = self.data_in_memory[index:] - else: - v = self.data_in_memory[index:index + maximum_entries] - else: - # We have to start off the disk - data = [] - iterator = self.db_storage.iterate(self.start_entry) - try: - while len(data) < maximum_entries: - try: - data.append(next(iterator)) - except StopIteration: - for index, tpl in enumerate(self.data_in_memory): - if len(data) >= maximum_entries: - break - if self.synced_up_to is not None: - if tpl[0] > self.synced_up_to: - break - v = itertools.chain(data, self.data_in_memory[:index]) - break - else: - v = data - finally: - try_close(iterator) + v = self._on_sync_request_synced_up_is_not_none(maximum_entries) return v def on_synced_up_to(self, key: K) -> None: @@ -387,7 +395,4 @@ class SyncableDroppable(RMonitor, tp.Generic[K, V]): """ :return: key of the first element stored in memory """ - if not self.data_in_memory: - return None - else: - return self.data_in_memory[0][0] + return None if not self.data_in_memory else self.data_in_memory[0][0]