@@ -75,6 +75,7 @@ def filter_hypothesis_tests_by_function_name(code: str, function_name: str) -> s
7575
7676 Returns:
7777 Filtered code with only matching tests
78+
7879 """
7980 tree = ast .parse (code )
8081
@@ -86,10 +87,9 @@ def visit_Module(self, node): # noqa: ANN001, ANN202
8687 if isinstance (item , (ast .Import , ast .ImportFrom , ast .Assign )):
8788 # Keep all imports and module-level assignments
8889 new_body .append (item )
89- elif isinstance (item , ast .FunctionDef ):
90+ elif isinstance (item , ast .FunctionDef ) and item . name . startswith ( "test_" ) and function_name in item . name :
9091 # Only keep test functions that match the function name
91- if item .name .startswith ("test_" ) and function_name in item .name :
92- new_body .append (item )
92+ new_body .append (item )
9393 node .body = new_body
9494 return node
9595
@@ -126,25 +126,17 @@ def visit_Call(self, node: ast.Call) -> ast.Call:
126126 and node .func .value .id == "st"
127127 ):
128128 if node .func .attr == "floats" and not any (
129- k .arg in ["min_value" , "max_value" , "allow_nan" , "allow_infinity" ]
130- for k in node .keywords
129+ k .arg in ["min_value" , "max_value" , "allow_nan" , "allow_infinity" ] for k in node .keywords
131130 ):
132131 # Constrain floats to reasonable bounds
133132 node .keywords .extend (
134133 [
135134 ast .keyword (
136- arg = "min_value" ,
137- value = ast .UnaryOp (
138- op = ast .USub (), operand = ast .Constant (value = 1e6 )
139- ),
135+ arg = "min_value" , value = ast .UnaryOp (op = ast .USub (), operand = ast .Constant (value = 1e6 ))
140136 ),
141137 ast .keyword (arg = "max_value" , value = ast .Constant (value = 1e6 )),
142- ast .keyword (
143- arg = "allow_nan" , value = ast .Constant (value = False )
144- ),
145- ast .keyword (
146- arg = "allow_infinity" , value = ast .Constant (value = False )
147- ),
138+ ast .keyword (arg = "allow_nan" , value = ast .Constant (value = False )),
139+ ast .keyword (arg = "allow_infinity" , value = ast .Constant (value = False )),
148140 ]
149141 )
150142 elif node .func .attr == "integers" and not any (
@@ -154,9 +146,7 @@ def visit_Call(self, node: ast.Call) -> ast.Call:
154146 node .keywords .extend (
155147 [
156148 ast .keyword (arg = "min_value" , value = ast .Constant (value = - 10000 )),
157- ast .keyword (
158- arg = "max_value" , value = ast .Constant (value = 10000 )
159- ),
149+ ast .keyword (arg = "max_value" , value = ast .Constant (value = 10000 )),
160150 ]
161151 )
162152 return node
@@ -170,39 +160,28 @@ def visit_Call(self, node: ast.Call) -> ast.Call:
170160 (
171161 d
172162 for d in node .decorator_list
173- if isinstance (d , ast .Call )
174- and isinstance (d .func , ast .Name )
175- and d .func .id == "settings"
163+ if isinstance (d , ast .Call ) and isinstance (d .func , ast .Name ) and d .func .id == "settings"
176164 ),
177165 None ,
178166 )
179167
180168 if settings_decorator :
181169 if not any (k .arg == "derandomize" for k in settings_decorator .keywords ):
182- settings_decorator .keywords .append (
183- ast .keyword (arg = "derandomize" , value = ast .Constant (value = True ))
184- )
170+ settings_decorator .keywords .append (ast .keyword (arg = "derandomize" , value = ast .Constant (value = True )))
185171 else :
186172 node .decorator_list .append (
187173 ast .Call (
188174 func = ast .Name (id = "settings" , ctx = ast .Load ()),
189175 args = [],
190- keywords = [
191- ast .keyword (
192- arg = "derandomize" , value = ast .Constant (value = True )
193- )
194- ],
176+ keywords = [ast .keyword (arg = "derandomize" , value = ast .Constant (value = True ))],
195177 )
196178 )
197179
198180 return ast .unparse (tree )
199181
200182
201183def generate_hypothesis_tests (
202- test_cfg : TestConfig ,
203- args : Namespace ,
204- function_to_optimize : FunctionToOptimize ,
205- function_to_optimize_ast : ast .AST ,
184+ test_cfg : TestConfig , args : Namespace , function_to_optimize : FunctionToOptimize , function_to_optimize_ast : ast .AST
206185) -> tuple [dict [str , list [FunctionCalledInTest ]], str ]:
207186 """Generate property-based tests using Hypothesis ghostwriter.
208187
@@ -223,19 +202,15 @@ def generate_hypothesis_tests(
223202
224203 if (
225204 test_cfg .project_root_path
226- and isinstance (
227- function_to_optimize_ast , (ast .FunctionDef , ast .AsyncFunctionDef )
228- )
205+ and isinstance (function_to_optimize_ast , (ast .FunctionDef , ast .AsyncFunctionDef ))
229206 and has_typed_parameters (function_to_optimize_ast , function_to_optimize .parents )
230207 ):
231208 logger .info ("Generating Hypothesis tests for the original code…" )
232209 console .rule ()
233210
234211 try :
235212 qualified_function_path = get_qualified_function_path (
236- function_to_optimize .file_path ,
237- args .project_root ,
238- function_to_optimize .qualified_name ,
213+ function_to_optimize .file_path , args .project_root , function_to_optimize .qualified_name
239214 )
240215 logger .info (f"command: hypothesis write { qualified_function_path } " )
241216
@@ -250,9 +225,7 @@ def generate_hypothesis_tests(
250225 except subprocess .TimeoutExpired :
251226 logger .debug ("Hypothesis test generation timed out" )
252227 end_time = time .perf_counter ()
253- logger .debug (
254- f"Hypothesis test generation completed in { end_time - start_time :.2f} seconds"
255- )
228+ logger .debug (f"Hypothesis test generation completed in { end_time - start_time :.2f} seconds" )
256229 return function_to_hypothesis_tests , hypothesis_test_suite_code
257230
258231 if hypothesis_result .returncode == 0 :
@@ -269,39 +242,33 @@ def generate_hypothesis_tests(
269242 pytest_cmd = args .pytest_cmd ,
270243 )
271244 file_to_funcs = {function_to_optimize .file_path : [function_to_optimize ]}
272- function_to_hypothesis_tests , num_discovered_hypothesis_tests , _ = (
273- discover_unit_tests ( hypothesis_config , file_to_funcs_to_optimize = file_to_funcs )
245+ function_to_hypothesis_tests , num_discovered_hypothesis_tests , _ = discover_unit_tests (
246+ hypothesis_config , file_to_funcs_to_optimize = file_to_funcs
274247 )
275248 with hypothesis_path .open ("r" , encoding = "utf-8" ) as f :
276249 original_code = f .read ()
277250
278- unparsed = filter_hypothesis_tests_by_function_name (
279- original_code , function_to_optimize .function_name
280- )
251+ unparsed = filter_hypothesis_tests_by_function_name (original_code , function_to_optimize .function_name )
281252
282253 console .print (f"modified src: { unparsed } " )
283254
284255 hypothesis_test_suite_code = format_code (
285256 args .formatter_cmds ,
286257 hypothesis_path ,
287- optimized_code = make_hypothesis_tests_deterministic (
288- remove_functions_with_only_any_type (unparsed )
289- ),
258+ optimized_code = make_hypothesis_tests_deterministic (remove_functions_with_only_any_type (unparsed )),
290259 )
291260 with hypothesis_path .open ("w" , encoding = "utf-8" ) as f :
292261 f .write (hypothesis_test_suite_code )
293- function_to_hypothesis_tests , num_discovered_hypothesis_tests , _ = (
294- discover_unit_tests ( hypothesis_config , file_to_funcs_to_optimize = file_to_funcs )
262+ function_to_hypothesis_tests , num_discovered_hypothesis_tests , _ = discover_unit_tests (
263+ hypothesis_config , file_to_funcs_to_optimize = file_to_funcs
295264 )
296265 logger .info (
297266 f"Created { num_discovered_hypothesis_tests } "
298267 f"hypothesis unit test case{ 's' if num_discovered_hypothesis_tests != 1 else '' } "
299268 )
300269 console .rule ()
301270 end_time = time .perf_counter ()
302- logger .debug (
303- f"Generated hypothesis tests in { end_time - start_time :.2f} seconds"
304- )
271+ logger .debug (f"Generated hypothesis tests in { end_time - start_time :.2f} seconds" )
305272 return function_to_hypothesis_tests , hypothesis_test_suite_code
306273
307274 logger .debug (
@@ -310,7 +277,5 @@ def generate_hypothesis_tests(
310277 console .rule ()
311278
312279 end_time = time .perf_counter ()
313- logger .debug (
314- f"Hypothesis test generation completed in { end_time - start_time :.2f} seconds"
315- )
280+ logger .debug (f"Hypothesis test generation completed in { end_time - start_time :.2f} seconds" )
316281 return function_to_hypothesis_tests , hypothesis_test_suite_code
0 commit comments