Let's be explicit with asserts; there was a bug in histogram
authorScott <[email protected]>
Wed, 2 Feb 2022 21:47:36 +0000 (13:47 -0800)
committerScott <[email protected]>
Wed, 2 Feb 2022 21:47:36 +0000 (13:47 -0800)
caused by assert foo when foo was an int with valid valid 0.

15 files changed:
collect/bst.py
collect/shared_dict.py
dateparse/dateparse_utils.py
directory_filter.py
executors.py
file_utils.py
histogram.py
logging_utils.py
ml/model_trainer.py
persistent.py
smart_home/cameras.py
smart_home/chromecasts.py
smart_home/outlets.py
unittest_utils.py
waitable_presence.py

index 9d6525946e8131728896d86f3400c38c5ba528e7..8602ce698d9c5d7970f890cfd97d97b8ccb4ffda 100644 (file)
@@ -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
index 7c84c14c073743ea1e452d58393f8f29d280ed23..ac390bc600e769a94c2205440883257a665917bb 100644 (file)
@@ -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):
index 7ca3cf3123a2a460c375a2ef811575d656c0d572..bf1f10abb0e483a1998bd1035f9e50f9a6eef004 100755 (executable)
@@ -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)
 
index b076badf25dff7e34e2358b3e45d52c49692a424..b057f85a1c8c728a497171a37c4a216db231ba30 100644 (file)
@@ -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)
index 34528a33c2d10236cd7527fe53ffd027fa8020ca..b4cb06b4c9ad80816f0bb13e05e23863846fa8c1 100644 (file)
@@ -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.'
                 )
index 905e23b16df017d3cab6c6ef27ce61ee8596c112..deda45e033f6a5adb65a4b1d7725e2b346030797 100644 (file)
@@ -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))
 
 
index d45e93f328185f869c2b3af4cc832db280d14428..cea8b766e3f88a3e197cbdff128539f199fdc83a 100644 (file)
@@ -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,
index fdbb7a3d48daecb4e3b81ed4aad4bf0e11a79241..3fd2b849a3dcc2d030de28e0abe6c70cb1d9fe02 100644 (file)
@@ -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(
index 6fc0da071e7dd6e2e026b8bbb7d7780c81015985..a37885ce3e92f20d11bb61f4268407689829bca4 100644 (file)
@@ -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,
index 8832572e7b032ae71a7898ca6b21743cf7ce45bf..16f51c04160e8b05f7de83894b13d06cf11bc8e4 100644 (file)
@@ -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
 
index 2cf2de40f68c85db2999f00e567cf370c68d152d..712d73f18f5b82db0de4fd9fdebaaafd3ec71182 100644 (file)
@@ -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'
index bd2a80c54c2af85c191cf5d5272df6bcc7d89cf1..bec8461a4d764ce97a812f1af08f4a5087fd8869 100644 (file)
@@ -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
 
index d4a4886dd38d1a932494e90f060f4ce884de744d..d29fc4adb44335dce5772a504b539a2b2803faa9 100644 (file)
@@ -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
index ba9ca28f091bc70bd232cb6f059116cfc70d7fb9..b259c6b4c98f687d8e3c8db4b41c280db7ac9d19 100644 (file)
@@ -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
index 8046bdc31f988472900905665a2ef1dcd6dc5102..1d6c3ebdb7bf470ecbeb0d65bb351721a3ba3ec7 100644 (file)
@@ -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)