Skip to content

Commit 4db7d59

Browse files
authored
✨ Allow deletion of fields on entries by key (#445)
1 parent 16b881c commit 4db7d59

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

bibtexparser/model.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,16 @@ def set_field(self, field: Field):
304304
else:
305305
self._fields.append(field)
306306

307+
def pop_field(self, key: str) -> Optional[Field]:
308+
"""Removes and returns the field with the given key, if present."""
309+
try:
310+
field = self.fields_dict.pop(key)
311+
except KeyError:
312+
return None
313+
314+
self._fields = [f for f in self._fields if f.key != key]
315+
return field
316+
307317
def __getitem__(self, key: str) -> Any:
308318
"""Dict-mimicking index.
309319
@@ -326,6 +336,14 @@ def __setitem__(self, key: str, value: Any):
326336
"""
327337
self.set_field(Field(key, value))
328338

339+
def __delitem__(self, key):
340+
"""Dict-mimicking index.
341+
342+
This serves for partial v1.x backwards compatibility,
343+
as well as for a shorthand for `pop_field`.
344+
"""
345+
self.pop_field(key)
346+
329347
def items(self):
330348
"""Dict-mimicking, for partial v1.x backwards compatibility.
331349

tests/test_model.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from copy import copy, deepcopy
22
from textwrap import dedent
33

4+
import pytest
5+
46
from bibtexparser.model import (
57
Entry,
68
ExplicitComment,
@@ -311,3 +313,9 @@ def test_entry_fields_shorthand():
311313
assert entry.fields_dict["myNewField"].key == "myNewField"
312314
assert entry.fields_dict["myNewField"].value == "new_value"
313315
assert entry.fields_dict["myNewField"].start_line is None
316+
317+
del entry["myNewField"]
318+
assert "myNewField" not in entry.fields_dict
319+
assert len([f for f in entry.fields if f.key == "myNewField"]) == 0
320+
with pytest.raises(KeyError):
321+
entry["myNewField"]

0 commit comments

Comments
 (0)