@@ -108,6 +108,14 @@ def _address_from_row(person: list[str]) -> tuple[str, ...]:
108108
109109
110110class AbstractDataSource (abc .ABC ):
111+ @property
112+ @abc .abstractmethod
113+ def people_data_container (self ) -> str : ...
114+
115+ @property
116+ @abc .abstractmethod
117+ def already_selected_data_container (self ) -> str : ...
118+
111119 @abc .abstractmethod
112120 @contextmanager
113121 def read_feature_data (
@@ -145,6 +153,11 @@ def customise_people_parse_error(
145153 self , error : ParseTableMultiError , headers : Sequence [str ]
146154 ) -> SelectionMultilineError : ...
147155
156+ @abc .abstractmethod
157+ def customise_already_selected_parse_error (
158+ self , error : ParseTableMultiError , headers : Sequence [str ]
159+ ) -> SelectionMultilineError : ...
160+
148161
149162class SelectionData :
150163 def __init__ (self , data_source : AbstractDataSource , gen_rem_tab : bool = True ) -> None :
@@ -182,6 +195,7 @@ def load_people(self, settings: Settings, features: FeatureCollection) -> tuple[
182195 features = features ,
183196 settings = settings ,
184197 feature_column_name = self .feature_column_name ,
198+ data_container = self .data_source .people_data_container ,
185199 )
186200 except ParseTableMultiError as error :
187201 new_error = self .data_source .customise_people_parse_error (error , headers )
@@ -204,9 +218,10 @@ def load_already_selected(self, settings: Settings, features: FeatureCollection)
204218 features = features ,
205219 settings = settings ,
206220 feature_column_name = self .feature_column_name ,
221+ data_container = self .data_source .already_selected_data_container ,
207222 )
208223 except ParseTableMultiError as error :
209- new_error = self .data_source .customise_people_parse_error (error , headers )
224+ new_error = self .data_source .customise_already_selected_parse_error (error , headers )
210225 raise new_error from error
211226 return people , report
212227
@@ -261,6 +276,14 @@ def __init__(self, features_data: str, people_data: str, already_selected_data:
261276 self .selected_file_written = False
262277 self .remaining_file_written = False
263278
279+ @property
280+ def people_data_container (self ) -> str :
281+ return "people CSV data"
282+
283+ @property
284+ def already_selected_data_container (self ) -> str :
285+ return "already selected CSV data"
286+
264287 @contextmanager
265288 def read_feature_data (
266289 self , report : RunReport
@@ -315,6 +338,12 @@ def customise_people_parse_error(
315338 # given the info is in strings, we can't usefully add anything
316339 return error
317340
341+ def customise_already_selected_parse_error (
342+ self , error : ParseTableMultiError , headers : Sequence [str ]
343+ ) -> SelectionMultilineError :
344+ # given the info is in strings, we can't usefully add anything
345+ return error
346+
318347
319348class CSVFileDataSource (AbstractDataSource ):
320349 def __init__ (
@@ -332,6 +361,14 @@ def __init__(
332361 self .selected_file = selected_file
333362 self .remaining_file = remaining_file
334363
364+ @property
365+ def people_data_container (self ) -> str :
366+ return f" CSV file '{ self .people_file } '"
367+
368+ @property
369+ def already_selected_data_container (self ) -> str :
370+ return f" CSV file '{ self .already_selected_file } '"
371+
335372 @contextmanager
336373 def read_feature_data (
337374 self , report : RunReport
@@ -395,6 +432,14 @@ def customise_people_parse_error(
395432 * [str (e ) for e in error .all_errors ],
396433 ])
397434
435+ def customise_already_selected_parse_error (
436+ self , error : ParseTableMultiError , headers : Sequence [str ]
437+ ) -> SelectionMultilineError :
438+ return SelectionMultilineError ([
439+ f"Parser error(s) while reading already selected people from { self .already_selected_file } " ,
440+ * [str (e ) for e in error .all_errors ],
441+ ])
442+
398443
399444class GSheetTabNamer :
400445 def __init__ (self ) -> None :
@@ -463,6 +508,14 @@ def __init__(
463508 self .tab_namer = GSheetTabNamer ()
464509 self ._report = RunReport ()
465510
511+ @property
512+ def people_data_container (self ) -> str :
513+ return f"'{ self .people_tab_name } ' tab"
514+
515+ @property
516+ def already_selected_data_container (self ) -> str :
517+ return f"'{ self .already_selected_tab_name } ' tab"
518+
466519 @property
467520 def client (self ) -> gspread .client .Client :
468521 if self ._client is None :
@@ -719,14 +772,22 @@ def customise_features_parse_error(
719772 self , error : ParseTableMultiError , headers : Sequence [str ]
720773 ) -> SelectionMultilineError :
721774 return SelectionMultilineError ([
722- f"Parser error(s) while reading features from { self .feature_tab_name } worksheet" ,
775+ f"Parser error(s) while reading features from ' { self .feature_tab_name } ' worksheet" ,
723776 * self ._annotate_parse_errors_with_cell_names (error , headers ),
724777 ])
725778
726779 def customise_people_parse_error (
727780 self , error : ParseTableMultiError , headers : Sequence [str ]
728781 ) -> SelectionMultilineError :
729782 return SelectionMultilineError ([
730- f"Parser error(s) while reading people from { self .people_tab_name } worksheet" ,
783+ f"Parser error(s) while reading people from '{ self .people_tab_name } ' worksheet" ,
784+ * self ._annotate_parse_errors_with_cell_names (error , headers ),
785+ ])
786+
787+ def customise_already_selected_parse_error (
788+ self , error : ParseTableMultiError , headers : Sequence [str ]
789+ ) -> SelectionMultilineError :
790+ return SelectionMultilineError ([
791+ f"Parser error(s) while reading people from '{ self .already_selected_tab_name } ' worksheet" ,
731792 * self ._annotate_parse_errors_with_cell_names (error , headers ),
732793 ])
0 commit comments