diff --git a/pyproject.toml b/pyproject.toml index 540f456..f03ce79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ line-length = 90 [tool.mypy] disallow_untyped_calls = true disallow_untyped_defs = true -exclude = ["tests/"] +exclude = ["tests/", "output/"] [tool.pytest.ini_options] log_level = "INFO" diff --git a/tests/sources/xml/test_marc.py b/tests/sources/xml/test_marc.py index b365755..fbc2f06 100644 --- a/tests/sources/xml/test_marc.py +++ b/tests/sources/xml/test_marc.py @@ -1349,6 +1349,16 @@ def test_get_literary_form_transforms_correctly_if_char_positions_blank(): assert Marc.get_literary_form(source_record) is None +def test_get_literary_form_returns_none_if_control_field_too_short(caplog): + caplog.set_level("DEBUG") + source_record = create_marc_source_record_stub( + control_field_insert='220613s ' + "|||||o||||||||||||d", + ) + assert Marc.get_literary_form(source_record) is None + assert "could not parse literary form" in caplog.text + + def test_get_links_success(): source_record = create_marc_source_record_stub( datafield_insert=( diff --git a/transmogrifier/sources/xml/marc.py b/transmogrifier/sources/xml/marc.py index bf51031..9461625 100644 --- a/transmogrifier/sources/xml/marc.py +++ b/transmogrifier/sources/xml/marc.py @@ -586,10 +586,20 @@ def get_literary_form(cls, source_record: Tag) -> str | None: and Leader/07 (Bibliographic level) contains code a (Monographic component part), c (Collection), d (Subunit), or m (Monograph). + + If control field 008 is shorter than 34 characters, return None as we cannot + accurately determine. """ leader_field = cls._get_leader_field(source_record) control_field = cls._get_control_field(source_record) if leader_field[6] in "at" and leader_field[7] in "acdm": + if len(control_field) <= 33: # noqa: PLR2004 + message = ( + f"Record ID '{cls.get_source_record_id(source_record)}' has less than" + "34 characters for control field 008, could not parse literary form." + ) + logger.debug(message) + return None if control_field[33] in "0se": return "Nonfiction" return "Fiction"