Skip to content

Commit 00e9655

Browse files
committed
Remove enum usage for header/trailer in smithy-http and aws-sdk-signers
1 parent 7878b12 commit 00e9655

8 files changed

Lines changed: 68 additions & 97 deletions

File tree

packages/aws-sdk-signers/src/aws_sdk_signers/_http.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def __init__(
3636
*,
3737
name: str,
3838
values: Iterable[str] | None = None,
39-
kind: interfaces_http.FieldPosition = interfaces_http.FieldPosition.HEADER,
39+
kind: interfaces_http.FieldPosition = "header",
4040
):
4141
self.name = name
4242
self.values: list[str] = list(values) if values is not None else []
@@ -92,7 +92,7 @@ def __eq__(self, other: object) -> bool:
9292
return False
9393
return (
9494
self.name == other.name
95-
and self.kind is other.kind
95+
and self.kind == other.kind
9696
and self.values == other.values
9797
)
9898

@@ -168,7 +168,7 @@ def get_by_type(
168168
169169
Used to grab all headers or all trailers.
170170
"""
171-
return [entry for entry in self.entries.values() if entry.kind is kind]
171+
return [entry for entry in self.entries.values() if entry.kind == kind]
172172

173173
def extend(self, other: interfaces_http.Fields) -> None:
174174
"""Merges ``entries`` of ``other`` into the current ``entries``.

packages/aws-sdk-signers/src/aws_sdk_signers/interfaces/http.py

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,18 @@
55

66
from collections import OrderedDict
77
from collections.abc import AsyncIterable, Iterable, Iterator
8-
from enum import Enum
9-
from typing import Protocol, runtime_checkable
8+
from typing import Literal, Protocol, runtime_checkable
109

10+
FieldPosition = Literal["header", "trailer"]
11+
"""The type of a field.
1112
12-
class FieldPosition(Enum):
13-
"""The type of a field.
13+
Defines its placement in a request or response.
1414
15-
Defines its placement in a request or response.
16-
"""
17-
18-
HEADER = 0
19-
"""Header field.
20-
21-
In HTTP this is a header as defined in RFC 9110 Section 6.3. Implementations of
22-
other protocols may use this FieldPosition for similar types of metadata.
23-
"""
24-
25-
TRAILER = 1
26-
"""Trailer field.
15+
header: Header field. In HTTP this is a header as defined in RFC 9110 Section 6.3.
16+
trailer: Trailer field. In HTTP this is a trailer as defined in RFC 9110 Section 6.5.
2717
28-
In HTTP this is a trailer as defined in RFC 9110 Section 6.5. Implementations of
29-
other protocols may use this FieldPosition for similar types of metadata.
30-
"""
18+
Implementations of other protocols may use this FieldPosition for similar types of metadata.
19+
"""
3120

3221

3322
class Field(Protocol):
@@ -43,7 +32,7 @@ class Field(Protocol):
4332

4433
name: str
4534
values: list[str]
46-
kind: FieldPosition = FieldPosition.HEADER
35+
kind: FieldPosition = "header"
4736

4837
def add(self, value: str) -> None:
4938
"""Append a value to a field."""

packages/aws-sdk-signers/tests/unit/test_fields.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,21 @@
33

44
import pytest
55
from aws_sdk_signers import Field, Fields
6-
from aws_sdk_signers.interfaces.http import FieldPosition
76

87

98
def test_field_single_valued_basics() -> None:
10-
field = Field(name="fname", values=["fval"], kind=FieldPosition.HEADER)
9+
field = Field(name="fname", values=["fval"], kind="header")
1110
assert field.name == "fname"
12-
assert field.kind == FieldPosition.HEADER
11+
assert field.kind == "header"
1312
assert field.values == ["fval"]
1413
assert field.as_string() == "fval"
1514
assert field.as_tuples() == [("fname", "fval")]
1615

1716

1817
def test_field_multi_valued_basics() -> None:
19-
field = Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER)
18+
field = Field(name="fname", values=["fval1", "fval2"], kind="header")
2019
assert field.name == "fname"
21-
assert field.kind == FieldPosition.HEADER
20+
assert field.kind == "header"
2221
assert field.values == ["fval1", "fval2"]
2322
assert field.as_string() == "fval1,fval2"
2423
assert field.as_tuples() == [("fname", "fval1"), ("fname", "fval2")]
@@ -62,16 +61,16 @@ def test_field_serialization(values: list[str], expected: str) -> None:
6261
"field,expected_repr",
6362
[
6463
(
65-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
66-
"Field(name='fname', value=['fval1', 'fval2'], kind=<FieldPosition.HEADER: 0>)",
64+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
65+
"Field(name='fname', value=['fval1', 'fval2'], kind='header')",
6766
),
6867
(
69-
Field(name="fname", kind=FieldPosition.TRAILER),
70-
"Field(name='fname', value=[], kind=<FieldPosition.TRAILER: 1>)",
68+
Field(name="fname", kind="trailer"),
69+
"Field(name='fname', value=[], kind='trailer')",
7170
),
7271
(
7372
Field(name="fname"),
74-
"Field(name='fname', value=[], kind=<FieldPosition.HEADER: 0>)",
73+
"Field(name='fname', value=[], kind='header')",
7574
),
7675
],
7776
)
@@ -83,8 +82,8 @@ def test_field_repr(field: Field, expected_repr: str) -> None:
8382
"f1,f2",
8483
[
8584
(
86-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
87-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
85+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
86+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
8887
),
8988
(
9089
Field(name="fname", values=["fval1", "fval2"]),
@@ -104,20 +103,20 @@ def test_field_equality(f1: Field, f2: Field) -> None:
104103
"f1,f2",
105104
[
106105
(
107-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
108-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
106+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
107+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
109108
),
110109
(
111-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
112-
Field(name="fname", values=["fval2", "fval1"], kind=FieldPosition.HEADER),
110+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
111+
Field(name="fname", values=["fval2", "fval1"], kind="header"),
113112
),
114113
(
115-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
116-
Field(name="fname", values=["fval1"], kind=FieldPosition.HEADER),
114+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
115+
Field(name="fname", values=["fval1"], kind="header"),
117116
),
118117
(
119-
Field(name="fname1", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
120-
Field(name="fname2", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
118+
Field(name="fname1", values=["fval1", "fval2"], kind="header"),
119+
Field(name="fname2", values=["fval1", "fval2"], kind="header"),
121120
),
122121
],
123122
)
@@ -211,7 +210,7 @@ def test_fields_length_value(fields: Fields, expected_length: int) -> None:
211210
Fields([Field(name="fname1")]),
212211
(
213212
"Fields(OrderedDict({'fname1': Field(name='fname1', value=[], "
214-
"kind=<FieldPosition.HEADER: 0>)}))"
213+
"kind='header')}))"
215214
),
216215
),
217216
],

packages/smithy-http/src/smithy_http/__init__.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def __init__(
2424
*,
2525
name: str,
2626
values: Iterable[str] | None = None,
27-
kind: FieldPosition = FieldPosition.HEADER,
27+
kind: FieldPosition = "header",
2828
):
2929
self.name = name
3030
self.values: list[str] = list(values) if values is not None else []
@@ -79,7 +79,7 @@ def __eq__(self, other: object) -> bool:
7979
return False
8080
return (
8181
self.name == other.name
82-
and self.kind is other.kind
82+
and self.kind == other.kind
8383
and self.values == other.values
8484
)
8585

@@ -153,7 +153,7 @@ def get_by_type(self, kind: FieldPosition) -> list[interfaces.Field]:
153153
154154
Used to grab all headers or all trailers.
155155
"""
156-
return [entry for entry in self.entries.values() if entry.kind is kind]
156+
return [entry for entry in self.entries.values() if entry.kind == kind]
157157

158158
def extend(self, other: interfaces.Fields) -> None:
159159
"""Merges ``entries`` of ``other`` into the current ``entries``.
@@ -225,8 +225,6 @@ def tuples_to_fields(
225225
try:
226226
fields[name].add(value)
227227
except KeyError:
228-
fields[name] = Field(
229-
name=name, values=[value], kind=kind or FieldPosition.HEADER
230-
)
228+
fields[name] = Field(name=name, values=[value], kind=kind or "header")
231229

232230
return fields

packages/smithy-http/src/smithy_http/aio/aiohttp.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
from .. import Field, Fields
3030
from ..interfaces import (
31-
FieldPosition,
3231
HTTPClientConfiguration,
3332
HTTPRequestConfiguration,
3433
)
@@ -125,7 +124,7 @@ async def _marshal_response(
125124
headers[header_name] = Field(
126125
name=header_name,
127126
values=[header_val],
128-
kind=FieldPosition.HEADER,
127+
kind="header",
129128
)
130129

131130
return HTTPResponse(

packages/smithy-http/src/smithy_http/aio/crt.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
from .. import Field, Fields
4242
from .. import interfaces as http_interfaces
4343
from ..exceptions import SmithyHTTPError
44-
from ..interfaces import FieldPosition
4544
from . import interfaces as http_aio_interfaces
4645

4746
# Default buffer size for reading from streams (8 KB)
@@ -203,7 +202,7 @@ async def _await_response(
203202
fields[header_name] = Field(
204203
name=header_name,
205204
values=[header_val],
206-
kind=FieldPosition.HEADER,
205+
kind="header",
207206
)
208207
return AWSCRTHTTPResponse(
209208
status=status_code,
@@ -294,8 +293,7 @@ def _marshal_request(
294293
request.fields.set_field(Field(name="accept", values=["*/*"]))
295294

296295
for fld in request.fields.entries.values():
297-
# TODO: Use literal values for "header"/"trailer".
298-
if fld.kind.value != FieldPosition.HEADER.value:
296+
if fld.kind != "header":
299297
continue
300298
for val in fld.values:
301299
headers_list.append((fld.name, val))

packages/smithy-http/src/smithy_http/interfaces/__init__.py

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,18 @@
22
# SPDX-License-Identifier: Apache-2.0
33
from collections.abc import Iterator
44
from dataclasses import dataclass
5-
from enum import Enum
6-
from typing import Protocol
5+
from typing import Literal, Protocol
76

7+
FieldPosition = Literal["header", "trailer"]
8+
"""The type of a field.
89
9-
class FieldPosition(Enum):
10-
"""The type of a field.
10+
Defines its placement in a request or response.
1111
12-
Defines its placement in a request or response.
13-
"""
14-
15-
HEADER = 0
16-
"""Header field.
17-
18-
In HTTP this is a header as defined in RFC 9110 Section 6.3. Implementations of
19-
other protocols may use this FieldPosition for similar types of metadata.
20-
"""
21-
22-
TRAILER = 1
23-
"""Trailer field.
12+
header: Header field. In HTTP this is a header as defined in RFC 9110 Section 6.3.
13+
trailer: Trailer field. In HTTP this is a trailer as defined in RFC 9110 Section 6.5.
2414
25-
In HTTP this is a trailer as defined in RFC 9110 Section 6.5. Implementations of
26-
other protocols may use this FieldPosition for similar types of metadata.
27-
"""
15+
Implementations of other protocols may use this FieldPosition for similar types of metadata.
16+
"""
2817

2918

3019
class Field(Protocol):
@@ -40,7 +29,7 @@ class Field(Protocol):
4029

4130
name: str
4231
values: list[str]
43-
kind: FieldPosition = FieldPosition.HEADER
32+
kind: FieldPosition = "header"
4433

4534
def add(self, value: str) -> None:
4635
"""Append a value to a field."""

packages/smithy-http/tests/unit/test_fields.py

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,21 @@
66

77
import pytest
88
from smithy_http import Field, Fields
9-
from smithy_http.interfaces import FieldPosition
109

1110

1211
def test_field_single_valued_basics() -> None:
13-
field = Field(name="fname", values=["fval"], kind=FieldPosition.HEADER)
12+
field = Field(name="fname", values=["fval"], kind="header")
1413
assert field.name == "fname"
15-
assert field.kind == FieldPosition.HEADER
14+
assert field.kind == "header"
1615
assert field.values == ["fval"]
1716
assert field.as_string() == "fval"
1817
assert field.as_tuples() == [("fname", "fval")]
1918

2019

2120
def test_field_multi_valued_basics() -> None:
22-
field = Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER)
21+
field = Field(name="fname", values=["fval1", "fval2"], kind="header")
2322
assert field.name == "fname"
24-
assert field.kind == FieldPosition.HEADER
23+
assert field.kind == "header"
2524
assert field.values == ["fval1", "fval2"]
2625
assert field.as_string() == "fval1, fval2"
2726
assert field.as_tuples() == [("fname", "fval1"), ("fname", "fval2")]
@@ -65,16 +64,16 @@ def test_field_serialization(values: list[str], expected: str):
6564
"field,expected_repr",
6665
[
6766
(
68-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
69-
"Field(name='fname', value=['fval1', 'fval2'], kind=<FieldPosition.HEADER: 0>)",
67+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
68+
"Field(name='fname', value=['fval1', 'fval2'], kind='header')",
7069
),
7170
(
72-
Field(name="fname", kind=FieldPosition.TRAILER),
73-
"Field(name='fname', value=[], kind=<FieldPosition.TRAILER: 1>)",
71+
Field(name="fname", kind="trailer"),
72+
"Field(name='fname', value=[], kind='trailer')",
7473
),
7574
(
7675
Field(name="fname"),
77-
"Field(name='fname', value=[], kind=<FieldPosition.HEADER: 0>)",
76+
"Field(name='fname', value=[], kind='header')",
7877
),
7978
],
8079
)
@@ -86,8 +85,8 @@ def test_field_repr(field: Field, expected_repr: str) -> None:
8685
"f1,f2",
8786
[
8887
(
89-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
90-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
88+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
89+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
9190
),
9291
(
9392
Field(name="fname", values=["fval1", "fval2"]),
@@ -107,20 +106,20 @@ def test_field_equality(f1: Field, f2: Field) -> None:
107106
"f1,f2",
108107
[
109108
(
110-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
111-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.TRAILER),
109+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
110+
Field(name="fname", values=["fval1", "fval2"], kind="trailer"),
112111
),
113112
(
114-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
115-
Field(name="fname", values=["fval2", "fval1"], kind=FieldPosition.HEADER),
113+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
114+
Field(name="fname", values=["fval2", "fval1"], kind="header"),
116115
),
117116
(
118-
Field(name="fname", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
119-
Field(name="fname", values=["fval1"], kind=FieldPosition.HEADER),
117+
Field(name="fname", values=["fval1", "fval2"], kind="header"),
118+
Field(name="fname", values=["fval1"], kind="header"),
120119
),
121120
(
122-
Field(name="fname1", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
123-
Field(name="fname2", values=["fval1", "fval2"], kind=FieldPosition.HEADER),
121+
Field(name="fname1", values=["fval1", "fval2"], kind="header"),
122+
Field(name="fname2", values=["fval1", "fval2"], kind="header"),
124123
),
125124
],
126125
)
@@ -214,7 +213,7 @@ def test_fields_length_value(fields: Fields, expected_length: int) -> None:
214213
Fields([Field(name="fname1")]),
215214
(
216215
"Fields(OrderedDict({'fname1': Field(name='fname1', value=[], "
217-
"kind=<FieldPosition.HEADER: 0>)}))"
216+
"kind='header')}))"
218217
),
219218
),
220219
],

0 commit comments

Comments
 (0)