diff --git a/newsfragments/170.fixed.rst b/newsfragments/170.fixed.rst new file mode 100644 index 0000000..fb222b5 --- /dev/null +++ b/newsfragments/170.fixed.rst @@ -0,0 +1 @@ +``parse_types=True`` now works together with ``metadata=True`` in :meth:`~spacetrack.base.SpaceTrackClient.generic_request` and the request class methods; previously the metadata-wrapped response made it fail after the request had succeeded. diff --git a/src/spacetrack/base.py b/src/spacetrack/base.py index 0106ec9..97b18ca 100644 --- a/src/spacetrack/base.py +++ b/src/spacetrack/base.py @@ -747,7 +747,11 @@ def generic_request( def _parse_types(data, predicates): predicate_map = {p.name: p for p in predicates} - for obj in data: + # With metadata=true, the rows are wrapped in a dict alongside the + # request metadata. + rows = data.get("data", []) if isinstance(data, Mapping) else data + + for obj in rows: for key, value in obj.items(): if key.lower() in predicate_map: obj[key] = predicate_map[key.lower()].parse(value) diff --git a/tests/test_spacetrack.py b/tests/test_spacetrack.py index a0c9bfa..1f5f77c 100644 --- a/tests/test_spacetrack.py +++ b/tests/test_spacetrack.py @@ -621,6 +621,21 @@ def test_parse_types(client, httpx2_mock, mock_auth): assert "parse_types" in exc_info.value.args[0] +def test_parse_types_metadata(client, httpx2_mock, mock_auth, mock_gp_predicates): + httpx2_mock.add_response( + method="GET", + url=api_url("basicspacedata/query/class/gp/metadata/true"), + json={ + "request_metadata": {"DataSize": "1"}, + "data": [{"LAUNCH_DATE": "2017-01-01"}], + }, + ) + + result = client.gp(parse_types=True, metadata=True) + + assert result["data"][0]["LAUNCH_DATE"] == dt.date(2017, 1, 1) + + def test_params(httpx2_mock, mock_auth): data = b"hello\n" httpx2_mock.add_response(