@@ -1444,7 +1444,10 @@ def _generate_display_table(
1444
1444
column_values = gt.gt._get_column_of_values(built_gt, column_name=column, context="html")
1445
1445
1446
1446
# Get the maximum number of characters in the column
1447
- max_length_col_vals.append(max([len(str(val)) for val in column_values]))
1447
+ if column_values: # Check if column_values is not empty
1448
+ max_length_col_vals.append(max([len(str(val)) for val in column_values]))
1449
+ else:
1450
+ max_length_col_vals.append(0) # Use 0 for empty columns
1448
1451
1449
1452
length_col_names = [len(column) for column in col_dtype_dict.keys()]
1450
1453
length_data_types = [len(dtype) for dtype in col_dtype_dict_short.values()]
@@ -1515,8 +1518,12 @@ def _generate_display_table(
1515
1518
1516
1519
# Get the highest number in the `row_number_list` and calculate a width that will
1517
1520
# safely fit a number of that magnitude
1518
- max_row_num = max(row_number_list)
1519
- max_row_num_width = len(str(max_row_num)) * 7.8 + 10
1521
+ if row_number_list: # Check if list is not empty
1522
+ max_row_num = max(row_number_list)
1523
+ max_row_num_width = len(str(max_row_num)) * 7.8 + 10
1524
+ else:
1525
+ # If row_number_list is empty, use a default width
1526
+ max_row_num_width = 7.8 * 2 + 10 # Width for 2-digit numbers
1520
1527
1521
1528
# Update the col_width_dict to include the row number column
1522
1529
col_width_dict = {"_row_num_": f"{max_row_num_width}px"} | col_width_dict
@@ -9154,37 +9161,47 @@ def interrogate(
9154
9161
9155
9162
# Determine whether any preprocessing functions are to be applied to the table
9156
9163
if validation.pre is not None:
9157
- # Read the text of the preprocessing function
9158
- pre_text = _pre_processing_funcs_to_str(validation.pre)
9164
+ try:
9165
+ # Read the text of the preprocessing function
9166
+ pre_text = _pre_processing_funcs_to_str(validation.pre)
9167
+
9168
+ # Determine if the preprocessing function is a lambda function; return a boolean
9169
+ is_lambda = re.match(r"^lambda", pre_text) is not None
9159
9170
9160
- # Determine if the preprocessing function is a lambda function; return a boolean
9161
- is_lambda = re.match(r"^lambda", pre_text) is not None
9171
+ # If the preprocessing function is a lambda function, then check if there is
9172
+ # a keyword argument called `dfn` in the lamda signature; if so, that's a cue
9173
+ # to use a Narwhalified version of the table
9174
+ if is_lambda:
9175
+ # Get the signature of the lambda function
9176
+ sig = inspect.signature(validation.pre)
9162
9177
9163
- # If the preprocessing function is a lambda function, then check if there is
9164
- # a keyword argument called `dfn` in the lamda signature; if so, that's a cue
9165
- # to use a Narwhalified version of the table
9166
- if is_lambda:
9167
- # Get the signature of the lambda function
9168
- sig = inspect.signature(validation.pre)
9178
+ # Check if the lambda function has a keyword argument called `dfn`
9179
+ if "dfn" in sig.parameters:
9180
+ # Convert the table to a Narwhals DataFrame
9181
+ data_tbl_step = nw.from_native(data_tbl_step)
9169
9182
9170
- # Check if the lambda function has a keyword argument called `dfn`
9171
- if "dfn" in sig.parameters:
9172
- # Convert the table to a Narwhals DataFrame
9173
- data_tbl_step = nw.from_native(data_tbl_step)
9183
+ # Apply the preprocessing function to the table
9184
+ data_tbl_step = validation.pre(dfn=data_tbl_step)
9174
9185
9175
- # Apply the preprocessing function to the table
9176
- data_tbl_step = validation.pre(dfn= data_tbl_step)
9186
+ # Convert the table back to its original format
9187
+ data_tbl_step = nw.to_native( data_tbl_step)
9177
9188
9178
- # Convert the table back to its original format
9179
- data_tbl_step = nw.to_native(data_tbl_step)
9189
+ else:
9190
+ # Apply the preprocessing function to the table
9191
+ data_tbl_step = validation.pre(data_tbl_step)
9180
9192
9181
- else:
9182
- # Apply the preprocessing function to the table
9193
+ # If the preprocessing function is a function, apply it to the table
9194
+ elif isinstance(validation.pre, Callable):
9183
9195
data_tbl_step = validation.pre(data_tbl_step)
9184
9196
9185
- # If the preprocessing function is a function, apply it to the table
9186
- elif isinstance(validation.pre, Callable):
9187
- data_tbl_step = validation.pre(data_tbl_step)
9197
+ except Exception:
9198
+ # If preprocessing fails, mark the validation as having an eval_error
9199
+ validation.eval_error = True
9200
+ end_time = datetime.datetime.now(datetime.timezone.utc)
9201
+ validation.proc_duration_s = (end_time - start_time).total_seconds()
9202
+ validation.time_processed = end_time.isoformat(timespec="milliseconds")
9203
+ validation.active = False
9204
+ continue
9188
9205
9189
9206
# ------------------------------------------------
9190
9207
# Segmentation stage
0 commit comments