Skip to content

Commit 72475d3

Browse files
committed
ADD: Add dataset conditions method to client and HTTP docs
1 parent e6977d9 commit 72475d3

File tree

10 files changed

+208
-21
lines changed

10 files changed

+208
-21
lines changed

databento/common/parsing.py

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def enum_or_str_lowercase(
1111
param: str,
1212
) -> str:
1313
"""
14-
Return the given value parsed to a lowercase string if possible.
14+
Return the given value parsed to a lowercase string.
1515
1616
Parameters
1717
----------
@@ -44,7 +44,7 @@ def maybe_enum_or_str_lowercase(
4444
param: str,
4545
) -> Optional[str]:
4646
"""
47-
Return the given value parsed to a lowercase string if possible.
47+
Return the given value parsed to a lowercase string (if not `None`).
4848
4949
Parameters
5050
----------
@@ -68,6 +68,68 @@ def maybe_enum_or_str_lowercase(
6868
return enum_or_str_lowercase(value, param)
6969

7070

71+
def enum_or_str_uppercase(
72+
value: Union[Enum, str],
73+
param: str,
74+
) -> str:
75+
"""
76+
Return the given value parsed to an uppercase string.
77+
78+
Parameters
79+
----------
80+
value : Enum or str
81+
The value to parse.
82+
param : str
83+
The name of the parameter being validated (for any error message).
84+
85+
Returns
86+
-------
87+
str
88+
89+
Raises
90+
------
91+
TypeError
92+
If value is not of type NoneType, Enum or str.
93+
94+
"""
95+
if isinstance(value, Enum):
96+
return value.value.upper()
97+
elif isinstance(value, str):
98+
if not value.isspace():
99+
return value.upper()
100+
101+
raise TypeError(f"invalid `{param}` type, was {type(value)}.")
102+
103+
104+
def maybe_enum_or_str_uppercase(
105+
value: Optional[Union[Enum, str]],
106+
param: str,
107+
) -> Optional[str]:
108+
"""
109+
Return the given value parsed to an uppercase string (if not `None`).
110+
111+
Parameters
112+
----------
113+
value : Enum or str, optional
114+
The value to parse.
115+
param : str
116+
The name of the parameter being validated (for any error message).
117+
118+
Returns
119+
-------
120+
str or ``None``
121+
122+
Raises
123+
------
124+
TypeError
125+
If value is not of type NoneType, Enum or str.
126+
127+
"""
128+
if value is None:
129+
return value
130+
return enum_or_str_uppercase(value, param)
131+
132+
71133
def values_list_to_string(
72134
values: Union[Iterable[str], str],
73135
) -> str:

databento/historical/api/metadata.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pandas as pd
55
from databento.common.enums import Dataset, Encoding, FeedMode, Schema, SType
66
from databento.common.parsing import (
7-
enum_or_str_lowercase,
7+
enum_or_str_uppercase,
88
maybe_date_to_string,
99
maybe_datetime_to_string,
1010
maybe_enum_or_str_lowercase,
@@ -81,6 +81,46 @@ def list_datasets(
8181
)
8282
return response.json()
8383

84+
def list_dataset_conditions(
85+
self,
86+
dataset: Union[Dataset, str],
87+
start_date: Union[date, str],
88+
end_date: Union[date, str],
89+
) -> List[str]:
90+
"""
91+
Request the dataset conditions per date from Databento.
92+
93+
Makes a `GET /metadata.list_dataset_conditions` HTTP request.
94+
95+
Use this method to discover data availability and qualility.
96+
97+
Parameters
98+
----------
99+
dataset : Dataset or str
100+
The dataset code (string identifier) for the request.
101+
start_date : date or str
102+
The start date (UTC) for the request range.
103+
end_date : date or str
104+
The end date (UTC) for the request range.
105+
106+
Returns
107+
-------
108+
List[str]
109+
110+
"""
111+
params: List[Tuple[str, Optional[str]]] = [
112+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
113+
("start_date", str(pd.to_datetime(start_date).date())),
114+
("end_date", str(pd.to_datetime(end_date).date())),
115+
]
116+
117+
response: Response = self._get(
118+
url=self._base_url + ".list_dataset_conditions",
119+
params=params,
120+
basic_auth=True,
121+
)
122+
return response.json()
123+
84124
def list_schemas(
85125
self,
86126
dataset: Optional[Union[Dataset, str]] = None,
@@ -107,7 +147,7 @@ def list_schemas(
107147
108148
"""
109149
params: List[Tuple[str, Optional[str]]] = [
110-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
150+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
111151
("start_date", maybe_date_to_string(start_date)),
112152
("end_date", maybe_date_to_string(end_date)),
113153
]
@@ -152,7 +192,7 @@ def list_fields(
152192
validate_maybe_enum(encoding, Encoding, "encoding")
153193

154194
params: List[Tuple[str, str]] = [
155-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
195+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
156196
("schema", maybe_enum_or_str_lowercase(schema, "schema")),
157197
("encoding", maybe_enum_or_str_lowercase(encoding, "encoding")),
158198
]
@@ -229,7 +269,7 @@ def list_unit_prices(
229269
validate_maybe_enum(mode, FeedMode, "mode")
230270

231271
params: List[Tuple[str, Optional[str]]] = [
232-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
272+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
233273
("mode", maybe_enum_or_str_lowercase(mode, "mode")),
234274
("schema", maybe_enum_or_str_lowercase(schema, "schema")),
235275
]
@@ -290,7 +330,7 @@ def get_record_count(
290330
validate_enum(stype_in, SType, "stype_in")
291331

292332
params: List[Tuple[str, Optional[str]]] = [
293-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
333+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
294334
("symbols", maybe_symbols_list_to_string(symbols)),
295335
("schema", Schema(schema).value),
296336
("start", maybe_datetime_to_string(start)),

databento/historical/api/symbology.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
import pandas as pd
55
from databento.common.enums import SType
6-
from databento.common.parsing import enum_or_str_lowercase, maybe_symbols_list_to_string
6+
from databento.common.parsing import (
7+
enum_or_str_lowercase,
8+
enum_or_str_uppercase,
9+
maybe_symbols_list_to_string,
10+
)
711
from databento.historical.api import API_VERSION
812
from databento.historical.http import BentoHttpAPI
913
from requests import Response
@@ -58,7 +62,7 @@ def resolve(
5862
5963
"""
6064
params: List[Tuple[str, Optional[str]]] = [
61-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
65+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
6266
("symbols", maybe_symbols_list_to_string(symbols)),
6367
("stype_in", enum_or_str_lowercase(stype_in, "stype_in")),
6468
("stype_out", enum_or_str_lowercase(stype_out, "stype_out")),

databento/historical/http.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from databento.common.logging import log_info
1313
from databento.common.parsing import (
1414
datetime_to_string,
15-
enum_or_str_lowercase,
15+
enum_or_str_uppercase,
1616
maybe_symbols_list_to_string,
1717
)
1818
from databento.historical.error import BentoClientError, BentoServerError
@@ -51,7 +51,7 @@ def _timeseries_params(
5151
stype_out: SType = SType.PRODUCT_ID,
5252
) -> List[Tuple[str, Optional[str]]]:
5353
params: List[Tuple[str, Any]] = [
54-
("dataset", enum_or_str_lowercase(dataset, "dataset")),
54+
("dataset", enum_or_str_uppercase(dataset, "dataset")),
5555
("start", datetime_to_string(start)),
5656
("end", datetime_to_string(end)),
5757
("symbols", maybe_symbols_list_to_string(symbols) or "*"),

databento/version.py

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

tests/test_common_parsing.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
from databento.common.enums import Dataset, Flags
99
from databento.common.parsing import (
1010
enum_or_str_lowercase,
11+
enum_or_str_uppercase,
1112
maybe_date_to_string,
1213
maybe_datetime_to_string,
1314
maybe_enum_or_str_lowercase,
15+
maybe_enum_or_str_uppercase,
1416
maybe_symbols_list_to_string,
1517
maybe_values_list_to_string,
1618
parse_flags,
@@ -69,6 +71,52 @@ def test_maybe_enum_or_str_lowercase_returns_expected_outputs(
6971
# Arrange, Act, Assert
7072
assert maybe_enum_or_str_lowercase(value, "param") == expected
7173

74+
def test_enum_or_str_uppercase_given_none_raises_type_error(self) -> None:
75+
# Arrange, Act, Assert
76+
with pytest.raises(TypeError):
77+
enum_or_str_uppercase(None, "param") # noqa (passing None for test)
78+
79+
def test_enum_or_str_uppercase_given_incorrect_type_raises_type_error(self) -> None:
80+
# Arrange, Act, Assert
81+
with pytest.raises(TypeError):
82+
enum_or_str_uppercase(INCORRECT_TYPE, "param")
83+
84+
@pytest.mark.parametrize(
85+
"value, expected",
86+
[
87+
["abc", "ABC"],
88+
["ABC", "ABC"],
89+
[Dataset.GLBX_MDP3, "GLBX.MDP3"],
90+
],
91+
)
92+
def test_enum_or_str_uppercase_returns_expected_outputs(
93+
self, value: Union[Enum, str], expected: str
94+
) -> None:
95+
# Arrange, Act, Assert
96+
assert enum_or_str_uppercase(value, "param") == expected
97+
98+
def test_maybe_enum_or_str_uppercase_given_incorrect_types_raises_error(
99+
self,
100+
) -> None:
101+
# Arrange, Act, Assert
102+
with pytest.raises(TypeError):
103+
maybe_enum_or_str_lowercase(INCORRECT_TYPE, "param")
104+
105+
@pytest.mark.parametrize(
106+
"value, expected",
107+
[
108+
[None, None],
109+
["abc", "ABC"],
110+
["ABC", "ABC"],
111+
[Dataset.GLBX_MDP3, "GLBX.MDP3"],
112+
],
113+
)
114+
def test_maybe_enum_or_str_uppercase_returns_expected_outputs(
115+
self, value: Optional[Union[Enum, str]], expected: Optional[str]
116+
) -> None:
117+
# Arrange, Act, Assert
118+
assert maybe_enum_or_str_uppercase(value, "param") == expected
119+
72120
def test_maybe_values_list_to_string_given_invalid_input_raises_type_error(
73121
self,
74122
) -> None:

tests/test_historical_batch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def test_batch_submit_job_sends_expected_request(
8383
v in call["headers"]["user-agent"] for v in ("Databento/", "Python/")
8484
)
8585
assert call["params"] == [
86-
("dataset", "glbx.mdp3"),
86+
("dataset", "GLBX.MDP3"),
8787
("start", "2020-12-28T12:00:00"),
8888
("end", "2020-12-29T00:00:00"),
8989
("symbols", "ESH1"),

tests/test_historical_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_re_request_symbology_makes_expected_request(
7979
== f"https://hist.databento.com/v{db.API_VERSION}/symbology.resolve"
8080
)
8181
assert call["params"] == [
82-
("dataset", "glbx.mdp3"),
82+
("dataset", "GLBX.MDP3"),
8383
("symbols", "ESH1"),
8484
("stype_in", "native"),
8585
("stype_out", "product_id"),
@@ -117,7 +117,7 @@ def test_request_full_definitions_expected_request(
117117
== f"https://hist.databento.com/v{db.API_VERSION}/timeseries.stream"
118118
)
119119
assert call["params"] == [
120-
("dataset", "glbx.mdp3"),
120+
("dataset", "GLBX.MDP3"),
121121
("start", "2020-12-28T13:00:00+00:00"),
122122
("end", "2020-12-29T00:00:00+00:00"),
123123
("symbols", "ESH1"),

0 commit comments

Comments
 (0)