{"library":"pycobertura","title":"pycobertura","description":"pycobertura is a Python library and command-line tool for parsing Cobertura XML coverage reports. It can display, filter, and diff coverage reports, highlighting changes in coverage metrics between two reports. The current version is 4.1.0, and it maintains an active, moderate release cadence, with major versions typically aligning with Python version support or significant API changes.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install pycobertura"],"cli":{"name":"pycobertura","version":"Usage: pycobertura [OPTIONS] COMMAND [ARGS]..."}},"imports":["from pycobertura import Cobertura","from pycobertura import diff","from pycobertura.reporters import HtmlReporter"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import io\nfrom pycobertura import Cobertura, diff\n\n# Example Cobertura XML content\ncobertura_xml_baseline = '''<?xml version=\"1.0\" ?>\n<coverage branches-covered=\"0\" branches-valid=\"0\" complexity=\"0\" line-rate=\"0.5\" lines-covered=\"1\" lines-valid=\"2\" timestamp=\"1678886400\" version=\"coverage 6.0.0\">\n    <sources>\n        <source>/path/to/project</source>\n    </sources>\n    <packages>\n        <package line-rate=\"0.5\" branch-rate=\"0\" complexity=\"0\" name=\"my_module\">\n            <classes>\n                <class name=\"my_file.py\" filename=\"my_module/my_file.py\" line-rate=\"0.5\" branch-rate=\"0\" complexity=\"0\">\n                    <methods/>\n                    <lines>\n                        <line number=\"1\" hits=\"1\"/>\n                        <line number=\"2\" hits=\"0\"/>\n                    </lines>\n                </class>\n            </classes>\n        </package>\n    </packages>\n</coverage>'''\n\ncobertura_xml_current = '''<?xml version=\"1.0\" ?>\n<coverage branches-covered=\"0\" branches-valid=\"0\" complexity=\"0\" line-rate=\"1.0\" lines-covered=\"2\" lines-valid=\"2\" timestamp=\"1678886500\" version=\"coverage 6.0.0\">\n    <sources>\n        <source>/path/to/project</source>\n    </sources>\n    <packages>\n        <package line-rate=\"1.0\" branch-rate=\"0\" complexity=\"0\" name=\"my_module\">\n            <classes>\n                <class name=\"my_file.py\" filename=\"my_module/my_file.py\" line-rate=\"1.0\" branch-rate=\"0\" complexity=\"0\">\n                    <methods/>\n                    <lines>\n                        <line number=\"1\" hits=\"1\"/>\n                        <line number=\"2\" hits=\"1\"/>\n                    </lines>\n                </class>\n            </classes>\n        </package>\n    </packages>\n</coverage>'''\n\n# Parse the Cobertura reports\n# Cobertura can take a filename (string) or a string containing the XML\nbaseline_report = Cobertura(cobertura_xml_baseline)\ncurrent_report = Cobertura(cobertura_xml_current)\n\nprint(f\"Baseline report line rate: {baseline_report.line_rate:.2f}\")\nprint(f\"Current report line rate: {current_report.line_rate:.2f}\")\n\n# Calculate the diff between the two reports\ndifferences = diff(baseline_report, current_report)\n\nprint(\"\\n--- Coverage Differences ---\")\nfor file_path, file_diff in differences.files.items():\n    print(f\"File: {file_path}\")\n    print(f\"  Line rate change: {file_diff.line_rate_change:.2f}\")\n    print(f\"  Lines covered change: {file_diff.lines_covered_change}\")\n    print(f\"  Lines valid change: {file_diff.lines_valid_change}\")\n\n# Access changes for specific lines if available\nif 'my_module/my_file.py' in differences.files:\n    file_lines_changes = differences.files['my_module/my_file.py'].lines\n    for line_number, status in file_lines_changes.items():\n        print(f\"  Line {line_number}: {status.name}\") # e.g., NO_CHANGE, COVERED, UNCOVERED_NEW","lang":"python","description":"This quickstart demonstrates how to parse Cobertura XML reports using the `Cobertura` class and then how to compute and display the differences in coverage between two reports using the `diff` function. It uses in-memory XML strings for simplicity, but `Cobertura` can also load directly from file paths.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"4.1.0","pypi_latest":"4.1.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.7,"avg_import_s":0.29,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.31,"mem_mb":9,"disk_size":"33.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.24,"mem_mb":9,"disk_size":"34M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.38,"mem_mb":10.2,"disk_size":"35.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":0.36,"mem_mb":10.2,"disk_size":"36M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.32,"mem_mb":9.9,"disk_size":"27.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.34,"mem_mb":9.9,"disk_size":"28M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.3,"mem_mb":9.7,"disk_size":"27.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.3,"mem_mb":9.7,"disk_size":"28M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.19,"mem_mb":7.4,"disk_size":"32.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pycobertura","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.16,"mem_mb":7.4,"disk_size":"33M"}]}}