Skip to content

Commit 7bcff02

Browse files
committed
Preserve iterable middleware arguments
* Materialize one-shot middleware iterables before duplicate checks. * Exercise parse and unparse iterator inputs through the public API. * Correct unparse duplicate-warning terminology.
1 parent 08e370a commit 7bcff02

2 files changed

Lines changed: 42 additions & 5 deletions

File tree

bibtexparser/entrypoint.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def _build_parse_stack(
3131
if append_middleware is None:
3232
return list(parse_stack)
3333

34+
append_middleware = list(append_middleware)
3435
parse_stack_types = [type(m) for m in parse_stack]
3536
append_stack_types = {type(m) for m in append_middleware}
3637
stack_types_intersect = set(parse_stack_types).intersection(append_stack_types)
@@ -61,13 +62,14 @@ def _build_unparse_stack(
6162
if prepend_middleware is None:
6263
return list(unparse_stack)
6364

64-
parse_stack_types = [type(m) for m in unparse_stack]
65-
append_stack_types = {type(m) for m in prepend_middleware}
66-
stack_types_intersect = set(parse_stack_types).intersection(append_stack_types)
65+
prepend_middleware = list(prepend_middleware)
66+
unparse_stack_types = [type(m) for m in unparse_stack]
67+
prepend_stack_types = {type(m) for m in prepend_middleware}
68+
stack_types_intersect = set(unparse_stack_types).intersection(prepend_stack_types)
6769
if len(stack_types_intersect) > 0:
6870
warnings.warn(
69-
"Some middleware passed in append_middleware are "
70-
f"already in the default parse_stack ({stack_types_intersect})."
71+
"Some middleware passed in prepend_middleware are "
72+
f"already in the default unparse_stack ({stack_types_intersect})."
7173
)
7274

7375
return list(prepend_middleware) + list(unparse_stack)

tests/test_entrypoint.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,48 @@
77
import pytest
88

99
from bibtexparser import parse_file
10+
from bibtexparser import parse_string
1011
from bibtexparser import write_file
1112
from bibtexparser import write_string
1213
from bibtexparser.library import Library
14+
from bibtexparser.middlewares import NormalizeFieldKeys
15+
from bibtexparser.middlewares import SortFieldsCustomMiddleware
1316
from bibtexparser.model import Entry
1417
from bibtexparser.model import Field
1518

1619

20+
def test_parse_string_applies_append_middleware_from_iterator():
21+
"""One-shot middleware iterables must not be exhausted while checking duplicates."""
22+
middleware = iter([NormalizeFieldKeys()])
23+
24+
library = parse_string(
25+
"@article{test, TITLE = {Iterator middleware}}",
26+
append_middleware=middleware,
27+
)
28+
29+
assert library.entries[0].fields[0].key == "title"
30+
31+
32+
def test_write_string_applies_prepend_middleware_from_iterator():
33+
"""One-shot unparse middleware iterables must execute before the default stack."""
34+
library = Library(
35+
[
36+
Entry(
37+
entry_type="article",
38+
key="test",
39+
fields=[
40+
Field(key="title", value="Iterator middleware"),
41+
Field(key="year", value="2026"),
42+
],
43+
)
44+
]
45+
)
46+
middleware = iter([SortFieldsCustomMiddleware(order=("year", "title"))])
47+
48+
written = write_string(library, prepend_middleware=middleware)
49+
50+
assert written.index("\tyear") < written.index("\ttitle")
51+
1752
def test_gbk():
1853
library = parse_file("tests/resources/gbk_test.bib", encoding="gbk")
1954
assert library.entries[0]["author"] == "凯撒"

0 commit comments

Comments
 (0)