Skip to content

Commit efcd71f

Browse files
committed
feat: add census2023 support
- Add MSA and CSA codes to CensusData model - Add census2023 to GeocodioFields - Add unit and integration tests for census2023
1 parent 5fbdd1b commit efcd71f

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed

src/geocodio/client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ def _parse_fields(self, fields_data: dict | None) -> GeocodioFields | None:
213213
if "census2020" in fields_data else None
214214
)
215215

216+
census2023 = (
217+
CensusData.from_api(fields_data["census2023"])
218+
if "census2023" in fields_data else None
219+
)
220+
216221
acs = (
217222
ACSSurveyData.from_api(fields_data["acs"])
218223
if "acs" in fields_data else None
@@ -226,5 +231,6 @@ def _parse_fields(self, fields_data: dict | None) -> GeocodioFields | None:
226231
school_districts=school_districts,
227232
census2010=census2010,
228233
census2020=census2020,
234+
census2023=census2023,
229235
acs=acs,
230236
)

src/geocodio/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ class CensusData(_HasExtras, ApiModelMixin):
106106
tract: Optional[str] = None
107107
county_fips: Optional[str] = None
108108
state_fips: Optional[str] = None
109+
msa_code: Optional[str] = None # Metropolitan Statistical Area
110+
csa_code: Optional[str] = None # Combined Statistical Area
109111
extras: Dict[str, Any] = field(default_factory=dict, repr=False)
110112

111113

@@ -146,6 +148,7 @@ class GeocodioFields:
146148
school_districts: Optional[List[SchoolDistrict]] = None
147149
census2010: Optional[CensusData] = None
148150
census2020: Optional[CensusData] = None
151+
census2023: Optional[CensusData] = None
149152
acs: Optional[ACSSurveyData] = None
150153

151154

tests/e2e/test_api.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,36 @@ def test_integration_with_school_districts(client):
253253
if district.lea_id:
254254
assert isinstance(district.lea_id, str)
255255
if district.nces_id:
256-
assert isinstance(district.nces_id, str)
256+
assert isinstance(district.nces_id, str)
257+
258+
259+
def test_integration_with_census2023(client):
260+
"""Test real API call with census2023 field."""
261+
# Test address
262+
address = "1600 Pennsylvania Ave NW, Washington, DC"
263+
264+
# Request additional fields
265+
response = client.geocode(
266+
address,
267+
fields=["census2023"]
268+
)
269+
270+
# Verify response structure
271+
assert response is not None
272+
assert len(response.results) > 0
273+
result = response.results[0]
274+
275+
# Verify fields data
276+
fields = result.fields
277+
assert fields is not None
278+
279+
# Check census2023 data
280+
if fields.census2023:
281+
assert fields.census2023.tract is not None
282+
assert fields.census2023.block is not None
283+
assert fields.census2023.county_fips is not None
284+
assert fields.census2023.state_fips is not None
285+
if fields.census2023.msa_code:
286+
assert isinstance(fields.census2023.msa_code, str)
287+
if fields.census2023.csa_code:
288+
assert isinstance(fields.census2023.csa_code, str)

tests/test_models.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
from geocodio.models import (
33
AddressComponents, Timezone, CongressionalDistrict,
4-
GeocodioFields, GeocodingResult, GeocodingResponse, Location, StateLegislativeDistrict, SchoolDistrict
4+
GeocodioFields, GeocodingResult, GeocodingResponse, Location, StateLegislativeDistrict, SchoolDistrict, CensusData
55
)
66

77

@@ -130,4 +130,30 @@ def test_school_district_extras():
130130
assert district.lea_id == "5100000"
131131
assert district.nces_id == "5100000"
132132
assert district.get_extra("extra_field") == "extra value"
133-
assert district.get_extra("nonexistent", "default") == "default"
133+
assert district.get_extra("nonexistent", "default") == "default"
134+
135+
136+
def test_census_data_extras():
137+
# Test that extra fields are stored in extras
138+
data = {
139+
"block": "1000",
140+
"blockgroup": "1",
141+
"tract": "000100",
142+
"county_fips": "51013",
143+
"state_fips": "51",
144+
"msa_code": "47900",
145+
"csa_code": "548",
146+
"extra_field": "extra value"
147+
}
148+
149+
census = CensusData.from_api(data)
150+
151+
assert census.block == "1000"
152+
assert census.blockgroup == "1"
153+
assert census.tract == "000100"
154+
assert census.county_fips == "51013"
155+
assert census.state_fips == "51"
156+
assert census.msa_code == "47900"
157+
assert census.csa_code == "548"
158+
assert census.get_extra("extra_field") == "extra value"
159+
assert census.get_extra("nonexistent", "default") == "default"

0 commit comments

Comments
 (0)