Merge remote-tracking branch 'upstream/master' into features
This commit is contained in:
		
						commit
						3d89905114
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							| 
						 | 
					@ -120,6 +120,7 @@ Michael Birtwell
 | 
				
			||||||
Michael Droettboom
 | 
					Michael Droettboom
 | 
				
			||||||
Michael Seifert
 | 
					Michael Seifert
 | 
				
			||||||
Michal Wajszczuk
 | 
					Michal Wajszczuk
 | 
				
			||||||
 | 
					Mihai Capotă
 | 
				
			||||||
Mike Lundy
 | 
					Mike Lundy
 | 
				
			||||||
Nathaniel Waisbrot
 | 
					Nathaniel Waisbrot
 | 
				
			||||||
Ned Batchelder
 | 
					Ned Batchelder
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,13 +34,13 @@ If you are reporting a bug, please include:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Your operating system name and version.
 | 
					* Your operating system name and version.
 | 
				
			||||||
* Any details about your local setup that might be helpful in troubleshooting,
 | 
					* Any details about your local setup that might be helpful in troubleshooting,
 | 
				
			||||||
  specifically Python interpreter version,
 | 
					  specifically the Python interpreter version, installed libraries, and pytest
 | 
				
			||||||
  installed libraries and pytest version.
 | 
					  version.
 | 
				
			||||||
* Detailed steps to reproduce the bug.
 | 
					* Detailed steps to reproduce the bug.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you can write a demonstration test that currently fails but should pass (xfail),
 | 
					If you can write a demonstration test that currently fails but should pass
 | 
				
			||||||
that is a very useful commit to make as well, even if you can't find how
 | 
					(xfail), that is a very useful commit to make as well, even if you cannot
 | 
				
			||||||
to fix the bug yet.
 | 
					fix the bug itself.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _fixbugs:
 | 
					.. _fixbugs:
 | 
				
			||||||
| 
						 | 
					@ -165,29 +165,30 @@ Short version
 | 
				
			||||||
~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#. Fork the repository;
 | 
					#. Fork the repository;
 | 
				
			||||||
#. Target ``master`` for bug-fix and doc changes;
 | 
					#. Target ``master`` for bugfixes and doc changes;
 | 
				
			||||||
#. Target ``features`` for new features or functionality changes.
 | 
					#. Target ``features`` for new features or functionality changes.
 | 
				
			||||||
#. Follow **PEP-8**. There's a ``tox`` command to help fixing it: ``tox -e fix-lint``.
 | 
					#. Follow **PEP-8**. There's a ``tox`` command to help fixing it: ``tox -e fix-lint``.
 | 
				
			||||||
#. Tests are run using ``tox``::
 | 
					#. Tests are run using ``tox``::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tox -e linting,py27,py36
 | 
					    tox -e linting,py27,py36
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   The test environments above are usually enough to to cover most cases locally.
 | 
					   The test environments above are usually enough to cover most cases locally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#. Write a ``changelog`` entry: ``changelog/2574.bugfix``, use issue id number and one of
 | 
					#. Write a ``changelog`` entry: ``changelog/2574.bugfix``, use issue id number
 | 
				
			||||||
   ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or ``trivial`` for the issue type.
 | 
					   and one of ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or
 | 
				
			||||||
 | 
					   ``trivial`` for the issue type.
 | 
				
			||||||
#. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order.
 | 
					#. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Long version
 | 
					Long version
 | 
				
			||||||
~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What is a "pull request"?  It informs the project's core developers about the
 | 
				
			||||||
What is a "pull request"?  It informs project's core developers about the
 | 
					 | 
				
			||||||
changes you want to review and merge.  Pull requests are stored on
 | 
					changes you want to review and merge.  Pull requests are stored on
 | 
				
			||||||
`GitHub servers <https://github.com/pytest-dev/pytest/pulls>`_.
 | 
					`GitHub servers <https://github.com/pytest-dev/pytest/pulls>`_.
 | 
				
			||||||
Once you send a pull request, we can discuss its potential modifications and
 | 
					Once you send a pull request, we can discuss its potential modifications and
 | 
				
			||||||
even add more commits to it later on. There's an excellent tutorial on how Pull Requests work in the
 | 
					even add more commits to it later on. There's an excellent tutorial on how Pull
 | 
				
			||||||
 | 
					Requests work in the
 | 
				
			||||||
