33import shutil
44import unittest
55
6+ from executorlib .standalone .select import FutureSelector
7+
68
79try :
810 from executorlib .task_scheduler .file .backend import backend_execute_task_in_file
9- from executorlib .task_scheduler .file .shared import _check_task_output , FutureItem
11+ from executorlib .task_scheduler .file .shared import _check_task_output , _convert_args_and_kwargs , FutureItem
1012 from executorlib .standalone .hdf import dump , get_runtime
1113 from executorlib .standalone .serialize import serialize_funct
1214
@@ -19,6 +21,14 @@ def my_funct(a, b):
1921 return a + b
2022
2123
24+ def return_dict (a , b ):
25+ return {"a" : a , "b" : b }
26+
27+
28+ def return_list (a , b ):
29+ return [a , b ]
30+
31+
2232def get_error (a ):
2333 raise ValueError (a )
2434
@@ -36,7 +46,6 @@ def test_execute_function_mixed(self):
3646 fn_kwargs = {"b" : 2 },
3747 )
3848 file_name = os .path .join (cache_directory , task_key + "_i.h5" )
39- os .makedirs (cache_directory , exist_ok = True )
4049 dump (file_name = file_name , data_dict = data_dict )
4150 backend_execute_task_in_file (file_name = file_name )
4251 future_obj = Future ()
@@ -55,6 +64,47 @@ def test_execute_function_mixed(self):
5564 self .assertTrue (future_file_obj .done ())
5665 self .assertEqual (future_file_obj .result (), 3 )
5766
67+ def test_execute_function_mixed_selector_convert (self ):
68+ cache_directory = os .path .abspath ("executorlib_cache" )
69+ os .makedirs (cache_directory , exist_ok = True )
70+ task_key_1 , data_dict = serialize_funct (
71+ fn = return_dict ,
72+ fn_args = [1 ],
73+ fn_kwargs = {"b" : 2 },
74+ )
75+ file_name_1 = os .path .join (cache_directory , task_key_1 + "_i.h5" )
76+ dump (file_name = file_name_1 , data_dict = data_dict )
77+ backend_execute_task_in_file (file_name = file_name_1 )
78+ f1 = Future ()
79+ _check_task_output (
80+ task_key = task_key_1 , future_obj = f1 , cache_directory = cache_directory
81+ )
82+ task_key_2 , data_dict = serialize_funct (
83+ fn = return_list ,
84+ fn_args = [1 ],
85+ fn_kwargs = {"b" : 2 },
86+ )
87+ file_name_2 = os .path .join (cache_directory , task_key_2 + "_i.h5" )
88+ dump (file_name = file_name_2 , data_dict = data_dict )
89+ backend_execute_task_in_file (file_name = file_name_2 )
90+ f2 = Future ()
91+ _check_task_output (
92+ task_key = task_key_2 , future_obj = f2 , cache_directory = cache_directory
93+ )
94+ fs1 = FutureSelector (future = f1 , selector = "a" )
95+ fs2 = FutureSelector (future = f2 , selector = 1 )
96+ task_args , task_kwargs , future_wait_key_lst = _convert_args_and_kwargs (
97+ task_dict = {"fn" : 1 , "args" : (fs1 ,), "kwargs" : {"b" : fs2 }},
98+ memory_dict = {task_key_1 : f1 , task_key_2 : f2 },
99+ file_name_dict = {
100+ task_key_1 : os .path .join (cache_directory , task_key_1 + "_o.h5" ),
101+ task_key_2 : os .path .join (cache_directory , task_key_2 + "_o.h5" ),
102+ },
103+ )
104+ self .assertEqual (task_args [0 ].result (), 1 )
105+ self .assertEqual (task_kwargs ["b" ].result (), 2 )
106+ self .assertTrue (len (future_wait_key_lst ) == 2 )
107+
58108 def test_execute_function_args (self ):
59109 cache_directory = os .path .abspath ("executorlib_cache" )
60110 os .makedirs (cache_directory , exist_ok = True )
@@ -92,7 +142,6 @@ def test_execute_function_kwargs(self):
92142 fn_kwargs = {"a" : 1 , "b" : 2 },
93143 )
94144 file_name = os .path .join (cache_directory , task_key + "_i.h5" )
95- os .makedirs (cache_directory , exist_ok = True )
96145 dump (file_name = file_name , data_dict = data_dict )
97146 backend_execute_task_in_file (file_name = file_name )
98147 future_obj = Future ()
@@ -120,7 +169,6 @@ def test_execute_function_error(self):
120169 fn_kwargs = {"a" : 1 },
121170 )
122171 file_name = os .path .join (cache_directory , task_key + "_i.h5" )
123- os .makedirs (cache_directory , exist_ok = True )
124172 data_dict ["error_log_file" ] = os .path .join (cache_directory , "error.out" )
125173 dump (file_name = file_name , data_dict = data_dict )
126174 backend_execute_task_in_file (file_name = file_name )
0 commit comments