summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2018-08-07 07:27:23 -0400
committerNed Batchelder <ned@nedbatchelder.com>2018-08-07 07:27:23 -0400
commit839a1a0209f2ed27215c8f2fb75c710806346b38 (patch)
tree4ecae9ebf2114623701cae7b188eb436af1045fb
parentb147ea9dafe38e08083842f89502fefd9ba790d7 (diff)
parent305c5fdc378879adaac518ddeac7c22a0c92f49d (diff)
downloadpython-coveragepy-git-839a1a0209f2ed27215c8f2fb75c710806346b38.tar.gz
Merge branch 'master' into nedbat/data-sqlite
-rw-r--r--coverage/cmdline.py6
-rw-r--r--coverage/control.py6
-rw-r--r--doc/api_coverage.rst2
-rw-r--r--doc/requirements.pip4
-rw-r--r--requirements/dev.pip2
-rw-r--r--requirements/pytest.pip4
-rw-r--r--requirements/tox.pip2
-rw-r--r--setup.cfg2
-rw-r--r--tests/coveragetest.py14
-rw-r--r--tests/test_api.py6
-rw-r--r--tests/test_data.py19
-rw-r--r--tests/test_testing.py17
-rw-r--r--tox.ini4
13 files changed, 57 insertions, 31 deletions
diff --git a/coverage/cmdline.py b/coverage/cmdline.py
index 4d1d1e72..5a9233ab 100644
--- a/coverage/cmdline.py
+++ b/coverage/cmdline.py
@@ -390,8 +390,10 @@ OK, ERR, FAIL_UNDER = 0, 1, 2
class CoverageScript(object):
"""The command-line interface to coverage.py."""
- def __init__(self, _covpkg=None, _run_python_file=None,
- _run_python_module=None, _help_fn=None, _path_exists=None):
+ def __init__(
+ self, _covpkg=None, _run_python_file=None,
+ _run_python_module=None, _help_fn=None, _path_exists=None,
+ ):
# _covpkg is for dependency injection, so we can test this code.
if _covpkg:
self.covpkg = _covpkg
diff --git a/coverage/control.py b/coverage/control.py
index 2f084cc2..46c2ece1 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -384,12 +384,6 @@ class Coverage(object):
"""
self.config.set_option(option_name, value)
- def use_cache(self, usecache):
- """Obsolete method."""
- self._init()
- if not usecache:
- self._warn("use_cache(False) is no longer supported.")
-
def load(self):
"""Load previously-collected coverage data from the data file."""
self._init()
diff --git a/doc/api_coverage.rst b/doc/api_coverage.rst
index 9ee95967..33433605 100644
--- a/doc/api_coverage.rst
+++ b/doc/api_coverage.rst
@@ -12,7 +12,7 @@ The Coverage class
.. autoclass:: Coverage
:members:
- :exclude-members: use_cache, sys_info
+ :exclude-members: sys_info
:special-members: __init__
diff --git a/doc/requirements.pip b/doc/requirements.pip
index c1297408..71b17134 100644
--- a/doc/requirements.pip
+++ b/doc/requirements.pip
@@ -3,9 +3,9 @@
# https://requires.io/github/nedbat/coveragepy/requirements/
pyenchant==2.0.0
-sphinx==1.7.5
+sphinx==1.7.6
sphinxcontrib-spelling==4.2.0
-sphinx_rtd_theme==0.4.0
+sphinx_rtd_theme==0.4.1
# A version of doc8 with a -q flag.
git+https://github.com/nedbat/doc8.git#egg=doc8==0.0
diff --git a/requirements/dev.pip b/requirements/dev.pip
index f9fa8265..d7ed3131 100644
--- a/requirements/dev.pip
+++ b/requirements/dev.pip
@@ -11,7 +11,7 @@ pip==18.0.0
-r pytest.pip
# for linting.
-greenlet==0.4.13
+greenlet==0.4.14
mock==2.0.0
PyContracts==1.8.3
pylint==1.9.2
diff --git a/requirements/pytest.pip b/requirements/pytest.pip
index b23977b7..23264ee9 100644
--- a/requirements/pytest.pip
+++ b/requirements/pytest.pip
@@ -3,6 +3,6 @@
# The pytest specifics used by coverage.py
-pytest==3.6.3
-pytest-xdist==1.22.2
+pytest==3.7.1
+pytest-xdist==1.22.5
flaky==3.4.0
diff --git a/requirements/tox.pip b/requirements/tox.pip
index 43b921c6..a84d77e9 100644
--- a/requirements/tox.pip
+++ b/requirements/tox.pip
@@ -1,4 +1,4 @@
# The version of tox used by coverage.py
-tox==3.1.2
+tox==3.1.3
# Adds env recreation on requirements file changes.
tox-battery==0.5.1
diff --git a/setup.cfg b/setup.cfg
index 1ca402b3..69c64e7e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
[tool:pytest]
-addopts = -q -n3 --strict --no-flaky-report
+addopts = -q -n3 --strict --no-flaky-report -rfe
markers =
expensive: too slow to run during "make smoke"
diff --git a/tests/coveragetest.py b/tests/coveragetest.py
index 8e3fa05d..94f50852 100644
--- a/tests/coveragetest.py
+++ b/tests/coveragetest.py
@@ -6,6 +6,7 @@
import contextlib
import datetime
import functools
+import glob
import os
import random
import re
@@ -347,6 +348,13 @@ class CoverageTest(
msg = "File %r shouldn't exist" % fname
self.assertTrue(not os.path.exists(fname), msg)
+ def assert_file_count(self, pattern, count):
+ """Assert that there are `count` files matching `pattern`."""
+ files = glob.glob(pattern)
+ msg = "There should be {} files matching {!r}, but there are these: {}"
+ msg = msg.format(count, pattern, files)
+ self.assertEqual(len(files), count, msg)
+
def assert_starts_with(self, s, prefix, msg=None):
"""Assert that `s` starts with `prefix`."""
if not s.startswith(prefix):
@@ -355,10 +363,8 @@ class CoverageTest(
def assert_recent_datetime(self, dt, seconds=10, msg=None):
"""Assert that `dt` marks a time at most `seconds` seconds ago."""
age = datetime.datetime.now() - dt
- # Python2.6 doesn't have total_seconds :(
- self.assertEqual(age.days, 0, msg)
- self.assertGreaterEqual(age.seconds, 0, msg)
- self.assertLessEqual(age.seconds, seconds, msg)
+ self.assertGreaterEqual(age.total_seconds(), 0, msg)
+ self.assertLessEqual(age.total_seconds(), seconds, msg)
def command_line(self, args, ret=OK, _covpkg=None):
"""Run `args` through the command line.
diff --git a/tests/test_api.py b/tests/test_api.py
index 248784ff..a860c7da 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -357,6 +357,7 @@ class ApiTest(CoverageTest):
cov = coverage.Coverage(data_suffix=True)
self.start_import_stop(cov, "code2")
cov.save()
+ self.assert_file_count(".coverage.*", 2)
def make_bad_data_file(self):
"""Make one bad data file."""
@@ -378,8 +379,9 @@ class ApiTest(CoverageTest):
# We got the results from code1 and code2 properly.
self.check_code1_code2(cov)
- # The bad file still exists.
+ # The bad file still exists, but it's the only parallel data file left.
self.assert_exists(".coverage.foo")
+ self.assert_file_count(".coverage.*", 1)
def test_combining_twice(self):
self.make_good_data_files()
@@ -387,6 +389,8 @@ class ApiTest(CoverageTest):
cov1.combine()
cov1.save()
self.check_code1_code2(cov1)
+ self.assert_file_count(".coverage.*", 0)
+ self.assert_exists(".coverage")
cov2 = coverage.Coverage()
with self.assertRaisesRegex(CoverageException, r"No data to combine"):
diff --git a/tests/test_data.py b/tests/test_data.py
index 702f4554..68b2c375 100644
--- a/tests/test_data.py
+++ b/tests/test_data.py
@@ -574,7 +574,7 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
self.assert_doesnt_exist(".coverage")
def test_true_suffix(self):
- self.assertEqual(glob.glob(".coverage.*"), [])
+ self.assert_file_count(".coverage.*", 0)
# suffix=True will make a randomly named data file.
covdata1 = CoverageData()
@@ -596,26 +596,25 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
self.assertTrue(all(str(os.getpid()) in fn for fn in data_files2))
def test_combining(self):
- self.assert_doesnt_exist(".coverage.1")
- self.assert_doesnt_exist(".coverage.2")
+ self.assert_file_count(".coverage.*", 0)
covdata1 = CoverageData()
covdata1.add_lines(LINES_1)
covdata1.write(suffix='1')
self.assert_exists(".coverage.1")
- self.assert_doesnt_exist(".coverage.2")
+ self.assert_file_count(".coverage.*", 1)
covdata2 = CoverageData()
covdata2.add_lines(LINES_2)
covdata2.write(suffix='2')
self.assert_exists(".coverage.2")
+ self.assert_file_count(".coverage.*", 2)
covdata3 = CoverageData()
combine_parallel_data(covdata3)
self.assert_line_counts(covdata3, SUMMARY_1_2)
self.assert_measured_files(covdata3, MEASURED_FILES_1_2)
- self.assert_doesnt_exist(".coverage.1")
- self.assert_doesnt_exist(".coverage.2")
+ self.assert_file_count(".coverage.*", 0)
def test_erasing(self):
covdata1 = CoverageData()
@@ -635,8 +634,7 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
self.make_file(".coverage")
data = CoverageData("datafile")
data.erase(parallel=True)
- self.assert_doesnt_exist("datafile.1")
- self.assert_doesnt_exist("datafile.2")
+ self.assert_file_count("datafile.*", 0)
self.assert_exists(".coverage")
def read_json_data_file(self, fname):
@@ -709,11 +707,16 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
})
covdata2.write(suffix='2')
+ self.assert_file_count(".coverage.*", 2)
+
covdata3 = CoverageData()
aliases = PathAliases()
aliases.add("/home/ned/proj/src/", "./")
aliases.add(r"c:\ned\test", "./")
combine_parallel_data(covdata3, aliases=aliases)
+ self.assert_file_count(".coverage.*", 0)
+ # covdata3 hasn't been written yet. Should this file exist or not?
+ #self.assert_exists(".coverage")
apy = canonical_filename('./a.py')
sub_bpy = canonical_filename('./sub/b.py')
diff --git a/tests/test_testing.py b/tests/test_testing.py
index d8cd0ef0..2b01584e 100644
--- a/tests/test_testing.py
+++ b/tests/test_testing.py
@@ -51,6 +51,23 @@ class CoverageTestTest(CoverageTest):
with self.assertRaises(AssertionError):
self.assert_exists("shadow.txt")
+ def test_file_count(self):
+ self.make_file("abcde.txt", "abcde")
+ self.make_file("axczz.txt", "axczz")
+ self.make_file("afile.txt", "afile")
+ self.assert_file_count("a*.txt", 3)
+ self.assert_file_count("*c*.txt", 2)
+ self.assert_file_count("afile.*", 1)
+ self.assert_file_count("*.q", 0)
+ with self.assertRaises(AssertionError):
+ self.assert_file_count("a*.txt", 13)
+ with self.assertRaises(AssertionError):
+ self.assert_file_count("*c*.txt", 12)
+ with self.assertRaises(AssertionError):
+ self.assert_file_count("afile.*", 11)
+ with self.assertRaises(AssertionError):
+ self.assert_file_count("*.q", 10)
+
def test_assert_startwith(self):
self.assert_starts_with("xyzzy", "xy")
self.assert_starts_with("xyz\nabc", "xy")
diff --git a/tox.ini b/tox.ini
index 102a7f54..0f81c200 100644
--- a/tox.ini
+++ b/tox.ini
@@ -21,8 +21,8 @@ deps =
#-e/Users/ned/unittest_mixins
# gevent 1.3 causes a failure: https://bitbucket.org/ned/coveragepy/issues/663/gevent-132-on-windows-fails
py{27,34,35,36}: gevent==1.2.2
- py{27,34,35,36,37}: eventlet==0.23.0
- py{27,34,35,36,37}: greenlet==0.4.13
+ py{27,34,35,36,37}: eventlet==0.24.1
+ py{27,34,35,36,37}: greenlet==0.4.14
# Windows can't update the pip version with pip running, so use Python
# to install things.