coverage 7.15.0__tar.gz → 7.15.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/codeql-analysis.yml +3 -3
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/coverage.yml +11 -3
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/kit.yml +3 -3
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/publish.yml +2 -2
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/quality.yml +4 -4
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/testsuite.yml +2 -2
- {coverage-7.15.0 → coverage-7.15.2}/.pre-commit-config.yaml +1 -1
- {coverage-7.15.0 → coverage-7.15.2}/CHANGES.rst +37 -0
- {coverage-7.15.0 → coverage-7.15.2}/CONTRIBUTORS.txt +2 -0
- {coverage-7.15.0 → coverage-7.15.2}/PKG-INFO +8 -8
- coverage-7.15.2/coverage/bytecode.py +208 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/control.py +5 -7
- {coverage-7.15.0 → coverage-7.15.2}/coverage/html.py +12 -3
- {coverage-7.15.0 → coverage-7.15.2}/coverage/parser.py +122 -45
- {coverage-7.15.0 → coverage-7.15.2}/coverage/python.py +0 -1
- {coverage-7.15.0 → coverage-7.15.2}/coverage/report_core.py +8 -2
- {coverage-7.15.0 → coverage-7.15.2}/coverage/sysmon.py +47 -55
- {coverage-7.15.0 → coverage-7.15.2}/coverage/version.py +1 -1
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/PKG-INFO +8 -8
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/SOURCES.txt +1 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/changes.rst +14 -12
- {coverage-7.15.0 → coverage-7.15.2}/doc/conf.py +3 -3
- {coverage-7.15.0 → coverage-7.15.2}/doc/requirements.pip +12 -12
- {coverage-7.15.0 → coverage-7.15.2}/howto.txt +1 -1
- {coverage-7.15.0 → coverage-7.15.2}/igor.py +1 -2
- {coverage-7.15.0 → coverage-7.15.2}/requirements/dev.pip +207 -210
- {coverage-7.15.0 → coverage-7.15.2}/requirements/kit.pip +87 -90
- {coverage-7.15.0 → coverage-7.15.2}/requirements/light-threads.pip +80 -80
- {coverage-7.15.0 → coverage-7.15.2}/requirements/mypy.pip +6 -6
- {coverage-7.15.0 → coverage-7.15.2}/requirements/pip.pip +12 -12
- {coverage-7.15.0 → coverage-7.15.2}/requirements/pytest.pip +6 -6
- {coverage-7.15.0 → coverage-7.15.2}/requirements/tox.pip +15 -15
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_html.py +22 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_parser.py +170 -1
- coverage-7.15.2/tests/test_sysmon.py +76 -0
- coverage-7.15.0/coverage/bytecode.py +0 -255
- {coverage-7.15.0 → coverage-7.15.2}/.editorconfig +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.git-blame-ignore-revs +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/CODE_OF_CONDUCT.md +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/FUNDING.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/ISSUE_TEMPLATE/support.md +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/SECURITY.md +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/dependabot.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/dependency-review.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/workflows/python-nightly.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.github/zizmor.yml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.ignore +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/.readthedocs.yaml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/CITATION.cff +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/LICENSE.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/MANIFEST.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/Makefile +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/NOTICE.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/README.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/__main__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/a1_coverage.pth +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/ci/README.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/ci/comment_on_fixes.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/ci/session.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/ci/trigger_action.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/ci/update_rtfd.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/__main__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/annotate.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/cmdline.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/collector.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/config.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/context.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/core.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/datastack.c +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/datastack.h +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/filedisp.c +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/filedisp.h +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/module.c +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/stats.h +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/tracer.c +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/tracer.h +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/ctracer/util.h +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/data.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/debug.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/disposition.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/env.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/exceptions.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/execfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/files.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/coverage_html.js +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/favicon_32.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/keybd_closed.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/pyfile.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/style.css +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/htmlfiles/style.scss +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/inorout.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/jsonreport.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/lcovreport.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/misc.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/multiproc.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/numbits.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/patch.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/phystokens.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/plugin.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/plugin_support.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/pth_file.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/py.typed +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/pytracer.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/regions.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/report.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/results.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/sqldata.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/sqlitedb.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/templite.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/tomlconfig.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/tracer.pyi +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/types.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage/xmlreport.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/dependency_links.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/entry_points.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/not-zip-safe +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/requires.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/coverage.egg-info/top_level.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/_static/coverage.css +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api_coverage.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api_coveragedata.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api_exceptions.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api_module.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/api_plugin.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/branch.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/cog_helpers.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_annotate.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_combine.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_debug.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_erase.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_html.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_json.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_lcov.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_report.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_reporting.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_run.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/cmd_xml.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/commands/index.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/config.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/contexts.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/contributing.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/dbschema.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/dict.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/excluding.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/faq.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/howitworks.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/index.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/install.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/media/sleepy-snake-600.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/media/sleepy-snake-circle-150.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/messages.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/migrating.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/other.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/plugins.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/python-coverage.1.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/requirements.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/sample_html/favicon_32_cb_c827f16f.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/sample_html/keybd_closed_cb_900cfef5.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/sleepy.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/source.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/subprocess.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/trouble.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/doc/whatsnew5x.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/README.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/branches.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/compare_times.sh +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/coverage-04.dtd +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/extract_code.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/goals.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/hack_pyc.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/notes/arcs-to-branches.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/notes/bug1303.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/notes/pypy-738-decorated-functions.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/parse_all.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/parser.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/pick.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/platform_info.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/run_sysmon.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/run_trace.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/select_contexts.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/show_platform.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/show_pyc.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/treetopy.sh +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/warn_executed.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/lab/warn_executed.toml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/metacov.ini +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/pyproject.toml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/dev.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/kit.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/light-threads.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/mypy.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/pins.pip +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/pip.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/pytest.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/requirements/tox.in +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/setup.cfg +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/setup.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/conftest.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/coveragetest.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/covmodzip1.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/README.rst +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/anno_dir/multi.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/anno_dir/z_80084bf2fba02475___init__.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/anno_dir/z_80084bf2fba02475_a.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/anno_dir/z_b039179a8a4ce2c2___init__.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/anno_dir/z_b039179a8a4ce2c2_b.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/encodings/utf8.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/mae/mae.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/multi/a/__init__.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/multi/a/a.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/multi/b/__init__.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/multi/b/b.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/multi/multi.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/annotate/white/white.py,cover +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/Makefile +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/a/a_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/a/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/a/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/a/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/b_branch/b_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/b_branch/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/b_branch/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/b_branch/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/bom/bom_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/bom/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/bom/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/bom/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/contexts/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/contexts/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/contexts/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/contexts/two_tests_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/isolatin1/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/isolatin1/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/isolatin1/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/isolatin1/isolatin1_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/multiline/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/multiline/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/multiline/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/multiline/multiline_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/m1_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/m2_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/m3_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_1/main_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/m2_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/m3_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_2/main_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_3/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_3/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_3/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_3/m3_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_3/main_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/m1_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/m3_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_4/main_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_5/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_5/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_5/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_5/m1_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/omit_5/main_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/other/blah_blah_other_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/other/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/other/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/other/here_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/other/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/partial/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/partial/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/partial/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/partial/partial_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/a_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/myextra.css +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/styled/style.css +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/support/coverage_html_cb_dd2e7eb5.js +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/support/favicon_32_cb_c827f16f.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/support/keybd_closed_cb_900cfef5.png +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/support/style_cb_a90a112a.css +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/unicode/class_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/unicode/function_index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/unicode/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/html/unicode/unicode_py.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/testing/getty/gettysburg.txt +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/testing/xml/output.xml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/xml/x_xml/coverage.xml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/gold/xml/y_xml_branch/coverage.xml +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/goldtest.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/helpers.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/js/index.html +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/js/tests.js +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/mixins.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/afile.odd.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/afile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb/bfile.odd.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb/bfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb/cc/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb/cc/cfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/bb.odd/bfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/aa/zfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/ambiguous/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/ambiguous/pkg1/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/ambiguous/pkg1/ambiguous.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/checkspec.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/covmod1.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/namespace_420/sub1/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/__main__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/p1a.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/p1b.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/p1c.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/runmod2.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/sub/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/sub/__main__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/sub/ps1a.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg1/sub/runmod3.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg2/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg2/p2a.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/pkg2/p2b.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/plugins/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/plugins/a_plugin.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/plugins/another.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/process_test/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/process_test/try_execfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/runmod1.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/modules/usepkgs.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/namespace_420/sub2/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/othera.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/otherb.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/sub/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/sub/osa.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/moremodules/othermods/sub/osb.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/osinfo.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/plugin1.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/plugin2.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/plugin_config.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/qunit/jquery.tmpl.min.js +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/select_plugin.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/strategies.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/stress_phystoken.tok +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/stress_phystoken_dos.tok +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_annotate.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_api.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_arcs.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_bytecode.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_cmdline.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_collector.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_concurrency.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_config.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_context.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_core.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_coverage.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_data.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_debug.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_execfile.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_filereporter.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_files.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_goldtest.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_json.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_lcov.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_misc.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_mixins.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_numbits.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_oddball.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_phystokens.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_plugins.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_process.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_python.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_regions.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_report.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_report_common.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_report_core.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_results.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_setup.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_sqlitedb.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_templite.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_testing.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_venv.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_version.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/test_xml.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/testenv.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/zipsrc/zip1/__init__.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tests/zipsrc/zip1/zip1.py +0 -0
- {coverage-7.15.0 → coverage-7.15.2}/tox.ini +0 -0
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
|
|
56
56
|
# Initializes the CodeQL tools for scanning.
|
|
57
57
|
- name: Initialize CodeQL
|
|
58
|
-
uses: github/codeql-action/init@
|
|
58
|
+
uses: github/codeql-action/init@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
|
|
59
59
|
with:
|
|
60
60
|
languages: ${{ matrix.language }}
|
|
61
61
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
@@ -66,7 +66,7 @@ jobs:
|
|
|
66
66
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
67
67
|
# If this step fails, then you should remove it and run the build manually (see below)
|
|
68
68
|
- name: Autobuild
|
|
69
|
-
uses: github/codeql-action/autobuild@
|
|
69
|
+
uses: github/codeql-action/autobuild@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
|
|
70
70
|
|
|
71
71
|
# ℹ️ Command-line programs to run using the OS shell.
|
|
72
72
|
# 📚 https://git.io/JvXDl
|
|
@@ -80,4 +80,4 @@ jobs:
|
|
|
80
80
|
# make release
|
|
81
81
|
|
|
82
82
|
- name: Perform CodeQL Analysis
|
|
83
|
-
uses: github/codeql-action/analyze@
|
|
83
|
+
uses: github/codeql-action/analyze@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
|
|
@@ -45,7 +45,7 @@ jobs:
|
|
|
45
45
|
persist-credentials: false
|
|
46
46
|
|
|
47
47
|
- name: "Examine changed files"
|
|
48
|
-
uses: dorny/paths-filter@
|
|
48
|
+
uses: dorny/paths-filter@7b450fff21473bca461d4b92ce414b9d0420d706 # v4.0.2
|
|
49
49
|
id: filter
|
|
50
50
|
with:
|
|
51
51
|
filters: |
|
|
@@ -126,7 +126,7 @@ jobs:
|
|
|
126
126
|
persist-credentials: false
|
|
127
127
|
|
|
128
128
|
- name: "Set up Python"
|
|
129
|
-
uses: actions/setup-python@
|
|
129
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
130
130
|
with:
|
|
131
131
|
python-version: "${{ matrix.python-version }}"
|
|
132
132
|
allow-prereleases: true
|
|
@@ -187,7 +187,7 @@ jobs:
|
|
|
187
187
|
persist-credentials: false
|
|
188
188
|
|
|
189
189
|
- name: "Set up Python"
|
|
190
|
-
uses: actions/setup-python@
|
|
190
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
191
191
|
with:
|
|
192
192
|
python-version: "3.10" # Minimum of PYVERSIONS
|
|
193
193
|
# At a certain point, installing dependencies failed on pypy 3.9 and
|
|
@@ -230,6 +230,14 @@ jobs:
|
|
|
230
230
|
path: htmlcov
|
|
231
231
|
include-hidden-files: true
|
|
232
232
|
|
|
233
|
+
- name: "Upload other reports"
|
|
234
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
235
|
+
with:
|
|
236
|
+
name: json_xml
|
|
237
|
+
path: |
|
|
238
|
+
coverage.xml
|
|
239
|
+
coverage.json
|
|
240
|
+
|
|
233
241
|
- name: "Show text report"
|
|
234
242
|
run: |
|
|
235
243
|
set -xe
|
|
@@ -178,7 +178,7 @@ jobs:
|
|
|
178
178
|
|
|
179
179
|
- name: "Install Python"
|
|
180
180
|
if: ${{ matrix.arch != 'ppc64le' }}
|
|
181
|
-
uses: actions/setup-python@
|
|
181
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
182
182
|
with:
|
|
183
183
|
python-version: "${{ matrix.cipy }}"
|
|
184
184
|
cache: pip
|
|
@@ -202,7 +202,7 @@ jobs:
|
|
|
202
202
|
|
|
203
203
|
- name: "Set up QEMU"
|
|
204
204
|
if: ${{ matrix.arch == 'riscv64' }}
|
|
205
|
-
uses: docker/setup-qemu-action@
|
|
205
|
+
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
|
|
206
206
|
|
|
207
207
|
- name: "Build binary wheels"
|
|
208
208
|
env:
|
|
@@ -239,7 +239,7 @@ jobs:
|
|
|
239
239
|
persist-credentials: false
|
|
240
240
|
|
|
241
241
|
- name: "Install Python"
|
|
242
|
-
uses: actions/setup-python@
|
|
242
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
243
243
|
with:
|
|
244
244
|
python-version: "3.11" # PYVERSIONS: the kit-building version
|
|
245
245
|
cache: pip
|
|
@@ -86,7 +86,7 @@ jobs:
|
|
|
86
86
|
files=$(find dist/* 2>/dev/null | wc -l) && [ "$files" -eq "$EXPECTED" ] || exit 1
|
|
87
87
|
|
|
88
88
|
- name: "Generate attestations"
|
|
89
|
-
uses: actions/attest-build-provenance@
|
|
89
|
+
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
|
|
90
90
|
with:
|
|
91
91
|
subject-path: "dist/*"
|
|
92
92
|
|
|
@@ -127,7 +127,7 @@ jobs:
|
|
|
127
127
|
files=$(find dist/* 2>/dev/null | wc -l) && [ "$files" -eq "$EXPECTED" ] || exit 1
|
|
128
128
|
|
|
129
129
|
- name: "Generate attestations"
|
|
130
|
-
uses: actions/attest-build-provenance@
|
|
130
|
+
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
|
|
131
131
|
with:
|
|
132
132
|
subject-path: "dist/*"
|
|
133
133
|
|
|
@@ -43,7 +43,7 @@ jobs:
|
|
|
43
43
|
persist-credentials: false
|
|
44
44
|
|
|
45
45
|
- name: "Examine changed files"
|
|
46
|
-
uses: dorny/paths-filter@
|
|
46
|
+
uses: dorny/paths-filter@7b450fff21473bca461d4b92ce414b9d0420d706 # v4.0.2
|
|
47
47
|
id: filter
|
|
48
48
|
with:
|
|
49
49
|
filters: |
|
|
@@ -79,7 +79,7 @@ jobs:
|
|
|
79
79
|
persist-credentials: false
|
|
80
80
|
|
|
81
81
|
- name: "Install Python"
|
|
82
|
-
uses: actions/setup-python@
|
|
82
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
83
83
|
with:
|
|
84
84
|
python-version: "3.10" # Minimum of PYVERSIONS
|
|
85
85
|
cache: pip
|
|
@@ -109,7 +109,7 @@ jobs:
|
|
|
109
109
|
persist-credentials: false
|
|
110
110
|
|
|
111
111
|
- name: "Install Python"
|
|
112
|
-
uses: actions/setup-python@
|
|
112
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
113
113
|
with:
|
|
114
114
|
python-version: "3.10" # Minimum of PYVERSIONS
|
|
115
115
|
cache: pip
|
|
@@ -144,7 +144,7 @@ jobs:
|
|
|
144
144
|
git fetch origin main --depth=1
|
|
145
145
|
|
|
146
146
|
- name: "Install Python"
|
|
147
|
-
uses: actions/setup-python@
|
|
147
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
148
148
|
with:
|
|
149
149
|
python-version: "3.12" # Doc version from PYVERSIONS
|
|
150
150
|
cache: pip
|
|
@@ -43,7 +43,7 @@ jobs:
|
|
|
43
43
|
persist-credentials: false
|
|
44
44
|
|
|
45
45
|
- name: "Examine changed files"
|
|
46
|
-
uses: dorny/paths-filter@
|
|
46
|
+
uses: dorny/paths-filter@7b450fff21473bca461d4b92ce414b9d0420d706 # v4.0.2
|
|
47
47
|
id: filter
|
|
48
48
|
with:
|
|
49
49
|
filters: |
|
|
@@ -121,7 +121,7 @@ jobs:
|
|
|
121
121
|
persist-credentials: false
|
|
122
122
|
|
|
123
123
|
- name: "Set up Python"
|
|
124
|
-
uses: actions/setup-python@
|
|
124
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
125
125
|
with:
|
|
126
126
|
python-version: "${{ matrix.python-version }}"
|
|
127
127
|
allow-prereleases: true
|
|
@@ -22,6 +22,43 @@ upgrading your version of coverage.py.
|
|
|
22
22
|
|
|
23
23
|
.. start-releases
|
|
24
24
|
|
|
25
|
+
.. _changes_7-15-2:
|
|
26
|
+
|
|
27
|
+
Version 7.15.2 — 2026-07-15
|
|
28
|
+
---------------------------
|
|
29
|
+
|
|
30
|
+
- Fix: one of the performance improvements in 7.15.1 (pull 2215) dramatically
|
|
31
|
+
increased memory use during reporting for large projects. Now we use a
|
|
32
|
+
different approach that is both faster and slimmer than 7.15.0. Fixes `issue
|
|
33
|
+
2229`_.
|
|
34
|
+
|
|
35
|
+
.. _issue 2229: https://github.com/coveragepy/coveragepy/issues/2229
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
.. _changes_7-15-1:
|
|
39
|
+
|
|
40
|
+
Version 7.15.1 — 2026-07-12
|
|
41
|
+
---------------------------
|
|
42
|
+
|
|
43
|
+
- Fix: in the HTML report with ``show_contexts`` enabled, a context label
|
|
44
|
+
containing ``</script>`` (for example a parametrized pytest node id) could
|
|
45
|
+
close the inline ``<script>`` element in a file page early, injecting markup.
|
|
46
|
+
Context labels are now fully escaped. Thanks, `Rajath Mohare <pull 2224_>`_.
|
|
47
|
+
|
|
48
|
+
- A number of performance improvements thanks to Paul Kehrer, in pull requests
|
|
49
|
+
`2213 <pull 2213_>`_, `2214 <pull 2214_>`_, `2215 <pull 2215_>`_, `2216
|
|
50
|
+
<pull 2216_>`_, `2218 <pull 2218_>`_, `2220 <pull 2220_>`_, and `2221 <pull
|
|
51
|
+
2221_>`_.
|
|
52
|
+
|
|
53
|
+
.. _pull 2213: https://github.com/coveragepy/coveragepy/pull/2213
|
|
54
|
+
.. _pull 2214: https://github.com/coveragepy/coveragepy/pull/2214
|
|
55
|
+
.. _pull 2215: https://github.com/coveragepy/coveragepy/pull/2215
|
|
56
|
+
.. _pull 2216: https://github.com/coveragepy/coveragepy/pull/2216
|
|
57
|
+
.. _pull 2218: https://github.com/coveragepy/coveragepy/pull/2218
|
|
58
|
+
.. _pull 2220: https://github.com/coveragepy/coveragepy/pull/2220
|
|
59
|
+
.. _pull 2221: https://github.com/coveragepy/coveragepy/pull/2221
|
|
60
|
+
.. _pull 2224: https://github.com/coveragepy/coveragepy/pull/2224
|
|
61
|
+
|
|
25
62
|
.. _changes_7-15-0:
|
|
26
63
|
|
|
27
64
|
Version 7.15.0 — 2026-07-02
|
|
@@ -206,12 +206,14 @@ Pablo Carballo
|
|
|
206
206
|
Pankaj Pandey
|
|
207
207
|
Pankhudi Jain
|
|
208
208
|
Patrick Mezard
|
|
209
|
+
Paul Kehrer
|
|
209
210
|
Paul Timmins
|
|
210
211
|
Pavel Tsialnou
|
|
211
212
|
Peter Baughman
|
|
212
213
|
Peter Ebden
|
|
213
214
|
Peter Portante
|
|
214
215
|
Phebe Polk
|
|
216
|
+
Rajath Mohare
|
|
215
217
|
Reya B
|
|
216
218
|
Ricardo Newbery
|
|
217
219
|
Robert Harris
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coverage
|
|
3
|
-
Version: 7.15.
|
|
3
|
+
Version: 7.15.2
|
|
4
4
|
Summary: Code coverage measurement for Python
|
|
5
5
|
Home-page: https://github.com/coveragepy/coveragepy
|
|
6
|
-
Author: Ned Batchelder and
|
|
6
|
+
Author: Ned Batchelder and 261 others
|
|
7
7
|
Author-email: ned@nedbatchelder.com
|
|
8
8
|
License: Apache-2.0
|
|
9
|
-
Project-URL: Documentation, https://coverage.readthedocs.io/en/7.15.
|
|
9
|
+
Project-URL: Documentation, https://coverage.readthedocs.io/en/7.15.2
|
|
10
10
|
Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi
|
|
11
11
|
Project-URL: Issues, https://github.com/coveragepy/coveragepy/issues
|
|
12
12
|
Project-URL: Mastodon, https://hachyderm.io/@coveragepy
|
|
@@ -83,7 +83,7 @@ Coverage.py runs on these versions of Python:
|
|
|
83
83
|
Documentation is on `Read the Docs`_. Code repository and issue tracker are on
|
|
84
84
|
`GitHub`_.
|
|
85
85
|
|
|
86
|
-
.. _Read the Docs: https://coverage.readthedocs.io/en/7.15.
|
|
86
|
+
.. _Read the Docs: https://coverage.readthedocs.io/en/7.15.2/
|
|
87
87
|
.. _GitHub: https://github.com/coveragepy/coveragepy
|
|
88
88
|
|
|
89
89
|
|
|
@@ -112,7 +112,7 @@ Getting Started
|
|
|
112
112
|
Looking to run ``coverage`` on your test suite? See the `Quick Start section`_
|
|
113
113
|
of the docs.
|
|
114
114
|
|
|
115
|
-
.. _Quick Start section: https://coverage.readthedocs.io/en/7.15.
|
|
115
|
+
.. _Quick Start section: https://coverage.readthedocs.io/en/7.15.2/#quick-start
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
Change history
|
|
@@ -120,7 +120,7 @@ Change history
|
|
|
120
120
|
|
|
121
121
|
The complete history of changes is on the `change history page`_.
|
|
122
122
|
|
|
123
|
-
.. _change history page: https://coverage.readthedocs.io/en/7.15.
|
|
123
|
+
.. _change history page: https://coverage.readthedocs.io/en/7.15.2/changes.html
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
Code of Conduct
|
|
@@ -139,7 +139,7 @@ Contributing
|
|
|
139
139
|
Found a bug? Want to help improve the code or documentation? See the
|
|
140
140
|
`Contributing section`_ of the docs.
|
|
141
141
|
|
|
142
|
-
.. _Contributing section: https://coverage.readthedocs.io/en/7.15.
|
|
142
|
+
.. _Contributing section: https://coverage.readthedocs.io/en/7.15.2/contributing.html
|
|
143
143
|
|
|
144
144
|
|
|
145
145
|
Security
|
|
@@ -167,7 +167,7 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
|
|
|
167
167
|
:target: https://github.com/coveragepy/coveragepy/actions/workflows/quality.yml
|
|
168
168
|
:alt: Quality check status
|
|
169
169
|
.. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat
|
|
170
|
-
:target: https://coverage.readthedocs.io/en/7.15.
|
|
170
|
+
:target: https://coverage.readthedocs.io/en/7.15.2/
|
|
171
171
|
:alt: Documentation
|
|
172
172
|
.. |kit| image:: https://img.shields.io/pypi/v/coverage
|
|
173
173
|
:target: https://pypi.org/project/coverage/
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
|
2
|
+
# For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
|
|
3
|
+
|
|
4
|
+
"""Bytecode analysis for coverage.py"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import dis
|
|
9
|
+
from collections.abc import Iterable, Mapping
|
|
10
|
+
from types import CodeType
|
|
11
|
+
|
|
12
|
+
from coverage.types import TArc, TLineNo, TOffset
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ByteParser:
|
|
16
|
+
"""Parse bytecode to understand the structure of code."""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
*,
|
|
21
|
+
code: CodeType | None = None,
|
|
22
|
+
text: str | None = None,
|
|
23
|
+
filename: str | None = None,
|
|
24
|
+
) -> None:
|
|
25
|
+
if code is None:
|
|
26
|
+
assert text is not None
|
|
27
|
+
code = compile(text, filename or "<string>", "exec", dont_inherit=True)
|
|
28
|
+
self.code = code
|
|
29
|
+
|
|
30
|
+
def _child_parsers(self) -> Iterable[ByteParser]:
|
|
31
|
+
"""Iterate over all the code objects nested within this one.
|
|
32
|
+
|
|
33
|
+
The iteration includes `self` as its first value.
|
|
34
|
+
|
|
35
|
+
We skip code objects named `__annotate__` since they are deferred
|
|
36
|
+
annotations that usually are never run. If there are errors in the
|
|
37
|
+
annotations, they will be caught by type checkers or other tools that
|
|
38
|
+
use annotations.
|
|
39
|
+
|
|
40
|
+
"""
|
|
41
|
+
return (ByteParser(code=c) for c in self.code_objects() if c.co_name != "__annotate__")
|
|
42
|
+
|
|
43
|
+
def code_objects(self) -> Iterable[CodeType]:
|
|
44
|
+
"""Iterate over all the code objects in `code`."""
|
|
45
|
+
stack = [self.code]
|
|
46
|
+
while stack:
|
|
47
|
+
# We're going to return the code object on the stack, but first
|
|
48
|
+
# push its children for later returning.
|
|
49
|
+
code = stack.pop()
|
|
50
|
+
for c in code.co_consts:
|
|
51
|
+
if isinstance(c, CodeType):
|
|
52
|
+
stack.append(c)
|
|
53
|
+
yield code
|
|
54
|
+
|
|
55
|
+
def _line_numbers(self) -> Iterable[TLineNo]:
|
|
56
|
+
"""Yield the line numbers possible in this code object.
|
|
57
|
+
|
|
58
|
+
Uses co_lines() to produce a sequence: l0, l1, ...
|
|
59
|
+
"""
|
|
60
|
+
for _, _, line in self.code.co_lines():
|
|
61
|
+
if line:
|
|
62
|
+
yield line
|
|
63
|
+
|
|
64
|
+
def find_statements(self) -> Iterable[TLineNo]:
|
|
65
|
+
"""Find the statements in `self.code`.
|
|
66
|
+
|
|
67
|
+
Produce a sequence of line numbers that start statements. Recurses
|
|
68
|
+
into all code objects reachable from `self.code`.
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
for bp in self._child_parsers():
|
|
72
|
+
# Get all of the lineno information from this code.
|
|
73
|
+
yield from bp._line_numbers()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def bytes_to_lines(code: CodeType) -> dict[TOffset, TLineNo]:
|
|
77
|
+
"""Make a dict mapping byte code offsets to line numbers."""
|
|
78
|
+
b2l = {}
|
|
79
|
+
for bstart, bend, lineno in code.co_lines():
|
|
80
|
+
if lineno is not None:
|
|
81
|
+
for boffset in range(bstart, bend, 2):
|
|
82
|
+
b2l[boffset] = lineno
|
|
83
|
+
return b2l
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def op_set(*op_names: str) -> set[int]:
|
|
87
|
+
"""Make a set of opcodes from instruction names.
|
|
88
|
+
|
|
89
|
+
The names might not exist in this version of Python, skip those if not.
|
|
90
|
+
"""
|
|
91
|
+
ops = {op for name in op_names if (op := dis.opmap.get(name))}
|
|
92
|
+
assert ops, f"At least one opcode must exist: {op_names}"
|
|
93
|
+
return ops
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# Opcodes that are unconditional jumps elsewhere.
|
|
97
|
+
ALWAYS_JUMPS = op_set(
|
|
98
|
+
"JUMP_BACKWARD",
|
|
99
|
+
"JUMP_BACKWARD_NO_INTERRUPT",
|
|
100
|
+
"JUMP_FORWARD",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Opcodes that exit from a function.
|
|
104
|
+
RETURNS = op_set(
|
|
105
|
+
"RETURN_VALUE",
|
|
106
|
+
"RETURN_GENERATOR",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# CACHE doesn't exist in Python 3.10, but the branch resolver is only used
|
|
111
|
+
# on 3.14+, so a placeholder value is fine.
|
|
112
|
+
_CACHE = dis.opmap.get("CACHE", -1)
|
|
113
|
+
_EXTENDED_ARG = dis.opmap["EXTENDED_ARG"]
|
|
114
|
+
|
|
115
|
+
# All opcodes with a jump target.
|
|
116
|
+
JUMPS = set(dis.hasjrel) | set(dis.hasjabs)
|
|
117
|
+
|
|
118
|
+
# Opcodes that jump backwards.
|
|
119
|
+
BACKWARD_JUMPS = {op for op in JUMPS if "JUMP_BACKWARD" in dis.opname[op]}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class BranchArcResolver:
|
|
123
|
+
"""Resolve branch events to line arcs, one (source, dest) pair at a time.
|
|
124
|
+
|
|
125
|
+
Branch events are one-shot (they are DISABLEd after firing), so each
|
|
126
|
+
(source offset, destination offset) pair is resolved at most a couple of
|
|
127
|
+
times per code object. Resolving pairs on demand is much cheaper than
|
|
128
|
+
precomputing trails for every branch in the code object, most of which
|
|
129
|
+
never fire. We walk the raw bytecode bytes so that we never need to
|
|
130
|
+
disassemble whole code objects with `dis`.
|
|
131
|
+
|
|
132
|
+
To resolve one pair:
|
|
133
|
+
starting from the destination, follow the trail of instructions (through
|
|
134
|
+
unconditional jumps) until we reach an instruction on a new source line
|
|
135
|
+
(giving us the arc), a return (an arc to leaving the code object), or
|
|
136
|
+
another branch possibility (no arc: that branch will produce its own
|
|
137
|
+
events).
|
|
138
|
+
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
def __init__(
|
|
142
|
+
self,
|
|
143
|
+
code: CodeType,
|
|
144
|
+
byte_to_line: Mapping[TOffset, TLineNo],
|
|
145
|
+
multiline_map: Mapping[TLineNo, TLineNo],
|
|
146
|
+
) -> None:
|
|
147
|
+
self.code = code
|
|
148
|
+
# co_code re-copies the bytes on each access, so fetch it once.
|
|
149
|
+
self.co_code = code.co_code
|
|
150
|
+
self.byte_to_line = byte_to_line
|
|
151
|
+
self.multiline_map = multiline_map
|
|
152
|
+
|
|
153
|
+
def line_at(self, offset: TOffset) -> TLineNo | None:
|
|
154
|
+
"""The source line of the instruction at `offset`, de-multilined."""
|
|
155
|
+
line = self.byte_to_line.get(offset)
|
|
156
|
+
if line is not None:
|
|
157
|
+
line = self.multiline_map.get(line, line)
|
|
158
|
+
return line
|
|
159
|
+
|
|
160
|
+
def resolve(self, source: TOffset, dest: TOffset) -> TArc | None:
|
|
161
|
+
"""Turn a branch event's (source, dest) offsets into an arc, or None."""
|
|
162
|
+
from_line = self.line_at(source)
|
|
163
|
+
if from_line is None:
|
|
164
|
+
return None
|
|
165
|
+
co_code = self.co_code
|
|
166
|
+
max_offset = len(co_code)
|
|
167
|
+
byte_to_line = self.byte_to_line
|
|
168
|
+
multiline_map = self.multiline_map
|
|
169
|
+
offset = dest
|
|
170
|
+
ext_arg = 0
|
|
171
|
+
seen: set[TOffset] = set()
|
|
172
|
+
while 0 <= offset < max_offset and offset not in seen:
|
|
173
|
+
seen.add(offset)
|
|
174
|
+
op = co_code[offset]
|
|
175
|
+
if op == _CACHE:
|
|
176
|
+
offset += 2
|
|
177
|
+
continue
|
|
178
|
+
if op == _EXTENDED_ARG:
|
|
179
|
+
ext_arg = (ext_arg | co_code[offset + 1]) << 8
|
|
180
|
+
offset += 2
|
|
181
|
+
continue
|
|
182
|
+
line = byte_to_line.get(offset)
|
|
183
|
+
if line is not None:
|
|
184
|
+
line = multiline_map.get(line, line)
|
|
185
|
+
if line and line != from_line:
|
|
186
|
+
return (from_line, line)
|
|
187
|
+
if op in JUMPS:
|
|
188
|
+
if op in ALWAYS_JUMPS:
|
|
189
|
+
arg = ext_arg | co_code[offset + 1]
|
|
190
|
+
# Jump distances are measured from the end of the
|
|
191
|
+
# instruction's inline CACHE entries, which appear in
|
|
192
|
+
# co_code as CACHE opcodes immediately following it.
|
|
193
|
+
next_offset = offset + 2
|
|
194
|
+
while next_offset < max_offset and co_code[next_offset] == _CACHE:
|
|
195
|
+
next_offset += 2
|
|
196
|
+
if op in BACKWARD_JUMPS:
|
|
197
|
+
offset = next_offset - 2 * arg
|
|
198
|
+
else:
|
|
199
|
+
offset = next_offset + 2 * arg
|
|
200
|
+
ext_arg = 0
|
|
201
|
+
continue
|
|
202
|
+
# Another branch possibility: it will get its own events.
|
|
203
|
+
return None
|
|
204
|
+
if op in RETURNS:
|
|
205
|
+
return (from_line, -self.code.co_firstlineno)
|
|
206
|
+
ext_arg = 0
|
|
207
|
+
offset += 2
|
|
208
|
+
return None
|
|
@@ -9,7 +9,6 @@ import atexit
|
|
|
9
9
|
import collections
|
|
10
10
|
import contextlib
|
|
11
11
|
import datetime
|
|
12
|
-
import functools
|
|
13
12
|
import os
|
|
14
13
|
import os.path
|
|
15
14
|
import signal
|
|
@@ -999,16 +998,17 @@ class Coverage(TConfigurable):
|
|
|
999
998
|
analysis.missing_formatted(),
|
|
1000
999
|
)
|
|
1001
1000
|
|
|
1002
|
-
|
|
1003
|
-
def _analyze(self, morf: TMorf) -> Analysis:
|
|
1001
|
+
def _analyze(self, morf: TMorf, file_reporter: FileReporter | None = None) -> Analysis:
|
|
1004
1002
|
"""Analyze a module or file. Private for now."""
|
|
1005
1003
|
self._init()
|
|
1006
1004
|
self._post_init()
|
|
1007
1005
|
|
|
1008
1006
|
data = self.get_data()
|
|
1009
|
-
file_reporter
|
|
1007
|
+
if file_reporter is None:
|
|
1008
|
+
file_reporter = self._get_file_reporter(morf)
|
|
1010
1009
|
filename = self._file_mapper(file_reporter.filename)
|
|
1011
|
-
|
|
1010
|
+
analysis = analysis_from_file_reporter(data, self.config.precision, file_reporter, filename)
|
|
1011
|
+
return analysis
|
|
1012
1012
|
|
|
1013
1013
|
def branch_stats(self, morf: TMorf) -> dict[TLineNo, tuple[int, int]]:
|
|
1014
1014
|
"""Get branch statistics about a module.
|
|
@@ -1024,7 +1024,6 @@ class Coverage(TConfigurable):
|
|
|
1024
1024
|
analysis = self._analyze(morf)
|
|
1025
1025
|
return analysis.branch_stats()
|
|
1026
1026
|
|
|
1027
|
-
@functools.lru_cache(maxsize=1)
|
|
1028
1027
|
def _get_file_reporter(self, morf: TMorf) -> FileReporter:
|
|
1029
1028
|
"""Get a FileReporter for a module or file name."""
|
|
1030
1029
|
assert self._data is not None
|
|
@@ -1075,7 +1074,6 @@ class Coverage(TConfigurable):
|
|
|
1075
1074
|
if not isinstance(morfs, (list, tuple, set)):
|
|
1076
1075
|
morfs = [morfs] # type: ignore[list-item]
|
|
1077
1076
|
|
|
1078
|
-
morfs = sorted(morfs, key=lambda m: m if isinstance(m, str) else m.__name__)
|
|
1079
1077
|
return [(self._get_file_reporter(morf), morf) for morf in morfs]
|
|
1080
1078
|
|
|
1081
1079
|
def _prepare_data_for_reporting(self) -> None:
|
|
@@ -483,9 +483,18 @@ class HtmlReporter:
|
|
|
483
483
|
contexts = collections.Counter(c for cline in file_data.lines for c in cline.contexts)
|
|
484
484
|
context_codes = {y: i for (i, y) in enumerate(x[0] for x in contexts.most_common())}
|
|
485
485
|
if context_codes:
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
486
|
+
# This JSON is dropped straight into an inline <script> element, so
|
|
487
|
+
# the HTML-significant characters have to be escaped as \uXXXX to keep
|
|
488
|
+
# a context label like "</script>" from closing the element early.
|
|
489
|
+
# The escapes are still valid JSON, so the parsed values are unchanged.
|
|
490
|
+
contexts_json = (
|
|
491
|
+
json.dumps(
|
|
492
|
+
{encode_int(v): k for (k, v) in context_codes.items()},
|
|
493
|
+
indent=2,
|
|
494
|
+
)
|
|
495
|
+
.replace("<", r"\u003c")
|
|
496
|
+
.replace(">", r"\u003e")
|
|
497
|
+
.replace("&", r"\u0026")
|
|
489
498
|
)
|
|
490
499
|
else:
|
|
491
500
|
contexts_json = None
|