`GitHub Help Center <https://help.github.com/articles/using-pull-requests/>`_.
 | 
					`GitHub Help Center <https://help.github.com/articles/using-pull-requests/>`_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Here is a simple overview, with pytest-specific bits:
 | 
					Here is a simple overview, with pytest-specific bits:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -254,6 +254,11 @@ class EncodedFile(object):
 | 
				
			||||||
        data = ''.join(linelist)
 | 
					        data = ''.join(linelist)
 | 
				
			||||||
        self.write(data)
 | 
					        self.write(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def name(self):
 | 
				
			||||||
 | 
					        """Ensure that file.name is a string."""
 | 
				
			||||||
 | 
					        return repr(self.buffer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __getattr__(self, name):
 | 
					    def __getattr__(self, name):
 | 
				
			||||||
        return getattr(object.__getattribute__(self, "buffer"), name)
 | 
					        return getattr(object.__getattribute__(self, "buffer"), name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -916,8 +916,11 @@ class Testdir:
 | 
				
			||||||
        env['PYTHONPATH'] = os.pathsep.join(filter(None, [
 | 
					        env['PYTHONPATH'] = os.pathsep.join(filter(None, [
 | 
				
			||||||
            str(os.getcwd()), env.get('PYTHONPATH', '')]))
 | 
					            str(os.getcwd()), env.get('PYTHONPATH', '')]))
 | 
				
			||||||
        kw['env'] = env
 | 
					        kw['env'] = env
 | 
				
			||||||
        return subprocess.Popen(cmdargs,
 | 
					
 | 
				
			||||||
                                stdout=stdout, stderr=stderr, **kw)
 | 
					        popen = subprocess.Popen(cmdargs, stdin=subprocess.PIPE, stdout=stdout, stderr=stderr, **kw)
 | 
				
			||||||
 | 
					        popen.stdin.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return popen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self, *cmdargs):
 | 
					    def run(self, *cmdargs):
 | 
				
			||||||
        """Run a command with arguments.
 | 
					        """Run a command with arguments.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -425,9 +425,10 @@ class Module(main.File, PyCollector):
 | 
				
			||||||
            if e.allow_module_level:
 | 
					            if e.allow_module_level:
 | 
				
			||||||
                raise
 | 
					                raise
 | 
				
			||||||
            raise self.CollectError(
 | 
					            raise self.CollectError(
 | 
				
			||||||
                "Using pytest.skip outside of a test is not allowed. If you are "
 | 
					                "Using pytest.skip outside of a test is not allowed. "
 | 
				
			||||||
                "trying to decorate a test function, use the @pytest.mark.skip "
 | 
					                "To decorate a test function, use the @pytest.mark.skip "
 | 
				
			||||||
                "or @pytest.mark.skipif decorators instead."
 | 
					                "or @pytest.mark.skipif decorators instead, and to skip a "
 | 
				
			||||||
 | 
					                "module use `pytestmark = pytest.mark.{skip,skipif}."
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        self.config.pluginmanager.consider_module(mod)
 | 
					        self.config.pluginmanager.consider_module(mod)
 | 
				
			||||||
        return mod
 | 
					        return mod
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -382,4 +382,4 @@ def show_skipped(terminalreporter, lines):
 | 
				
			||||||
                    reason = reason[9:]
 | 
					                    reason = reason[9:]
 | 
				
			||||||
                lines.append(
 | 
					                lines.append(
 | 
				
			||||||
                    "SKIP [%d] %s:%d: %s" %
 | 
					                    "SKIP [%d] %s:%d: %s" %
 | 
				
			||||||
                    (num, fspath, lineno, reason))
 | 
					                    (num, fspath, lineno + 1, reason))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Set ``stdin`` to a closed ``PIPE`` in ``pytester.py.Testdir.popen()`` for avoid unwanted interactive ``pdb``
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Improve error message for CollectError with skip/skipif.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Fix line number when reporting summary of skipped tests.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					capture: ensure that EncodedFile.name is a string.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Show multiple issue links in CHANGELOG entries.
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% if definitions[category]['showcontent'] %}
 | 
					{% if definitions[category]['showcontent'] %}
 | 
				
			||||||
{% for text, values in sections[section][category]|dictsort(by='value') %}
 | 
					{% for text, values in sections[section][category]|dictsort(by='value') %}
 | 
				
			||||||
- {{ text }}{% if category != 'vendor' %} (`{{ values[0] }} <https://github.com/pytest-dev/pytest/issues/{{ values[0][1:] }}>`_){% endif %}
 | 
					{% set issue_joiner = joiner(', ') %}
 | 
				
			||||||
 | 
					- {{ text }}{% if category != 'vendor' %} ({% for value in values|sort %}{{ issue_joiner() }}`{{ value }} <https://github.com/pytest-dev/pytest/issues/{{ value[1:] }}>`_{% endfor %}){% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% endfor %}
 | 
					{% endfor %}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -716,13 +716,21 @@ def test_dupfile(tmpfile):
 | 
				
			||||||
        assert nf not in flist
 | 
					        assert nf not in flist
 | 
				
			||||||
        print(i, end="", file=nf)
 | 
					        print(i, end="", file=nf)
 | 
				
			||||||
        flist.append(nf)
 | 
					        flist.append(nf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fname_open = flist[0].name
 | 
				
			||||||
 | 
					    assert fname_open == repr(flist[0].buffer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for i in range(5):
 | 
					    for i in range(5):
 | 
				
			||||||
        f = flist[i]
 | 
					        f = flist[i]
 | 
				
			||||||
        f.close()
 | 
					        f.close()
 | 
				
			||||||
 | 
					    fname_closed = flist[0].name
 | 
				
			||||||
 | 
					    assert fname_closed == repr(flist[0].buffer)
 | 
				
			||||||
 | 
					    assert fname_closed != fname_open
 | 
				
			||||||
    tmpfile.seek(0)
 | 
					    tmpfile.seek(0)
 | 
				
			||||||
    s = tmpfile.read()
 | 
					    s = tmpfile.read()
 | 
				
			||||||
    assert "01234" in repr(s)
 | 
					    assert "01234" in repr(s)
 | 
				
			||||||
    tmpfile.close()
 | 
					    tmpfile.close()
 | 
				
			||||||
 | 
					    assert fname_closed == repr(flist[0].buffer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_dupfile_on_bytesio():
 | 
					def test_dupfile_on_bytesio():
 | 
				
			||||||
| 
						 | 
					@ -730,6 +738,7 @@ def test_dupfile_on_bytesio():
 | 
				
			||||||
    f = capture.safe_text_dupfile(io, "wb")
 | 
					    f = capture.safe_text_dupfile(io, "wb")
 | 
				
			||||||
    f.write("hello")
 | 
					    f.write("hello")
 | 
				
			||||||
    assert io.getvalue() == b"hello"
 | 
					    assert io.getvalue() == b"hello"
 | 
				
			||||||
 | 
					    assert 'BytesIO object' in f.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_dupfile_on_textio():
 | 
					def test_dupfile_on_textio():
 | 
				
			||||||
| 
						 | 
					@ -737,6 +746,7 @@ def test_dupfile_on_textio():
 | 
				
			||||||
    f = capture.safe_text_dupfile(io, "wb")
 | 
					    f = capture.safe_text_dupfile(io, "wb")
 | 
				
			||||||
    f.write("hello")
 | 
					    f.write("hello")
 | 
				
			||||||
    assert io.getvalue() == "hello"
 | 
					    assert io.getvalue() == "hello"
 | 
				
			||||||
 | 
					    assert not hasattr(f, 'name')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@contextlib.contextmanager
 | 
					@contextlib.contextmanager
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -708,7 +708,7 @@ def test_skipped_reasons_functional(testdir):
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    result = testdir.runpytest('-rs')
 | 
					    result = testdir.runpytest('-rs')
 | 
				
			||||||
    result.stdout.fnmatch_lines([
 | 
					    result.stdout.fnmatch_lines([
 | 
				
			||||||
        "*SKIP*2*conftest.py:3: test",
 | 
					        "*SKIP*2*conftest.py:4: test",
 | 
				
			||||||
    ])
 | 
					    ])
 | 
				
			||||||
    assert result.ret == 0
 | 
					    assert result.ret == 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue