"""Python 3.10+; demonstrate revision-scoped keys and pruning.""" import unittest class FeedCache: def __init__(self): self.values = {} def get(self, feed, revision, stop, loader): key = (feed, revision, stop) if key not in self.values: self.values[key] = tuple(loader()) return self.values[key] def prune(self, feed, keep_revision): self.values = {key: value for key, value in self.values.items() if key[0] != feed or key[1] == keep_revision} class RevisionTests(unittest.TestCase): def test_revision_and_feed_are_both_part_of_identity(self): cache = FeedCache() self.assertEqual(cache.get("bus", "r1", "S", lambda: ["10:00"]), ("10:00",)) def must_not_reload(): raise AssertionError("cache miss for an existing key") self.assertEqual(cache.get("bus", "r1", "S", must_not_reload), ("10:00",)) self.assertEqual(cache.get("bus", "r2", "S", lambda: ["10:05"]), ("10:05",)) self.assertEqual(cache.get("rail", "r1", "S", lambda: ["11:00"]), ("11:00",)) cache.prune("bus", "r2") self.assertNotIn(("bus", "r1", "S"), cache.values) self.assertIn(("rail", "r1", "S"), cache.values) def test_failed_load_is_not_cached(self): cache = FeedCache() def broken(): raise OSError("download failed") with self.assertRaises(OSError): cache.get("bus", "r1", "S", broken) self.assertEqual(cache.values, {}) if __name__ == "__main__": unittest.main()