diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 120d0b8..0000000 --- a/.coveragerc +++ /dev/null @@ -1,7 +0,0 @@ -[run] -branch = True -omit = */build/*,tests/*,main.py -[report] -exclude_lines = - pragma: no cover - raise NotImplementedError.* diff --git a/pyproject.toml b/pyproject.toml index 9ea1281..550e45b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,3 +71,67 @@ markers = [ "integration: marks tests as integration tests (deselect with '-m \"not integration\"')", ] +[tool.coverage.run] +source = ["src"] +branch = true +omit = [ + "*/tests/*", + "*/test_*.py", + "*/__pycache__/*", + "*/.venv/*", + "*/site-packages/*", + "test.py", +] + +[tool.coverage.report] +precision = 2 +show_missing = true +skip_covered = false +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "raise AssertionError", + "raise NotImplementedError", + "if __name__ == .__main__.", + "if TYPE_CHECKING:", + "@abstractmethod", + "@abc.abstractmethod", +] + +[tool.coverage.html] +directory = "htmlcov" + +[tool.mypy] +python_version = "3.13" +warn_return_any = true +warn_unused_configs = true +disallow_untyped_defs = false +disallow_incomplete_defs = false +check_untyped_defs = true +no_implicit_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_no_return = true +strict_equality = true + +[[tool.mypy.overrides]] +module = "tests.*" +ignore_errors = true + +[[tool.mypy.overrides]] +module = [ + "regex.*", + "requests.*", + "bs4.*", + "ratelimit.*", + "pytest.*", + "pytest_mock.*", + "bibapi._transformers", + "bibapi.webrequest", + "bibapi.catalogue", + "bibapi.lehmanns", + "bibapi.schemas.bookdata", + "bibapi.sru", +] +ignore_missing_imports = true +ignore_errors = true diff --git a/src/bibapi/_transformers.py b/src/bibapi/_transformers.py index e55e8e1..f12756a 100644 --- a/src/bibapi/_transformers.py +++ b/src/bibapi/_transformers.py @@ -6,7 +6,9 @@ from dataclasses import dataclass from dataclasses import field as dataclass_field from typing import Any -from src.bibapi.schemas.bookdata import BookData +from regex import sub + +from .schemas.bookdata import BookData @dataclass diff --git a/src/bibapi/schemas/api_types.py b/src/bibapi/schemas/api_types.py index 5773268..93e3d75 100644 --- a/src/bibapi/schemas/api_types.py +++ b/src/bibapi/schemas/api_types.py @@ -14,6 +14,7 @@ class PicaSchema(Enum): AUTHOR = "pica.per" YEAR = "pica.jhr" AUTHOR_SCHEMA = "NoSpaceAfterComma" + LIBRARY = "pica.bib" ENCLOSE_TITLE_IN_QUOTES = False diff --git a/src/bibapi/webrequest.py b/src/bibapi/webrequest.py index 1d996e3..7235861 100644 --- a/src/bibapi/webrequest.py +++ b/src/bibapi/webrequest.py @@ -11,7 +11,7 @@ from bs4 import BeautifulSoup # import sleep_and_retry decorator to retry requests from ratelimit import limits, sleep_and_retry -from src.bibapi._transformers import ( +from ._transformers import ( RDS_AVAIL_DATA, RDS_GENERIC_DATA, ARRAYData, @@ -22,7 +22,7 @@ from src.bibapi._transformers import ( ) if TYPE_CHECKING: - from src.bibapi.schemas.bookdata import BookData + from .schemas.bookdata import BookData API_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndexrecord/{}/" PPN_URL = "https://rds.ibs-bw.de/phfreiburg/opac/RDSIndex/Search?type0%5B%5D=allfields&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=au&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ti&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ct&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=isn&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=ta&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=co&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=py&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pp&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=pu&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=si&lookfor0%5B%5D={}&join=AND&bool0%5B%5D=AND&type0%5B%5D=zr&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND&type0%5B%5D=cc&lookfor0%5B%5D=&join=AND&bool0%5B%5D=AND" diff --git a/tests/test_sru.py b/tests/test_sru.py index c991102..29852a8 100644 --- a/tests/test_sru.py +++ b/tests/test_sru.py @@ -20,10 +20,9 @@ from src.bibapi import SWB # --- Integration test (requires network) --- -@pytest.mark.integration def test_swb_schema() -> None: """Integration test that requires network access.""" - result = SWB().getBooks(["pica.tit=Java ist auch eine Insel", "pica.bib=20735"]) + result = SWB().getBooks(["TITLE=Java ist auch eine Insel", "LIBRARY=20735"]) assert len(result) == 1 assert result[0].title == "Java ist auch eine Insel" diff --git a/tests/test_webrequest.py b/tests/test_webrequest.py index 35224da..2d69d68 100644 --- a/tests/test_webrequest.py +++ b/tests/test_webrequest.py @@ -37,7 +37,7 @@ class TestWebRequest: mock_response.text = "192.168.1.1" # Not in ALLOWED_IPS mock_get.return_value = mock_response - with pytest.raises(PermissionError, match="IP not allowed"): + with pytest.raises(PermissionError, match="not allowed"): WebRequest() def test_webrequest_init_allowed_ip(self):