| 
														
															@@ -1,11 +1,12 @@ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import re 
														 | 
														
														 | 
														
															 import re 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-from datetime import datetime, timezone 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+from datetime import datetime, timezone, timedelta 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import pytest 
														 | 
														
														 | 
														
															 import pytest 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 from ...constants import *  # NOQA 
														 | 
														
														 | 
														
															 from ...constants import *  # NOQA 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-from ...archiver.prune_cmd import prune_split 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+from ...archiver.prune_cmd import prune_split, prune_within 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 from . import cmd, RK_ENCRYPTION, src_dir, generate_archiver_tests 
														 | 
														
														 | 
														
															 from . import cmd, RK_ENCRYPTION, src_dir, generate_archiver_tests 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+from ...helpers import interval 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 pytest_generate_tests = lambda metafunc: generate_archiver_tests(metafunc, kinds="local,remote,binary")  # NOQA 
														 | 
														
														 | 
														
															 pytest_generate_tests = lambda metafunc: generate_archiver_tests(metafunc, kinds="local,remote,binary")  # NOQA 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -282,6 +283,38 @@ class MockArchive: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 local_tz = datetime.now(tz=timezone.utc).astimezone(tz=None).tzinfo 
														 | 
														
														 | 
														
															 local_tz = datetime.now(tz=timezone.utc).astimezone(tz=None).tzinfo 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+def test_prune_within(): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    def subset(lst, indices): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return {lst[i] for i in indices} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    def dotest(test_archives, within, indices): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        for ta in test_archives, reversed(test_archives): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            kept_because = {} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            keep = prune_within(ta, interval(within), kept_because) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            assert set(keep) == subset(test_archives, indices) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            assert all("within" == kept_because[a.id][0] for a in keep) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    # 1 minute, 1.5 hours, 2.5 hours, 3.5 hours, 25 hours, 49 hours 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    test_offsets = [60, 90 * 60, 150 * 60, 210 * 60, 25 * 60 * 60, 49 * 60 * 60] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    now = datetime.now(timezone.utc) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    test_dates = [now - timedelta(seconds=s) for s in test_offsets] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    test_archives = [MockArchive(date, i) for i, date in enumerate(test_dates)] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "15S", []) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "2M", [0]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "1H", [0]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "2H", [0, 1]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "3H", [0, 1, 2]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "24H", [0, 1, 2, 3]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "26H", [0, 1, 2, 3, 4]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "2d", [0, 1, 2, 3, 4]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "50H", [0, 1, 2, 3, 4, 5]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "3d", [0, 1, 2, 3, 4, 5]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "1w", [0, 1, 2, 3, 4, 5]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "1m", [0, 1, 2, 3, 4, 5]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dotest(test_archives, "1y", [0, 1, 2, 3, 4, 5]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 @pytest.mark.parametrize( 
														 | 
														
														 | 
														
															 @pytest.mark.parametrize( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     "rule,num_to_keep,expected_ids", 
														 | 
														
														 | 
														
															     "rule,num_to_keep,expected_ids", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     [ 
														 | 
														
														 | 
														
															     [ 
														 |