summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt7
-rw-r--r--coverage/__init__.py2
-rw-r--r--coverage/version.py43
-rw-r--r--doc/changes.rst9
-rw-r--r--tests/test_misc.py38
5 files changed, 70 insertions, 29 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 4f7c0fc8..cfb9a999 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -30,12 +30,13 @@ Latest
will convert v3.x pickle data files to v4.x JSON data files. Thanks,
Alexander Todorov. Closes `issue 395`_.
-- A new version identifier is available, `coverage.hexversion`, with semantics
- identical to sys.hexversion.
+- A new version identifier is available, `coverage.version_info`, a plain tuple
+ of values similar to `sys.version_info`_.
.. _issue 392: https://bitbucket.org/ned/coveragepy/issues/392/run-append-doesnt-create-coverage-file
.. _issue 395: https://bitbucket.org/ned/coveragepy/issues/395/rfe-read-pickled-files-as-well-for
.. _issue 399: https://bitbucket.org/ned/coveragepy/issues/399/coverageexception-cant-combine-line-data
+.. _sys.version_info: https://docs.python.org/3/library/sys.html#sys.version_info
Version 4.0b1 --- 2 August 2015
@@ -352,7 +353,7 @@ Version 4.0a1 --- 27 September 2014
preventing paradoxical results, fixing `issue 284`_.
- The XML report will now create the output directory if need be, fixing
- `issue 285`_. Thanks Chris Rose.
+ `issue 285`_. Thanks, Chris Rose.
- HTML reports no longer raise UnicodeDecodeError if a Python file has
undecodable characters, fixing `issue 303`_ and `issue 331`_.
diff --git a/coverage/__init__.py b/coverage/__init__.py
index cc4b350e..d132e4a7 100644
--- a/coverage/__init__.py
+++ b/coverage/__init__.py
@@ -8,7 +8,7 @@ http://nedbatchelder.com/code/coverage
"""
-from coverage.version import hexversion, __version__, __url__
+from coverage.version import __version__, __url__, version_info
from coverage.control import Coverage, process_startup
from coverage.data import CoverageData
diff --git a/coverage/version.py b/coverage/version.py
index 523405d6..1b60626a 100644
--- a/coverage/version.py
+++ b/coverage/version.py
@@ -4,21 +4,28 @@
"""The version and URL for coverage.py"""
# This file is exec'ed in setup.py, don't import anything!
-_maj = 4
-_min = 0
-_mic = 0
-_rel = 0xb
-_ser = 2
-
-hexversion = (_maj << 24) + (_min << 16) + (_mic << 8) + (_rel << 4) + _ser
-
-__version__ = "%d.%d" % (_maj, _min)
-if _mic:
- __version__ += ".%d" % (_mic,)
-if _rel != 0xf:
- __version__ += "%x%d" % (_rel, _ser)
-
-__url__ = "https://coverage.readthedocs.org"
-if _rel != 0xf:
- # For pre-releases, use a version-specific URL.
- __url__ += "/en/coverage-" + __version__
+# Same semantics as sys.version_info.
+version_info = (4, 0, 0, 'beta', 2)
+
+
+def _make_version(major, minor, micro, releaselevel, serial):
+ """Create a readable version string from version_info tuple components."""
+ assert releaselevel in ['alpha', 'beta', 'candidate', 'final']
+ version = "%d.%d" % (major, minor)
+ if micro:
+ version += ".%d" % (micro,)
+ if releaselevel != 'final':
+ version += "%s%d" % (releaselevel[0], serial)
+ return version
+
+
+def _make_url(major, minor, micro, releaselevel, serial):
+ url = "https://coverage.readthedocs.org"
+ if releaselevel != 'final':
+ # For pre-releases, use a version-specific URL.
+ url += "/en/coverage-" + _make_version(major, minor, micro, releaselevel, serial)
+ return url
+
+
+__version__ = _make_version(*version_info)
+__url__ = _make_url(*version_info)
diff --git a/doc/changes.rst b/doc/changes.rst
index 7ef96fbd..4feb12b2 100644
--- a/doc/changes.rst
+++ b/doc/changes.rst
@@ -141,8 +141,8 @@ New features:
- The COVERAGE_DEBUG environment variable can be used to set the ``[run] debug``
configuration option to control what internal operations are logged.
-- A new version identifier is available, `coverage.hexversion`, with semantics
- identical to sys.hexversion.
+- A new version identifier is available, `coverage.version_info`, a plain tuple
+ of values similar to `sys.version_info`_.
Improvements:
@@ -210,7 +210,7 @@ Bug fixes:
preventing paradoxical results, fixing `issue 284`_.
- Branch coverage couldn't properly handle certain extremely long files. This
- is now fixed. (`issue 359`_).
+ is now fixed, closing `issue 359`_.
- Branch coverage didn't understand yield statements properly. Mickie Betz
persisted in pursuing this despite Ned's pessimism. Fixes `issue 308`_ and
@@ -222,7 +222,7 @@ Bug fixes:
- Empty files are now reported as 100% covered in the XML report, not 0%
covered.
-- The XML report will now create the output directory if need be. Thanks Chris
+- The XML report will now create the output directory if need be. Thanks, Chris
Rose.
- HTML reports no longer raise UnicodeDecodeError if a Python file has
@@ -238,6 +238,7 @@ Bug fixes:
.. _issue 324: https://bitbucket.org/ned/coveragepy/issue/324/yield-in-loop-confuses-branch-coverage
.. _issue 342: https://bitbucket.org/ned/coveragepy/issue/342/console-and-html-coverage-reports-differ
.. _issue 359: https://bitbucket.org/ned/coveragepy/issue/359/xml-report-chunk-error
+.. _sys.version_info: https://docs.python.org/3/library/sys.html#sys.version_info
.. _changes_371:
diff --git a/tests/test_misc.py b/tests/test_misc.py
index 76194ef6..b5957b24 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -5,8 +5,10 @@
import sys
+import coverage
+from coverage.version import _make_url, _make_version
from coverage.misc import Hasher, file_be_gone
-from coverage import __version__, __url__
+
from tests.coveragetest import CoverageTest
@@ -60,6 +62,36 @@ class RemoveFileTest(CoverageTest):
file_be_gone(".")
+class VersionTest(CoverageTest):
+ """Tests of version.py"""
+
+ run_in_temp_dir = False
+
+ def test_version_info(self):
+ # Make sure we didn't screw up the version_info tuple.
+ self.assertIsInstance(coverage.version_info, tuple)
+ self.assertEqual([type(d) for d in coverage.version_info], [int, int, int, str, int])
+ self.assertIn(coverage.version_info[3], ['alpha', 'beta', 'candidate', 'final'])
+
+ def test_make_version(self):
+ self.assertEqual(_make_version(4, 0, 0, 'alpha', 0), "4.0a0")
+ self.assertEqual(_make_version(4, 0, 0, 'alpha', 1), "4.0a1")
+ self.assertEqual(_make_version(4, 0, 0, 'final', 0), "4.0")
+ self.assertEqual(_make_version(4, 1, 2, 'beta', 3), "4.1.2b3")
+ self.assertEqual(_make_version(4, 1, 2, 'final', 0), "4.1.2")
+ self.assertEqual(_make_version(5, 10, 2, 'candidate', 7), "5.10.2c7")
+
+ def test_make_url(self):
+ self.assertEqual(
+ _make_url(4, 0, 0, 'final', 0),
+ "https://coverage.readthedocs.org"
+ )
+ self.assertEqual(
+ _make_url(4, 1, 2, 'beta', 3),
+ "https://coverage.readthedocs.org/en/coverage-4.1.2b3"
+ )
+
+
class SetupPyTest(CoverageTest):
"""Tests of setup.py"""
@@ -72,8 +104,8 @@ class SetupPyTest(CoverageTest):
self.assertEqual(status, 0)
out = output.splitlines()
self.assertIn("measurement", out[0])
- self.assertEqual(out[1], __version__)
- self.assertEqual(out[2], __url__)
+ self.assertEqual(out[1], coverage.__version__)
+ self.assertEqual(out[2], coverage.__url__)
self.assertIn("Ned Batchelder", out[3])
def test_more_metadata(self):