From 7ff2af6fe7bffea90dc4a31c93140c189917c659 Mon Sep 17 00:00:00 2001 From: Scott Date: Wed, 2 Feb 2022 13:47:36 -0800 Subject: [PATCH] Let's be explicit with asserts; there was a bug in histogram caused by assert foo when foo was an int with valid valid 0. --- collect/bst.py | 4 ++-- collect/shared_dict.py | 3 ++- dateparse/dateparse_utils.py | 4 ++-- directory_filter.py | 6 +++--- executors.py | 8 ++++---- file_utils.py | 4 ++-- histogram.py | 8 ++++---- logging_utils.py | 2 +- ml/model_trainer.py | 6 +++--- persistent.py | 4 ++-- smart_home/cameras.py | 2 +- smart_home/chromecasts.py | 2 +- smart_home/outlets.py | 10 +++++----- unittest_utils.py | 8 ++++---- waitable_presence.py | 4 ++-- 15 files changed, 38 insertions(+), 37 deletions(-) diff --git a/collect/bst.py b/collect/bst.py index 9d65259..8602ce6 100644 --- a/collect/bst.py +++ b/collect/bst.py @@ -520,12 +520,12 @@ class BinarySearchTree(object): return x path = self.parent_path(node) - assert path[-1] + assert path[-1] is not None assert path[-1] == node path = path[:-1] path.reverse() for ancestor in path: - assert ancestor + assert ancestor is not None if node != ancestor.right: return ancestor node = ancestor diff --git a/collect/shared_dict.py b/collect/shared_dict.py index 7c84c14..ac390bc 100644 --- a/collect/shared_dict.py +++ b/collect/shared_dict.py @@ -74,6 +74,7 @@ class SharedDict(object): super().__init__() self.name = name self._serializer = PickleSerializer() + assert size_bytes is None or size_bytes > 0 self.shared_memory = self._get_or_create_memory_block(name, size_bytes) self._ensure_memory_initialization() self.lock = RLock() @@ -89,7 +90,7 @@ class SharedDict(object): try: return shared_memory.SharedMemory(name=name) except FileNotFoundError: - assert size_bytes + assert size_bytes is not None return shared_memory.SharedMemory(name=name, create=True, size=size_bytes) def _ensure_memory_initialization(self): diff --git a/dateparse/dateparse_utils.py b/dateparse/dateparse_utils.py index 7ca3cf3..bf1f10a 100755 --- a/dateparse/dateparse_utils.py +++ b/dateparse/dateparse_utils.py @@ -441,7 +441,7 @@ class DateParser(dateparse_utilsListener): # Apply resudual adjustments to times here when we have a # datetime. self.datetime = self.datetime + self.timedelta - assert self.datetime + assert self.datetime is not None self.time = datetime.time( self.datetime.hour, self.datetime.minute, @@ -1028,7 +1028,7 @@ def main() -> None: logger.exception(e) print("Unrecognized.") else: - assert dt + assert dt is not None print(dt.strftime('%A %Y/%m/%d %H:%M:%S.%f %Z(%z)')) sys.exit(0) diff --git a/directory_filter.py b/directory_filter.py index b076bad..b057f85 100644 --- a/directory_filter.py +++ b/directory_filter.py @@ -55,7 +55,7 @@ class DirectoryFileFilter(object): assert file_utils.does_file_exist(filename) if mtime is None: mtime = file_utils.get_file_raw_mtime(filename) - assert mtime + assert mtime is not None if self.mtime_by_filename.get(filename, 0) != mtime: md5 = file_utils.get_file_md5(filename) logger.debug(f'Computed/stored {filename}\'s MD5 at ts={mtime} ({md5})') @@ -112,7 +112,7 @@ class DirectoryAllFilesFilter(DirectoryFileFilter): assert file_utils.does_file_exist(filename) if mtime is None: mtime = file_utils.get_file_raw_mtime(filename) - assert mtime + assert mtime is not None if self.mtime_by_filename.get(filename, 0) != mtime: md5 = file_utils.get_file_md5(filename) self.mtime_by_filename[filename] = mtime @@ -120,7 +120,7 @@ class DirectoryAllFilesFilter(DirectoryFileFilter): self.all_md5s.add(md5) def apply(self, item: Any, ignored_filename: str = None) -> bool: - assert not ignored_filename + assert ignored_filename is None self._update() mem_hash = hashlib.md5() mem_hash.update(item) diff --git a/executors.py b/executors.py index 34528a3..b4cb06b 100644 --- a/executors.py +++ b/executors.py @@ -345,7 +345,7 @@ class RemoteExecutorStatus: self.in_flight_bundles_by_worker[worker].remove(uuid) if not was_cancelled: start = self.start_per_bundle[uuid] - assert start + assert start is not None bundle_latency = ts - start x = self.finished_bundle_timings_per_worker.get(worker, list()) x.append(bundle_latency) @@ -740,7 +740,7 @@ class RemoteExecutor(BaseExecutor): worker = None while worker is None: worker = self.find_available_worker_or_block(avoid_machine) - assert worker + assert worker is not None # Ok, found a worker. bundle.worker = worker @@ -840,7 +840,7 @@ class RemoteExecutor(BaseExecutor): self, p: Optional[subprocess.Popen], bundle: BundleDetails, depth: int ) -> Any: machine = bundle.machine - assert p + assert p is not None pid = p.pid if depth > 3: logger.error( @@ -984,7 +984,7 @@ class RemoteExecutor(BaseExecutor): # Tell the original to stop if we finished first. if not was_cancelled: orig_bundle = bundle.src_bundle - assert orig_bundle + assert orig_bundle is not None logger.debug( f'{bundle}: Notifying original {orig_bundle.uuid} we beat them to it.' ) diff --git a/file_utils.py b/file_utils.py index 905e23b..deda45e 100644 --- a/file_utils.py +++ b/file_utils.py @@ -330,13 +330,13 @@ def get_file_md5(filename: str) -> str: def set_file_raw_atime(filename: str, atime: float): mtime = get_file_raw_mtime(filename) - assert mtime + assert mtime is not None os.utime(filename, (atime, mtime)) def set_file_raw_mtime(filename: str, mtime: float): atime = get_file_raw_atime(filename) - assert atime + assert atime is not None os.utime(filename, (atime, mtime)) diff --git a/histogram.py b/histogram.py index d45e93f..cea8b76 100644 --- a/histogram.py +++ b/histogram.py @@ -81,7 +81,7 @@ class SimpleHistogram(Generic[T]): last_bucket_start = bucket[0] # beginning of range if max_population is None or pop > max_population: max_population = pop # bucket with max items - if max_population is None: + if len(self.buckets) == 0 or max_population is None: return txt max_label_width: Optional[int] = None @@ -100,9 +100,9 @@ class SimpleHistogram(Generic[T]): max_label_width = label_width if start == last_bucket_start: break - assert max_label_width - assert lowest_start - assert highest_end + assert max_label_width is not None + assert lowest_start is not None + assert highest_end is not None sigma_label = f'[{label_formatter}..{label_formatter}): ' % ( lowest_start, diff --git a/logging_utils.py b/logging_utils.py index fdbb7a3..3fd2b84 100644 --- a/logging_utils.py +++ b/logging_utils.py @@ -511,7 +511,7 @@ def initialize_logging(logger=None) -> logging.Logger: if config.config['logging_syslog_facility']: facility_name = 'LOG_' + config.config['logging_syslog_facility'] facility = SysLogHandler.__dict__.get(facility_name, SysLogHandler.LOG_USER) # type: ignore - assert facility + assert facility is not None handler = SysLogHandler(facility=facility, address='/dev/log') handler.setFormatter( MillisecondAwareFormatter( diff --git a/ml/model_trainer.py b/ml/model_trainer.py index 6fc0da0..a37885c 100644 --- a/ml/model_trainer.py +++ b/ml/model_trainer.py @@ -170,9 +170,9 @@ class TrainingBlueprint(ABC): print(msg) logger.info(msg) - assert best_training_score - assert best_test_score - assert best_params + assert best_training_score is not None + assert best_test_score is not None + assert best_params is not None ( scaler_filename, model_filename, diff --git a/persistent.py b/persistent.py index 8832572..16f51c0 100644 --- a/persistent.py +++ b/persistent.py @@ -64,7 +64,7 @@ def was_file_written_today(filename: str) -> bool: return False mtime = file_utils.get_file_mtime_as_datetime(filename) - assert mtime + assert mtime is not None now = datetime.datetime.now() return mtime.month == now.month and mtime.day == now.day and mtime.year == now.year @@ -81,7 +81,7 @@ def was_file_written_within_n_seconds( return False mtime = file_utils.get_file_mtime_as_datetime(filename) - assert mtime + assert mtime is not None now = datetime.datetime.now() return (now - mtime).total_seconds() <= limit_seconds diff --git a/smart_home/cameras.py b/smart_home/cameras.py index 2cf2de4..712d73f 100644 --- a/smart_home/cameras.py +++ b/smart_home/cameras.py @@ -28,6 +28,6 @@ class BaseCamera(dev.Device): name = self.camera_name assert name is not None if name == 'driveway': - return f'http://10.0.0.226:8080/Umtxxf1uKMBniFblqeQ9KRbb6DDzN4/mjpeg/GKlT2FfiSQ/driveway' + return 'http://10.0.0.226:8080/Umtxxf1uKMBniFblqeQ9KRbb6DDzN4/mjpeg/GKlT2FfiSQ/driveway' else: return f'http://10.0.0.226:8080/Umtxxf1uKMBniFblqeQ9KRbb6DDzN4/mp4/GKlT2FfiSQ/{name}/s.mp4' diff --git a/smart_home/chromecasts.py b/smart_home/chromecasts.py index bd2a80c..bec8461 100644 --- a/smart_home/chromecasts.py +++ b/smart_home/chromecasts.py @@ -38,7 +38,7 @@ class BaseChromecast(dev.Device): BaseChromecast.ccasts, BaseChromecast.browser, ) = pychromecast.get_chromecasts(timeout=15.0) - assert BaseChromecast.browser + assert BaseChromecast.browser is not None atexit.register(BaseChromecast.browser.stop_discovery) BaseChromecast.refresh_ts = now diff --git a/smart_home/outlets.py b/smart_home/outlets.py index d4a4886..d29fc4a 100644 --- a/smart_home/outlets.py +++ b/smart_home/outlets.py @@ -307,23 +307,23 @@ class MerossOutlet(BaseOutlet): @overrides def turn_on(self) -> bool: self.lazy_initialize_device() - assert self.meross_wrapper - assert self.device + assert self.meross_wrapper is not None + assert self.device is not None self.meross_wrapper.loop.run_until_complete(self.device.async_turn_on()) return True @overrides def turn_off(self) -> bool: self.lazy_initialize_device() - assert self.meross_wrapper - assert self.device + assert self.meross_wrapper is not None + assert self.device is not None self.meross_wrapper.loop.run_until_complete(self.device.async_turn_off()) return True @overrides def is_on(self) -> bool: self.lazy_initialize_device() - assert self.device + assert self.device is not None return self.device.is_on() @overrides diff --git a/unittest_utils.py b/unittest_utils.py index ba9ca28..b259c6b 100644 --- a/unittest_utils.py +++ b/unittest_utils.py @@ -286,12 +286,12 @@ class RecordStdout(object): def __enter__(self) -> Callable[[], tempfile.SpooledTemporaryFile]: self.recorder = contextlib.redirect_stdout(self.destination) - assert self.recorder + assert self.recorder is not None self.recorder.__enter__() return lambda: self.destination def __exit__(self, *args) -> Optional[bool]: - assert self.recorder + assert self.recorder is not None self.recorder.__exit__(*args) self.destination.seek(0) return None @@ -315,12 +315,12 @@ class RecordStderr(object): def __enter__(self) -> Callable[[], tempfile.SpooledTemporaryFile]: self.recorder = contextlib.redirect_stderr(self.destination) # type: ignore - assert self.recorder + assert self.recorder is not None self.recorder.__enter__() return lambda: self.destination def __exit__(self, *args) -> Optional[bool]: - assert self.recorder + assert self.recorder is not None self.recorder.__exit__(*args) self.destination.seek(0) return None diff --git a/waitable_presence.py b/waitable_presence.py index 8046bdc..1d6c3eb 100644 --- a/waitable_presence.py +++ b/waitable_presence.py @@ -98,8 +98,8 @@ class WaitablePresenceDetectorWithMemory(state_tracker.WaitableAutomaticStateTra if self.someone_is_home is None: raise Exception("Too Soon!") if self.someone_is_home: - assert self.someone_home_since + assert self.someone_home_since is not None return (True, self.someone_home_since) else: - assert self.everyone_gone_since + assert self.everyone_gone_since is not None return (False, self.everyone_gone_since) -- 2.45.2