@@ -629,7 +629,7 @@ def check_result(i: float, result: float) -> bool:
629
629
return check_result
630
630
631
631
632
- def parse_unary_case_block (case_block : str ) -> List [UnaryCase ]:
632
+ def parse_unary_case_block (case_block : str , func_name : str ) -> List [UnaryCase ]:
633
633
"""
634
634
Parses a Sphinx-formatted docstring of a unary function to return a list of
635
635
codified unary cases, e.g.
@@ -660,7 +660,7 @@ def parse_unary_case_block(case_block: str) -> List[UnaryCase]:
660
660
... '''
661
661
...
662
662
>>> case_block = r_case_block.search(sqrt.__doc__).group(1)
663
- >>> unary_cases = parse_unary_case_block(case_block)
663
+ >>> unary_cases = parse_unary_case_block(case_block, 'sqrt' )
664
664
>>> for case in unary_cases:
665
665
... print(repr(case))
666
666
UnaryCase(<x_i < 0 -> NaN>)
@@ -691,7 +691,7 @@ def parse_unary_case_block(case_block: str) -> List[UnaryCase]:
691
691
cond , cond_expr_template , cond_from_dtype = parse_cond (m .group (1 ))
692
692
_check_result , result_expr = parse_result (m .group (2 ))
693
693
except ParseError as e :
694
- warn (f"not machine-readable: '{ e .value } '" )
694
+ warn (f"case for { func_name } not machine-readable: '{ e .value } '" )
695
695
continue
696
696
cond_expr = cond_expr_template .replace ("{}" , "x_i" )
697
697
# Do not define check_result in this function's body - see
@@ -708,7 +708,7 @@ def parse_unary_case_block(case_block: str) -> List[UnaryCase]:
708
708
cases .append (case )
709
709
else :
710
710
if not r_remaining_case .search (case_str ):
711
- warn (f"case not machine-readable: '{ case_str } '" )
711
+ warn (f"case for { func_name } not machine-readable: '{ case_str } '" )
712
712
return cases
713
713
714
714
@@ -1102,7 +1102,7 @@ def cond(i1: float, i2: float) -> bool:
1102
1102
r_redundant_case = re .compile ("result.+determined by the rule already stated above" )
1103
1103
1104
1104
1105
- def parse_binary_case_block (case_block : str ) -> List [BinaryCase ]:
1105
+ def parse_binary_case_block (case_block : str , func_name : str ) -> List [BinaryCase ]:
1106
1106
"""
1107
1107
Parses a Sphinx-formatted docstring of a binary function to return a list of
1108
1108
codified binary cases, e.g.
@@ -1133,7 +1133,7 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1133
1133
... '''
1134
1134
...
1135
1135
>>> case_block = r_case_block.search(logaddexp.__doc__).group(1)
1136
- >>> binary_cases = parse_binary_case_block(case_block)
1136
+ >>> binary_cases = parse_binary_case_block(case_block, 'logaddexp' )
1137
1137
>>> for case in binary_cases:
1138
1138
... print(repr(case))
1139
1139
BinaryCase(<x1_i == NaN or x2_i == NaN -> NaN>)
@@ -1151,10 +1151,10 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1151
1151
case = parse_binary_case (case_str )
1152
1152
cases .append (case )
1153
1153
except ParseError as e :
1154
- warn (f"not machine-readable: '{ e .value } '" )
1154
+ warn (f"case for { func_name } not machine-readable: '{ e .value } '" )
1155
1155
else :
1156
1156
if not r_remaining_case .match (case_str ):
1157
- warn (f"case not machine-readable: '{ case_str } '" )
1157
+ warn (f"case for { func_name } not machine-readable: '{ case_str } '" )
1158
1158
return cases
1159
1159
1160
1160
@@ -1163,19 +1163,20 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1163
1163
iop_params = []
1164
1164
func_to_op : Dict [str , str ] = {v : k for k , v in dh .op_to_func .items ()}
1165
1165
for stub in category_to_funcs ["elementwise" ]:
1166
+ func_name = stub .__name__
1166
1167
if stub .__doc__ is None :
1167
- warn (f"{ stub . __name__ } () stub has no docstring" )
1168
+ warn (f"{ func_name } () stub has no docstring" )
1168
1169
continue
1169
1170
if m := r_case_block .search (stub .__doc__ ):
1170
1171
case_block = m .group (1 )
1171
1172
else :
1172
1173
continue
1173
1174
marks = []
1174
1175
try :
1175
- func = getattr (xp , stub . __name__ )
1176
+ func = getattr (xp , func_name )
1176
1177
except AttributeError :
1177
1178
marks .append (
1178
- pytest .mark .skip (reason = f"{ stub . __name__ } not found in array module" )
1179
+ pytest .mark .skip (reason = f"{ func_name } not found in array module" )
1179
1180
)
1180
1181
func = None
1181
1182
sig = inspect .signature (stub )
@@ -1184,10 +1185,10 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1184
1185
warn (f"{ func = } has no parameters" )
1185
1186
continue
1186
1187
if param_names [0 ] == "x" :
1187
- if cases := parse_unary_case_block (case_block ):
1188
- name_to_func = {stub . __name__ : func }
1189
- if stub . __name__ in func_to_op .keys ():
1190
- op_name = func_to_op [stub . __name__ ]
1188
+ if cases := parse_unary_case_block (case_block , func_name ):
1189
+ name_to_func = {func_name : func }
1190
+ if func_name in func_to_op .keys ():
1191
+ op_name = func_to_op [func_name ]
1191
1192
op = getattr (operator , op_name )
1192
1193
name_to_func [op_name ] = op
1193
1194
for func_name , func in name_to_func .items ():
@@ -1196,20 +1197,20 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1196
1197
p = pytest .param (func_name , func , case , id = id_ )
1197
1198
unary_params .append (p )
1198
1199
else :
1199
- warn (f"Special cases found for { stub . __name__ } but none were parsed" )
1200
+ warn (f"Special cases found for { func_name } but none were parsed" )
1200
1201
continue
1201
1202
if len (sig .parameters ) == 1 :
1202
1203
warn (f"{ func = } has one parameter '{ param_names [0 ]} ' which is not named 'x'" )
1203
1204
continue
1204
1205
if param_names [0 ] == "x1" and param_names [1 ] == "x2" :
1205
- if cases := parse_binary_case_block (case_block ):
1206
- name_to_func = {stub . __name__ : func }
1207
- if stub . __name__ in func_to_op .keys ():
1208
- op_name = func_to_op [stub . __name__ ]
1206
+ if cases := parse_binary_case_block (case_block , func_name ):
1207
+ name_to_func = {func_name : func }
1208
+ if func_name in func_to_op .keys ():
1209
+ op_name = func_to_op [func_name ]
1209
1210
op = getattr (operator , op_name )
1210
1211
name_to_func [op_name ] = op
1211
1212
# We collect inplace operator test cases seperately
1212
- if "equal" in stub . __name__ :
1213
+ if "equal" in func_name :
1213
1214
continue
1214
1215
iop_name = "__i" + op_name [2 :]
1215
1216
iop = getattr (operator , iop_name )
@@ -1223,7 +1224,7 @@ def parse_binary_case_block(case_block: str) -> List[BinaryCase]:
1223
1224
p = pytest .param (func_name , func , case , id = id_ )
1224
1225
binary_params .append (p )
1225
1226
else :
1226
- warn (f"Special cases found for { stub . __name__ } but none were parsed" )
1227
+ warn (f"Special cases found for { func_name } but none were parsed" )
1227
1228
continue
1228
1229
else :
1229
1230
warn (
0 commit comments