Skip to content

Commit be8aadd

Browse files
authored
VER: Release 0.59.0
2 parents 40e8702 + 81774cd commit be8aadd

File tree

5 files changed

+52
-33
lines changed

5 files changed

+52
-33
lines changed

CHANGELOG.md

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

3+
## 0.59.0 - 2025-07-15
4+
5+
#### Enhancements
6+
- Upgraded `databento-dbn` to 0.37.1
7+
- Fix buffer growth in `DbnFsm::write_all()`, which is used by `DBNDecoder.write()`
8+
9+
#### Breaking changes
10+
- Renamed the following Venue, Dataset, and Publishers:
11+
- `XEER` to `XEEE`
12+
- `XEER.EOBI` to `XEEE.EOBI`
13+
- `XEER.EOBI.XEER` to `XEEE.EOBI.XEEE`
14+
- `XEER.EOBI.XOFF` to `XEEE.EOBI.XOFF`
15+
316
## 0.58.0 - 2025-07-08
417

518
#### Enhancements

databento/common/publishers.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class Venue(StringyMixin, str, Enum):
116116
ICE Europe Financials.
117117
XEUR
118118
Eurex Exchange.
119-
XEER
119+
XEEE
120120
European Energy Exchange.
121121
122122
"""
@@ -171,7 +171,7 @@ class Venue(StringyMixin, str, Enum):
171171
IFUS = "IFUS"
172172
IFLL = "IFLL"
173173
XEUR = "XEUR"
174-
XEER = "XEER"
174+
XEEE = "XEEE"
175175

176176
@classmethod
177177
def from_int(cls, value: int) -> Venue:
@@ -279,7 +279,7 @@ def from_int(cls, value: int) -> Venue:
279279
if value == 50:
280280
return Venue.XEUR
281281
if value == 51:
282-
return Venue.XEER
282+
return Venue.XEEE
283283
raise ValueError(f"Integer value {value} does not correspond with any Venue variant")
284284

285285
def to_int(self) -> int:
@@ -386,7 +386,7 @@ def to_int(self) -> int:
386386
return 49
387387
if self == Venue.XEUR:
388388
return 50
389-
if self == Venue.XEER:
389+
if self == Venue.XEEE:
390390
return 51
391391
raise ValueError("Invalid Venue")
392392

@@ -495,7 +495,7 @@ def description(self) -> str:
495495
return "ICE Europe Financials"
496496
if self == Venue.XEUR:
497497
return "Eurex Exchange"
498-
if self == Venue.XEER:
498+
if self == Venue.XEEE:
499499
return "European Energy Exchange"
500500
raise ValueError("Unexpected Venue value")
501501

@@ -582,7 +582,7 @@ class Dataset(StringyMixin, str, Enum):
582582
ICE Europe Financials iMpact.
583583
XEUR_EOBI
584584
Eurex EOBI.
585-
XEER_EOBI
585+
XEEE_EOBI
586586
European Energy Exchange EOBI.
587587
588588
"""
@@ -625,7 +625,7 @@ class Dataset(StringyMixin, str, Enum):
625625
IFUS_IMPACT = "IFUS.IMPACT"
626626
IFLL_IMPACT = "IFLL.IMPACT"
627627
XEUR_EOBI = "XEUR.EOBI"
628-
XEER_EOBI = "XEER.EOBI"
628+
XEEE_EOBI = "XEEE.EOBI"
629629

630630
@classmethod
631631
def from_int(cls, value: int) -> Dataset:
@@ -709,7 +709,7 @@ def from_int(cls, value: int) -> Dataset:
709709
if value == 38:
710710
return Dataset.XEUR_EOBI
711711
if value == 39:
712-
return Dataset.XEER_EOBI
712+
return Dataset.XEEE_EOBI
713713
raise ValueError(f"Integer value {value} does not correspond with any Dataset variant")
714714

715715
def to_int(self) -> int:
@@ -792,7 +792,7 @@ def to_int(self) -> int:
792792
return 37
793793
if self == Dataset.XEUR_EOBI:
794794
return 38
795-
if self == Dataset.XEER_EOBI:
795+
if self == Dataset.XEEE_EOBI:
796796
return 39
797797
raise ValueError("Invalid Dataset")
798798

