Skip to content

Commit ee5d7bc

Browse files
authored
VER: Release 0.39.2
See release notes.
2 parents f0dbdc9 + 5b59ef8 commit ee5d7bc

File tree

5 files changed

+22
-8
lines changed

5 files changed

+22
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.39.2 - 2024-08-13
4+
5+
#### Enhancements
6+
- Changed `corporate_actions.get_range(...)` to stream compressed zstd data
7+
38
## 0.39.1 - 2024-08-13
49

510
#### Bug fixes

databento/reference/api/corporate.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
from collections.abc import Iterable
44
from datetime import date
5+
from io import BytesIO
56
from io import StringIO
67

78
import pandas as pd
9+
import zstandard
10+
from databento_dbn import Compression
811
from databento_dbn import SType
912

1013
from databento.common import API_VERSION
@@ -112,6 +115,7 @@ def get_range(
112115
"events": ",".join(events) if events else None,
113116
"countries": ",".join(countries) if countries else None,
114117
"security_types": ",".join(security_types) if security_types else None,
118+
"compression": str(Compression.ZSTD), # Always request zstd
115119
}
116120

117121
response = self._post(
@@ -120,7 +124,10 @@ def get_range(
120124
basic_auth=True,
121125
)
122126

123-
df = pd.read_json(StringIO(response.text), lines=True)
127+
decompressor = zstandard.ZstdDecompressor()
128+
decompressed_content = decompressor.stream_reader(BytesIO(response.content)).read()
129+
130+
df = pd.read_json(StringIO(decompressed_content.decode()), lines=True)
124131
if df.empty:
125132
return df
126133

databento/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.39.1"
1+
__version__ = "0.39.2"

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "databento"
3-
version = "0.39.1"
3+
version = "0.39.2"
44
description = "Official Python client library for Databento"
55
authors = [
66
"Databento <support@databento.com>",

tests/test_reference_corporate.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pandas as pd
99
import pytest
1010
import requests
11+
import zstandard
1112
from databento.reference.client import Reference
1213

1314
from tests import TESTS_ROOT
@@ -77,7 +78,7 @@ def test_corporate_actions_get_range_sends_expected_request(
7778
) -> None:
7879
# Arrange
7980
mock_response = MagicMock()
80-
mock_response.text = "{}"
81+
mock_response.content = zstandard.compress(b"{}")
8182
mock_response.__enter__.return_value = mock_response
8283
mock_response.__exit__ = MagicMock()
8384
monkeypatch.setattr(requests, "post", mock_post := MagicMock(return_value=mock_response))
@@ -110,6 +111,7 @@ def test_corporate_actions_get_range_sends_expected_request(
110111
"events": expected_events,
111112
"countries": expected_countries,
112113
"security_types": expected_security_types,
114+
"compression": "zstd",
113115
}
114116
assert call["timeout"] == (100, 100)
115117
assert isinstance(call["auth"], requests.auth.HTTPBasicAuth)
@@ -122,7 +124,7 @@ def test_corporate_actions_get_range_response_parsing_as_pit(
122124
# Arrange
123125
data_path = Path(TESTS_ROOT) / "data" / "REFERENCE" / "test_data.corporate-actions.ndjson"
124126
mock_response = MagicMock()
125-
mock_response.text = data_path.read_text()
127+
mock_response.content = zstandard.compress(data_path.read_bytes())
126128
mock_response.__enter__.return_value = mock_response
127129
mock_response.__exit__ = MagicMock()
128130
monkeypatch.setattr(requests, "post", MagicMock(return_value=mock_response))
@@ -152,7 +154,7 @@ def test_corporate_actions_get_range_response(
152154
# Arrange
153155
data_path = Path(TESTS_ROOT) / "data" / "REFERENCE" / "test_data.corporate-actions-pit.ndjson"
154156
mock_response = MagicMock()
155-
mock_response.text = data_path.read_text()
157+
mock_response.content = zstandard.compress(data_path.read_bytes())
156158
mock_response.__enter__.return_value = mock_response
157159
mock_response.__exit__ = MagicMock()
158160
monkeypatch.setattr(requests, "post", MagicMock(return_value=mock_response))
@@ -178,7 +180,7 @@ def test_corporate_actions_get_range_with_ts_record_index(
178180
# Arrange
179181
data_path = Path(TESTS_ROOT) / "data" / "REFERENCE" / "test_data.corporate-actions.ndjson"
180182
mock_response = MagicMock()
181-
mock_response.text = data_path.read_text()
183+
mock_response.content = zstandard.compress(data_path.read_bytes())
182184
mock_response.__enter__.return_value = mock_response
183185
mock_response.__exit__ = MagicMock()
184186
monkeypatch.setattr(requests, "post", MagicMock(return_value=mock_response))
@@ -212,7 +214,7 @@ def test_corporate_actions_get_range_without_flattening(
212214
# Arrange
213215
data_path = Path(TESTS_ROOT) / "data" / "REFERENCE" / "test_data.corporate-actions.ndjson"
214216
mock_response = MagicMock()
215-
mock_response.text = data_path.read_text()
217+
mock_response.content = zstandard.compress(data_path.read_bytes())
216218
mock_response.__enter__.return_value = mock_response
217219
mock_response.__exit__ = MagicMock()
218220
monkeypatch.setattr(requests, "post", MagicMock(return_value=mock_response))

0 commit comments

Comments
 (0)