Skip to content

Commit 91b7181

Browse files
authored
VER: Release 0.77.0
See release notes.
2 parents 659040e + 667127e commit 91b7181

9 files changed

Lines changed: 49 additions & 10 deletions

File tree

CHANGELOG.md

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

3+
## 0.77.0 - 2026-04-28
4+
5+
#### Enhancements
6+
- Added new publisher values for Cboe Titanium Cboe Global Indices Feed
7+
- Added `YEAR` to `SplitDuration` enum to support yearly historical batch job submission
8+
- Upgraded `databento-dbn` to 0.56.0:
9+
- Improved Python `DBNDecoder.decode()` performance with pre-allocated output buffers
10+
- Added `DBNDecoder.write_and_decode()` to combine write and decode in a single call
11+
312
## 0.76.0 - 2026-04-21
413

514
#### Enhancements

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ The library is fully compatible with distributions of Anaconda 2023.x and above.
3232
The minimum dependencies as found in the `pyproject.toml` are also listed below:
3333
- python = "^3.10"
3434
- aiohttp = "^3.8.3"
35-
- databento-dbn = "~0.55.0"
35+
- databento-dbn = "~0.56.0"
3636
- numpy = ">=1.23.5"
3737
- pandas = ">=1.5.3"
3838
- pip-system-certs = ">=4.0" (Windows only)

databento/common/dbnstore.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,7 @@ def __iter__(self) -> Generator[DBNRecord, None, None]:
391391
while True:
392392
raw = reader.read(DBNStore.DBN_READ_SIZE)
393393
if raw:
394-
decoder.write(raw)
395-
records = decoder.decode()
394+
records = decoder.write_and_decode(raw)
396395
for record in records:
397396
if isinstance(record, databento_dbn.Metadata):
398397
continue

databento/common/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class SplitDuration(StringyMixin, str, Enum):
134134
DAY = "day"
135135
WEEK = "week"
136136
MONTH = "month"
137+
YEAR = "year"
137138
NONE = "none"
138139

139140

databento/common/publishers.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ class Venue(StringyMixin, str, Enum):
126126
MX2 Options.
127127
IEXO
128128
IEX Options LLC.
129+
CGIF
130+
Cboe Global Indices Feed.
129131
130132
"""
131133

@@ -184,6 +186,7 @@ class Venue(StringyMixin, str, Enum):
184186
OCEA = "OCEA"
185187
MXTO = "MXTO"
186188
IEXO = "IEXO"
189+
CGIF = "CGIF"
187190

188191
@classmethod
189192
def from_int(cls, value: int) -> Venue:
@@ -300,6 +303,8 @@ def from_int(cls, value: int) -> Venue:
300303
return Venue.MXTO
301304
if value == 55:
302305
return Venue.IEXO
306+
if value == 56:
307+
return Venue.CGIF
303308
raise ValueError(f"Integer value {value} does not correspond with any Venue variant")
304309

305310
def to_int(self) -> int:
@@ -416,6 +421,8 @@ def to_int(self) -> int:
416421
return 54
417422
if self == Venue.IEXO:
418423
return 55
424+
if self == Venue.CGIF:
425+
return 56
419426
raise ValueError("Invalid Venue")
420427

421428
@property
@@ -533,6 +540,8 @@ def description(self) -> str:
533540
return "MX2 Options"
534541
if self == Venue.IEXO:
535542
return "IEX Options LLC"
543+
if self == Venue.CGIF:
544+
return "Cboe Global Indices Feed"
536545
raise ValueError("Unexpected Venue value")
537546

538547

@@ -624,6 +633,8 @@ class Dataset(StringyMixin, str, Enum):
624633
CFE Depth.
625634
OCEA_MEMOIR
626635
Blue Ocean ATS MEMOIR Depth.
636+
CGIF_TITANIUM
637+
Cboe Titanium Cboe Global Indices Feed.
627638
628639
"""
629640

@@ -668,6 +679,7 @@ class Dataset(StringyMixin, str, Enum):
668679
XEEE_EOBI = "XEEE.EOBI"
669680
XCBF_PITCH = "XCBF.PITCH"
670681
OCEA_MEMOIR = "OCEA.MEMOIR"
682+
CGIF_TITANIUM = "CGIF.TITANIUM"
671683

672684
@classmethod
673685
def from_int(cls, value: int) -> Dataset:
@@ -756,6 +768,8 @@ def from_int(cls, value: int) -> Dataset:
756768
return Dataset.XCBF_PITCH
757769
if value == 41:
758770
return Dataset.OCEA_MEMOIR
771+
if value == 42:
772+
return Dataset.CGIF_TITANIUM
759773
raise ValueError(f"Integer value {value} does not correspond with any Dataset variant")
760774

761775
def to_int(self) -> int:
@@ -844,6 +858,8 @@ def to_int(self) -> int:
844858
return 40
845859
if self == Dataset.OCEA_MEMOIR:
846860
return 41
861+
if self == Dataset.CGIF_TITANIUM:
862+
return 42
847863
raise ValueError("Invalid Dataset")
848864

849865
@property
@@ -933,6 +949,8 @@ def description(self) -> str:
933949
return "CFE Depth"
934950
if self == Dataset.OCEA_MEMOIR:
935951
return "Blue Ocean ATS MEMOIR Depth"
952+
if self == Dataset.CGIF_TITANIUM:
953+
return "Cboe Titanium Cboe Global Indices Feed"
936954
raise ValueError("Unexpected Dataset value")
937955