@@ -877,7 +877,7 @@ def description(self) -> str:
877877
return "ICE Europe Financials iMpact"
878878
if self == Dataset.XEUR_EOBI:
879879
return "Eurex EOBI"
880-
if self == Dataset.XEER_EOBI:
880+
if self == Dataset.XEEE_EOBI:
881881
return "European Energy Exchange EOBI"
882882
raise ValueError("Unexpected Dataset value")
883883

@@ -1090,11 +1090,11 @@ class Publisher(StringyMixin, str, Enum):
10901090
ICE Europe Financials - Off-Market Trades.
10911091
XEUR_EOBI_XEUR
10921092
Eurex EOBI.
1093-
XEER_EOBI_XEER
1093+
XEEE_EOBI_XEEE
10941094
European Energy Exchange EOBI.
10951095
XEUR_EOBI_XOFF
10961096
Eurex EOBI - Off-Market Trades.
1097-
XEER_EOBI_XOFF
1097+
XEEE_EOBI_XOFF
10981098
European Energy Exchange EOBI - Off-Market Trades.
10991099
11001100
"""
@@ -1200,9 +1200,9 @@ class Publisher(StringyMixin, str, Enum):
12001200
IFLL_IMPACT_IFLL = "IFLL.IMPACT.IFLL"
12011201
IFLL_IMPACT_XOFF = "IFLL.IMPACT.XOFF"
12021202
XEUR_EOBI_XEUR = "XEUR.EOBI.XEUR"
1203-
XEER_EOBI_XEER = "XEER.EOBI.XEER"
1203+
XEEE_EOBI_XEEE = "XEEE.EOBI.XEEE"
12041204
XEUR_EOBI_XOFF = "XEUR.EOBI.XOFF"
1205-
XEER_EOBI_XOFF = "XEER.EOBI.XOFF"
1205+
XEEE_EOBI_XOFF = "XEEE.EOBI.XOFF"
12061206

12071207
@classmethod
12081208
def from_int(cls, value: int) -> Publisher:
@@ -1412,11 +1412,11 @@ def from_int(cls, value: int) -> Publisher:
14121412
if value == 101:
14131413
return Publisher.XEUR_EOBI_XEUR
14141414
if value == 102:
1415-
return Publisher.XEER_EOBI_XEER
1415+
return Publisher.XEEE_EOBI_XEEE
14161416
if value == 103:
14171417
return Publisher.XEUR_EOBI_XOFF
14181418
if value == 104:
1419-
return Publisher.XEER_EOBI_XOFF
1419+
return Publisher.XEEE_EOBI_XOFF
14201420
raise ValueError(f"Integer value {value} does not correspond with any Publisher variant")
14211421

14221422
def to_int(self) -> int:
@@ -1625,11 +1625,11 @@ def to_int(self) -> int:
16251625
return 100
16261626
if self == Publisher.XEUR_EOBI_XEUR:
16271627
return 101
1628-
if self == Publisher.XEER_EOBI_XEER:
1628+
if self == Publisher.XEEE_EOBI_XEEE:
16291629
return 102
16301630
if self == Publisher.XEUR_EOBI_XOFF:
16311631
return 103
1632-
if self == Publisher.XEER_EOBI_XOFF:
1632+
if self == Publisher.XEEE_EOBI_XOFF:
16331633
return 104
16341634
raise ValueError("Invalid Publisher")
16351635

@@ -1840,11 +1840,11 @@ def venue(self) -> Venue:
18401840
return Venue.XOFF
18411841
if self == Publisher.XEUR_EOBI_XEUR:
18421842
return Venue.XEUR
1843-
if self == Publisher.XEER_EOBI_XEER:
1844-
return Venue.XEER
1843+
if self == Publisher.XEEE_EOBI_XEEE:
1844+
return Venue.XEEE
18451845
if self == Publisher.XEUR_EOBI_XOFF:
18461846
return Venue.XOFF
1847-
if self == Publisher.XEER_EOBI_XOFF:
1847+
if self == Publisher.XEEE_EOBI_XOFF:
18481848
return Venue.XOFF
18491849
raise ValueError("Unexpected Publisher value")
18501850

@@ -2055,12 +2055,12 @@ def dataset(self) -> Dataset:
20552055
return Dataset.IFLL_IMPACT
20562056
if self == Publisher.XEUR_EOBI_XEUR:
20572057
return Dataset.XEUR_EOBI
2058-
if self == Publisher.XEER_EOBI_XEER:
2059-
return Dataset.XEER_EOBI
2058+
if self == Publisher.XEEE_EOBI_XEEE:
2059+
return Dataset.XEEE_EOBI
20602060
if self == Publisher.XEUR_EOBI_XOFF:
20612061
return Dataset.XEUR_EOBI
2062-
if self == Publisher.XEER_EOBI_XOFF:
2063-
return Dataset.XEER_EOBI
2062+
if self == Publisher.XEEE_EOBI_XOFF:
2063+
return Dataset.XEEE_EOBI
20642064
raise ValueError("Unexpected Publisher value")
20652065

20662066
@property
@@ -2270,10 +2270,10 @@ def description(self) -> str:
22702270
return "ICE Europe Financials - Off-Market Trades"
22712271
if self == Publisher.XEUR_EOBI_XEUR:
22722272
return "Eurex EOBI"
2273-
if self == Publisher.XEER_EOBI_XEER:
2273+
if self == Publisher.XEEE_EOBI_XEEE:
22742274
return "European Energy Exchange EOBI"
22752275
if self == Publisher.XEUR_EOBI_XOFF:
22762276
return "Eurex EOBI - Off-Market Trades"
2277-
if self == Publisher.XEER_EOBI_XOFF:
2277+
if self == Publisher.XEEE_EOBI_XOFF:
22782278
return "European Energy Exchange EOBI - Off-Market Trades"
22792279
raise ValueError("Unexpected Publisher value")

databento/historical/api/batch.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
logger = logging.getLogger(__name__)
4949

50-
BATCH_DOWNLOAD_MAX_RETRIES: Final = 3
50+
BATCH_DOWNLOAD_MAX_RETRIES: Final = 5
5151

5252

5353
class BatchHttpAPI(BentoHttpAPI):
@@ -457,6 +457,11 @@ def _download_batch_file(
457457
with open(output_path, mode=mode) as f:
458458
for chunk in response.iter_content(chunk_size=HTTP_STREAMING_READ_SIZE):
459459
f.write(chunk)
460+
461+
# Successfully wrote some data, reset attempts counter
462+
if attempts > 0:
463+
attempts = 0
464+
logger.info(f"Resumed download of {output_path.name}.")
460465
except BentoHttpError as exc:
461466
if exc.http_status == 429:
462467
wait_time = int(exc.headers.get("Retry-After", 1))
@@ -465,10 +470,11 @@ def _download_batch_file(
465470
raise
466471
except Exception as exc:
467472
if attempts < BATCH_DOWNLOAD_MAX_RETRIES:
473+
attempts += 1
468474
logger.error(
469-
f"Retrying download of {output_path.name} due to error: {exc}",
475+
f"Retrying download of {output_path.name} due to error, "
476+
f"{attempts}/{BATCH_DOWNLOAD_MAX_RETRIES}: {exc}",
470477
)
471-
attempts += 1
472478
continue # try again
473479
raise BentoError(f"Error downloading file: {exc}") from None
474480
else:

databento/version.py

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

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "databento"
3-
version = "0.58.0"
3+
version = "0.59.0"
44
description = "Official Python client library for Databento"
55
authors = [
66
"Databento <[email protected]>",
@@ -32,7 +32,7 @@ aiohttp = [
3232
{version = "^3.8.3", python = "<3.12"},
3333
{version = "^3.9.0", python = "^3.12"}
3434
]
35-
databento-dbn = "~=0.36.2"
35+
databento-dbn = "~=0.37.1"
3636
numpy = [
3737
{version = ">=1.23.5", python = "<3.12"},
3838
{version = ">=1.26.0", python = "^3.12"}

0 commit comments

Comments
 (0)