Hello community,

here is the log from the commit of package python-tap.py for openSUSE:Leap:15.2 
checked in at 2020-03-21 16:46:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-tap.py (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.python-tap.py.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-tap.py"

Sat Mar 21 16:46:14 2020 rev:2 rq:786842 version:3.0

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-tap.py/python-tap.py.changes    
2020-02-22 18:48:26.144244483 +0100
+++ /work/SRC/openSUSE:Leap:15.2/.python-tap.py.new.3160/python-tap.py.changes  
2020-03-21 16:47:40.737671641 +0100
@@ -1,0 +2,9 @@
+Wed Mar 11 12:59:42 UTC 2020 - pgaj...@suse.com
+
+- version update to 3.0
+  * Drop support for Python 2 (it is end-of-life).
+  * Add support for subtests.
+  * Run a test suite with ``python -m tap``.
+  * Discontinue use of Pipenv for managing development.
+
+-------------------------------------------------------------------

Old:
----
  tap.py-2.6.1.tar.gz

New:
----
  tap.py-3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-tap.py.spec ++++++
--- /var/tmp/diff_new_pack.RZrA8e/_old  2020-03-21 16:47:41.189671927 +0100
+++ /var/tmp/diff_new_pack.RZrA8e/_new  2020-03-21 16:47:41.193671930 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-tap.py
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,8 +17,9 @@
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
+%define skip_python2 1
 Name:           python-tap.py
-Version:        2.6.1
+Version:        3.0
 Release:        0
 Summary:        Test Anything Protocol (TAP) tools
 License:        BSD-2-Clause
@@ -29,6 +30,7 @@
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
+Requires:       python-setuptools
 Recommends:     python-PyYAML
 Recommends:     python-more-itertools
 BuildArch:      noarch
@@ -36,6 +38,7 @@
 BuildRequires:  %{python_module PyYAML}
 BuildRequires:  %{python_module mock}
 BuildRequires:  %{python_module more-itertools}
+BuildRequires:  %{python_module pytest}
 # /SECTION
 %python_subpackages
 
@@ -56,7 +59,7 @@
 
 %check
 export LANG=en_US.UTF-8
-%python_exec setup.py test
+%pytest
 
 %files %{python_files}
 %doc AUTHORS README.md

++++++ tap.py-2.6.1.tar.gz -> tap.py-3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/AUTHORS new/tap.py-3.0/AUTHORS
--- old/tap.py-2.6.1/AUTHORS    2018-09-15 01:32:05.000000000 +0200
+++ new/tap.py-3.0/AUTHORS      2020-01-10 16:08:52.000000000 +0100
@@ -5,6 +5,7 @@
 
 * Andrew McNamara
 * Chris Clarke
+* Erik Cederstrand
 * Marc Abramowitz
 * Mark E. Hamilton
 * Matt Layman
@@ -12,3 +13,5 @@
 * Michael F. Lamb (http://datagrok.org)
 * Nicolas Caniart
 * Richard Bosworth
+* Ross Burton
+* Simon McVittie
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/MANIFEST.in new/tap.py-3.0/MANIFEST.in
--- old/tap.py-2.6.1/MANIFEST.in        2018-01-07 03:54:20.000000000 +0100
+++ new/tap.py-3.0/MANIFEST.in  2019-12-15 02:25:01.000000000 +0100
@@ -1,8 +1,6 @@
 include AUTHORS
 include LICENSE
 include README.md
-include Pipfile
-include Pipfile.lock
 recursive-include docs *
 recursive-include tap/locale *
 prune docs/_build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/PKG-INFO new/tap.py-3.0/PKG-INFO
--- old/tap.py-2.6.1/PKG-INFO   2019-09-17 15:36:47.000000000 +0200
+++ new/tap.py-3.0/PKG-INFO     2020-01-10 16:12:24.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: tap.py
-Version: 2.6.1
+Version: 3.0
 Summary: Test Anything Protocol (TAP) tools
 Home-page: https://github.com/python-tap/tappy
 Author: Matt Layman
@@ -19,6 +19,20 @@
         Releases
         ========
         
+        Version 3.0, Released January 10, 2020
+        --------------------------------------
+        
+        * Drop support for Python 2 (it is end-of-life).
+        * Add support for subtests.
+        * Run a test suite with ``python -m tap``.
+        * Discontinue use of Pipenv for managing development.
+        
+        Version 2.6.2, Released October 20, 2019
+        ----------------------------------------
+        
+        * Fix bug in streaming mode that would generate tap files
+          when the plan was already set (affected pytest).
+        
         Version 2.6.1, Released September 17, 2019
         ------------------------------------------
         
@@ -185,7 +199,6 @@
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/Pipfile new/tap.py-3.0/Pipfile
--- old/tap.py-2.6.1/Pipfile    2019-01-23 19:31:06.000000000 +0100
+++ new/tap.py-3.0/Pipfile      1970-01-01 01:00:00.000000000 +0100
@@ -1,20 +0,0 @@
-[[source]]
-url = "https://pypi.python.org/simple";
-verify_ssl = true
-name = "pypi"
-
-[dev-packages]
-Babel = "*"
-coverage = "*"
-"flake8" = "==3.6.0"
-mock = "*"
-requests = "*"
-Sphinx = "*"
-tox = "*"
-twine = "*"
-pytest = "*"
-more-itertools = "*"
-pyyaml = "*"
-black = "*"
-
-[packages]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/Pipfile.lock new/tap.py-3.0/Pipfile.lock
--- old/tap.py-2.6.1/Pipfile.lock       2018-09-15 01:33:21.000000000 +0200
+++ new/tap.py-3.0/Pipfile.lock 1970-01-01 01:00:00.000000000 +0100
@@ -1,370 +0,0 @@
-{
-    "_meta": {
-        "hash": {
-            "sha256": 
"75d157b7787ee1eff10691e6cbbd12b52687ef68f2aa6509d18f8a829f166beb"
-        },
-        "pipfile-spec": 6,
-        "requires": {},
-        "sources": [
-            {
-                "name": "pypi",
-                "url": "https://pypi.python.org/simple";,
-                "verify_ssl": true
-            }
-        ]
-    },
-    "default": {},
-    "develop": {
-        "alabaster": {
-            "hashes": [
-                
"sha256:674bb3bab080f598371f4443c5008cbfeb1a5e622dd312395d2d82af2c54c456",
-                
"sha256:b63b1f4dc77c074d386752ec4a8a7517600f6c0db8cd42980cae17ab7b3275d7"
-            ],
-            "version": "==0.7.11"
-        },
-        "appdirs": {
-            "hashes": [
-                
"sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92",
-                
"sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"
-            ],
-            "version": "==1.4.3"
-        },
-        "atomicwrites": {
-            "hashes": [
-                
"sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0",
-                
"sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee"
-            ],
-            "markers": "python_version >= '2.7' and python_version != '3.3.*' 
and python_version != '3.1.*' and python_version != '3.0.*' and python_version 
!= '3.2.*'",
-            "version": "==1.2.1"
-        },
-        "attrs": {
-            "hashes": [
-                
"sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69",
-                
"sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"
-            ],
-            "version": "==18.2.0"
-        },
-        "babel": {
-            "hashes": [
-                
"sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669",
-                
"sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"
-            ],
-            "index": "pypi",
-            "version": "==2.6.0"
-        },
-        "black": {
-            "hashes": [
-                
"sha256:22158b89c1a6b4eb333a1e65e791a3f8b998cf3b11ae094adb2570f31f769a44",
-                
"sha256:4b475bbd528acce094c503a3d2dbc2d05a4075f6d0ef7d9e7514518e14cc5191"
-            ],
-            "index": "pypi",
-            "version": "==18.6b4"
-        },
-        "certifi": {
-            "hashes": [
-                
"sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638",
-                
"sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a"
-            ],
-            "version": "==2018.8.24"
-        },
-        "chardet": {
-            "hashes": [
-                
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
-                
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
-            ],
-            "version": "==3.0.4"
-        },
-        "click": {
-            "hashes": [
-                
"sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d",
-                
"sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"
-            ],
-            "version": "==6.7"
-        },
-        "coverage": {
-            "hashes": [
-                
"sha256:0dcf381f51f589f1f797449602a7fe4e63be8a7963c259c13742af3f30be902e",
-                
"sha256:11a4bb30306def2fa012e3429de44a93ef2ae3b6ad3f6b800f6c578658a5c402",
-                
"sha256:166c957a38b034050a14201f64eec11fc95e17bf2ba31fc07d887db82bae1a47",
-                
"sha256:184e6680f85fcc1b371f67ab732290ecf96a225448198e14ec170986db47b0aa",
-                
"sha256:1904deb72c561a8e445feb190db07ca4b165ee85567894b4b85fdb9bf21a27c0",
-                
"sha256:1f2003b83426cfaadebff8b9bb1fb3650134a15fda3a81434cc8415896d7a7bc",
-                
"sha256:1f462997b1804f8b5d1ee2b262626fc76b746e66023eb64f529af35991167c7c",
-                
"sha256:213697f49eba45b5fb05e77f63bdb7c0d13eed12dcd08e6af43224615b28b524",
-                
"sha256:2557da232b0daeb55afe2f7e55f7b80c56bfa2981864c6638b32b5691da9f4c3",
-                
"sha256:395a8525f1456439a5d6c248bc1397040491047e3e0e0c4ceb2059155419cd3b",
-                
"sha256:43d6334b35e50e74d034ec075ffd9082c559bca624924af6c7e9d2b8aef0f362",
-                
"sha256:4566c74bde36aaaef0372fb11678edf43dcc73f4eb8dbb6987250658c4a3b95a",
-                
"sha256:6d39cc527c9c7a30f20bed14b5cf9a7e87ef1f3528c1847d1c81caf75a31ebb6",
-                
"sha256:8bd69d3cba21d885df6fe8728cee779a722da08cf84072558956c148b5ab61e5",
-                
"sha256:a1d0fcbbe0735eb66c6622266b12e60ea8d37ada405cb8f73b154c5eec467187",
-                
"sha256:ab706bfbb365f232be01a536a9199ee6bfc80c9b63fb7825fdd5f4ae5cc2a12c",
-                
"sha256:afbf4cee68d2f2968b06951cf16c0b18513eb59bb3af0685084de6cacb04e217",
-                
"sha256:bbc8913cd5889df7eab597a4b4074a2c6c5ee6ca9aad58a9ba0f3f847b1a99df",
-                
"sha256:bd5428ab378a7432e43afa52b6bb9c5d48f5029f395a97dc9ebf87fc0f2a9d8b",
-                
"sha256:c3efe0185583443e04f8519818f4772d92fbbdf5f9fa23165f2f2482b20efc37",
-                
"sha256:d40277e918da575d008e2955a0ca6600f870bdb3570b07ee3a754ea9301862e7",
-                
"sha256:d4b6ec6951e20ea3f5d1fefe35b4bcbf692d4306f1b932c28dd2ee4cb167152c",
-                
"sha256:d5837e813ad62c856bc80f988c4e24e0d2b7b22a8a1dad8c1cfcb8ff4d4750a8",
-                
"sha256:d9583ae0e152c5fb0142cb55c3a11e1b13006c00d0c3e8b35ccc2d4ebfc6645e",
-                
"sha256:e27380cbe4088a1df514e75aa4fe6dc9e98bbd7902cf28ab16e8b2de0f8cb344",
-                
"sha256:e624daef32f8808296312e72190c7e576852cb75c27935b31c1bbbde14ab353c",
-                
"sha256:ef4278e5ac1e47c731ec5e3e48351721e01d2eb4fefa9b97fcdba7495a82cfad"
-            ],
-            "index": "pypi",
-            "version": "==5.0a2"
-        },
-        "docutils": {
-            "hashes": [
-                
"sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
-                
"sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
-                
"sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
-            ],
-            "version": "==0.14"
-        },
-        "flake8": {
-            "hashes": [
-                
"sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0",
-                
"sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37"
-            ],
-            "index": "pypi",
-            "version": "==3.5.0"
-        },
-        "idna": {
-            "hashes": [
-                
"sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
-                
"sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"
-            ],
-            "version": "==2.7"
-        },
-        "imagesize": {
-            "hashes": [
-                
"sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8",
-                
"sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5"
-            ],
-            "markers": "python_version >= '2.7' and python_version != '3.3.*' 
and python_version != '3.1.*' and python_version != '3.0.*' and python_version 
!= '3.2.*'",
-            "version": "==1.1.0"
-        },
-        "jinja2": {
-            "hashes": [
-                
"sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd",
-                
"sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"
-            ],
-            "version": "==2.10"
-        },
-        "markupsafe": {
-            "hashes": [
-                
"sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665"
-            ],
-            "version": "==1.0"
-        },
-        "mccabe": {
-            "hashes": [
-                
"sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
-                
"sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
-            ],
-            "version": "==0.6.1"
-        },
-        "mock": {
-            "hashes": [
-                
"sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1",
-                
"sha256:b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba"
-            ],
-            "index": "pypi",
-            "version": "==2.0.0"
-        },
-        "more-itertools": {
-            "hashes": [
-                
"sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092",
-                
"sha256:c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e",
-                
"sha256:fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d"
-            ],
-            "index": "pypi",
-            "version": "==4.3.0"
-        },
-        "packaging": {
-            "hashes": [
-                
"sha256:e9215d2d2535d3ae866c3d6efc77d5b24a0192cce0ff20e42896cc0664f889c0",
-                
"sha256:f019b770dd64e585a99714f1fd5e01c7a8f11b45635aa953fd41c689a657375b"
-            ],
-            "version": "==17.1"
-        },
-        "pbr": {
-            "hashes": [
-                
"sha256:1b8be50d938c9bb75d0eaf7eda111eec1bf6dc88a62a6412e33bf077457e0f45",
-                
"sha256:b486975c0cafb6beeb50ca0e17ba047647f229087bd74e37f4a7e2cac17d2caa"
-            ],
-            "version": "==4.2.0"
-        },
-        "pkginfo": {
-            "hashes": [
-                
"sha256:5878d542a4b3f237e359926384f1dde4e099c9f5525d236b1840cf704fa8d474",
-                
"sha256:a39076cb3eb34c333a0dd390b568e9e1e881c7bf2cc0aee12120636816f55aee"
-            ],
-            "version": "==1.4.2"
-        },
-        "pluggy": {
-            "hashes": [
-                
"sha256:6e3836e39f4d36ae72840833db137f7b7d35105079aee6ec4a62d9f80d594dd1",
-                
"sha256:95eb8364a4708392bae89035f45341871286a333f749c3141c20573d2b3876e1"
-            ],
-            "markers": "python_version != '3.3.*' and python_version != 
'3.2.*' and python_version != '3.1.*' and python_version >= '2.7' and 
python_version != '3.0.*'",
-            "version": "==0.7.1"
-        },
-        "py": {
-            "hashes": [
-                
"sha256:06a30435d058473046be836d3fc4f27167fd84c45b99704f2fb5509ef61f9af1",
-                
"sha256:50402e9d1c9005d759426988a492e0edaadb7f4e68bcddfea586bc7432d009c6"
-            ],
-            "markers": "python_version != '3.3.*' and python_version != 
'3.2.*' and python_version != '3.1.*' and python_version >= '2.7' and 
python_version != '3.0.*'",
-            "version": "==1.6.0"
-        },
-        "pycodestyle": {
-            "hashes": [
-                
"sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766",
-                
"sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9"
-            ],
-            "version": "==2.3.1"
-        },
-        "pyflakes": {
-            "hashes": [
-                
"sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f",
-                
"sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805"
-            ],
-            "version": "==1.6.0"
-        },
-        "pygments": {
-            "hashes": [
-                
"sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
-                
"sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
-            ],
-            "version": "==2.2.0"
-        },
-        "pyparsing": {
-            "hashes": [
-                
"sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04",
-                
"sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010"
-            ],
-            "version": "==2.2.0"
-        },
-        "pytest": {
-            "hashes": [
-                
"sha256:453cbbbe5ce6db38717d282b758b917de84802af4288910c12442984bde7b823",
-                
"sha256:a8a07f84e680482eb51e244370aaf2caa6301ef265f37c2bdefb3dd3b663f99d"
-            ],
-            "index": "pypi",
-            "version": "==3.8.0"
-        },
-        "pytz": {
-            "hashes": [
-                
"sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053",
-                
"sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277"
-            ],
-            "version": "==2018.5"
-        },
-        "pyyaml": {
-            "hashes": [
-                
"sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb",
-                
"sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2",
-                
"sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76",
-                
"sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b",
-                
"sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b"
-            ],
-            "index": "pypi",
-            "version": "==4.2b4"
-        },
-        "requests": {
-            "hashes": [
-                
"sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
-                
"sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a"
-            ],
-            "index": "pypi",
-            "version": "==2.19.1"
-        },
-        "requests-toolbelt": {
-            "hashes": [
-                
"sha256:42c9c170abc2cacb78b8ab23ac957945c7716249206f90874651971a4acff237",
-                
"sha256:f6a531936c6fa4c6cfce1b9c10d5c4f498d16528d2a54a22ca00011205a187b5"
-            ],
-            "markers": "python_version != '3.3.*' and python_version != 
'3.2.*' and python_version != '3.1.*' and python_version != '3.0.*' and 
python_version >= '2.6' and python_version < '4'",
-            "version": "==0.8.0"
-        },
-        "six": {
-            "hashes": [
-                
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
-                
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
-            ],
-            "version": "==1.11.0"
-        },
-        "snowballstemmer": {
-            "hashes": [
-                
"sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128",
-                
"sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89"
-            ],
-            "version": "==1.2.1"
-        },
-        "sphinx": {
-            "hashes": [
-                
"sha256:95acd6648902333647a0e0564abdb28a74b0a76d2333148aa35e5ed1f56d3c4b",
-                
"sha256:c091dbdd5cc5aac6eb95d591a819fd18bccec90ffb048ec465b165a48b839b45"
-            ],
-            "index": "pypi",
-            "version": "==1.8.0"
-        },
-        "sphinxcontrib-websupport": {
-            "hashes": [
-                
"sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd",
-                
"sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9"
-            ],
-            "markers": "python_version >= '2.7' and python_version != '3.3.*' 
and python_version != '3.1.*' and python_version != '3.0.*' and python_version 
!= '3.2.*'",
-            "version": "==1.1.0"
-        },
-        "toml": {
-            "hashes": [
-                
"sha256:380178cde50a6a79f9d2cf6f42a62a5174febe5eea4126fe4038785f1d888d42",
-                
"sha256:a7901919d3e4f92ffba7ff40a9d697e35bbbc8a8049fe8da742f34c83606d957"
-            ],
-            "version": "==0.9.6"
-        },
-        "tox": {
-            "hashes": [
-                
"sha256:433bb93c57edae263150767e672a0d468ab4fefcc1958eb4013e56a670bb851e",
-                
"sha256:bfb4e4efb7c61a54bc010a5c00fdbe0973bc4bdf04090bfcd3c93c901006177c"
-            ],
-            "index": "pypi",
-            "version": "==3.3.0"
-        },
-        "tqdm": {
-            "hashes": [
-                
"sha256:18f1818ce951aeb9ea162ae1098b43f583f7d057b34d706f66939353d1208889",
-                
"sha256:df02c0650160986bac0218bb07952245fc6960d23654648b5d5526ad5a4128c9"
-            ],
-            "markers": "python_version != '3.1.*' and python_version >= '2.6' 
and python_version != '3.0.*'",
-            "version": "==4.26.0"
-        },
-        "twine": {
-            "hashes": [
-                
"sha256:08eb132bbaec40c6d25b358f546ec1dc96ebd2638a86eea68769d9e67fe2b129",
-                
"sha256:2fd9a4d9ff0bcacf41fdc40c8cb0cfaef1f1859457c9653fd1b92237cc4e9f25"
-            ],
-            "index": "pypi",
-            "version": "==1.11.0"
-        },
-        "urllib3": {
-            "hashes": [
-                
"sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
-                
"sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
-            ],
-            "markers": "python_version != '3.3.*' and python_version != 
'3.2.*' and python_version != '3.1.*' and python_version != '3.0.*' and 
python_version >= '2.6' and python_version < '4'",
-            "version": "==1.23"
-        },
-        "virtualenv": {
-            "hashes": [
-                
"sha256:2ce32cd126117ce2c539f0134eb89de91a8413a29baac49cbab3eb50e2026669",
-                
"sha256:ca07b4c0b54e14a91af9f34d0919790b016923d157afda5efdde55c96718f752"
-            ],
-            "markers": "python_version != '3.2.*' and python_version != 
'3.1.*' and python_version >= '2.7' and python_version != '3.0.*'",
-            "version": "==16.0.0"
-        }
-    }
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/README.md new/tap.py-3.0/README.md
--- old/tap.py-2.6.1/README.md  2019-09-17 03:43:18.000000000 +0200
+++ new/tap.py-3.0/README.md    2019-12-10 03:01:09.000000000 +0100
@@ -28,7 +28,6 @@
 
 tappy is available for download from [PyPI][pypi]. tappy is currently supported
 on Python
-2.7,
 3.5,
 3.6,
 3.7,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/docs/contributing.rst 
new/tap.py-3.0/docs/contributing.rst
--- old/tap.py-2.6.1/docs/contributing.rst      2018-09-15 01:57:18.000000000 
+0200
+++ new/tap.py-3.0/docs/contributing.rst        2019-12-15 02:25:01.000000000 
+0100
@@ -14,20 +14,15 @@
 Setup
 -----
 
-tappy uses Pipenv
-to manage development.
-The following instructions assume that Pipenv is installed.
-See the `Pipenv install instructions <https://docs.pipenv.org/install/>`_
-for more details.
-
-After installing Pipenv:
+tappy uses the built-in `venv` module.
 
 .. code-block:: console
 
    $ git clone g...@github.com:python-tap/tappy.git
    $ cd tappy
-   $ pipenv install --dev --ignore-pipfile
-   $ pipenv shell
+   $ python3 -m venv venv
+   $ source venv/bin/activate
+   $ pip install -r requirements-dev.txt
    $ # Edit some files and run the tests.
    $ pytest
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/docs/index.rst 
new/tap.py-3.0/docs/index.rst
--- old/tap.py-2.6.1/docs/index.rst     2019-09-17 03:43:18.000000000 +0200
+++ new/tap.py-3.0/docs/index.rst       2019-12-15 03:07:09.000000000 +0100
@@ -24,7 +24,7 @@
 
 tappy is available for download from `PyPI
 <https://pypi.python.org/pypi/tap.py>`_. tappy is currently supported on
-Python 2.7,
+Python
 3.5,
 3.6,
 3.7,
@@ -45,6 +45,18 @@
 
    $ pip install tap.py[yaml]
 
+Quickstart
+----------
+
+tappy can run like the built-in ``unittest`` discovery runner.
+
+.. code-block:: console
+
+   $ python -m tap
+
+This should be enough to run a unittest-based test suite
+and output TAP to the console.
+
 Documentation
 -------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/docs/producers.rst 
new/tap.py-3.0/docs/producers.rst
--- old/tap.py-2.6.1/docs/producers.rst 2016-07-30 20:51:28.000000000 +0200
+++ new/tap.py-3.0/docs/producers.rst   2019-12-15 03:07:09.000000000 +0100
@@ -13,6 +13,8 @@
   for the **nose** testing tool.
 * tappy for **pytest** - tappy provides a plugin called ``tap``
   for the **pytest** testing tool.
+* tappy as the test runner - tappy can run like ``python -m unittest``.
+  Run your test suite with ``python -m tap``.
 
 By default, the producers will create one TAP file for each ``TestCase``
 executed by the test suite.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/docs/releases.rst 
new/tap.py-3.0/docs/releases.rst
--- old/tap.py-2.6.1/docs/releases.rst  2019-09-17 15:32:21.000000000 +0200
+++ new/tap.py-3.0/docs/releases.rst    2020-01-10 16:09:53.000000000 +0100
@@ -1,6 +1,20 @@
 Releases
 ========
 
+Version 3.0, Released January 10, 2020
+--------------------------------------
+
+* Drop support for Python 2 (it is end-of-life).
+* Add support for subtests.
+* Run a test suite with ``python -m tap``.
+* Discontinue use of Pipenv for managing development.
+
+Version 2.6.2, Released October 20, 2019
+----------------------------------------
+
+* Fix bug in streaming mode that would generate tap files
+  when the plan was already set (affected pytest).
+
 Version 2.6.1, Released September 17, 2019
 ------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/docs/tappy.1.rst 
new/tap.py-3.0/docs/tappy.1.rst
--- old/tap.py-2.6.1/docs/tappy.1.rst   2016-07-30 20:51:28.000000000 +0200
+++ new/tap.py-3.0/docs/tappy.1.rst     2020-01-10 16:08:52.000000000 +0100
@@ -17,7 +17,7 @@
 given as *pathname* s and produces an output similar to what
 the regular text test-runner from python's :py:mod:`unittest`
 module would. If *pathname* points to a directory,
-:program:`tappy` will look in that directory of ``*.tap``
+:program:`tappy` will look in that directory for ``*.tap``
 files to consume.
 
 If you have a tool that consumes the `unittest` regular output,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/setup.py new/tap.py-3.0/setup.py
--- old/tap.py-2.6.1/setup.py   2019-09-17 03:43:18.000000000 +0200
+++ new/tap.py-3.0/setup.py     2019-12-26 15:22:44.000000000 +0100
@@ -9,29 +9,33 @@
 `Read the Docs <https://tappy.readthedocs.io/>`_.
 """
 
-from setuptools import find_packages, setup
-from setuptools.command.build_py import build_py
-from setuptools.command.sdist import sdist
+from setuptools import find_packages, setup, Command
 
 import tap
 
 
-class BuildPy(build_py):
-    """Custom ``build_py`` command to always build mo files for wheels."""
+class ReleaseCommand(Command):
+    description = "generate distribution release artifacts"
+    user_options = []
+
+    def initialize_options(self):
+        """Initialize options.
+        This method overrides a required abstract method.
+        """
+
+    def finalize_options(self):
+        """Finalize options.
+        This method overrides a required abstract method.
+        """
 
     def run(self):
+        """Generate the distribution release artifacts.
+        The custom command is used to ensure that compiling
+        po to mo is not skipped.
+        """
         self.run_command("compile_catalog")
-        # build_py is an old style class so super cannot be used.
-        build_py.run(self)
-
-
-class Sdist(sdist):
-    """Custom ``sdist`` command to ensure that mo files are always created."""
-
-    def run(self):
-        self.run_command("compile_catalog")
-        # sdist is an old style class so super cannot be used.
-        sdist.run(self)
+        self.run_command("sdist")
+        self.run_command("bdist_wheel")
 
 
 # The docs import setup.py for the version so only call setup when not behaving
@@ -59,14 +63,13 @@
         zip_safe=False,
         platforms="any",
         install_requires=[],
-        extras_require={"yaml": ["more-itertools", "PyYAML"]},
+        extras_require={"yaml": ["more-itertools", "PyYAML>=5.1"]},
         classifiers=[
             "Development Status :: 5 - Production/Stable",
             "Environment :: Console",
             "Intended Audience :: Developers",
             "License :: OSI Approved :: BSD License",
             "Operating System :: OS Independent",
-            "Programming Language :: Python :: 2.7",
             "Programming Language :: Python :: 3.5",
             "Programming Language :: Python :: 3.6",
             "Programming Language :: Python :: 3.7",
@@ -74,7 +77,5 @@
             "Topic :: Software Development :: Testing",
         ],
         keywords=["TAP", "unittest"],
-        cmdclass={"build_py": BuildPy, "sdist": Sdist},
-        test_suite="tap.tests",
-        tests_require=["mock"],
+        cmdclass={"release": ReleaseCommand},
     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/__init__.py 
new/tap.py-3.0/tap/__init__.py
--- old/tap.py-2.6.1/tap/__init__.py    2019-09-17 15:33:08.000000000 +0200
+++ new/tap.py-3.0/tap/__init__.py      2019-12-10 03:01:09.000000000 +0100
@@ -3,4 +3,4 @@
 from .runner import TAPTestRunner
 
 __all__ = ["TAPTestRunner"]
-__version__ = "2.6.1"
+__version__ = "3.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/__main__.py 
new/tap.py-3.0/tap/__main__.py
--- old/tap.py-2.6.1/tap/__main__.py    1970-01-01 01:00:00.000000000 +0100
+++ new/tap.py-3.0/tap/__main__.py      2019-12-15 03:07:09.000000000 +0100
@@ -0,0 +1,3 @@
+from tap.main import main_module
+
+main_module()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/directive.py 
new/tap.py-3.0/tap/directive.py
--- old/tap.py-2.6.1/tap/directive.py   2019-09-17 02:58:18.000000000 +0200
+++ new/tap.py-3.0/tap/directive.py     2019-10-20 23:30:15.000000000 +0200
@@ -20,10 +20,10 @@
     )
 
     def __init__(self, text):
-        """Initialize the directive by parsing the text.
+        r"""Initialize the directive by parsing the text.
 
         The text is assumed to be everything after a '#\s*' on a result line.
-        """  # noqa: flake8 is grumbling about the \s in the description.
+        """
         self._text = text
         self._skip = False
         self._todo = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/line.py new/tap.py-3.0/tap/line.py
--- old/tap.py-2.6.1/tap/line.py        2019-09-17 02:58:18.000000000 +0200
+++ new/tap.py-3.0/tap/line.py  2019-12-26 15:22:44.000000000 +0100
@@ -96,7 +96,7 @@
         """
         if LOAD_YAML and self._yaml_block is not None:
             try:
-                yaml_dict = yaml.load(self._yaml_block)
+                yaml_dict = yaml.load(self._yaml_block, Loader=yaml.SafeLoader)
                 return yaml_dict
             except yaml.error.YAMLError:
                 print("Error parsing yaml block. Check formatting.")
Binary files old/tap.py-2.6.1/tap/locale/ar/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/ar/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/de/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/de/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/es/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/es/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/fr/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/fr/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/it/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/it/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/ja/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/ja/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/nl/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/nl/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/pt/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/pt/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/ru/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/ru/LC_MESSAGES/tappy.mo differ
Binary files old/tap.py-2.6.1/tap/locale/zh/LC_MESSAGES/tappy.mo and 
new/tap.py-3.0/tap/locale/zh/LC_MESSAGES/tappy.mo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/main.py new/tap.py-3.0/tap/main.py
--- old/tap.py-2.6.1/tap/main.py        2019-09-17 02:58:18.000000000 +0200
+++ new/tap.py-3.0/tap/main.py  2019-12-15 03:07:09.000000000 +0100
@@ -6,6 +6,7 @@
 
 from tap.i18n import _
 from tap.loader import Loader
+from tap.runner import TAPTestRunner
 
 
 def main(argv=sys.argv, stream=sys.stderr):
@@ -71,3 +72,10 @@
         return 0
     else:
         return 1
+
+
+def main_module():
+    """Entry point for running as ``python -m tap``."""
+    runner = TAPTestRunner()
+    runner.set_stream(True)
+    unittest.main(module=None, testRunner=runner)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/runner.py 
new/tap.py-3.0/tap/runner.py
--- old/tap.py-2.6.1/tap/runner.py      2019-09-17 02:58:18.000000000 +0200
+++ new/tap.py-3.0/tap/runner.py        2019-12-15 01:47:48.000000000 +0100
@@ -17,6 +17,18 @@
     def __init__(self, stream, descriptions, verbosity):
         super(TAPTestResult, self).__init__(stream, descriptions, verbosity)
 
+    def addSubTest(self, test, subtest, err):
+        super(TAPTestResult, self).addSubTest(test, subtest, err)
+        if err is not None:
+            diagnostics = formatter.format_exception(err)
+            self.tracker.add_not_ok(
+                self._cls_name(test),
+                self._description(subtest),
+                diagnostics=diagnostics,
+            )
+        else:
+            self.tracker.add_ok(self._cls_name(test), 
self._description(subtest))
+
     def stopTestRun(self):
         """Once the test run is complete, generate each of the TAP files."""
         super(TAPTestResult, self).stopTestRun()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_adapter.py 
new/tap.py-3.0/tap/tests/test_adapter.py
--- old/tap.py-2.6.1/tap/tests/test_adapter.py  2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_adapter.py    2019-12-15 03:12:58.000000000 
+0100
@@ -1,9 +1,6 @@
 # Copyright (c) 2019, Matt Layman and contributors
 
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap.adapter import Adapter
 from tap.tests import TestCase
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_loader.py 
new/tap.py-3.0/tap/tests/test_loader.py
--- old/tap.py-2.6.1/tap/tests/test_loader.py   2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_loader.py     2019-12-15 02:05:47.000000000 
+0100
@@ -5,11 +5,7 @@
 import os
 import tempfile
 import unittest
-
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap.i18n import _
 from tap.loader import Loader
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_main.py 
new/tap.py-3.0/tap/tests/test_main.py
--- old/tap.py-2.6.1/tap/tests/test_main.py     2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_main.py       2019-12-15 03:07:09.000000000 
+0100
@@ -2,14 +2,10 @@
 
 import argparse
 import os
-
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap.loader import Loader
-from tap.main import build_suite, get_status, main, parse_args
+from tap.main import build_suite, get_status, main, main_module, parse_args
 from tap.tests import TestCase
 
 
@@ -57,3 +53,11 @@
         parse_args(argv)
         self.assertTrue(print_help.called)
         self.assertTrue(sys_exit.called)
+
+
+class TestMainModule(TestCase):
+    @mock.patch("tap.main.unittest")
+    def test_main_set_to_stream(self, mock_unittest):
+        main_module()
+
+        mock_unittest.main.called
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_parser.py 
new/tap.py-3.0/tap/tests/test_parser.py
--- old/tap.py-2.6.1/tap/tests/test_parser.py   2019-09-17 15:30:59.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_parser.py     2019-12-15 02:05:47.000000000 
+0100
@@ -6,11 +6,7 @@
 import sys
 import tempfile
 import unittest
-
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap.parser import Parser
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_result.py 
new/tap.py-3.0/tap/tests/test_result.py
--- old/tap.py-2.6.1/tap/tests/test_result.py   2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_result.py     2019-12-15 01:47:48.000000000 
+0100
@@ -1,7 +1,9 @@
 # Copyright (c) 2019, Matt Layman and contributors
 
+import contextlib
 import os
 import unittest
+import unittest.case
 
 from tap.i18n import _
 from tap.runner import TAPTestResult
@@ -13,6 +15,14 @@
     def runTest(self):
         pass
 
+    @contextlib.contextmanager
+    def subTest(self, *args, **kwargs):
+        try:
+            self._subtest = unittest.case._SubTest(self, object(), {})
+            yield
+        finally:
+            self._subtest = None
+
     def __call__(self, result):
         pass
 
@@ -70,3 +80,25 @@
         self.assertEqual(
             line.directive.text, "TODO {}".format(_("(unexpected success)"))
         )
+
+    def test_adds_subtest_success(self):
+        """Test that the runner handles subtest success results."""
+        result = self._make_one()
+        test = FakeTestCase()
+        with test.subTest():
+            result.addSubTest(test, test._subtest, None)
+        line = result.tracker._test_cases["FakeTestCase"][0]
+        self.assertTrue(line.ok)
+
+    def test_adds_subtest_failure(self):
+        """Test that the runner handles subtest failure results."""
+        result = self._make_one()
+        # Python 3 does some extra testing in unittest on exceptions so fake
+        # the cause as if it were raised.
+        ex = Exception()
+        ex.__cause__ = None
+        test = FakeTestCase()
+        with test.subTest():
+            result.addSubTest(test, test._subtest, (ex.__class__, ex, None))
+        line = result.tracker._test_cases["FakeTestCase"][0]
+        self.assertFalse(line.ok)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_runner.py 
new/tap.py-3.0/tap/tests/test_runner.py
--- old/tap.py-2.6.1/tap/tests/test_runner.py   2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_runner.py     2019-12-15 02:05:47.000000000 
+0100
@@ -4,11 +4,7 @@
 import sys
 import tempfile
 import unittest
-
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap import TAPTestRunner
 from tap.runner import TAPTestResult, _tracker
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tests/test_tracker.py 
new/tap.py-3.0/tap/tests/test_tracker.py
--- old/tap.py-2.6.1/tap/tests/test_tracker.py  2019-09-17 02:58:18.000000000 
+0200
+++ new/tap.py-3.0/tap/tests/test_tracker.py    2020-01-10 16:08:52.000000000 
+0100
@@ -1,18 +1,10 @@
 # Copyright (c) 2019, Matt Layman and contributors
 
 import inspect
+from io import StringIO
 import os
 import tempfile
-
-try:
-    from cStringIO import StringIO
-except ImportError:
-    from io import StringIO
-
-try:
-    from unittest import mock
-except ImportError:
-    import mock
+from unittest import mock
 
 from tap.i18n import _
 from tap.tests import TestCase
@@ -233,11 +225,21 @@
 
     @mock.patch("tap.tracker.ENABLE_VERSION_13", False)
     def test_write_plan_first_streaming(self):
+        outdir = tempfile.mkdtemp()
         stream = StringIO()
-        tracker = Tracker(streaming=True, stream=stream)
+        tracker = Tracker(outdir=outdir, streaming=True, stream=stream)
         tracker.set_plan(123)
+        tracker.add_ok("FakeTestCase", "YESSS!")
+
         tracker.generate_tap_reports()
-        self.assertEqual(stream.getvalue(), "1..123\n")
+
+        self.assertEqual(
+            stream.getvalue(),
+            "1..123\n{header}\nok 1 YESSS!\n".format(
+                header=self._make_header("FakeTestCase")
+            ),
+        )
+        self.assertFalse(os.path.exists(os.path.join(outdir, 
"FakeTestCase.tap")))
 
     @mock.patch("tap.tracker.ENABLE_VERSION_13", False)
     def test_write_plan_immediate_streaming(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap/tracker.py 
new/tap.py-3.0/tap/tracker.py
--- old/tap.py-2.6.1/tap/tracker.py     2019-09-17 02:58:18.000000000 +0200
+++ new/tap.py-3.0/tap/tracker.py       2019-12-10 03:01:09.000000000 +0100
@@ -1,9 +1,6 @@
 # Copyright (c) 2019, Matt Layman and contributors
 
-from __future__ import print_function
 import os
-import string
-import sys
 
 from tap.directive import Directive
 from tap.i18n import _
@@ -52,11 +49,7 @@
         # Internal state for tracking each test case.
         self._test_cases = {}
 
-        # Python versions 2 and 3 keep maketrans in different locations.
-        if sys.version_info[0] < 3:
-            self._sanitized_table = string.maketrans(" \\/\n", "----")
-        else:  # pragma: no cover
-            self._sanitized_table = str.maketrans(" \\/\n", "----")
+        self._sanitized_table = str.maketrans(" \\/\n", "----")
 
         if self.streaming:
             self._write_tap_version(self.stream)
@@ -152,11 +145,12 @@
         The results are either combined into a single output file or
         the output file name is generated from the test case.
         """
-        # We're streaming but set_plan wasn't called, so we can only
-        # know the plan now (at the end).
-        if self.streaming and not self._plan_written:
-            print("1..{0}".format(self.combined_line_number), file=self.stream)
-            self._plan_written = True
+        if self.streaming:
+            # We're streaming but set_plan wasn't called, so we can only
+            # know the plan now (at the end).
+            if not self._plan_written:
+                print("1..{0}".format(self.combined_line_number), 
file=self.stream)
+                self._plan_written = True
             return
 
         if self.combined:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap.py.egg-info/PKG-INFO 
new/tap.py-3.0/tap.py.egg-info/PKG-INFO
--- old/tap.py-2.6.1/tap.py.egg-info/PKG-INFO   2019-09-17 15:36:47.000000000 
+0200
+++ new/tap.py-3.0/tap.py.egg-info/PKG-INFO     2020-01-10 16:12:24.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: tap.py
-Version: 2.6.1
+Version: 3.0
 Summary: Test Anything Protocol (TAP) tools
 Home-page: https://github.com/python-tap/tappy
 Author: Matt Layman
@@ -19,6 +19,20 @@
         Releases
         ========
         
+        Version 3.0, Released January 10, 2020
+        --------------------------------------
+        
+        * Drop support for Python 2 (it is end-of-life).
+        * Add support for subtests.
+        * Run a test suite with ``python -m tap``.
+        * Discontinue use of Pipenv for managing development.
+        
+        Version 2.6.2, Released October 20, 2019
+        ----------------------------------------
+        
+        * Fix bug in streaming mode that would generate tap files
+          when the plan was already set (affected pytest).
+        
         Version 2.6.1, Released September 17, 2019
         ------------------------------------------
         
@@ -185,7 +199,6 @@
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap.py.egg-info/SOURCES.txt 
new/tap.py-3.0/tap.py.egg-info/SOURCES.txt
--- old/tap.py-2.6.1/tap.py.egg-info/SOURCES.txt        2019-09-17 
15:36:47.000000000 +0200
+++ new/tap.py-3.0/tap.py.egg-info/SOURCES.txt  2020-01-10 16:12:24.000000000 
+0100
@@ -1,8 +1,6 @@
 AUTHORS
 LICENSE
 MANIFEST.in
-Pipfile
-Pipfile.lock
 README.md
 setup.cfg
 setup.py
@@ -23,6 +21,7 @@
 docs/images/stream.gif
 docs/images/tap.png
 tap/__init__.py
+tap/__main__.py
 tap/adapter.py
 tap/directive.py
 tap/formatter.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tap.py-2.6.1/tap.py.egg-info/requires.txt 
new/tap.py-3.0/tap.py.egg-info/requires.txt
--- old/tap.py-2.6.1/tap.py.egg-info/requires.txt       2019-09-17 
15:36:47.000000000 +0200
+++ new/tap.py-3.0/tap.py.egg-info/requires.txt 2020-01-10 16:12:24.000000000 
+0100
@@ -1,4 +1,4 @@
 
 [yaml]
 more-itertools
-PyYAML
+PyYAML>=5.1


Reply via email to