diff --git a/0001-make-data-collection-operations-thread-safe.patch b/0001-make-data-collection-operations-thread-safe.patch deleted file mode 100644 index c01e98b..0000000 --- a/0001-make-data-collection-operations-thread-safe.patch +++ /dev/null @@ -1,140 +0,0 @@ -From e36b42e2db46e892d9347ba0408c99b187ba8cb8 Mon Sep 17 00:00:00 2001 -From: Ned Batchelder -Date: Mon, 3 May 2021 07:56:05 -0400 -Subject: [PATCH] fix: make data collection operations thread-safe - ---- - CHANGES.rst | 3 +++ - coverage/sqldata.py | 20 ++++++++++++++++++++ - tests/test_data.py | 7 ++++++- - 3 files changed, 29 insertions(+), 1 deletion(-) - -#diff --git a/CHANGES.rst b/CHANGES.rst -#index 29af7340..3c65e5d8 100644 -#--- a/CHANGES.rst -#+++ b/CHANGES.rst -#@@ -26,6 +26,9 @@ Unreleased -# -# - Dropped support for Python 2.7, PyPy 2, and Python 3.5. -# -#+- Data collection is now thread-safe. There may have been rare instances of -#+ exceptions raised in multi-threaded programs. -#+ -# - Plugins (like the `Django coverage plugin`_) were generating "Already -# imported a file that will be measured" warnings about Django itself. These -# have been fixed, closing `issue 1150`_. -Index: coverage-5.5/coverage/sqldata.py -=================================================================== ---- coverage-5.5.orig/coverage/sqldata.py -+++ coverage-5.5/coverage/sqldata.py -@@ -8,12 +8,14 @@ - - import collections - import datetime -+import functools - import glob - import itertools - import os - import re - import sqlite3 - import sys -+import threading - import zlib - - from coverage import env -@@ -179,6 +181,10 @@ class CoverageData(SimpleReprMixin): - Data in a :class:`CoverageData` can be serialized and deserialized with - :meth:`dumps` and :meth:`loads`. - -+ The methods used during the coverage.py collection phase -+ (:meth:`add_lines`, :meth:`add_arcs`, :meth:`set_context`, and -+ :meth:`add_file_tracers`) are thread-safe. Other methods may not be. -+ - """ - - def __init__(self, basename=None, suffix=None, no_disk=False, warn=None, debug=None): -@@ -207,6 +213,8 @@ class CoverageData(SimpleReprMixin): - # Maps thread ids to SqliteDb objects. - self._dbs = {} - self._pid = os.getpid() -+ # Synchronize the operations used during collection. -+ self._lock = threading.Lock() - - # Are we in sync with the data file? - self._have_used = False -@@ -218,6 +226,15 @@ class CoverageData(SimpleReprMixin): - self._current_context_id = None - self._query_context_ids = None - -+ def _locked(method): # pylint: disable=no-self-argument -+ """A decorator for methods that should hold self._lock.""" -+ @functools.wraps(method) -+ def _wrapped(self, *args, **kwargs): -+ with self._lock: -+ # pylint: disable=not-callable -+ return method(self, *args, **kwargs) -+ return _wrapped -+ - def _choose_filename(self): - """Set self._filename based on inited attributes.""" - if self._no_disk: -@@ -381,6 +398,7 @@ class CoverageData(SimpleReprMixin): - else: - return None - -+ @_locked - def set_context(self, context): - """Set the current context for future :meth:`add_lines` etc. - -@@ -422,6 +440,7 @@ class CoverageData(SimpleReprMixin): - """ - return self._filename - -+ @_locked - def add_lines(self, line_data): - """Add measured line data. - -@@ -454,6 +473,7 @@ class CoverageData(SimpleReprMixin): - (file_id, self._current_context_id, linemap), - ) - -+ @_locked - def add_arcs(self, arc_data): - """Add measured arc data. - -@@ -498,6 +518,7 @@ class CoverageData(SimpleReprMixin): - ('has_arcs', str(int(arcs))) - ) - -+ @_locked - def add_file_tracers(self, file_tracers): - """Add per-file plugin information. - -Index: coverage-5.5/tests/test_data.py -=================================================================== ---- coverage-5.5.orig/tests/test_data.py -+++ coverage-5.5/tests/test_data.py -@@ -488,10 +488,14 @@ class CoverageDataTest(DataTestHelpers, - - def test_thread_stress(self): - covdata = CoverageData() -+ exceptions = [] - - def thread_main(): - """Every thread will try to add the same data.""" -- covdata.add_lines(LINES_1) -+ try: -+ covdata.add_lines(LINES_1) -+ except Exception as ex: -+ exceptions.append(ex) - - threads = [threading.Thread(target=thread_main) for _ in range(10)] - for t in threads: -@@ -500,6 +504,7 @@ class CoverageDataTest(DataTestHelpers, - t.join() - - self.assert_lines1_data(covdata) -+ assert exceptions == [] - - - class CoverageDataTestInTempDir(DataTestHelpers, CoverageTest): diff --git a/change__file__report-dir.patch b/change__file__report-dir.patch deleted file mode 100644 index e557dc0..0000000 --- a/change__file__report-dir.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 01cbb8751f98e5a7de79699444cbc03647691616 Mon Sep 17 00:00:00 2001 -From: Ned Batchelder -Date: Tue, 11 May 2021 19:32:32 -0400 -Subject: [PATCH] fix: Python 3.8.10 changed how __file__ is reported when - running directories - ---- - coverage/execfile.py | 5 +++++ - tests/test_process.py | 2 +- - 2 files changed, 6 insertions(+), 1 deletion(-) - ---- a/coverage/execfile.py -+++ b/coverage/execfile.py -@@ -176,6 +176,11 @@ class PyRunner(object): - # directory. - for ext in [".py", ".pyc", ".pyo"]: - try_filename = os.path.join(self.arg0, "__main__" + ext) -+ # 3.8.10 changed how files are reported when running a -+ # directory. But I'm not sure how far this change is going to -+ # spread, so I'll just hard-code it here for now. -+ if env.PYVERSION >= (3, 8, 10): -+ try_filename = os.path.abspath(try_filename) - if os.path.exists(try_filename): - self.arg0 = try_filename - break ---- a/tests/test_process.py -+++ b/tests/test_process.py -@@ -852,7 +852,7 @@ class EnvironmentTest(CoverageTest): - expected = re_lines(expected, r'\s+"argv0":', match=False) - actual = re_lines(actual, r'\s+"argv0":', match=False) - -- assert expected == actual -+ assert actual == expected - - def test_coverage_run_is_like_python(self): - with open(TRY_EXECFILE) as f: diff --git a/coverage-5.5.tar.gz b/coverage-5.5.tar.gz deleted file mode 100644 index 98fb769..0000000 --- a/coverage-5.5.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c -size 691258 diff --git a/coverage-6.2.tar.gz b/coverage-6.2.tar.gz new file mode 100644 index 0000000..3bab248 --- /dev/null +++ b/coverage-6.2.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8 +size 678664 diff --git a/python-coverage.changes b/python-coverage.changes index ff38641..af9c8c6 100644 --- a/python-coverage.changes +++ b/python-coverage.changes @@ -1,3 +1,187 @@ +------------------------------------------------------------------- +Thu Dec 9 17:16:23 UTC 2021 - Ben Greiner + +- Update to version 6.2 + * Feature: Now the --concurrency setting can now have a list of + values, so that threads and another lightweight threading + package can be measured together, such as + --concurrency=gevent,thread. Closes issue 1012 and issue 1082. + * Fix: A module specified as the source setting is imported + during startup, before the user program imports it. This could + cause problems if the rest of the program isn't ready yet. For + example, issue 1203 describes a Django setting that is accessed + before settings have been configured. Now the early import is + wrapped in a try/except so errors then don't stop execution. + * Fix: A colon in a decorator expression would cause an exclusion + to end too early, preventing the exclusion of the decorated + function. This is now fixed. + * Fix: The HTML report now will not overwrite a .gitignore file + that already exists in the HTML output directory (follow-on for + issue 1244). + * API: The exceptions raised by Coverage.py have been + specialized, to provide finer-grained catching of exceptions by + third-party code. + * API: Using suffix=False when constructing a Coverage object + with multiprocessing wouldn't suppress the data file suffix + (issue 989). This is now fixed. + * Debug: The coverage debug data command will now sniff out + combinable data files, and report on all of them. + * Debug: The coverage debug command used to accept a number of + topics at a time, and show all of them, though this was never + documented. This no longer works, to allow for command-line + options in the future. +- Release notes for 6.1.2 + * Python 3.11 is supported (tested with 3.11.0a2). One still-open + issue has to do with exits through with-statements. + * Fix: When remapping file paths through the [paths] setting + while combining, the [run] relative_files setting was ignored, + resulting in absolute paths for remapped file names (issue + 1147). This is now fixed. + * Fix: Complex conditionals over excluded lines could have + incorrectly reported a missing branch (issue 1271). This is now + fixed. + * Fix: More exceptions are now handled when trying to parse + source files for reporting. Problems that used to terminate + coverage.py can now be handled with [report] ignore_errors. + This helps with plugins failing to read files + (django_coverage_plugin issue 78). + * Fix: Removed another vestige of jQuery from the source tarball + (issue 840). + * Fix: Added a default value for a new-to-6.x argument of an + internal class. This unsupported class is being used by + coveralls (issue 1273). Although I'd rather not "fix" + unsupported interfaces, it's actually nicer with a default + value. +- Release notes for 6.1.1 + * Fix: The sticky header on the HTML report didn't work unless + you had branch coverage enabled. This is now fixed: the sticky + header works for everyone. (Do people still use coverage + without branch measurement!? j/k) + * Fix: When using explicitly declared namespace packages, the + "already imported a file that will be measured" warning would + be issued (issue 888). This is now fixed. +- Release notes for 6.1 + * Deprecated: The annotate command and the Coverage.annotate + function will be removed in a future version, unless people let + me know that they are using it. Instead, the html command gives + better-looking (and more accurate) output, and the report -m + command will tell you line numbers of missing lines. Please get + in touch if you have a reason to use annotate over those better + options: ned@nedbatchelder.com. + * Feature: Coverage now sets an environment variable, + COVERAGE_RUN when running your code with the coverage run + command. The value is not important, and may change in the + future. Closes issue 553. + * Feature: The HTML report pages for Python source files now have + a sticky header so the file name and controls are always + visible. + * Feature: The xml and json commands now describe what they wrote + where. + * Feature: The html, combine, xml, and json commands all accept a + -q/--quiet option to suppress the messages they write to stdout + about what they are doing (issue 1254). + * Feature: The html command writes a .gitignore file into the + HTML output directory, to prevent the report from being + committed to git. If you want to commit it, you will need to + delete that file. Closes issue 1244. + * Feature: Added support for PyPy 3.8. + * Fix: More generated code is now excluded from measurement. Code + such as attrs boilerplate, or doctest code, was being measured + though the synthetic line numbers meant they were never + reported. Once Cython was involved though, the generated .so + files were parsed as Python, raising syntax errors, as reported + in issue 1160. This is now fixed. + * Fix: When sorting human-readable names, numeric components are + sorted correctly: file10.py will appear after file9.py. This + applies to file names, module names, environment variables, and + test contexts. + * Performance: Branch coverage measurement is faster, though you + might only notice on code that is executed many times, such as + long-running loops. + * Build: jQuery is no longer used or vendored (issue 840 and + issue 1118). Huge thanks to Nils Kattenbeck (septatrix) for the + conversion to vanilla JavaScript in pull request 1248. +- Release notes for 6.0.2 + * Namespace packages being measured weren't properly handled by + the new code that ignores third-party packages. If the + namespace package was installed, it was ignored as a + third-party package. That problem (issue 1231) is now fixed. + * Packages named as "source packages" (with source, or + source_pkgs, or pytest-cov's --cov) might have been only + partially measured. Their top-level statements could be marked + as unexecuted, because they were imported by coverage.py before + measurement began (issue 1232). This is now fixed, but the + package will be imported twice, once by coverage.py, then again + by your test suite. This could cause problems if importing the + package has side effects. + * The :meth:`.CoverageData.contexts_by_lineno` method was + documented to return a dict, but was returning a defaultdict. + Now it returns a plain dict. It also no longer returns negative + numbered keys. +- Release notes for 6.0.1 + * In 6.0, the coverage.py exceptions moved from coverage.misc to + coverage.exceptions. These exceptions are not part of the + public supported API, CoverageException is. But a number of + other third-party packages were importing the exceptions from + coverage.misc, so they are now available from there again + (issue 1226). + * Changed an internal detail of how tomli is imported, so that + tomli can use coverage.py for their own test suite (issue + 1228). + * Defend against an obscure possibility under code obfuscation, + where a function can have an argument called "self", but no + local named "self" (pull request 1210). Thanks, Ben Carlsson. +- Release notes for 6.0 + * The coverage html command now prints a message indicating where + the HTML report was written. Fixes issue 1195. + * The coverage combine command now prints messages indicating + each data file being combined. Fixes issue 1105. + * The HTML report now includes a sentence about skipped files due + to skip_covered or skip_empty settings. Fixes issue 1163. + * Unrecognized options in the configuration file are no longer + errors. They are now warnings, to ease the use of coverage + across versions. Fixes issue 1035. + * Fix handling of exceptions through context managers in Python + 3.10. A missing exception is no longer considered a missing + branch from the with statement. Fixes issue 1205. + * Fix another rarer instance of "Error binding parameter 0 - + probably unsupported type." (issue 1010). + * Creating a directory for the coverage data file now is safer + against conflicts when two coverage runs happen simultaneously + (pull 1220). Thanks, Clément Pit-Claudel. +- Release notes for Version 6.0b1 + * Dropped support for Python 2.7, PyPy 2, and Python 3.5. + * Added support for the Python 3.10 match/case syntax. + * Data collection is now thread-safe. There may have been rare + instances of exceptions raised in multi-threaded programs. + * Plugins (like the Django coverage plugin) were generating + "Already imported a file that will be measured" warnings about + Django itself. These have been fixed, closing issue 1150. + * Warnings generated by coverage.py are now real Python warnings. + * Using --fail-under=100 with coverage near 100% could result in + the self-contradictory message total of 100 is less than + fail-under=100. This bug (issue 1168) is now fixed. + * The COVERAGE_DEBUG_FILE environment variable now accepts stdout + and stderr to write to those destinations. + * TOML parsing now uses the tomli library. + * Some minor changes to usually invisible details of the HTML + report: + * Use a modern hash algorithm when fingerprinting, for + high-security environments (issue 1189). When generating the + HTML report, we save the hash of the data, to avoid + regenerating an unchanged HTML page. We used to use MD5 to + generate the hash, and now use SHA-3-256. This was never a + security concern, but security scanners would notice the MD5 + algorithm and raise a false alarm. + * Change how report file names are generated, to avoid leading + underscores (issue 1167), to avoid rare file name collisions + (issue 584), and to avoid file names becoming too long (issue + 580). +- Drop patches + * 0001-make-data-collection-operations-thread-safe.patch + * change__file__report-dir.patch + * traced_file_absolute.patch + ------------------------------------------------------------------- Wed May 12 09:29:03 UTC 2021 - Matej Cepl diff --git a/python-coverage.spec b/python-coverage.spec index db7c17e..c5bfba6 100644 --- a/python-coverage.spec +++ b/python-coverage.spec @@ -16,39 +16,31 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} +%{?!python_module:%define python_module() python3-%{**}} +%define skip_python2 1 Name: python-coverage -Version: 5.5 +Version: 6.2 Release: 0 Summary: Code coverage measurement for Python License: Apache-2.0 URL: https://github.com/nedbat/coveragepy Source: https://files.pythonhosted.org/packages/source/c/coverage/coverage-%{version}.tar.gz -# PATCH-FIX-UPSTREAM traced_file_absolute.patch gh#nedbat/coveragepy#1161 mcepl@suse.com -# traced file names seem to be absolute now? -Patch0: traced_file_absolute.patch -# PATCH-FIX-UPSTREAM 0001-make-data-collection-operations-thread-safe.patch gh#nedbat/coveragepy#commit-e36b42e2db46 alarrosa@suse.com -# Make data collection operations thread safe -Patch1: 0001-make-data-collection-operations-thread-safe.patch -# PATCH-FIX-UPSTREAM change__file__report-dir.patch gh#nedbat/coveragepy#1161 mcepl@suse.com -# Fix yet another regression in Python 3.8.10, this time about __file__ value for directories. -Patch2: change__file__report-dir.patch BuildRequires: %{python_module devel} +BuildRequires: %{python_module setuptools} +# SECTION test requirements BuildRequires: %{python_module flaky} BuildRequires: %{python_module hypothesis >= 4.57} -BuildRequires: %{python_module mock} BuildRequires: %{python_module pytest >= 4.6} BuildRequires: %{python_module pytest-xdist} -BuildRequires: %{python_module setuptools} -BuildRequires: %{python_module toml} -BuildRequires: %{python_module unittest-mixins} -BuildRequires: %{python_module xml} -BuildRequires: %{pythons} +BuildRequires: %{python_module tomli} +# for database (sqlite3) support +BuildRequires: %pythons +# /SECTION BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python -Requires: python-setuptools -Requires: python-toml +# coverage[toml] +Recommends: python-tomli Requires(post): update-alternatives Requires(postun):update-alternatives %python_subpackages @@ -61,14 +53,8 @@ library to determine which lines are executable, and which have been executed. %prep %autosetup -p1 -n coverage-%{version} -# do not require xdist +# we define everything necessary ourselves below sed -i -e '/addopts/d' setup.cfg -# writes in /usr/ -rm tests/test_process.py -# summary differs trivialy -rm tests/test_summary.py -# requires additional plugins -rm tests/test_plugins.py %build %python_build @@ -80,18 +66,6 @@ rm -vf %{buildroot}%{_bindir}/coverage{2,3} %python_expand %fdupes %{buildroot}%{$python_sitearch} %check -# GetZipBytesTest.test_get_encoded_zip_files - needs zip command -# test_egg - needs generated egg file -# test_doctest - weird doctest importing -# test_unicode - differs between py2/py3 -# test_version - checks for non-compiled variant, we ship only compiled one -# test_multiprocessing_with_branching - whitespace issue in regexp -# test_farm, test_encoding, test_multi - tries to write in /usr -# test_dothtml_not_python - no idea -# test_bytes -# test_one_of -# test_xdist_sys_path_nuttiness_is_fixed - xdist check that we actually fail on purpose -# test_debug_sys_ctracer - requires dep on ctracer export LANG=en_US.UTF8 %{python_expand # Link executables to flavor specific build areas, to be used for testing. build/ is shuffled around by python_expand mkdir build/bin @@ -100,12 +74,35 @@ for filepath in %{buildroot}%{_bindir}/coverage*-%{$python_bin_suffix}; do unsuffixed=${filename/-%{$python_bin_suffix}/} ln -s $filepath build/bin/$unsuffixed done +# indicate a writeable .pth directory for tests +mkdir -p build/mysite +cp %{python_sitearch}/zzzz-import-failed-hooks.pth build/mysite/ } +# the tests need the empty leading part for importing local test projects" +export PYTHONPATH=":$PWD/build/mysite" + export PATH="$(pwd)/build/bin:$PATH" + %python_exec -mcoverage debug sys -# the tests need the empty leading part for importing local test projects, the x is a dummy" -export PYTHONPATH=":x" -%pytest_arch -k 'not (test_get_encoded_zip_files or test_egg or test_doctest or test_unicode or test_version or test_multiprocessing_with_branching or test_farm or test_dothtml_not_python or test_one_of or test_bytes or test_encoding or test_multi or test_xdist_sys_path_nuttiness_is_fixed or test_debug_sys_ctracer)' + +# installs some test modules into tests/ (flavor agnostic) +python3 igor.py zip_mods + +# test_version - checks for non-compiled variant, we ship only compiled one +donttest="test_version" +# test_xdist_sys_path_nuttiness_is_fixed - xdist check that we actually fail on purpose +donttest+=" or test_xdist_sys_path_nuttiness_is_fixed" +# test_debug_sys_ctracer - requires dep on ctracer +donttest+=" or test_debug_sys_ctracer" +# does not find a usable venv +donttest+=" or test_venv" +# writes in /usr/ +donttest+=" or test_process" +# requires additional plugins +donttest+=" or test_plugins" + +%pytest_arch -n auto --no-flaky-report -k "$donttest" -rp ||: +%pytest_arch -n auto --no-flaky-report -k "not ($donttest)" %post %python_install_alternative coverage diff --git a/traced_file_absolute.patch b/traced_file_absolute.patch deleted file mode 100644 index 5ab2cd0..0000000 --- a/traced_file_absolute.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 06cb51b39620e2140f915393f0f41b281594e05b Mon Sep 17 00:00:00 2001 -From: Ned Batchelder -Date: Sat, 8 May 2021 21:27:45 -0400 -Subject: [PATCH] test: traced file names seem to be absolute now? #1161 - -This was changed in 3.10.0b1 and 3.9.5. Seems like a strange change to -throw into 3.9.5, but there it is. Fixes #1161. ---- - tests/test_debug.py | 6 ++++-- - tests/test_oddball.py | 16 +++++++++------- - 2 files changed, 13 insertions(+), 9 deletions(-) - ---- a/tests/test_debug.py -+++ b/tests/test_debug.py -@@ -124,8 +124,10 @@ class DebugTraceTest(CoverageTest): - def test_debug_trace(self): - out_lines = self.f1_debug_output(["trace"]) - -- # We should have a line like "Tracing 'f1.py'" -- assert "Tracing 'f1.py'" in out_lines -+ # We should have a line like "Tracing 'f1.py'", perhaps with an -+ # absolute path. -+ f1 = re_lines(out_lines, r"Tracing '.*f1.py'") -+ assert f1 - - # We should have lines like "Not tracing 'collector.py'..." - coverage_lines = re_lines( ---- a/tests/test_oddball.py -+++ b/tests/test_oddball.py -@@ -451,10 +451,12 @@ class GettraceTest(CoverageTest): - def test_setting_new_trace_function(self): - # https://github.com/nedbat/coveragepy/issues/436 - self.check_coverage('''\ -+ import os.path - import sys - - def tracer(frame, event, arg): -- print("%s: %s @ %d" % (event, frame.f_code.co_filename, frame.f_lineno)) -+ filename = os.path.basename(frame.f_code.co_filename) -+ print("%s: %s @ %d" % (event, filename, frame.f_lineno)) - return tracer - - def begin(): -@@ -474,16 +476,16 @@ class GettraceTest(CoverageTest): - a = 21 - b = 22 - ''', -- lines=[1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, 21, 22], -- missing="4-5, 11-12", -+ lines=[1, 2, 4, 5, 6, 7, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 24], -+ missing="5-7, 13-14", - ) - - out = self.stdout().replace(self.last_module_name, "coverage_test") - expected = ( -- "call: coverage_test.py @ 10\n" -- "line: coverage_test.py @ 11\n" -- "line: coverage_test.py @ 12\n" -- "return: coverage_test.py @ 12\n" -+ "call: coverage_test.py @ 12\n" -+ "line: coverage_test.py @ 13\n" -+ "line: coverage_test.py @ 14\n" -+ "return: coverage_test.py @ 14\n" - ) - assert expected == out -