Skip to content

Commit e7959b6

Browse files
authored
more pydantic fixes (#632)
1 parent 30549a2 commit e7959b6

3 files changed

Lines changed: 98 additions & 5 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "stats_can"
3-
version = "3.2.2"
3+
version = "3.2.3"
44
description = "Read StatsCan data into python, mostly pandas dataframes"
55
authors = [{ name = "Ian Preston" }]
66
requires-python = ">=3.10,<4.0"

src/stats_can/schemas.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ class CubeMetadata(TypedDict):
6363
cansimId: str | None
6464
cubeTitleEn: str
6565
cubeTitleFr: str
66-
cubeStartDate: str
67-
cubeEndDate: str
66+
cubeStartDate: str | None
67+
cubeEndDate: str | None
6868
frequencyCode: int
6969
nbSeriesCube: int
7070
nbDatapointsCube: int
71-
releaseTime: str
71+
releaseTime: str | None
7272
archiveStatusCode: str
7373
archiveStatusEn: str
7474
archiveStatusFr: str
@@ -78,7 +78,7 @@ class CubeMetadata(TypedDict):
7878
footnote: list[Footnote]
7979
correction: list[Any]
8080
correctionFootnote: list[Any]
81-
issueDate: str
81+
issueDate: str | None
8282

8383

8484
class SeriesInfo(TypedDict):

tests/test_error_handling.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,99 @@ def test_string_cansim_id_validates(self):
167167
result = scwds.get_cube_metadata("27100022")
168168
assert result[0]["cansimId"] == "271-0022"
169169

170+
def test_null_issue_date_validates(self):
171+
"""Tables like 36100402 return issueDate=null from the API."""
172+
mock_resp = _mock_response(
173+
json_data=[
174+
{
175+
"status": "SUCCESS",
176+
"object": {
177+
**self._CUBE_METADATA_BASE,
178+
"cansimId": None,
179+
"issueDate": None,
180+
},
181+
}
182+
]
183+
)
184+
with patch.object(scwds._session, "request", return_value=mock_resp):
185+
result = scwds.get_cube_metadata("36100402")
186+
assert result[0]["issueDate"] is None
187+
188+
def test_null_cube_start_date_validates(self):
189+
"""cubeStartDate can be null for tables with no data yet."""
190+
mock_resp = _mock_response(
191+
json_data=[
192+
{
193+
"status": "SUCCESS",
194+
"object": {
195+
**self._CUBE_METADATA_BASE,
196+
"cansimId": None,
197+
"cubeStartDate": None,
198+
},
199+
}
200+
]
201+
)
202+
with patch.object(scwds._session, "request", return_value=mock_resp):
203+
result = scwds.get_cube_metadata("34100292")
204+
assert result[0]["cubeStartDate"] is None
205+
206+
def test_null_cube_end_date_validates(self):
207+
"""cubeEndDate can be null for tables with no data yet."""
208+
mock_resp = _mock_response(
209+
json_data=[
210+
{
211+
"status": "SUCCESS",
212+
"object": {
213+
**self._CUBE_METADATA_BASE,
214+
"cansimId": None,
215+
"cubeEndDate": None,
216+
},
217+
}
218+
]
219+
)
220+
with patch.object(scwds._session, "request", return_value=mock_resp):
221+
result = scwds.get_cube_metadata("34100292")
222+
assert result[0]["cubeEndDate"] is None
223+
224+
def test_null_release_time_validates(self):
225+
"""releaseTime can be null for unreleased tables."""
226+
mock_resp = _mock_response(
227+
json_data=[
228+
{
229+
"status": "SUCCESS",
230+
"object": {
231+
**self._CUBE_METADATA_BASE,
232+
"cansimId": None,
233+
"releaseTime": None,
234+
},
235+
}
236+
]
237+
)
238+
with patch.object(scwds._session, "request", return_value=mock_resp):
239+
result = scwds.get_cube_metadata("34100292")
240+
assert result[0]["releaseTime"] is None
241+
242+
def test_multiple_null_fields_validate(self):
243+
"""Multiple nullable fields can be null simultaneously."""
244+
metadata = {
245+
**self._CUBE_METADATA_BASE,
246+
"cansimId": None,
247+
"cubeStartDate": None,
248+
"cubeEndDate": None,
249+
"releaseTime": None,
250+
"issueDate": None,
251+
}
252+
mock_resp = _mock_response(
253+
json_data=[{"status": "SUCCESS", "object": metadata}]
254+
)
255+
with patch.object(scwds._session, "request", return_value=mock_resp):
256+
result = scwds.get_cube_metadata("36100402")
257+
assert result[0]["cansimId"] is None
258+
assert result[0]["cubeStartDate"] is None
259+
assert result[0]["cubeEndDate"] is None
260+
assert result[0]["releaseTime"] is None
261+
assert result[0]["issueDate"] is None
262+
170263

171264
class TestVectorsToDfEdgeCases:
172265
"""Tests for vectors_to_df edge cases."""

0 commit comments

Comments
 (0)