|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
3 | 3 | import os
|
| 4 | +import re |
4 | 5 | import inspect
|
5 | 6 | import functools
|
6 | 7 | from typing import Any, Mapping, TypeVar, Callable, Iterable, Sequence, cast, overload
|
7 | 8 | from pathlib import Path
|
8 | 9 | from typing_extensions import Required, Annotated, TypeGuard, get_args, get_origin
|
9 | 10 |
|
10 |
| -from .._types import NotGiven, FileTypes, NotGivenOr |
| 11 | +from .._types import Headers, NotGiven, FileTypes, NotGivenOr, HeadersLike |
11 | 12 | from .._compat import is_union as _is_union
|
12 | 13 | from .._compat import parse_date as parse_date
|
13 | 14 | from .._compat import parse_datetime as parse_datetime
|
@@ -351,3 +352,22 @@ def file_from_path(path: str) -> FileTypes:
|
351 | 352 | contents = Path(path).read_bytes()
|
352 | 353 | file_name = os.path.basename(path)
|
353 | 354 | return (file_name, contents)
|
| 355 | + |
| 356 | + |
| 357 | +def get_required_header(headers: HeadersLike, header: str) -> str: |
| 358 | + lower_header = header.lower() |
| 359 | + if isinstance(headers, Mapping): |
| 360 | + headers = cast(Headers, headers) |
| 361 | + for k, v in headers.items(): |
| 362 | + if k.lower() == lower_header and isinstance(v, str): |
| 363 | + return v |
| 364 | + |
| 365 | + """ to deal with the case where the header looks like Stainless-Event-Id """ |
| 366 | + intercaps_header = re.sub(r"([^\w])(\w)", lambda pat: pat.group(1) + pat.group(2).upper(), header.capitalize()) |
| 367 | + |
| 368 | + for normalized_header in [header, lower_header, header.upper(), intercaps_header]: |
| 369 | + value = headers.get(normalized_header) |
| 370 | + if value: |
| 371 | + return value |
| 372 | + |
| 373 | + raise ValueError(f"Could not find {header} header") |
0 commit comments