diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2018-08-07 07:27:23 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2018-08-07 07:27:23 -0400 |
commit | 839a1a0209f2ed27215c8f2fb75c710806346b38 (patch) | |
tree | 4ecae9ebf2114623701cae7b188eb436af1045fb | |
parent | b147ea9dafe38e08083842f89502fefd9ba790d7 (diff) | |
parent | 305c5fdc378879adaac518ddeac7c22a0c92f49d (diff) | |
download | python-coveragepy-git-839a1a0209f2ed27215c8f2fb75c710806346b38.tar.gz |
Merge branch 'master' into nedbat/data-sqlite
-rw-r--r-- | coverage/cmdline.py | 6 | ||||
-rw-r--r-- | coverage/control.py | 6 | ||||
-rw-r--r-- | doc/api_coverage.rst | 2 | ||||
-rw-r--r-- | doc/requirements.pip | 4 | ||||
-rw-r--r-- | requirements/dev.pip | 2 | ||||
-rw-r--r-- | requirements/pytest.pip | 4 | ||||
-rw-r--r-- | requirements/tox.pip | 2 | ||||
-rw-r--r-- | setup.cfg | 2 | ||||
-rw-r--r-- | tests/coveragetest.py | 14 | ||||
-rw-r--r-- | tests/test_api.py | 6 | ||||
-rw-r--r-- | tests/test_data.py | 19 | ||||
-rw-r--r-- | tests/test_testing.py | 17 | ||||
-rw-r--r-- | tox.ini | 4 |
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 @@ -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") @@ -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. |