From aa86bf3e94644aed51e6de774c09ef1c56bc3b8b Mon Sep 17 00:00:00 2001 From: Siddha Kilaru Date: Wed, 22 Apr 2026 09:28:31 -0700 Subject: [PATCH 1/6] ADD: CGIF publisher definitions --- CHANGELOG.md | 5 +++++ databento/common/publishers.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 419d042..1c372d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### 0.77.0 - TBD + +##### Enhancements +- Added new publisher values for Cboe Titanium Cboe Global Indices Feed + ## 0.76.0 - 2026-04-21 #### Enhancements diff --git a/databento/common/publishers.py b/databento/common/publishers.py index 14634ae..f221cde 100644 --- a/databento/common/publishers.py +++ b/databento/common/publishers.py @@ -126,6 +126,8 @@ class Venue(StringyMixin, str, Enum): MX2 Options. IEXO IEX Options LLC. + CGIF + Cboe Global Indices Feed. """ @@ -184,6 +186,7 @@ class Venue(StringyMixin, str, Enum): OCEA = "OCEA" MXTO = "MXTO" IEXO = "IEXO" + CGIF = "CGIF" @classmethod def from_int(cls, value: int) -> Venue: @@ -300,6 +303,8 @@ def from_int(cls, value: int) -> Venue: return Venue.MXTO if value == 55: return Venue.IEXO + if value == 56: + return Venue.CGIF raise ValueError(f"Integer value {value} does not correspond with any Venue variant") def to_int(self) -> int: @@ -416,6 +421,8 @@ def to_int(self) -> int: return 54 if self == Venue.IEXO: return 55 + if self == Venue.CGIF: + return 56 raise ValueError("Invalid Venue") @property @@ -533,6 +540,8 @@ def description(self) -> str: return "MX2 Options" if self == Venue.IEXO: return "IEX Options LLC" + if self == Venue.CGIF: + return "Cboe Global Indices Feed" raise ValueError("Unexpected Venue value") @@ -624,6 +633,8 @@ class Dataset(StringyMixin, str, Enum): CFE Depth. OCEA_MEMOIR Blue Ocean ATS MEMOIR Depth. + CGIF_TITANIUM + Cboe Titanium Cboe Global Indices Feed. """ @@ -668,6 +679,7 @@ class Dataset(StringyMixin, str, Enum): XEEE_EOBI = "XEEE.EOBI" XCBF_PITCH = "XCBF.PITCH" OCEA_MEMOIR = "OCEA.MEMOIR" + CGIF_TITANIUM = "CGIF.TITANIUM" @classmethod def from_int(cls, value: int) -> Dataset: @@ -756,6 +768,8 @@ def from_int(cls, value: int) -> Dataset: return Dataset.XCBF_PITCH if value == 41: return Dataset.OCEA_MEMOIR + if value == 42: + return Dataset.CGIF_TITANIUM raise ValueError(f"Integer value {value} does not correspond with any Dataset variant") def to_int(self) -> int: @@ -844,6 +858,8 @@ def to_int(self) -> int: return 40 if self == Dataset.OCEA_MEMOIR: return 41 + if self == Dataset.CGIF_TITANIUM: + return 42 raise ValueError("Invalid Dataset") @property @@ -933,6 +949,8 @@ def description(self) -> str: return "CFE Depth" if self == Dataset.OCEA_MEMOIR: return "Blue Ocean ATS MEMOIR Depth" + if self == Dataset.CGIF_TITANIUM: + return "Cboe Titanium Cboe Global Indices Feed" raise ValueError("Unexpected Dataset value") @@ -1160,6 +1178,8 @@ class Publisher(StringyMixin, str, Enum): OPRA - MEMX MX2 Options. OPRA_PILLAR_IEXO OPRA - IEX Options LLC. + CGIF_TITANIUM_CGIF + Cboe Global Indices Feed. """ @@ -1272,6 +1292,7 @@ class Publisher(StringyMixin, str, Enum): OCEA_MEMOIR_OCEA = "OCEA.MEMOIR.OCEA" OPRA_PILLAR_MXTO = "OPRA.PILLAR.MXTO" OPRA_PILLAR_IEXO = "OPRA.PILLAR.IEXO" + CGIF_TITANIUM_CGIF = "CGIF.TITANIUM.CGIF" @classmethod def from_int(cls, value: int) -> Publisher: @@ -1496,6 +1517,8 @@ def from_int(cls, value: int) -> Publisher: return Publisher.OPRA_PILLAR_MXTO if value == 109: return Publisher.OPRA_PILLAR_IEXO + if value == 110: + return Publisher.CGIF_TITANIUM_CGIF raise ValueError(f"Integer value {value} does not correspond with any Publisher variant") def to_int(self) -> int: @@ -1720,6 +1743,8 @@ def to_int(self) -> int: return 108 if self == Publisher.OPRA_PILLAR_IEXO: return 109 + if self == Publisher.CGIF_TITANIUM_CGIF: + return 110 raise ValueError("Invalid Publisher") @property @@ -1945,6 +1970,8 @@ def venue(self) -> Venue: return Venue.MXTO if self == Publisher.OPRA_PILLAR_IEXO: return Venue.IEXO + if self == Publisher.CGIF_TITANIUM_CGIF: + return Venue.CGIF raise ValueError("Unexpected Publisher value") @property @@ -2170,6 +2197,8 @@ def dataset(self) -> Dataset: return Dataset.OPRA_PILLAR if self == Publisher.OPRA_PILLAR_IEXO: return Dataset.OPRA_PILLAR + if self == Publisher.CGIF_TITANIUM_CGIF: + return Dataset.CGIF_TITANIUM raise ValueError("Unexpected Publisher value") @property @@ -2395,4 +2424,6 @@ def description(self) -> str: return "OPRA - MEMX MX2 Options" if self == Publisher.OPRA_PILLAR_IEXO: return "OPRA - IEX Options LLC" + if self == Publisher.CGIF_TITANIUM_CGIF: + return "Cboe Global Indices Feed" raise ValueError("Unexpected Publisher value") From 998b94284e1693b972f92aac5e92a5b37aa361d4 Mon Sep 17 00:00:00 2001 From: Dane Rigby Date: Wed, 22 Apr 2026 12:20:00 -0500 Subject: [PATCH 2/6] ADD: Update clients to support year split --- CHANGELOG.md | 5 +++-- databento/common/enums.py | 1 + databento/historical/api/batch.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c372d3..2c3d94b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Changelog -### 0.77.0 - TBD +## 0.77.0 - TBD -##### Enhancements +#### Enhancements - Added new publisher values for Cboe Titanium Cboe Global Indices Feed +- Added `YEAR` to `SplitDuration` enum to support yearly historical batch job submission ## 0.76.0 - 2026-04-21 diff --git a/databento/common/enums.py b/databento/common/enums.py index dc2ae76..b23d0b0 100644 --- a/databento/common/enums.py +++ b/databento/common/enums.py @@ -134,6 +134,7 @@ class SplitDuration(StringyMixin, str, Enum): DAY = "day" WEEK = "week" MONTH = "month" + YEAR = "year" NONE = "none" diff --git a/databento/historical/api/batch.py b/databento/historical/api/batch.py index 6e4686f..be2009e 100644 --- a/databento/historical/api/batch.py +++ b/databento/historical/api/batch.py @@ -122,7 +122,7 @@ def submit_job( `dbn`. split_symbols : bool, default False If files should be split by raw symbol. Cannot be requested with `'ALL_SYMBOLS'`. - split_duration : SplitDuration or str {'day', 'week', 'month', 'none'}, default 'day' + split_duration : SplitDuration or str {'day', 'week', 'month', 'year', 'none'}, default 'day' The maximum time duration before batched data is split into multiple files. A week starts on Sunday UTC. split_size : int, optional From 72758c6c89b8832d6296fac65f191e513c30bf14 Mon Sep 17 00:00:00 2001 From: Carter Green Date: Mon, 27 Apr 2026 16:29:03 -0500 Subject: [PATCH 3/6] OPT: Optimize Python live decode path --- databento/live/protocol.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/databento/live/protocol.py b/databento/live/protocol.py index 4d06dcc..834221d 100644 --- a/databento/live/protocol.py +++ b/databento/live/protocol.py @@ -255,7 +255,7 @@ def buffer_updated(self, nbytes: int) -> None: """ logger.debug("read %d bytes from remote gateway", nbytes) - data = self.__buffer[:nbytes] + data = bytes(memoryview(self.__buffer)[:nbytes]) if self.authenticated.done(): self._process_dbn(data) @@ -375,7 +375,7 @@ def _process_dbn(self, data: bytes) -> None: raise ValueError("not connected") try: - self._dbn_decoder.write(bytes(data)) + self._dbn_decoder.write(data) records = self._dbn_decoder.decode() except Exception: logger.exception("error decoding DBN record") From 9f39a76931c9861ed529f21e73e449469536aa2f Mon Sep 17 00:00:00 2001 From: Nick Macholl Date: Tue, 28 Apr 2026 13:09:38 -0700 Subject: [PATCH 4/6] MOD: Upgrade databento_dbn to version 0.56.0 --- CHANGELOG.md | 3 +++ README.md | 2 +- pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c3d94b..e460b50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ #### Enhancements - Added new publisher values for Cboe Titanium Cboe Global Indices Feed - Added `YEAR` to `SplitDuration` enum to support yearly historical batch job submission +- Upgraded `databento-dbn` to 0.56.0: + - Improved Python `DBNDecoder.decode()` performance with pre-allocated output buffers + - Added `DBNDecoder.write_and_decode()` to combine write and decode in a single call ## 0.76.0 - 2026-04-21 diff --git a/README.md b/README.md index 5d75a7c..905046f 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ The library is fully compatible with distributions of Anaconda 2023.x and above. The minimum dependencies as found in the `pyproject.toml` are also listed below: - python = "^3.10" - aiohttp = "^3.8.3" -- databento-dbn = "~0.55.0" +- databento-dbn = "~0.56.0" - numpy = ">=1.23.5" - pandas = ">=1.5.3" - pip-system-certs = ">=4.0" (Windows only) diff --git a/pyproject.toml b/pyproject.toml index 613cb99..7bc7a7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ dynamic = [ "classifiers" ] dependencies = [ "aiohttp>=3.8.3,<4.0.0; python_version < '3.12'", "aiohttp>=3.9.0,<4.0.0; python_version >= '3.12'", - "databento-dbn~=0.55.0", + "databento-dbn~=0.56.0", "numpy>=1.23.5; python_version < '3.12'", "numpy>=1.26.0; python_version >= '3.12'", "pandas>=1.5.3,<4.0.0", From 075426e90df22db24ea4ee66bcc74d201cd3a694 Mon Sep 17 00:00:00 2001 From: Nick Macholl Date: Tue, 28 Apr 2026 14:31:24 -0700 Subject: [PATCH 5/6] MOD: Switch to `write_and_decode()` --- databento/common/dbnstore.py | 3 +-- databento/live/protocol.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/databento/common/dbnstore.py b/databento/common/dbnstore.py index 205bc04..b4cc674 100644 --- a/databento/common/dbnstore.py +++ b/databento/common/dbnstore.py @@ -391,8 +391,7 @@ def __iter__(self) -> Generator[DBNRecord, None, None]: while True: raw = reader.read(DBNStore.DBN_READ_SIZE) if raw: - decoder.write(raw) - records = decoder.decode() + records = decoder.write_and_decode(raw) for record in records: if isinstance(record, databento_dbn.Metadata): continue diff --git a/databento/live/protocol.py b/databento/live/protocol.py index 834221d..1bac003 100644 --- a/databento/live/protocol.py +++ b/databento/live/protocol.py @@ -375,8 +375,7 @@ def _process_dbn(self, data: bytes) -> None: raise ValueError("not connected") try: - self._dbn_decoder.write(data) - records = self._dbn_decoder.decode() + records = self._dbn_decoder.write_and_decode(data) except Exception: logger.exception("error decoding DBN record") self.__transport.close() From 667127e0c50e6bfa0672ff12249bb2f653e71d82 Mon Sep 17 00:00:00 2001 From: Nick Macholl Date: Tue, 28 Apr 2026 13:50:00 -0700 Subject: [PATCH 6/6] VER: Release 0.77.0 --- CHANGELOG.md | 2 +- databento/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e460b50..2c4b7e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.77.0 - TBD +## 0.77.0 - 2026-04-28 #### Enhancements - Added new publisher values for Cboe Titanium Cboe Global Indices Feed diff --git a/databento/version.py b/databento/version.py index 7df7f46..e2133e5 100644 --- a/databento/version.py +++ b/databento/version.py @@ -1 +1 @@ -__version__ = "0.76.0" +__version__ = "0.77.0" diff --git a/pyproject.toml b/pyproject.toml index 7bc7a7d..625937e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "databento" -version = "0.76.0" +version = "0.77.0" description = "Official Python client library for Databento" readme = "README.md" requires-python = ">=3.10"