938956

@@ -1160,6 +1178,8 @@ class Publisher(StringyMixin, str, Enum):
11601178
OPRA - MEMX MX2 Options.
11611179
OPRA_PILLAR_IEXO
11621180
OPRA - IEX Options LLC.
1181+
CGIF_TITANIUM_CGIF
1182+
Cboe Global Indices Feed.
11631183
11641184
"""
11651185

@@ -1272,6 +1292,7 @@ class Publisher(StringyMixin, str, Enum):
12721292
OCEA_MEMOIR_OCEA = "OCEA.MEMOIR.OCEA"
12731293
OPRA_PILLAR_MXTO = "OPRA.PILLAR.MXTO"
12741294
OPRA_PILLAR_IEXO = "OPRA.PILLAR.IEXO"
1295+
CGIF_TITANIUM_CGIF = "CGIF.TITANIUM.CGIF"
12751296

12761297
@classmethod
12771298
def from_int(cls, value: int) -> Publisher:
@@ -1496,6 +1517,8 @@ def from_int(cls, value: int) -> Publisher:
14961517
return Publisher.OPRA_PILLAR_MXTO
14971518
if value == 109:
14981519
return Publisher.OPRA_PILLAR_IEXO
1520+
if value == 110:
1521+
return Publisher.CGIF_TITANIUM_CGIF
14991522
raise ValueError(f"Integer value {value} does not correspond with any Publisher variant")
15001523

15011524
def to_int(self) -> int:
@@ -1720,6 +1743,8 @@ def to_int(self) -> int:
17201743
return 108
17211744
if self == Publisher.OPRA_PILLAR_IEXO:
17221745
return 109
1746+
if self == Publisher.CGIF_TITANIUM_CGIF:
1747+
return 110
17231748
raise ValueError("Invalid Publisher")
17241749

17251750
@property
@@ -1945,6 +1970,8 @@ def venue(self) -> Venue:
19451970
return Venue.MXTO
19461971
if self == Publisher.OPRA_PILLAR_IEXO:
19471972
return Venue.IEXO
1973+
if self == Publisher.CGIF_TITANIUM_CGIF:
1974+
return Venue.CGIF
19481975
raise ValueError("Unexpected Publisher value")
19491976

19501977
@property
@@ -2170,6 +2197,8 @@ def dataset(self) -> Dataset:
21702197
return Dataset.OPRA_PILLAR
21712198
if self == Publisher.OPRA_PILLAR_IEXO:
21722199
return Dataset.OPRA_PILLAR
2200+
if self == Publisher.CGIF_TITANIUM_CGIF:
2201+
return Dataset.CGIF_TITANIUM
21732202
raise ValueError("Unexpected Publisher value")
21742203

21752204
@property
@@ -2395,4 +2424,6 @@ def description(self) -> str:
23952424
return "OPRA - MEMX MX2 Options"
23962425
if self == Publisher.OPRA_PILLAR_IEXO:
23972426
return "OPRA - IEX Options LLC"
2427+
if self == Publisher.CGIF_TITANIUM_CGIF:
2428+
return "Cboe Global Indices Feed"
23982429
raise ValueError("Unexpected Publisher value")

databento/historical/api/batch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def submit_job(
122122
`dbn`.
123123
split_symbols : bool, default False
124124
If files should be split by raw symbol. Cannot be requested with `'ALL_SYMBOLS'`.
125-
split_duration : SplitDuration or str {'day', 'week', 'month', 'none'}, default 'day'
125+
split_duration : SplitDuration or str {'day', 'week', 'month', 'year', 'none'}, default 'day'
126126
The maximum time duration before batched data is split into multiple files.
127127
A week starts on Sunday UTC.
128128
split_size : int, optional

databento/live/protocol.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ def buffer_updated(self, nbytes: int) -> None:
255255
256256
"""
257257
logger.debug("read %d bytes from remote gateway", nbytes)
258-
data = self.__buffer[:nbytes]
258+
data = bytes(memoryview(self.__buffer)[:nbytes])
259259

260260
if self.authenticated.done():
261261
self._process_dbn(data)
@@ -375,8 +375,7 @@ def _process_dbn(self, data: bytes) -> None:
375375
raise ValueError("not connected")
376376

377377
try:
378-
self._dbn_decoder.write(bytes(data))
379-
records = self._dbn_decoder.decode()
378+
records = self._dbn_decoder.write_and_decode(data)
380379
except Exception:
381380
logger.exception("error decoding DBN record")
382381
self.__transport.close()

databento/version.py

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

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "databento"
3-
version = "0.76.0"
3+
version = "0.77.0"
44
description = "Official Python client library for Databento"
55
readme = "README.md"
66
requires-python = ">=3.10"
@@ -10,7 +10,7 @@ dynamic = [ "classifiers" ]
1010
dependencies = [
1111
"aiohttp>=3.8.3,<4.0.0; python_version < '3.12'",
1212
"aiohttp>=3.9.0,<4.0.0; python_version >= '3.12'",
13-
"databento-dbn~=0.55.0",
13+
"databento-dbn~=0.56.0",
1414
"numpy>=1.23.5; python_version < '3.12'",
1515
"numpy>=1.26.0; python_version >= '3.12'",
1616
"pandas>=1.5.3,<4.0.0",

0 commit comments

Comments
 (0)