Skip to content

Commit 0eb5dcc

Browse files
fix: dynamically parse all census field appends
Replace hardcoded census year parsing (census2010, census2020, census2023) with dynamic detection and parsing of any census field returned by the API. Changes: - Modified _parse_fields() to automatically detect and parse any field matching the pattern "census" + digits (e.g., census2024, census2025) - Removed slots=True from GeocodioFields to allow dynamic field passing via **kwargs (backwards compatible, negligible performance impact) - Only parses census fields that are defined in the GeocodioFields model Benefits: - Fixes issue where census2024 was not being parsed - Future-proof: new census years only require adding a field definition to GeocodioFields, no changes needed to parsing logic - Maintains backwards compatibility with all existing census fields Fixes #12
1 parent 0a06fca commit 0eb5dcc

File tree

2 files changed

+13
-18
lines changed

2 files changed

+13
-18
lines changed

src/geocodio/client.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -443,20 +443,17 @@ def _parse_fields(self, fields_data: dict | None) -> GeocodioFields | None:
443443
for district in fields_data["school"]
444444
]
445445

446-
census2010 = (
447-
CensusData.from_api(fields_data["census2010"])
448-
if "census2010" in fields_data else None
449-
)
450-
451-
census2020 = (
452-
CensusData.from_api(fields_data["census2020"])
453-
if "census2020" in fields_data else None
454-
)
455-
456-
census2023 = (
457-
CensusData.from_api(fields_data["census2023"])
458-
if "census2023" in fields_data else None
459-
)
446+
# Dynamically parse all census fields (e.g., census2010, census2020, census2024, etc.)
447+
# This supports any census year returned by the API
448+
from dataclasses import fields as dataclass_fields
449+
valid_field_names = {f.name for f in dataclass_fields(GeocodioFields)}
450+
451+
census_fields = {}
452+
for key in fields_data:
453+
if key.startswith("census") and key[6:].isdigit(): # e.g., "census2024"
454+
# Only include if it's a defined field in GeocodioFields
455+
if key in valid_field_names:
456+
census_fields[key] = CensusData.from_api(fields_data[key])
460457

461458
acs = (
462459
ACSSurveyData.from_api(fields_data["acs"])
@@ -515,9 +512,6 @@ def _parse_fields(self, fields_data: dict | None) -> GeocodioFields | None:
515512
state_legislative_districts=state_legislative_districts,
516513
state_legislative_districts_next=state_legislative_districts_next,
517514
school_districts=school_districts,
518-
census2010=census2010,
519-
census2020=census2020,
520-
census2023=census2023,
521515
acs=acs,
522516
demographics=demographics,
523517
economics=economics,
@@ -528,6 +522,7 @@ def _parse_fields(self, fields_data: dict | None) -> GeocodioFields | None:
528522
provriding=provriding,
529523
provriding_next=provriding_next,
530524
statcan=statcan,
525+
**census_fields, # Dynamically include all census year fields
531526
)
532527

533528
# @TODO add a "keep_trying" parameter to download() to keep trying until the list is processed.

src/geocodio/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ class FFIECData(ApiModelMixin):
283283
extras: Dict[str, Any] = field(default_factory=dict, repr=False)
284284

285285

286-
@dataclass(slots=True, frozen=True)
286+
@dataclass(frozen=True)
287287
class GeocodioFields:
288288
"""
289289
Container for optional 'fields' returned by the Geocodio API.

0 commit comments

Comments
 (0)