Skip to content

Commit cd0e5ee

Browse files
jirhikerclaude
andcommitted
Remove deprecated source shims (transformer_klass, validator override)
Three back-compat paths in backend/source.py were dead: - `BaseSource.transformer_klass` — no source overrides it; every connector passes transformer=. The None fallback now constructs BaseTransformer() directly. - `_SubclassValidatorShim` + `BaseParameterSource._validate_record` — the "override _validate_record instead of passing validator=" mechanism. Nothing overrides _validate_record, and every concrete parameter source receives a real validator via BaseAnalyteSource/BaseWaterLevelSource (WQP reaches them through its mixin MRO). Removed the shim and the stub; the validator default is now plain None and validation is skipped when absent (only the test fake / uninstantiated mixin hit that). No connector relied on either path. Full suite (311) + dg check defs clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 567887f commit cd0e5ee

2 files changed

Lines changed: 6 additions & 23 deletions

File tree

backend/source.py

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,6 @@ def validate(self, record: dict) -> None:
6969
raise ValueError(f"Invalid record. Missing {k}")
7070

7171

72-
class _SubclassValidatorShim(RecordValidator):
73-
"""Shim: delegates to source._validate_record() for subclasses that override it."""
74-
def __init__(self, source):
75-
self._source = source
76-
77-
def set_config(self, config) -> None:
78-
pass # source._validate_record uses self.config directly
79-
80-
def validate(self, record: dict) -> None:
81-
self._source._validate_record(record)
82-
83-
8472
# =============================================================================
8573
# Record summarization strategy
8674
# =============================================================================
@@ -192,10 +180,8 @@ def get_analyte_search_param(parameter: str, mapping: dict) -> str:
192180

193181

194182
class BaseSource:
195-
transformer_klass = BaseTransformer # deprecated: pass transformer= to __init__
196-
197183
def __init__(self, transformer: Optional[BaseTransformer] = None, http_client: httpx.Client | None = None):
198-
self.transformer = transformer if transformer is not None else self.transformer_klass()
184+
self.transformer = transformer if transformer is not None else BaseTransformer()
199185
self._http_client = http_client if http_client is not None else httpx.Client(timeout=900)
200186
_l = make_logger(self.__class__.__name__)
201187
self.log = _l.log
@@ -228,7 +214,7 @@ def tag(self):
228214
def set_config(self, config):
229215
self.config = config
230216
self.transformer.set_config(config)
231-
if hasattr(self, "_validator"):
217+
if getattr(self, "_validator", None) is not None:
232218
self._validator.set_config(config)
233219

234220
def check(self, *args, **kw):
@@ -356,7 +342,7 @@ class BaseParameterSource(BaseSource):
356342

357343
def __init__(self, transformer=None, validator: Optional[RecordValidator] = None, http_client: httpx.Client | None = None):
358344
super().__init__(transformer=transformer, http_client=http_client)
359-
self._validator = validator if validator is not None else _SubclassValidatorShim(self)
345+
self._validator = validator
360346
self._summarizer = RecordSummarizer(self)
361347

362348
def _extract_earliest_record(self, records: list) -> dict:
@@ -483,16 +469,13 @@ def _extract_source_parameter_results(self, records: list) -> list:
483469

484470
def _extract_parameter(self, record: dict) -> dict:
485471
record = self._extract_parameter_record(record)
486-
self._validator.validate(record)
472+
if self._validator is not None:
473+
self._validator.validate(record)
487474
return record
488475

489476
def _sort_func(self, x):
490477
return x.date_measured
491478

492-
# deprecated: override via validator= __init__ arg instead
493-
def _validate_record(self, record: dict) -> None:
494-
raise NotImplementedError(f"{self.__class__.__name__} Must implement _validate_record")
495-
496479

497480
class BaseAnalyteSource(BaseParameterSource):
498481
name = "analyte"

docs/cleanup-todo.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ registry). Tiers are ordered by safety — Tier 1 is batchable into one no-risk
6262
- **`config.validate()` `sys.exit(2)` → raise** — library code shouldn't exit the process; raise a `ConfigError` and let CLI translate to an exit code. (Affects callers; needs care.)
6363
- **Hoist connector `_extract_*` duplication**`_extract_source_parameter_results/dates/units` repeat dict/list access across connectors; lift common shapes to a base.
6464
- **Spatial-filter precedence**`bbox_bounding_points` (bbox first) vs `bounding_wkt` (wkt first) resolve multiple filters differently; #101 warns, but unify the precedence. Consider a small `Scope` value object and drop the `wkt=None`-means-statewide magic in `die_config`.
65-
- **Remove deprecated shims** `transformer_klass`, `_SubclassValidatorShim`, `_validate_record` (`backend/source.py`). Verify no connector still relies on the override path first.
65+
- **Remove deprecated shims** (DONE) — removed `transformer_klass`, `_SubclassValidatorShim`, `_validate_record` (`backend/source.py`). Verified no connector overrides `_validate_record` or sets `transformer_klass`, and every concrete parameter source gets a real validator via `BaseAnalyteSource`/`BaseWaterLevelSource` (WQP through its mixin MRO). `transformer=None` now falls back to `BaseTransformer()` directly; `validator=None` is tolerated (validation skipped) for the test fake / mixin.
6666

6767
---
6868

0 commit comments

Comments
 (0)