33import time
44from pathlib import Path
55from subprocess import PIPE , Popen
6+ from typing import Any , TypedDict
67
78import pytest
9+ from pytest import FixtureRequest
810
911from vivarium_cluster_tools .utilities import backoff_and_retry , mkdir
1012
1113
14+ class MkdirParams (TypedDict , total = False ):
15+ """Parameters for the mkdir function."""
16+
17+ parents : bool
18+ exists_ok : bool
19+ umask : int
20+
21+
1222@pytest .fixture (
1323 params = [
1424 ({}, None ),
2030 ({"exists_ok" : True , "parents" : True }, None ),
2131 ]
2232)
23- def permissions_params (request ) :
24- return request .param
33+ def permissions_params (request : FixtureRequest ) -> tuple [ MkdirParams , str | None ] :
34+ return request .param # type: ignore[no-any-return]
2535
2636
27- def test_mkdir_set_permissions (permissions_params : list ) -> None :
37+ def test_mkdir_set_permissions (permissions_params : tuple [ MkdirParams , str | None ] ) -> None :
2838 # Get prior umask value
2939 prior_umask = os .umask (0 )
3040 os .umask (prior_umask )
@@ -36,10 +46,10 @@ def test_mkdir_set_permissions(permissions_params: list) -> None:
3646 parent_path = cwd / parent_dir_name
3747 path = parent_path / child_dir_name
3848
39- mkdir_params : dict = permissions_params [0 ]
49+ mkdir_params : MkdirParams = permissions_params [0 ]
4050 permissions : str | None = permissions_params [1 ] if permissions_params [1 ] else "drwxrwxr-x"
4151
42- def test_mkdir_permissions ():
52+ def test_mkdir_permissions () -> None :
4353 mkdir (path , ** mkdir_params )
4454 proc = Popen (
4555 f"ls -l | grep '{ parent_dir_name } ' | grep '{ permissions } '" ,
@@ -76,18 +86,18 @@ def test_mkdir_permissions():
7686 assert prior_umask == os .umask (prior_umask ), "umask was changed and not reset"
7787
7888
79- def test_backoff_and_retry ():
89+ def test_backoff_and_retry () -> None :
8090 class WarningCatcher :
81- def __init__ (self ):
82- self .caught_warnings = []
91+ def __init__ (self ) -> None :
92+ self .caught_warnings : list [ str ] = []
8393
84- def warn (self , message , * args , ** kwargs ) :
94+ def warn (self , message : str , * args : Any , ** kwargs : Any ) -> None :
8595 self .caught_warnings .append (message )
8696
8797 wc = WarningCatcher ()
8898
8999 @backoff_and_retry (log_function = wc .warn )
90- def successful_function ():
100+ def successful_function () -> bool :
91101 return True
92102
93103 assert successful_function ()
@@ -96,7 +106,7 @@ def successful_function():
96106 wc = WarningCatcher ()
97107
98108 @backoff_and_retry (backoff_seconds = 0.1 , num_retries = 5 , log_function = wc .warn )
99- def failing_function ():
109+ def failing_function () -> None :
100110 raise ValueError
101111
102112 start = time .time ()
0 commit comments