home · contact · privacy
Use higher resolution for VersionedAttribute.history timestamps, avoid conflicts...
[plomtask] / plomtask / misc.py
index 5759c0d8b6bcc5915f84b2e94a533eefa70954e7..2c46c1c592e3fc9558f3784d3f94c564bb8fbc09 100644 (file)
@@ -3,6 +3,9 @@ from datetime import datetime
 from typing import Any
 from sqlite3 import Row
 from plomtask.db import DatabaseConnection
+from time import sleep
+
+TIMESTAMP_FMT = '%Y-%m-%d %H:%M:%S.%f'
 
 
 class VersionedAttribute:
@@ -28,10 +31,19 @@ class VersionedAttribute:
         return self.history[self._newest_timestamp]
 
     def set(self, value: str | float) -> None:
-        """Add to self.history if and only if not same value as newest one."""
+        """Add to self.history if and only if not same value as newest one.
+
+        Note that we wait one micro-second, as timestamp comparison to check
+        most recent elements only goes up to that precision.
+
+        Also note that we don't check against .newest because that may make us
+        compare value against .default even if not set. We want to be able to
+        explicitly set .default as the first element.
+        """
+        sleep(0.00001)
         if 0 == len(self.history) \
                 or value != self.history[self._newest_timestamp]:
-            self.history[datetime.now().strftime('%Y-%m-%d %H:%M:%S')] = value
+            self.history[datetime.now().strftime(TIMESTAMP_FMT)] = value
 
     def history_from_row(self, row: Row) -> None:
         """Extend self.history from expected table row format."""