[Pytest-commit] commit/pytest: 11 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Wed Sep 3 22:57:48 CEST 2014


11 new commits in pytest:

https://bitbucket.org/hpk42/pytest/commits/016cdc38d5e9/
Changeset:   016cdc38d5e9
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-07-31 00:16:51
Summary:     first implementation and tox environment for cx-freeze support
Affected #:  8 files

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c _pytest/cx_freeze_support.py
--- /dev/null
+++ b/_pytest/cx_freeze_support.py
@@ -0,0 +1,52 @@
+
+
+def includes():
+    return [
+        '_pytest.assertion.newinterpret',
+        '_pytest.assertion.oldinterpret',
+        '_pytest.assertion.reinterpret',
+        '_pytest.assertion.rewrite',
+        '_pytest.assertion.util',
+
+        '_pytest._argcomplete',
+        '_pytest.doctest',
+        '_pytest.pdb',
+        '_pytest.unittest',
+        '_pytest.capture',
+        '_pytest.config',
+        '_pytest.core',
+        '_pytest.genscript',
+        '_pytest.helpconfig',
+        '_pytest.hookspec',
+        '_pytest.junitxml',
+        '_pytest.main',
+        '_pytest.mark',
+        '_pytest.monkeypatch',
+        '_pytest.nose',
+        '_pytest.pastebin',
+        '_pytest.pytester',
+        '_pytest.python',
+        '_pytest.recwarn',
+        '_pytest.resultlog',
+        '_pytest.runner',
+        '_pytest.skipping',
+        '_pytest.standalonetemplate',
+        '_pytest.terminal',
+        '_pytest.tmpdir',
+
+        'py._builtin',
+        'py._path.local',
+        'py._io.capture',
+        'py._io.saferepr',
+        'py._iniconfig',
+        'py._io.terminalwriter',
+        'py._xmlgen',
+        'py._error',
+        'py._std',
+
+        # builtin files imported by pytest using py.std implicit mechanism
+        'argparse',
+        'shlex',
+        'warnings',
+        'types',
+    ]
\ No newline at end of file

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c pytest.py
--- a/pytest.py
+++ b/pytest.py
@@ -13,6 +13,7 @@
 
 from _pytest.config import main, UsageError, _preloadplugins, cmdline
 from _pytest import __version__
+from _pytest import cx_freeze_support
 
 _preloadplugins() # to populate pytest.* namespace so help(pytest) works
 

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c testing/cx_freeze/run.py
--- /dev/null
+++ b/testing/cx_freeze/run.py
@@ -0,0 +1,7 @@
+import os
+import sys
+
+executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
+if sys.platform.startswith('win'):
+    executable += '.exe'
+sys.exit(os.system('%s tests' % executable))
\ No newline at end of file

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c testing/cx_freeze/runtests_script.py
--- /dev/null
+++ b/testing/cx_freeze/runtests_script.py
@@ -0,0 +1,10 @@
+"""
+Simple script that actually executes py.test runner when passed "--pytest" as
+first argument; in this case, all other arguments are forwarded to pytest's
+main().
+"""
+
+if __name__ == '__main__':
+    import sys
+    import pytest
+    sys.exit(pytest.main())
\ No newline at end of file

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c testing/cx_freeze/runtests_setup.py
--- /dev/null
+++ b/testing/cx_freeze/runtests_setup.py
@@ -0,0 +1,11 @@
+from cx_Freeze import setup, Executable
+
+import pytest
+setup(
+    name="runtests",
+    version="0.1",
+    description="exemple of how embedding py.test into an executable using cx_freeze",
+    executables=[Executable("runtests_script.py")],
+    options={"build_exe": {'includes': pytest.cx_freeze_support.includes()}},
+)
+

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c testing/cx_freeze/tests/test_doctest.txt
--- /dev/null
+++ b/testing/cx_freeze/tests/test_doctest.txt
@@ -0,0 +1,6 @@
+
+
+Testing doctest::
+
+    >>> 1 + 1
+    2

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c testing/cx_freeze/tests/test_trivial.py
--- /dev/null
+++ b/testing/cx_freeze/tests/test_trivial.py
@@ -0,0 +1,6 @@
+
+def test_upper():
+    assert 'foo'.upper() == 'FOO'
+
+def test_lower():
+    assert 'FOO'.lower() == 'foo'
\ No newline at end of file

diff -r 040c46f257331f1c4546246683a808668969c011 -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c tox.ini
--- a/tox.ini
+++ b/tox.ini
@@ -123,6 +123,14 @@
     {envpython} {envbindir}/py.test-jython \
         -rfsxX --junitxml={envlogdir}/junit-{envname}2.xml []
 
+[testenv:py27-cxfreeze]
+deps=cx_freeze
+changedir=testing/cx_freeze
+basepython=python2.7
+commands=
+    {envpython} runtests_setup.py build --build-exe build
+    {envpython} run.py
+
 [pytest]
 minversion=2.0
 plugins=pytester


https://bitbucket.org/hpk42/pytest/commits/e014ae4ab62e/
Changeset:   e014ae4ab62e
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-07-31 02:50:00
Summary:     Docs about cx_freeze support and minor adjustments
Affected #:  7 files

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 _pytest/cx_freeze_support.py
--- a/_pytest/cx_freeze_support.py
+++ b/_pytest/cx_freeze_support.py
@@ -1,52 +1,56 @@
+"""
+Package to support embedding pytest runner into executable files.
 
+.. note:: Since we are imported into pytest namespace, we use local imports to
+          be as cheap as possible.
+"""
 
 def includes():
-    return [
-        '_pytest.assertion.newinterpret',
-        '_pytest.assertion.oldinterpret',
-        '_pytest.assertion.reinterpret',
-        '_pytest.assertion.rewrite',
-        '_pytest.assertion.util',
+    """
+    Returns a list of module names used by py.test that should be
+    included by cx_freeze.
+    """
+    import py
+    import _pytest
 
-        '_pytest._argcomplete',
-        '_pytest.doctest',
-        '_pytest.pdb',
-        '_pytest.unittest',
-        '_pytest.capture',
-        '_pytest.config',
-        '_pytest.core',
-        '_pytest.genscript',
-        '_pytest.helpconfig',
-        '_pytest.hookspec',
-        '_pytest.junitxml',
-        '_pytest.main',
-        '_pytest.mark',
-        '_pytest.monkeypatch',
-        '_pytest.nose',
-        '_pytest.pastebin',
-        '_pytest.pytester',
-        '_pytest.python',
-        '_pytest.recwarn',
-        '_pytest.resultlog',
-        '_pytest.runner',
-        '_pytest.skipping',
-        '_pytest.standalonetemplate',
-        '_pytest.terminal',
-        '_pytest.tmpdir',
+    result = list(_iter_all_modules(py))
+    result += list(_iter_all_modules(_pytest))
 
-        'py._builtin',
-        'py._path.local',
-        'py._io.capture',
-        'py._io.saferepr',
-        'py._iniconfig',
-        'py._io.terminalwriter',
-        'py._xmlgen',
-        'py._error',
-        'py._std',
-
-        # builtin files imported by pytest using py.std implicit mechanism
+    # builtin files imported by pytest using py.std implicit mechanism;
+    # should be removed if https://bitbucket.org/hpk42/pytest/pull-request/185
+    # gets merged
+    result += [
         'argparse',
         'shlex',
         'warnings',
         'types',
-    ]
\ No newline at end of file
+    ]
+    return result
+
+
+def _iter_all_modules(package, prefix=''):
+    """
+    Iterates over the names of all modules that can be found in the given
+    package, recursively.
+
+    Example:
+        _iter_all_modules(_pytest) ->
+            ['_pytest.assertion.newinterpret',
+             '_pytest.capture',
+             '_pytest.core',
+             ...
+            ]
+    """
+    import pkgutil
+    import os
+
+    if type(package) is not str:
+        path, prefix = package.__path__[0], package.__name__ + '.'
+    else:
+        path = package
+    for _, name, is_package in pkgutil.iter_modules([path]):
+        if is_package:
+            for m in _iter_all_modules(os.path.join(path, name), prefix=name + '.'):
+                yield prefix + m
+        else:
+            yield prefix + name

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 doc/en/example/simple.txt
--- a/doc/en/example/simple.txt
+++ b/doc/en/example/simple.txt
@@ -694,33 +694,26 @@
 send test files to users so they can run them in their machines, which can be
 invaluable to obtain more information about a hard to reproduce bug.
 
-Unfortunately embedding the ``pytest`` runner into a frozen executable using
-``cx_freeze`` is not as straightforward as one would like,
-because ``pytest`` makes heavy use of dynamic module loading which
-``cx_freeze`` can't resolve by itself.
-
-To solve this, you have to manually include ``pytest`` and ``py``
-modules by using the ``build_exe`` option in your ``setup.py`` script, like this::
+Unfortunately ``cx_freeze`` can't discover them
+automatically because of ``pytest``'s use of dynamic module loading, so you
+must declare them explicitly by using ``pytest.cx_freeze_support.includes()``::
 
     # contents of setup.py
     from cx_Freeze import setup, Executable
+    import pytest
 
-    includes = [
-        '_pytest.doctest',
-        '_pytest.unittest',
-        # ... lots more
-    ]
     setup(
         name="runtests",
-        options={"build_exe": {'includes': includes}},
+        options={"build_exe":
+            {
+            'includes': pytest.cx_freeze_support.includes()}
+            },
         # ... other options
     )
 
-(For the complete list, check out the modules under ``_pytest`` in your
-site-packages).
-
-With that, you can make your program check for a certain flag and pass control
-over to ``pytest``::
+If you don't want to ship a different executable just in order to run your tests,
+you can make your program check for a certain flag and pass control
+over to ``pytest`` instead. For example::
 
     # contents of app_main.py
     import sys
@@ -734,6 +727,6 @@
         ...
 
 This makes it convenient to execute your tests from within your frozen
-application, using standard ``py.test`` command-line::
+application, using standard ``py.test`` command-line options::
 
     $ ./app_main --pytest --verbose --tb=long --junit-xml=results.xml test-suite/
\ No newline at end of file

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 testing/cx_freeze/run.py
--- a/testing/cx_freeze/run.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import os
-import sys
-
-executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
-if sys.platform.startswith('win'):
-    executable += '.exe'
-sys.exit(os.system('%s tests' % executable))
\ No newline at end of file

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 testing/cx_freeze/runtests_script.py
--- a/testing/cx_freeze/runtests_script.py
+++ b/testing/cx_freeze/runtests_script.py
@@ -1,7 +1,6 @@
 """
-Simple script that actually executes py.test runner when passed "--pytest" as
-first argument; in this case, all other arguments are forwarded to pytest's
-main().
+This is the script that is actually frozen into an executable: simply executes
+py.test main().
 """
 
 if __name__ == '__main__':

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 testing/cx_freeze/runtests_setup.py
--- a/testing/cx_freeze/runtests_setup.py
+++ b/testing/cx_freeze/runtests_setup.py
@@ -1,6 +1,9 @@
+"""
+Sample setup.py script that generates an executable with pytest runner embedded.
+"""
 from cx_Freeze import setup, Executable
+import pytest
 
-import pytest
 setup(
     name="runtests",
     version="0.1",

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 testing/cx_freeze/tox_run.py
--- /dev/null
+++ b/testing/cx_freeze/tox_run.py
@@ -0,0 +1,14 @@
+"""
+Called by tox.ini: uses the generated executable to run the tests in ./tests/
+directory.
+
+.. note:: somehow calling "build/runtests_script" directly from tox doesn't
+          seem to work (at least on Windows).
+"""
+import os
+import sys
+
+executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
+if sys.platform.startswith('win'):
+    executable += '.exe'
+sys.exit(os.system('%s tests' % executable))
\ No newline at end of file

diff -r 016cdc38d5e9deaafffac07f0d8351d09e5b460c -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 tox.ini
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 distshare={homedir}/.tox/distshare
-envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py32,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting
+envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py32,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting,py27-cxfreeze
 
 [testenv]
 changedir=testing
@@ -129,7 +129,7 @@
 basepython=python2.7
 commands=
     {envpython} runtests_setup.py build --build-exe build
-    {envpython} run.py
+    {envpython} tox_run.py
 
 [pytest]
 minversion=2.0


https://bitbucket.org/hpk42/pytest/commits/42411297f4d7/
Changeset:   42411297f4d7
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-07-31 02:57:19
Summary:     fixed line endings for test_doctest.txt
Affected #:  1 file

diff -r e014ae4ab62ea71a8ec0a5b8045864423aeb63c0 -r 42411297f4d7348102dafd5cc0c986c94a825494 testing/cx_freeze/tests/test_doctest.txt
--- a/testing/cx_freeze/tests/test_doctest.txt
+++ b/testing/cx_freeze/tests/test_doctest.txt
@@ -1,6 +1,6 @@
-
-
-Testing doctest::
-
-    >>> 1 + 1
-    2
+
+
+Testing doctest::
+
+    >>> 1 + 1
+    2


https://bitbucket.org/hpk42/pytest/commits/8b0cb61eb871/
Changeset:   8b0cb61eb871
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-07-31 03:28:03
Summary:     guarding scripts with __main__ and doc changes

tox-flakes environment tries to import the modules for
checking, and that may fail because of its dependencies
Affected #:  3 files

diff -r 42411297f4d7348102dafd5cc0c986c94a825494 -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 doc/en/example/simple.txt
--- a/doc/en/example/simple.txt
+++ b/doc/en/example/simple.txt
@@ -703,7 +703,8 @@
     import pytest
 
     setup(
-        name="runtests",
+        name="app_main",
+        executables=[Executable("app_main.py")],
         options={"build_exe":
             {
             'includes': pytest.cx_freeze_support.includes()}

diff -r 42411297f4d7348102dafd5cc0c986c94a825494 -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 testing/cx_freeze/runtests_setup.py
--- a/testing/cx_freeze/runtests_setup.py
+++ b/testing/cx_freeze/runtests_setup.py
@@ -1,14 +1,15 @@
 """
 Sample setup.py script that generates an executable with pytest runner embedded.
 """
-from cx_Freeze import setup, Executable
-import pytest
+if __name__ == '__main__':
+    from cx_Freeze import setup, Executable
+    import pytest
 
-setup(
-    name="runtests",
-    version="0.1",
-    description="exemple of how embedding py.test into an executable using cx_freeze",
-    executables=[Executable("runtests_script.py")],
-    options={"build_exe": {'includes': pytest.cx_freeze_support.includes()}},
-)
+    setup(
+        name="runtests",
+        version="0.1",
+        description="exemple of how embedding py.test into an executable using cx_freeze",
+        executables=[Executable("runtests_script.py")],
+        options={"build_exe": {'includes': pytest.cx_freeze_support.includes()}},
+    )
 

diff -r 42411297f4d7348102dafd5cc0c986c94a825494 -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 testing/cx_freeze/tox_run.py
--- a/testing/cx_freeze/tox_run.py
+++ b/testing/cx_freeze/tox_run.py
@@ -5,10 +5,11 @@
 .. note:: somehow calling "build/runtests_script" directly from tox doesn't
           seem to work (at least on Windows).
 """
-import os
-import sys
+if __name__ == '__main__':
+    import os
+    import sys
 
-executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
-if sys.platform.startswith('win'):
-    executable += '.exe'
-sys.exit(os.system('%s tests' % executable))
\ No newline at end of file
+    executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
+    if sys.platform.startswith('win'):
+        executable += '.exe'
+    sys.exit(os.system('%s tests' % executable))
\ No newline at end of file


https://bitbucket.org/hpk42/pytest/commits/4901560bef61/
Changeset:   4901560bef61
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-08-12 01:03:14
Summary:     Moved freeze_includes() to genscript
Affected #:  5 files

diff -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 _pytest/cx_freeze_support.py
--- a/_pytest/cx_freeze_support.py
+++ /dev/null
@@ -1,56 +0,0 @@
-"""
-Package to support embedding pytest runner into executable files.
-
-.. note:: Since we are imported into pytest namespace, we use local imports to
-          be as cheap as possible.
-"""
-
-def includes():
-    """
-    Returns a list of module names used by py.test that should be
-    included by cx_freeze.
-    """
-    import py
-    import _pytest
-
-    result = list(_iter_all_modules(py))
-    result += list(_iter_all_modules(_pytest))
-
-    # builtin files imported by pytest using py.std implicit mechanism;
-    # should be removed if https://bitbucket.org/hpk42/pytest/pull-request/185
-    # gets merged
-    result += [
-        'argparse',
-        'shlex',
-        'warnings',
-        'types',
-    ]
-    return result
-
-
-def _iter_all_modules(package, prefix=''):
-    """
-    Iterates over the names of all modules that can be found in the given
-    package, recursively.
-
-    Example:
-        _iter_all_modules(_pytest) ->
-            ['_pytest.assertion.newinterpret',
-             '_pytest.capture',
-             '_pytest.core',
-             ...
-            ]
-    """
-    import pkgutil
-    import os
-
-    if type(package) is not str:
-        path, prefix = package.__path__[0], package.__name__ + '.'
-    else:
-        path = package
-    for _, name, is_package in pkgutil.iter_modules([path]):
-        if is_package:
-            for m in _iter_all_modules(os.path.join(path, name), prefix=name + '.'):
-                yield prefix + m
-        else:
-            yield prefix + name

diff -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 _pytest/genscript.py
--- a/_pytest/genscript.py
+++ b/_pytest/genscript.py
@@ -1,6 +1,12 @@
 """ generate a single-file self-contained version of pytest """
+import os
+import sys
+import pkgutil
+
 import py
-import sys
+
+import _pytest
+
 
 def find_toplevel(name):
     for syspath in py.std.sys.path:
@@ -78,3 +84,52 @@
         tw.line("generated pytest standalone script: %s" % genscript,
                 bold=True)
         return 0
+
+
+def pytest_namespace():
+    return {'freeze_includes': freeze_includes}
+
+
+def freeze_includes():
+    """
+    Returns a list of module names used by py.test that should be
+    included by cx_freeze.
+    """
+    result = list(_iter_all_modules(py))
+    result += list(_iter_all_modules(_pytest))
+
+    # builtin files imported by pytest using py.std implicit mechanism;
+    # should be removed if https://bitbucket.org/hpk42/pytest/pull-request/185
+    # gets merged
+    result += [
+        'argparse',
+        'shlex',
+        'warnings',
+        'types',
+    ]
+    return result
+
+
+def _iter_all_modules(package, prefix=''):
+    """
+    Iterates over the names of all modules that can be found in the given
+    package, recursively.
+
+    Example:
+        _iter_all_modules(_pytest) ->
+            ['_pytest.assertion.newinterpret',
+             '_pytest.capture',
+             '_pytest.core',
+             ...
+            ]
+    """
+    if type(package) is not str:
+        path, prefix = package.__path__[0], package.__name__ + '.'
+    else:
+        path = package
+    for _, name, is_package in pkgutil.iter_modules([path]):
+        if is_package:
+            for m in _iter_all_modules(os.path.join(path, name), prefix=name + '.'):
+                yield prefix + m
+        else:
+            yield prefix + name

diff -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 pytest.py
--- a/pytest.py
+++ b/pytest.py
@@ -13,7 +13,6 @@
 
 from _pytest.config import main, UsageError, _preloadplugins, cmdline
 from _pytest import __version__
-from _pytest import cx_freeze_support
 
 _preloadplugins() # to populate pytest.* namespace so help(pytest) works
 

diff -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 testing/cx_freeze/runtests_setup.py
--- a/testing/cx_freeze/runtests_setup.py
+++ b/testing/cx_freeze/runtests_setup.py
@@ -10,6 +10,6 @@
         version="0.1",
         description="exemple of how embedding py.test into an executable using cx_freeze",
         executables=[Executable("runtests_script.py")],
-        options={"build_exe": {'includes': pytest.cx_freeze_support.includes()}},
+        options={"build_exe": {'includes': pytest.freeze_includes()}},
     )
 

diff -r 8b0cb61eb871dcd416520201b83b639b5bf718e7 -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 testing/test_genscript.py
--- a/testing/test_genscript.py
+++ b/testing/test_genscript.py
@@ -36,3 +36,13 @@
     result = standalone.run(anypython, testdir, p)
     assert result.ret != 0
 
+
+def test_freeze_includes():
+    """
+    Smoke test for freeze_includes(), to ensure that it works across all
+    supported python versions.
+    """
+    includes = pytest.freeze_includes()
+    assert len(includes) > 1
+    assert '_pytest.genscript' in includes
+


https://bitbucket.org/hpk42/pytest/commits/b458501957a7/
Changeset:   b458501957a7
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-08-12 01:07:11
Summary:     Merging with default
Affected #:  49 files

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -69,3 +69,4 @@
 60725b17a9d1af4100abb8be3f9f4ddf6262bf34 2.6.0
 60725b17a9d1af4100abb8be3f9f4ddf6262bf34 2.6.0
 88af949b9611494e2c65d528f9e565b00fb7e8ca 2.6.0
+a4f9639702baa3eb4f3b16e162f74f7b69f3f9e1 2.6.1

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,21 @@
 NEXT
+-----------
+
+- fixed issue561: adapt autouse fixture example for python3.
+
+2.6.1
 -----------------------------------
 
+- No longer show line numbers in the --verbose output, the output is now
+  purely the nodeid.  The line number is still shown in failure reports.
+  Thanks Floris Bruynooghe.
+
+- fix issue437 where assertion rewriting could cause pytest-xdist slaves
+  to collect different tests. Thanks Bruno Oliveira.
+
+- fix issue555: add "errors" attribute to capture-streams to satisfy
+  some distutils and possibly other code accessing sys.stdout.errors.
+
 - fix issue547 capsys/capfd also work when output capturing ("-s") is disabled.
 
 - address issue170: allow pytest.mark.xfail(...) to specify expected exceptions via
@@ -17,6 +32,9 @@
 - fix issue544 by only removing "@NUM" at the end of "::" separated parts 
   and if the part has an ".py" extension
 
+- don't use py.std import helper, rather import things directly.
+  Thanks Bruno Oliveira.
+
 2.6
 -----------------------------------
 

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/__init__.py
--- a/_pytest/__init__.py
+++ b/_pytest/__init__.py
@@ -1,2 +1,2 @@
 #
-__version__ = '2.6.1.dev1'
+__version__ = '2.6.2.dev1'

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/assertion/oldinterpret.py
--- a/_pytest/assertion/oldinterpret.py
+++ b/_pytest/assertion/oldinterpret.py
@@ -1,3 +1,5 @@
+import traceback
+import types
 import py
 import sys, inspect
 from compiler import parse, ast, pycodegen
@@ -477,7 +479,7 @@
 def interpret(source, frame, should_fail=False):
     module = Interpretable(parse(source, 'exec').node)
     #print "got module", module
-    if isinstance(frame, py.std.types.FrameType):
+    if isinstance(frame, types.FrameType):
         frame = py.code.Frame(frame)
     try:
         module.run(frame)
@@ -487,7 +489,6 @@
     except passthroughex:
         raise
     except:
-        import traceback
         traceback.print_exc()
     if should_fail:
         return ("(assertion failed, but when it was re-run for "

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/assertion/rewrite.py
--- a/_pytest/assertion/rewrite.py
+++ b/_pytest/assertion/rewrite.py
@@ -131,7 +131,7 @@
         pyc = os.path.join(cache_dir, cache_name)
         # Notice that even if we're in a read-only directory, I'm going
         # to check for a cached pyc. This may not be optimal...
-        co = _read_pyc(fn_pypath, pyc)
+        co = _read_pyc(fn_pypath, pyc, state.trace)
         if co is None:
             state.trace("rewriting %r" % (fn,))
             co = _rewrite_test(state, fn_pypath)
@@ -289,7 +289,7 @@
         if _write_pyc(state, co, fn, proc_pyc):
             os.rename(proc_pyc, pyc)
 
-def _read_pyc(source, pyc):
+def _read_pyc(source, pyc, trace=lambda x: None):
     """Possibly read a pytest pyc containing rewritten code.
 
     Return rewritten code if successful or None if not.
@@ -298,23 +298,27 @@
         fp = open(pyc, "rb")
     except IOError:
         return None
-    try:
+    with fp:
         try:
             mtime = int(source.mtime())
             data = fp.read(8)
-        except EnvironmentError:
+        except EnvironmentError as e:
+            trace('_read_pyc(%s): EnvironmentError %s' % (source, e))
             return None
         # Check for invalid or out of date pyc file.
         if (len(data) != 8 or data[:4] != imp.get_magic() or
                 struct.unpack("<l", data[4:])[0] != mtime):
+            trace('_read_pyc(%s): invalid or out of date pyc' % source)
             return None
-        co = marshal.load(fp)
+        try:
+            co = marshal.load(fp)
+        except Exception as e:
+            trace('_read_pyc(%s): marshal.load error %s' % (source, e))
+            return None
         if not isinstance(co, types.CodeType):
-            # That's interesting....
+            trace('_read_pyc(%s): not a code object' % source)
             return None
         return co
-    finally:
-        fp.close()
 
 
 def rewrite_asserts(mod):

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/assertion/util.py
--- a/_pytest/assertion/util.py
+++ b/_pytest/assertion/util.py
@@ -1,4 +1,5 @@
 """Utilities for assertion debugging"""
+import pprint
 
 import py
 try:
@@ -168,6 +169,7 @@
 
     If the input are bytes they will be safely converted to text.
     """
+    from difflib import ndiff
     explanation = []
     if isinstance(left, py.builtin.bytes):
         left = u(repr(left)[1:-1]).replace(r'\n', '\n')
@@ -195,8 +197,8 @@
                 left = left[:-i]
                 right = right[:-i]
     explanation += [line.strip('\n')
-                    for line in py.std.difflib.ndiff(left.splitlines(),
-                                                     right.splitlines())]
+                    for line in ndiff(left.splitlines(),
+                                      right.splitlines())]
     return explanation
 
 
@@ -214,8 +216,8 @@
         explanation += [
             u('Right contains more items, first extra item: %s') %
             py.io.saferepr(right[len(left)],)]
-    return explanation  # + _diff_text(py.std.pprint.pformat(left),
-                        #             py.std.pprint.pformat(right))
+    return explanation  # + _diff_text(pprint.pformat(left),
+                        #              pprint.pformat(right))
 
 
 def _compare_eq_set(left, right, verbose=False):
@@ -242,7 +244,7 @@
                         len(same)]
     elif same:
         explanation += [u('Common items:')]
-        explanation += py.std.pprint.pformat(same).splitlines()
+        explanation += pprint.pformat(same).splitlines()
     diff = set(k for k in common if left[k] != right[k])
     if diff:
         explanation += [u('Differing items:')]
@@ -252,12 +254,12 @@
     extra_left = set(left) - set(right)
     if extra_left:
         explanation.append(u('Left contains more items:'))
-        explanation.extend(py.std.pprint.pformat(
+        explanation.extend(pprint.pformat(
             dict((k, left[k]) for k in extra_left)).splitlines())
     extra_right = set(right) - set(left)
     if extra_right:
         explanation.append(u('Right contains more items:'))
-        explanation.extend(py.std.pprint.pformat(
+        explanation.extend(pprint.pformat(
             dict((k, right[k]) for k in extra_right)).splitlines())
     return explanation
 

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/capture.py
--- a/_pytest/capture.py
+++ b/_pytest/capture.py
@@ -223,6 +223,7 @@
 
 
 class EncodedFile(object):
+    errors = "strict"  # possibly needed by py3 code (issue555)
     def __init__(self, buffer, encoding):
         self.buffer = buffer
         self.encoding = encoding

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/config.py
--- a/_pytest/config.py
+++ b/_pytest/config.py
@@ -1,8 +1,12 @@
 """ command line options, ini-file and conftest.py processing. """
+import argparse
+import shlex
+import traceback
+import types
+import warnings
 
 import py
 # DON't import pytest here because it causes import cycle troubles
-import re
 import sys, os
 from _pytest import hookspec # the extension point definitions
 from _pytest.core import PluginManager
@@ -29,7 +33,7 @@
     except ConftestImportFailure:
         e = sys.exc_info()[1]
         tw = py.io.TerminalWriter(sys.stderr)
-        for line in py.std.traceback.format_exception(*e.excinfo):
+        for line in traceback.format_exception(*e.excinfo):
             tw.line(line.rstrip(), red=True)
         tw.line("ERROR: could not load %s\n" % (e.path), red=True)
         return 4
@@ -71,7 +75,7 @@
     elif not isinstance(args, (tuple, list)):
         if not isinstance(args, str):
             raise ValueError("not a string or argument list: %r" % (args,))
-        args = py.std.shlex.split(args)
+        args = shlex.split(args)
     pluginmanager = get_plugin_manager()
     try:
         if plugins:
@@ -181,8 +185,7 @@
                     a = option.attrs()
                     arggroup.add_argument(*n, **a)
         # bash like autocompletion for dirs (appending '/')
-        optparser.add_argument(FILE_OR_DIR, nargs='*', type=node_with_line_number,
-                               ).completer=filescompleter
+        optparser.add_argument(FILE_OR_DIR, nargs='*').completer=filescompleter
         return optparser
 
     def parse_setoption(self, args, option):
@@ -229,7 +232,7 @@
 
 
 class Argument:
-    """class that mimics the necessary behaviour of py.std.optparse.Option """
+    """class that mimics the necessary behaviour of optparse.Option """
     _typ_map = {
         'int': int,
         'string': str,
@@ -247,7 +250,7 @@
             try:
                 help = attrs['help']
                 if '%default' in help:
-                    py.std.warnings.warn(
+                    warnings.warn(
                         'pytest now uses argparse. "%default" should be'
                         ' changed to "%(default)s" ',
                         FutureWarning,
@@ -263,7 +266,7 @@
             if isinstance(typ, py.builtin._basestring):
                 if typ == 'choice':
                     if self.TYPE_WARN:
-                        py.std.warnings.warn(
+                        warnings.warn(
                             'type argument to addoption() is a string %r.'
                             ' For parsearg this is optional and when supplied '
                             ' should be a type.'
@@ -275,7 +278,7 @@
                     attrs['type'] = type(attrs['choices'][0])
                 else:
                     if self.TYPE_WARN:
-                        py.std.warnings.warn(
+                        warnings.warn(
                             'type argument to addoption() is a string %r.'
                             ' For parsearg this should be a type.'
                             ' (options: %s)' % (typ, names),
@@ -395,10 +398,10 @@
         self.options.append(option)
 
 
-class MyOptionParser(py.std.argparse.ArgumentParser):
+class MyOptionParser(argparse.ArgumentParser):
     def __init__(self, parser):
         self._parser = parser
-        py.std.argparse.ArgumentParser.__init__(self, usage=parser._usage,
+        argparse.ArgumentParser.__init__(self, usage=parser._usage,
             add_help=False, formatter_class=DropShorterLongHelpFormatter)
 
     def parse_args(self, args=None, namespace=None):
@@ -407,12 +410,12 @@
         if argv:
             for arg in argv:
                 if arg and arg[0] == '-':
-                    msg = py.std.argparse._('unrecognized arguments: %s')
+                    msg = argparse._('unrecognized arguments: %s')
                     self.error(msg % ' '.join(argv))
             getattr(args, FILE_OR_DIR).extend(argv)
         return args
 
-class DropShorterLongHelpFormatter(py.std.argparse.HelpFormatter):
+class DropShorterLongHelpFormatter(argparse.HelpFormatter):
     """shorten help for long options that differ only in extra hyphens
 
     - collapse **long** options that are the same except for extra hyphens
@@ -422,7 +425,7 @@
     - cache result on action object as this is called at least 2 times
     """
     def _format_action_invocation(self, action):
-        orgstr = py.std.argparse.HelpFormatter._format_action_invocation(self, action)
+        orgstr = argparse.HelpFormatter._format_action_invocation(self, action)
         if orgstr and orgstr[0] != '-': # only optional arguments
             return orgstr
         res = getattr(action, '_formatted_action_invocation', None)
@@ -746,7 +749,7 @@
         self.hook.pytest_cmdline_preparse(config=self, args=args)
         args = self._parser.parse_setoption(args, self.option)
         if not args:
-            args.append(py.std.os.getcwd())
+            args.append(os.getcwd())
         self.args = args
 
     def addinivalue_line(self, name, line):
@@ -784,11 +787,11 @@
         if type == "pathlist":
             dp = py.path.local(self.inicfg.config.path).dirpath()
             l = []
-            for relpath in py.std.shlex.split(value):
+            for relpath in shlex.split(value):
                 l.append(dp.join(relpath, abs=True))
             return l
         elif type == "args":
-            return py.std.shlex.split(value)
+            return shlex.split(value)
         elif type == "linelist":
             return [t for t in map(lambda x: x.strip(), value.split("\n")) if t]
         else:
@@ -862,13 +865,6 @@
     return {}
 
 
-rex_pyat = re.compile(r'(.*\.py)@\d+$')
-
-def node_with_line_number(string):
-    return "::".join(rex_pyat.sub(lambda m: m.group(1), part)
-                        for part in string.split("::"))
-
-
 def setns(obj, dic):
     import pytest
     for name, value in dic.items():
@@ -876,7 +872,7 @@
             mod = getattr(obj, name, None)
             if mod is None:
                 modname = "pytest.%s" % name
-                mod = py.std.types.ModuleType(modname)
+                mod = types.ModuleType(modname)
                 sys.modules[modname] = mod
                 mod.__all__ = []
                 setattr(obj, name, mod)

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/core.py
--- a/_pytest/core.py
+++ b/_pytest/core.py
@@ -1,6 +1,7 @@
 """
 pytest PluginManager, basic initialization and tracing.
 """
+import os
 import sys
 import inspect
 import py
@@ -154,7 +155,7 @@
     # API for bootstrapping
     #
     def _envlist(self, varname):
-        val = py.std.os.environ.get(varname, None)
+        val = os.environ.get(varname, None)
         if val is not None:
             return val.split(',')
         return ()
@@ -221,7 +222,7 @@
                 return self.import_plugin(modname[7:])
             raise
         except:
-            e = py.std.sys.exc_info()[1]
+            e = sys.exc_info()[1]
             import pytest
             if not hasattr(pytest, 'skip') or not isinstance(e, pytest.skip.Exception):
                 raise

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/doctest.py
--- a/_pytest/doctest.py
+++ b/_pytest/doctest.py
@@ -1,5 +1,6 @@
 """ discover and run doctests in modules and test files."""
-
+from __future__ import absolute_import
+import traceback
 import pytest, py
 from _pytest.python import FixtureRequest, FuncFixtureInfo
 from py._code.code import TerminalRepr, ReprFileLocation
@@ -43,7 +44,7 @@
         self.runner.run(self.dtest)
 
     def repr_failure(self, excinfo):
-        doctest = py.std.doctest
+        import doctest
         if excinfo.errisinstance((doctest.DocTestFailure,
                                   doctest.UnexpectedException)):
             doctestfailure = excinfo.value
@@ -56,8 +57,8 @@
                 lineno = test.lineno + example.lineno + 1
             message = excinfo.type.__name__
             reprlocation = ReprFileLocation(filename, lineno, message)
-            checker = py.std.doctest.OutputChecker()
-            REPORT_UDIFF = py.std.doctest.REPORT_UDIFF
+            checker = doctest.OutputChecker()
+            REPORT_UDIFF = doctest.REPORT_UDIFF
             filelines = py.path.local(filename).readlines(cr=0)
             lines = []
             if lineno is not None:
@@ -78,7 +79,7 @@
                 inner_excinfo = py.code.ExceptionInfo(excinfo.value.exc_info)
                 lines += ["UNEXPECTED EXCEPTION: %s" %
                             repr(inner_excinfo.value)]
-                lines += py.std.traceback.format_exception(*excinfo.value.exc_info)
+                lines += traceback.format_exception(*excinfo.value.exc_info)
             return ReprFailDoctest(reprlocation, lines)
         else:
             return super(DoctestItem, self).repr_failure(excinfo)
@@ -88,7 +89,7 @@
 
 class DoctestTextfile(DoctestItem, pytest.File):
     def runtest(self):
-        doctest = py.std.doctest
+        import doctest
         # satisfy `FixtureRequest` constructor...
         self.funcargs = {}
         fm = self.session._fixturemanager
@@ -106,7 +107,7 @@
 
 class DoctestModule(pytest.File):
     def collect(self):
-        doctest = py.std.doctest
+        import doctest
         if self.fspath.basename == "conftest.py":
             module = self.config._conftest.importconftest(self.fspath)
         else:

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/genscript.py
--- a/_pytest/genscript.py
+++ b/_pytest/genscript.py
@@ -8,8 +8,9 @@
 import _pytest
 
 
+
 def find_toplevel(name):
-    for syspath in py.std.sys.path:
+    for syspath in sys.path:
         base = py.path.local(syspath)
         lib = base/name
         if lib.check(dir=1):
@@ -35,9 +36,10 @@
     return name2src
 
 def compress_mapping(mapping):
-    data = py.std.pickle.dumps(mapping, 2)
-    data = py.std.zlib.compress(data, 9)
-    data = py.std.base64.encodestring(data)
+    import base64, pickle, zlib
+    data = pickle.dumps(mapping, 2)
+    data = zlib.compress(data, 9)
+    data = base64.encodestring(data)
     data = data.decode('ascii')
     return data
 

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/junitxml.py
--- a/_pytest/junitxml.py
+++ b/_pytest/junitxml.py
@@ -2,7 +2,6 @@
 
 Based on initial code from Ross Lawley.
 """
-
 import py
 import os
 import re
@@ -10,20 +9,13 @@
 import time
 
 # Python 2.X and 3.X compatibility
-try:
-    unichr(65)
-except NameError:
+if sys.version_info[0] < 3:
+    from codecs import open
+else:
     unichr = chr
-try:
-    unicode('A')
-except NameError:
     unicode = str
-try:
-    long(1)
-except NameError:
     long = int
 
-
 class Junit(py.xml.Namespace):
     pass
 
@@ -206,11 +198,7 @@
         self.suite_start_time = time.time()
 
     def pytest_sessionfinish(self):
-        if py.std.sys.version_info[0] < 3:
-            logfile = py.std.codecs.open(self.logfile, 'w', encoding='utf-8')
-        else:
-            logfile = open(self.logfile, 'w', encoding='utf-8')
-
+        logfile = open(self.logfile, 'w', encoding='utf-8')
         suite_stop_time = time.time()
         suite_time_delta = suite_stop_time - self.suite_start_time
         numtests = self.passed + self.failed

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/main.py
--- a/_pytest/main.py
+++ b/_pytest/main.py
@@ -1,4 +1,5 @@
 """ core implementation of testing process: init, session, runtest loop. """
+import re
 
 import py
 import pytest, _pytest
@@ -19,7 +20,7 @@
 EXIT_INTERNALERROR = 3
 EXIT_USAGEERROR = 4
 
-name_re = py.std.re.compile("^[a-zA-Z_]\w*$")
+name_re = re.compile("^[a-zA-Z_]\w*$")
 
 def pytest_addoption(parser):
     parser.addini("norecursedirs", "directory patterns to avoid for recursion",
@@ -315,7 +316,7 @@
         except py.builtin._sysex:
             raise
         except:
-            failure = py.std.sys.exc_info()
+            failure = sys.exc_info()
             setattr(self, exattrname, failure)
             raise
         setattr(self, attrname, res)

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/pdb.py
--- a/_pytest/pdb.py
+++ b/_pytest/pdb.py
@@ -1,7 +1,11 @@
 """ interactive debugging with PDB, the Python Debugger. """
+from __future__ import absolute_import
+import pdb
+import sys
 
-import pytest, py
-import sys
+import pytest
+import py
+
 
 def pytest_addoption(parser):
     group = parser.getgroup("general")
@@ -16,10 +20,10 @@
     if config.getvalue("usepdb"):
         config.pluginmanager.register(PdbInvoke(), 'pdbinvoke')
 
-    old = (py.std.pdb.set_trace, pytestPDB._pluginmanager)
+    old = (pdb.set_trace, pytestPDB._pluginmanager)
     def fin():
-        py.std.pdb.set_trace, pytestPDB._pluginmanager = old
-    py.std.pdb.set_trace = pytest.set_trace
+        pdb.set_trace, pytestPDB._pluginmanager = old
+    pdb.set_trace = pytest.set_trace
     pytestPDB._pluginmanager = config.pluginmanager
     config._cleanup.append(fin)
 
@@ -38,7 +42,7 @@
             tw = py.io.TerminalWriter()
             tw.line()
             tw.sep(">", "PDB set_trace (IO-capturing turned off)")
-        py.std.pdb.Pdb().set_trace(frame)
+        pdb.Pdb().set_trace(frame)
 
 
 class PdbInvoke:
@@ -74,7 +78,8 @@
 def _postmortem_traceback(excinfo):
     # A doctest.UnexpectedException is not useful for post_mortem.
     # Use the underlying exception instead:
-    if isinstance(excinfo.value, py.std.doctest.UnexpectedException):
+    from doctest import UnexpectedException
+    if isinstance(excinfo.value, UnexpectedException):
         return excinfo.value.exc_info[2]
     else:
         return excinfo._excinfo[2]
@@ -88,7 +93,6 @@
 
 
 def post_mortem(t):
-    pdb = py.std.pdb
     class Pdb(pdb.Pdb):
         def get_stack(self, f, t):
             stack, i = pdb.Pdb.get_stack(self, f, t)

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/pytester.py
--- a/_pytest/pytester.py
+++ b/_pytest/pytester.py
@@ -1,15 +1,21 @@
 """ (disabled by default) support for testing pytest and pytest plugins. """
-
-import py, pytest
-import sys, os
+import inspect
+import sys
+import os
 import codecs
 import re
 import time
+import platform
 from fnmatch import fnmatch
-from _pytest.main import Session, EXIT_OK
+import subprocess
+
+import py
+import pytest
 from py.builtin import print_
 from _pytest.core import HookRelay
 
+from _pytest.main import Session, EXIT_OK
+
 
 def get_public_names(l):
     """Only return names from iterator l without a leading underscore."""
@@ -87,10 +93,10 @@
 
     def _makecallparser(self, method):
         name = method.__name__
-        args, varargs, varkw, default = py.std.inspect.getargspec(method)
+        args, varargs, varkw, default = inspect.getargspec(method)
         if not args or args[0] != "self":
             args.insert(0, 'self')
-        fspec = py.std.inspect.formatargspec(args, varargs, varkw, default)
+        fspec = inspect.formatargspec(args, varargs, varkw, default)
         # we use exec because we want to have early type
         # errors on wrong input arguments, using
         # *args/**kwargs delays this and gives errors
@@ -122,7 +128,7 @@
         __tracebackhide__ = True
         i = 0
         entries = list(entries)
-        backlocals = py.std.sys._getframe(1).f_locals
+        backlocals = sys._getframe(1).f_locals
         while entries:
             name, check = entries.pop(0)
             for ind, call in enumerate(self.calls[i:]):
@@ -210,7 +216,7 @@
 
     def finalize(self):
         for p in self._syspathremove:
-            py.std.sys.path.remove(p)
+            sys.path.remove(p)
         if hasattr(self, '_olddir'):
             self._olddir.chdir()
         # delete modules that have been loaded from tmpdir
@@ -283,7 +289,7 @@
     def syspathinsert(self, path=None):
         if path is None:
             path = self.tmpdir
-        py.std.sys.path.insert(0, str(path))
+        sys.path.insert(0, str(path))
         self._syspathremove.append(str(path))
 
     def mkdir(self, name):
@@ -426,9 +432,8 @@
         env['PYTHONPATH'] = os.pathsep.join(filter(None, [
             str(os.getcwd()), env.get('PYTHONPATH', '')]))
         kw['env'] = env
-        #print "env", env
-        return py.std.subprocess.Popen(cmdargs,
-                                       stdout=stdout, stderr=stderr, **kw)
+        return subprocess.Popen(cmdargs,
+                                stdout=stdout, stderr=stderr, **kw)
 
     def run(self, *cmdargs):
         return self._run(*cmdargs)
@@ -474,9 +479,9 @@
     def _getpybinargs(self, scriptname):
         if not self.request.config.getvalue("notoolsonpath"):
             # XXX we rely on script referring to the correct environment
-            # we cannot use "(py.std.sys.executable,script)"
+            # we cannot use "(sys.executable,script)"
             # because on windows the script is e.g. a py.test.exe
-            return (py.std.sys.executable, _pytest_fullpath,) # noqa
+            return (sys.executable, _pytest_fullpath,) # noqa
         else:
             pytest.skip("cannot run %r with --no-tools-on-path" % scriptname)
 
@@ -496,7 +501,7 @@
 
     def runpython_c(self, command):
         command = self._getsysprepend() + command
-        return self.run(py.std.sys.executable, "-c", command)
+        return self.run(sys.executable, "-c", command)
 
     def runpytest(self, *args):
         p = py.path.local.make_numbered_dir(prefix="runpytest-",
@@ -523,7 +528,7 @@
 
     def spawn(self, cmd, expect_timeout=10.0):
         pexpect = pytest.importorskip("pexpect", "3.0")
-        if hasattr(sys, 'pypy_version_info') and '64' in py.std.platform.machine():
+        if hasattr(sys, 'pypy_version_info') and '64' in platform.machine():
             pytest.skip("pypy-64 bit not supported")
         if sys.platform == "darwin":
             pytest.xfail("pexpect does not work reliably on darwin?!")
@@ -670,7 +675,7 @@
 
     def fnmatch_lines(self, lines2):
         def show(arg1, arg2):
-            py.builtin.print_(arg1, arg2, file=py.std.sys.stderr)
+            py.builtin.print_(arg1, arg2, file=sys.stderr)
         lines2 = self._getlines(lines2)
         lines1 = self.lines[:]
         nextline = None

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/recwarn.py
--- a/_pytest/recwarn.py
+++ b/_pytest/recwarn.py
@@ -1,7 +1,8 @@
 """ recording warnings during test function execution. """
 
-import py
 import sys
+import warnings
+
 
 def pytest_funcarg__recwarn(request):
     """Return a WarningsRecorder instance that provides these methods:
@@ -13,7 +14,6 @@
     on warning categories.
     """
     if sys.version_info >= (2,7):
-        import warnings
         oldfilters = warnings.filters[:]
         warnings.simplefilter('default')
         def reset_filters():
@@ -30,26 +30,24 @@
     """ assert that calling ``func(*args, **kwargs)``
     triggers a DeprecationWarning.
     """
-    warningmodule = py.std.warnings
     l = []
-    oldwarn_explicit = getattr(warningmodule, 'warn_explicit')
+    oldwarn_explicit = getattr(warnings, 'warn_explicit')
     def warn_explicit(*args, **kwargs):
         l.append(args)
         oldwarn_explicit(*args, **kwargs)
-    oldwarn = getattr(warningmodule, 'warn')
+    oldwarn = getattr(warnings, 'warn')
     def warn(*args, **kwargs):
         l.append(args)
         oldwarn(*args, **kwargs)
 
-    warningmodule.warn_explicit = warn_explicit
-    warningmodule.warn = warn
+    warnings.warn_explicit = warn_explicit
+    warnings.warn = warn
     try:
         ret = func(*args, **kwargs)
     finally:
-        warningmodule.warn_explicit = warn_explicit
-        warningmodule.warn = warn
+        warnings.warn_explicit = warn_explicit
+        warnings.warn = warn
     if not l:
-        #print warningmodule
         __tracebackhide__ = True
         raise AssertionError("%r did not produce DeprecationWarning" %(func,))
     return ret
@@ -65,7 +63,6 @@
 
 class WarningsRecorder:
     def __init__(self):
-        warningmodule = py.std.warnings
         self.list = []
         def showwarning(message, category, filename, lineno, line=0):
             self.list.append(RecordedWarning(
@@ -76,8 +73,8 @@
             except TypeError:
                 # < python2.6
                 self.old_showwarning(message, category, filename, lineno)
-        self.old_showwarning = warningmodule.showwarning
-        warningmodule.showwarning = showwarning
+        self.old_showwarning = warnings.showwarning
+        warnings.showwarning = showwarning
 
     def pop(self, cls=Warning):
         """ pop the first recorded warning, raise exception if not exists."""
@@ -88,7 +85,6 @@
         assert 0, "%r not found in %r" %(cls, self.list)
 
     #def resetregistry(self):
-    #    import warnings
     #    warnings.onceregistry.clear()
     #    warnings.__warningregistry__.clear()
 
@@ -96,4 +92,4 @@
         self.list[:] = []
 
     def finalize(self):
-        py.std.warnings.showwarning = self.old_showwarning
+        warnings.showwarning = self.old_showwarning

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/runner.py
--- a/_pytest/runner.py
+++ b/_pytest/runner.py
@@ -1,9 +1,10 @@
 """ basic collect and runtest protocol implementations """
+import bdb
+import sys
+from time import time
 
 import py
 import pytest
-import sys
-from time import time
 from py._code.code import TerminalRepr
 
 def pytest_namespace():
@@ -118,7 +119,7 @@
     return call.excinfo and not (
                 hasattr(report, "wasxfail") or
                 call.excinfo.errisinstance(skip.Exception) or
-                call.excinfo.errisinstance(py.std.bdb.BdbQuit))
+                call.excinfo.errisinstance(bdb.BdbQuit))
 
 def call_runtest_hook(item, when, **kwds):
     hookname = "pytest_runtest_" + when

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/skipping.py
--- a/_pytest/skipping.py
+++ b/_pytest/skipping.py
@@ -1,7 +1,10 @@
 """ support for skip/xfail functions and markers. """
+import os
+import sys
+import traceback
 
-import py, pytest
-import sys
+import py
+import pytest
 
 def pytest_addoption(parser):
     group = parser.getgroup("general")
@@ -79,7 +82,7 @@
                 msg = [" " * (self.exc[1].offset + 4) + "^",]
                 msg.append("SyntaxError: invalid syntax")
             else:
-                msg = py.std.traceback.format_exception_only(*self.exc[:2])
+                msg = traceback.format_exception_only(*self.exc[:2])
             pytest.fail("Error evaluating %r expression\n"
                         "    %s\n"
                         "%s"
@@ -87,7 +90,7 @@
                         pytrace=False)
 
     def _getglobals(self):
-        d = {'os': py.std.os, 'sys': py.std.sys, 'config': self.item.config}
+        d = {'os': os, 'sys': sys, 'config': self.item.config}
         func = self.item.obj
         try:
             d.update(func.__globals__)

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/terminal.py
--- a/_pytest/terminal.py
+++ b/_pytest/terminal.py
@@ -5,6 +5,8 @@
 import pytest
 import py
 import sys
+import time
+
 
 def pytest_addoption(parser):
     group = parser.getgroup("terminal reporting", "reporting", after="general")
@@ -49,7 +51,7 @@
     optvalue = config.option.report
     if optvalue:
         py.builtin.print_("DEPRECATED: use -r instead of --report option.",
-            file=py.std.sys.stderr)
+            file=sys.stderr)
         if optvalue:
             for setting in optvalue.split(","):
                 setting = setting.strip()
@@ -95,7 +97,7 @@
         self.stats = {}
         self.startdir = self.curdir = py.path.local()
         if file is None:
-            file = py.std.sys.stdout
+            file = sys.stdout
         self._tw = self.writer = py.io.TerminalWriter(file)
         if self.config.option.color == 'yes':
             self._tw.hasmarkup = True
@@ -265,7 +267,7 @@
 
     @pytest.mark.trylast
     def pytest_sessionstart(self, session):
-        self._sessionstarttime = py.std.time.time()
+        self._sessionstarttime = time.time()
         if not self.showheader:
             return
         self.write_sep("=", "test session starts", bold=True)
@@ -380,9 +382,6 @@
             fspath = "%s <- %s" % (collect_fspath, fspath)
         if fspath:
             line = str(fspath)
-            if lineno is not None:
-                lineno += 1
-                line += "@" + str(lineno)
             if domain:
                 split = str(domain).split('[')
                 split[0] = split[0].replace('.', '::')  # don't replace '.' in params
@@ -469,7 +468,7 @@
             self._tw.line(content)
 
     def summary_stats(self):
-        session_duration = py.std.time.time() - self._sessionstarttime
+        session_duration = time.time() - self._sessionstarttime
 
         keys = ("failed passed skipped deselected "
                "xfailed xpassed warnings").split()

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/tmpdir.py
--- a/_pytest/tmpdir.py
+++ b/_pytest/tmpdir.py
@@ -1,7 +1,11 @@
 """ support for providing temporary directories to test functions.  """
-import pytest, py
+import re
+
+import pytest
+import py
 from _pytest.monkeypatch import monkeypatch
 
+
 class TempdirHandler:
     def __init__(self, config):
         self.config = config
@@ -63,7 +67,7 @@
     path object.
     """
     name = request.node.name
-    name = py.std.re.sub("[\W]", "_", name)
+    name = re.sub("[\W]", "_", name)
     MAXVAL = 30
     if len(name) > MAXVAL:
         name = name[:MAXVAL]

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de _pytest/unittest.py
--- a/_pytest/unittest.py
+++ b/_pytest/unittest.py
@@ -1,27 +1,25 @@
 """ discovery and running of std-library "unittest" style tests. """
-import pytest, py
+from __future__ import absolute_import
+import traceback
 import sys
 
+import pytest
+import py
+
+
 # for transfering markers
 from _pytest.python import transfer_markers
 
 
-def is_unittest(obj):
-    """Is obj a subclass of unittest.TestCase?"""
-    unittest = sys.modules.get('unittest')
-    if unittest is None:
-        return  # nobody can have derived unittest.TestCase
+def pytest_pycollect_makeitem(collector, name, obj):
+    # has unittest been imported and is obj a subclass of its TestCase?
     try:
-        return issubclass(obj, unittest.TestCase)
-    except KeyboardInterrupt:
-        raise
-    except:
-        return False
-
-
-def pytest_pycollect_makeitem(collector, name, obj):
-    if is_unittest(obj):
-        return UnitTestCase(name, parent=collector)
+        if not issubclass(obj, sys.modules["unittest"].TestCase):
+            return
+    except Exception:
+        return
+    # yes, so let's collect it
+    return UnitTestCase(name, parent=collector)
 
 
 class UnitTestCase(pytest.Class):
@@ -41,11 +39,12 @@
         super(UnitTestCase, self).setup()
 
     def collect(self):
+        from unittest import TestLoader
         cls = self.obj
         if not getattr(cls, "__test__", True):
             return
         self.session._fixturemanager.parsefactories(self, unittest=True)
-        loader = py.std.unittest.TestLoader()
+        loader = TestLoader()
         module = self.getparent(pytest.Module).obj
         foundsomething = False
         for name in loader.getTestCaseNames(self.obj):
@@ -90,7 +89,7 @@
         except TypeError:
             try:
                 try:
-                    l = py.std.traceback.format_exception(*rawexcinfo)
+                    l = traceback.format_exception(*rawexcinfo)
                     l.insert(0, "NOTE: Incompatible Exception Representation, "
                         "displaying natively:\n\n")
                     pytest.fail("".join(l), pytrace=False)

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/announce/release-2.6.1.txt
--- /dev/null
+++ b/doc/en/announce/release-2.6.1.txt
@@ -0,0 +1,59 @@
+pytest-2.6.1: fixes and new xfail feature
+===========================================================================
+
+pytest is a mature Python testing tool with more than a 1100 tests
+against itself, passing on many different interpreters and platforms.
+The 2.6.1 release is drop-in compatible to 2.5.2 and actually fixes some
+regressions introduced with 2.6.0.  It also brings a little feature
+to the xfail marker which now recognizes expected exceptions,
+see the CHANGELOG below.
+
+See docs at:
+
+    http://pytest.org
+
+As usual, you can upgrade from pypi via::
+
+    pip install -U pytest
+
+Thanks to all who contributed, among them:
+
+    Floris Bruynooghe
+    Bruno Oliveira
+    Nicolas Delaby
+
+have fun,
+holger krekel
+
+Changes 2.6.1
+=================
+
+- No longer show line numbers in the --verbose output, the output is now
+  purely the nodeid.  The line number is still shown in failure reports.
+  Thanks Floris Bruynooghe.
+
+- fix issue437 where assertion rewriting could cause pytest-xdist slaves
+  to collect different tests. Thanks Bruno Oliveira.
+
+- fix issue555: add "errors" attribute to capture-streams to satisfy
+  some distutils and possibly other code accessing sys.stdout.errors.
+
+- fix issue547 capsys/capfd also work when output capturing ("-s") is disabled.
+
+- address issue170: allow pytest.mark.xfail(...) to specify expected exceptions via
+  an optional "raises=EXC" argument where EXC can be a single exception
+  or a tuple of exception classes.  Thanks David Mohr for the complete
+  PR.
+
+- fix integration of pytest with unittest.mock.patch decorator when
+  it uses the "new" argument.  Thanks Nicolas Delaby for test and PR.
+
+- fix issue with detecting conftest files if the arguments contain
+  "::" node id specifications (copy pasted from "-v" output)
+
+- fix issue544 by only removing "@NUM" at the end of "::" separated parts
+  and if the part has an ".py" extension
+
+- don't use py.std import helper, rather import things directly.
+  Thanks Bruno Oliveira.
+

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/assert.txt
--- a/doc/en/assert.txt
+++ b/doc/en/assert.txt
@@ -26,7 +26,7 @@
 
     $ py.test test_assert1.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 1 items
     
     test_assert1.py F
@@ -132,7 +132,7 @@
 
     $ py.test test_assert2.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 1 items
     
     test_assert2.py F

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/attic_fixtures.txt
--- a/doc/en/attic_fixtures.txt
+++ /dev/null
@@ -1,188 +0,0 @@
-
-**Test classes, modules or whole projects can make use of
-one or more fixtures**.  All required fixture functions will execute 
-before a test from the specifying context executes.  As You can use this
-to make tests operate from a pre-initialized directory or with
-certain environment variables or with pre-configured global application
-settings.
-
-For example, the Django_ project requires database 
-initialization to be able to import from and use its model objects.  
-For that, the `pytest-django`_ plugin provides fixtures which your 
-project can then easily depend or extend on, simply by referencing the
-name of the particular fixture. 
-
-Fixture functions have limited visilibity which depends on where they
-are defined.  If they are defined on a test class, only its test methods 
-may use it. A fixture defined in a module can only be used
-from that test module.  A fixture defined in a conftest.py file
-can only be used by the tests below the directory of that file.
-Lastly, plugins can define fixtures which are available across all
-projects.
-
-
-
-
-
-Python, Java and many other languages support a so called xUnit_ style 
-for providing a fixed state, `test fixtures`_, for running tests.  It
-typically involves calling a autouse function ahead and a teardown
-function after test execute.  In 2005 pytest introduced a scope-specific
-model of automatically detecting and calling autouse and teardown
-functions on a per-module, class or function basis.  The Python unittest
-package and nose have subsequently incorporated them.  This model
-remains supported by pytest as :ref:`classic xunit`.  
-
-One property of xunit fixture functions is that they work implicitely
-by preparing global state or setting attributes on TestCase objects.
-By contrast, pytest provides :ref:`funcargs` which allow to 
-dependency-inject application test state into test functions or 
-methods as function arguments.  If your application is sufficiently modular
-or if you are creating a new project, we recommend you now rather head over to
-:ref:`funcargs` instead because many pytest users agree that using this
-paradigm leads to better application and test organisation.
-
-However, not all programs and frameworks work and can be tested in
-a fully modular way.  They rather require preparation of global state
-like database autouse on which further fixtures like preparing application
-specific tables or wrapping tests in transactions can take place.  For those 
-needs, pytest-2.3 now supports new **fixture functions** which come with
-a ton of improvements over classic xunit fixture writing.  Fixture functions:
-
-- allow to separate different autouse concerns into multiple modular functions
-
-- can receive and fully interoperate with :ref:`funcargs <resources>`,
-
-- are called multiple times if its funcargs are parametrized,
-
-- don't need to be defined directly in your test classes or modules,
-  they can also be defined in a plugin or :ref:`conftest.py <conftest.py>` files and get called 
-
-- are called on a per-session, per-module, per-class or per-function basis
-  by means of a simple "scope" declaration.
-
-- can access the :ref:`request <request>` object which allows to
-  introspect and interact with the (scoped) testcontext.
-
-- can add cleanup functions which will be invoked when the last test
-  of the fixture test context has finished executing.
-
-All of these features are now demonstrated by little examples.
-
-
-
-
-
-test modules accessing a global resource
--------------------------------------------------------
-
-.. note::
-
-    Relying on `global state is considered bad programming practise <http://en.wikipedia.org/wiki/Global_variable>`_ but when you work with an application
-    that relies on it you often have no choice.
-
-If you want test modules to access a global resource,
-you can stick the resource to the module globals in
-a per-module autouse function.  We use a :ref:`resource factory
-<@pytest.fixture>` to create our global resource::
-
-    # content of conftest.py
-    import pytest
-
-    class GlobalResource:
-        def __init__(self):
-            pass
-
-    @pytest.fixture(scope="session")
-    def globresource():
-        return GlobalResource()
-
-    @pytest.fixture(scope="module")
-    def setresource(request, globresource):
-        request.module.globresource = globresource
-       
-Now any test module can access ``globresource`` as a module global::
-
-    # content of test_glob.py
-
-    def test_1():
-        print ("test_1 %s" % globresource)
-    def test_2():
-        print ("test_2 %s" % globresource)
-
-Let's run this module without output-capturing::
-
-    $ py.test -qs test_glob.py
-    FF
-    ================================= FAILURES =================================
-    __________________________________ test_1 __________________________________
-    
-        def test_1():
-    >       print ("test_1 %s" % globresource)
-    E       NameError: global name 'globresource' is not defined
-    
-    test_glob.py:3: NameError
-    __________________________________ test_2 __________________________________
-    
-        def test_2():
-    >       print ("test_2 %s" % globresource)
-    E       NameError: global name 'globresource' is not defined
-    
-    test_glob.py:5: NameError
-    2 failed in 0.01 seconds
-
-The two tests see the same global ``globresource`` object.
-
-Parametrizing the global resource
-+++++++++++++++++++++++++++++++++++++++++++++++++
-
-We extend the previous example and add parametrization to the globresource 
-factory and also add a finalizer::
-
-    # content of conftest.py
-
-    import pytest
-
-    class GlobalResource:
-        def __init__(self, param):
-            self.param = param
-
-    @pytest.fixture(scope="session", params=[1,2])
-    def globresource(request):
-        g = GlobalResource(request.param)
-        def fin():
-            print "finalizing", g
-        request.addfinalizer(fin)
-        return g
-
-    @pytest.fixture(scope="module")
-    def setresource(request, globresource):
-        request.module.globresource = globresource
-
-And then re-run our test module::
-
-    $ py.test -qs test_glob.py
-    FF
-    ================================= FAILURES =================================
-    __________________________________ test_1 __________________________________
-    
-        def test_1():
-    >       print ("test_1 %s" % globresource)
-    E       NameError: global name 'globresource' is not defined
-    
-    test_glob.py:3: NameError
-    __________________________________ test_2 __________________________________
-    
-        def test_2():
-    >       print ("test_2 %s" % globresource)
-    E       NameError: global name 'globresource' is not defined
-    
-    test_glob.py:5: NameError
-    2 failed in 0.01 seconds
-
-We are now running the two tests twice with two different global resource
-instances.  Note that the tests are ordered such that only
-one instance is active at any given time: the finalizer of 
-the first globresource instance is called before the second
-instance is created and sent to the autouse functions.
-

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/capture.txt
--- a/doc/en/capture.txt
+++ b/doc/en/capture.txt
@@ -64,7 +64,7 @@
 
     $ py.test
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     
     test_module.py .F
@@ -78,7 +78,7 @@
     
     test_module.py:9: AssertionError
     -------------------------- Captured stdout setup ---------------------------
-    setting up <function test_func2 at 0x2abe0d7241b8>
+    setting up <function test_func2 at 0x2b5d6a81c9d8>
     ==================== 1 failed, 1 passed in 0.01 seconds ====================
 
 Accessing captured output from a test function

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/conf.py
--- a/doc/en/conf.py
+++ b/doc/en/conf.py
@@ -18,7 +18,7 @@
 # The full version, including alpha/beta/rc tags.
 # The short X.Y version.
 version = "2.6"
-release = "2.6.0"
+release = "2.6.1"
 
 import sys, os
 
@@ -225,7 +225,7 @@
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-#latex_logo = None
+latex_logo = 'img/pytest1.png'
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/doctest.txt
--- a/doc/en/doctest.txt
+++ b/doc/en/doctest.txt
@@ -44,12 +44,12 @@
 
     $ py.test
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 1 items
     
     mymodule.py .
     
-    ========================= 1 passed in 0.04 seconds =========================
+    ========================= 1 passed in 0.06 seconds =========================
 
 It is possible to use fixtures using the ``getfixture`` helper::
 

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/example/markers.txt
--- a/doc/en/example/markers.txt
+++ b/doc/en/example/markers.txt
@@ -31,10 +31,10 @@
 
     $ py.test -v -m webtest
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 3::test_send_http PASSED
+    test_server.py::test_send_http PASSED
     
     =================== 3 tests deselected by "-m 'webtest'" ===================
     ================== 1 passed, 3 deselected in 0.01 seconds ==================
@@ -43,12 +43,12 @@
 
     $ py.test -v -m "not webtest"
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 6::test_something_quick PASSED
-    test_server.py at 8::test_another PASSED
-    test_server.py at 11::TestClass::test_method PASSED
+    test_server.py::test_something_quick PASSED
+    test_server.py::test_another PASSED
+    test_server.py::TestClass::test_method PASSED
     
     ================= 1 tests deselected by "-m 'not webtest'" =================
     ================== 3 passed, 1 deselected in 0.01 seconds ==================
@@ -62,10 +62,10 @@
 
     $ py.test -v test_server.py::TestClass::test_method
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 5 items
     
-    test_server.py at 11::TestClass::test_method PASSED
+    test_server.py::TestClass::test_method PASSED
     
     ========================= 1 passed in 0.01 seconds =========================
 
@@ -73,10 +73,10 @@
 
     $ py.test -v test_server.py::TestClass
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 11::TestClass::test_method PASSED
+    test_server.py::TestClass::test_method PASSED
     
     ========================= 1 passed in 0.01 seconds =========================
 
@@ -84,11 +84,11 @@
 
   $ py.test -v test_server.py::TestClass test_server.py::test_send_http
   =========================== test session starts ============================
-  platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+  platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
   collecting ... collected 8 items
   
-  test_server.py at 11::TestClass::test_method PASSED
-  test_server.py at 3::test_send_http PASSED
+  test_server.py::TestClass::test_method PASSED
+  test_server.py::test_send_http PASSED
   
   ========================= 2 passed in 0.01 seconds =========================
 
@@ -120,10 +120,10 @@
 
     $ py.test -v -k http  # running with the above defined example module
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 3::test_send_http PASSED
+    test_server.py::test_send_http PASSED
     
     ====================== 3 tests deselected by '-khttp' ======================
     ================== 1 passed, 3 deselected in 0.01 seconds ==================
@@ -132,12 +132,12 @@
 
     $ py.test -k "not send_http" -v
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 6::test_something_quick PASSED
-    test_server.py at 8::test_another PASSED
-    test_server.py at 11::TestClass::test_method PASSED
+    test_server.py::test_something_quick PASSED
+    test_server.py::test_another PASSED
+    test_server.py::TestClass::test_method PASSED
     
     ================= 1 tests deselected by '-knot send_http' ==================
     ================== 3 passed, 1 deselected in 0.01 seconds ==================
@@ -146,11 +146,11 @@
 
     $ py.test -k "http or quick" -v
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 4 items
     
-    test_server.py at 3::test_send_http PASSED
-    test_server.py at 6::test_something_quick PASSED
+    test_server.py::test_send_http PASSED
+    test_server.py::test_something_quick PASSED
     
     ================= 2 tests deselected by '-khttp or quick' ==================
     ================== 2 passed, 2 deselected in 0.01 seconds ==================
@@ -187,7 +187,7 @@
     
     @pytest.mark.skipif(condition): skip the given test function if eval(condition) results in a True value.  Evaluation happens within the module global context. Example: skipif('sys.platform == "win32"') skips the test if we are on the win32 platform. see http://pytest.org/latest/skipping.html
     
-    @pytest.mark.xfail(condition, reason=None, run=True): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. See http://pytest.org/latest/skipping.html
+    @pytest.mark.xfail(condition, reason=None, run=True, raises=None): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html
     
     @pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would lead to two calls of the decorated test function, one with arg1=1 and another with arg1=2.see http://pytest.org/latest/parametrize.html for more info and examples.
     
@@ -326,7 +326,7 @@
 
     $ py.test -E stage2
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 1 items
     
     test_someenv.py s
@@ -337,7 +337,7 @@
 
     $ py.test -E stage1
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 1 items
     
     test_someenv.py .
@@ -351,7 +351,7 @@
     
     @pytest.mark.skipif(condition): skip the given test function if eval(condition) results in a True value.  Evaluation happens within the module global context. Example: skipif('sys.platform == "win32"') skips the test if we are on the win32 platform. see http://pytest.org/latest/skipping.html
     
-    @pytest.mark.xfail(condition, reason=None, run=True): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. See http://pytest.org/latest/skipping.html
+    @pytest.mark.xfail(condition, reason=None, run=True, raises=None): mark the the test function as an expected failure if eval(condition) has a True value. Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. If only specific exception(s) are expected, you can list them in raises, and if the test fails in other ways, it will be reported as a true failure. See http://pytest.org/latest/skipping.html
     
     @pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would lead to two calls of the decorated test function, one with arg1=1 and another with arg1=2.see http://pytest.org/latest/parametrize.html for more info and examples.
     
@@ -455,26 +455,26 @@
 
     $ py.test -rs # this option reports skip reasons
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 4 items
     
-    test_plat.py s.s.
+    test_plat.py sss.
     ========================= short test summary info ==========================
-    SKIP [2] /tmp/doc-exec-142/conftest.py:12: cannot run on platform linux2
+    SKIP [3] /tmp/doc-exec-238/conftest.py:12: cannot run on platform linux
     
-    =================== 2 passed, 2 skipped in 0.01 seconds ====================
+    =================== 1 passed, 3 skipped in 0.01 seconds ====================
 
 Note that if you specify a platform via the marker-command line option like this::
 
     $ py.test -m linux2
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 4 items
     
-    test_plat.py .
+    test_plat.py s
     
     =================== 3 tests deselected by "-m 'linux2'" ====================
-    ================== 1 passed, 3 deselected in 0.01 seconds ==================
+    ================= 1 skipped, 3 deselected in 0.01 seconds ==================
 
 then the unmarked-tests will not be run.  It is thus a way to restrict the run to the specific tests.
 
@@ -519,7 +519,7 @@
 
   $ py.test -m interface --tb=short
   =========================== test session starts ============================
-  platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+  platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
   collected 4 items
   
   test_module.py FF
@@ -540,7 +540,7 @@
 
   $ py.test -m "interface or event" --tb=short
   =========================== test session starts ============================
-  platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+  platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
   collected 4 items
   
   test_module.py FFF
@@ -559,4 +559,4 @@
       assert 0
   E   assert 0
   ============= 1 tests deselected by "-m 'interface or event'" ==============
-  ================== 3 failed, 1 deselected in 0.02 seconds ==================
+  ================== 3 failed, 1 deselected in 0.01 seconds ==================

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/example/nonpython.txt
--- a/doc/en/example/nonpython.txt
+++ b/doc/en/example/nonpython.txt
@@ -27,7 +27,7 @@
 
     nonpython $ py.test test_simple.yml
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     
     test_simple.yml .F
@@ -56,11 +56,11 @@
 
     nonpython $ py.test -v
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0 -- /home/hpk/p/pytest/.tox/regen/bin/python
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4
     collecting ... collected 2 items
     
-    test_simple.yml at 1::usecase: ok PASSED
-    test_simple.yml at 1::usecase: hello FAILED
+    test_simple.yml::usecase: ok PASSED
+    test_simple.yml::usecase: hello FAILED
     
     ================================= FAILURES =================================
     ______________________________ usecase: hello ______________________________
@@ -74,7 +74,7 @@
 
     nonpython $ py.test --collect-only
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     <YamlFile 'test_simple.yml'><YamlItem 'ok'>

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/example/parametrize.txt
--- a/doc/en/example/parametrize.txt
+++ b/doc/en/example/parametrize.txt
@@ -106,7 +106,7 @@
 
     $ py.test test_scenarios.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 4 items
     
     test_scenarios.py ....
@@ -118,7 +118,7 @@
 
     $ py.test --collect-only test_scenarios.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 4 items
     <Module 'test_scenarios.py'><Class 'TestSampleWithScenarios'>
@@ -182,7 +182,7 @@
 
     $ py.test test_backends.py --collect-only
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     <Module 'test_backends.py'><Function 'test_db_initialized[d1]'>
@@ -197,7 +197,7 @@
     ================================= FAILURES =================================
     _________________________ test_db_initialized[d2] __________________________
     
-    db = <conftest.DB2 instance at 0x2b45c2b12050>
+    db = <conftest.DB2 object at 0x2b83684b5eb8>
     
         def test_db_initialized(db):
             # a dummy test
@@ -251,9 +251,9 @@
     $ py.test -q
     F..
     ================================= FAILURES =================================
-    ________________________ TestClass.test_equals[1-2] ________________________
+    ________________________ TestClass.test_equals[2-1] ________________________
     
-    self = <test_parametrize.TestClass instance at 0x2acd519c6200>, a = 1, b = 2
+    self = <test_parametrize.TestClass object at 0x2ae94130e390>, a = 1, b = 2
     
         def test_equals(self, a, b):
     >       assert a == b
@@ -281,10 +281,10 @@
    . $ py.test -rs -q multipython.py
    ssssssssssssssssssssssssssssssssssss......sssssssss......ssssssssssssssssss
    ========================= short test summary info ==========================
+   SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.5' not found
+   SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.8' not found
    SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.4' not found
-   SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.8' not found
-   SKIP [21] /home/hpk/p/pytest/doc/en/example/multipython.py:22: 'python2.5' not found
-   12 passed, 63 skipped in 0.66 seconds
+   12 passed, 63 skipped in 0.65 seconds
 
 Indirect parametrization of optional implementations/imports
 --------------------------------------------------------------------
@@ -331,12 +331,12 @@
 
     $ py.test -rs test_module.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     
     test_module.py .s
     ========================= short test summary info ==========================
-    SKIP [1] /tmp/doc-exec-144/conftest.py:10: could not import 'opt2'
+    SKIP [1] /tmp/doc-exec-240/conftest.py:10: could not import 'opt2'
     
     =================== 1 passed, 1 skipped in 0.01 seconds ====================
 

diff -r 4901560bef6150e161b31ac28ad0eb47c984ddf6 -r b458501957a79e8eada6b901e1e245fe664dc6de doc/en/example/pythoncollection.txt
--- a/doc/en/example/pythoncollection.txt
+++ b/doc/en/example/pythoncollection.txt
@@ -43,7 +43,7 @@
 
     $ py.test --collect-only
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 2 items
     <Module 'check_myapp.py'><Class 'CheckMyApp'>
@@ -88,7 +88,7 @@
 
     . $ py.test --collect-only pythoncollection.py
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
     collected 3 items
     <Module 'pythoncollection.py'><Function 'test_function'>
@@ -141,10 +141,8 @@
 
     $ py.test --collect-only
     =========================== test session starts ============================
-    platform linux2 -- Python 2.7.6 -- py-1.4.22 -- pytest-2.6.0
-    collected 1 items
-    <Module 'pkg/module_py2.py'>
-      <Function 'test_only_on_python2'>
+    platform linux -- Python 3.4.0 -- py-1.4.23 -- pytest-2.6.1
+    collected 0 items
     
     =============================  in 0.01 seconds =============================
 

This diff is so big that we needed to truncate the remainder.

https://bitbucket.org/hpk42/pytest/commits/1853e10fe16c/
Changeset:   1853e10fe16c
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-08-12 01:20:41
Summary:     standard lib modules no longer required in freeze_includes() and updated docs
Affected #:  2 files

diff -r b458501957a79e8eada6b901e1e245fe664dc6de -r 1853e10fe16cdf967d228d2b3d1317eb97f958e5 _pytest/genscript.py
--- a/_pytest/genscript.py
+++ b/_pytest/genscript.py
@@ -99,16 +99,6 @@
     """
     result = list(_iter_all_modules(py))
     result += list(_iter_all_modules(_pytest))
-
-    # builtin files imported by pytest using py.std implicit mechanism;
-    # should be removed if https://bitbucket.org/hpk42/pytest/pull-request/185
-    # gets merged
-    result += [
-        'argparse',
-        'shlex',
-        'warnings',
-        'types',
-    ]
     return result
 
 

diff -r b458501957a79e8eada6b901e1e245fe664dc6de -r 1853e10fe16cdf967d228d2b3d1317eb97f958e5 doc/en/example/simple.txt
--- a/doc/en/example/simple.txt
+++ b/doc/en/example/simple.txt
@@ -684,7 +684,7 @@
 
 Unfortunately ``cx_freeze`` can't discover them
 automatically because of ``pytest``'s use of dynamic module loading, so you
-must declare them explicitly by using ``pytest.cx_freeze_support.includes()``::
+must declare them explicitly by using ``pytest.freeze_includes()``::
 
     # contents of setup.py
     from cx_Freeze import setup, Executable
@@ -695,7 +695,7 @@
         executables=[Executable("app_main.py")],
         options={"build_exe":
             {
-            'includes': pytest.cx_freeze_support.includes()}
+            'includes': pytest.freeze_includes()}
             },
         # ... other options
     )
@@ -718,5 +718,4 @@
 This makes it convenient to execute your tests from within your frozen
 application, using standard ``py.test`` command-line options::
 
-    $ ./app_main --pytest --verbose --tb=long --junit-xml=results.xml test-suite/    /bin/sh: 1: ./app_main: not found
-    /bin/sh: 1: ./app_main: not found
+    $ ./app_main --pytest --verbose --tb=long --junit-xml=results.xml test-suite/


https://bitbucket.org/hpk42/pytest/commits/a21b5e18c8c4/
Changeset:   a21b5e18c8c4
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-08-23 15:05:40
Summary:     merging with default
Affected #:  3 files

diff -r 1853e10fe16cdf967d228d2b3d1317eb97f958e5 -r a21b5e18c8c42eec7c6c2ed797261c280399663d CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,12 @@
 
 - fixed issue561: adapt autouse fixture example for python3.
 
+- Fix example in monkeypatch documentation, thanks t-8ch.
+
+- Do not mark as universal wheel because Python 2.6 is different from
+  other builds due to the extra argparse dependency.  Fixes issue566.
+  Thanks sontek.
+
 2.6.1
 -----------------------------------
 

diff -r 1853e10fe16cdf967d228d2b3d1317eb97f958e5 -r a21b5e18c8c42eec7c6c2ed797261c280399663d doc/en/monkeypatch.txt
--- a/doc/en/monkeypatch.txt
+++ b/doc/en/monkeypatch.txt
@@ -48,7 +48,7 @@
     import pytest
     @pytest.fixture(autouse=True)
     def no_requests(monkeypatch):
-        monkeypatch.delattr("requests.session.Session.request")
+        monkeypatch.delattr("requests.sessions.Session.request")
 
 This autouse fixture will be executed for each test function and it
 will delete the method ``request.session.Session.request`` 

diff -r 1853e10fe16cdf967d228d2b3d1317eb97f958e5 -r a21b5e18c8c42eec7c6c2ed797261c280399663d setup.cfg
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,6 +5,3 @@
 
 [upload_sphinx]
 upload-dir = doc/en/build/html
-
-[wheel]
-universal = 1
\ No newline at end of file


https://bitbucket.org/hpk42/pytest/commits/6a0c1f4622aa/
Changeset:   6a0c1f4622aa
Branch:      cx_freeze-support
User:        nicoddemus
Date:        2014-08-23 15:10:32
Summary:     Added changelog entry for freeze_includes()
Affected #:  1 file

diff -r a21b5e18c8c42eec7c6c2ed797261c280399663d -r 6a0c1f4622aa33becc1cdfd7c75b8c73ef962c95 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 NEXT
 -----------
 
+- Added function pytest.freeze_includes(), which makes it easy to embed
+  pytest into executables using tools like cx_freeze.
+  See docs for examples and rationale. Thanks Bruno Oliveira.
+
 - fixed issue561: adapt autouse fixture example for python3.
 
 - Fix example in monkeypatch documentation, thanks t-8ch.


https://bitbucket.org/hpk42/pytest/commits/766d82ca8b71/
Changeset:   766d82ca8b71
User:        flub
Date:        2014-09-03 22:55:46
Summary:     Merged in nocoddemus/pytest/cx_freeze-support (pull request #189)
Affected #:  11 files

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 NEXT
 -----------
 
+- Added function pytest.freeze_includes(), which makes it easy to embed
+  pytest into executables using tools like cx_freeze.
+  See docs for examples and rationale. Thanks Bruno Oliveira.
+
 - Improve assertion rewriting cache invalidation precision.
 
 - fixed issue561: adapt autouse fixture example for python3.

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 _pytest/genscript.py
--- a/_pytest/genscript.py
+++ b/_pytest/genscript.py
@@ -1,6 +1,12 @@
 """ generate a single-file self-contained version of pytest """
+import os
+import sys
+import pkgutil
+
 import py
-import sys
+
+import _pytest
+
 
 
 def find_toplevel(name):
@@ -80,3 +86,42 @@
         tw.line("generated pytest standalone script: %s" % genscript,
                 bold=True)
         return 0
+
+
+def pytest_namespace():
+    return {'freeze_includes': freeze_includes}
+
+
+def freeze_includes():
+    """
+    Returns a list of module names used by py.test that should be
+    included by cx_freeze.
+    """
+    result = list(_iter_all_modules(py))
+    result += list(_iter_all_modules(_pytest))
+    return result
+
+
+def _iter_all_modules(package, prefix=''):
+    """
+    Iterates over the names of all modules that can be found in the given
+    package, recursively.
+
+    Example:
+        _iter_all_modules(_pytest) ->
+            ['_pytest.assertion.newinterpret',
+             '_pytest.capture',
+             '_pytest.core',
+             ...
+            ]
+    """
+    if type(package) is not str:
+        path, prefix = package.__path__[0], package.__name__ + '.'
+    else:
+        path = package
+    for _, name, is_package in pkgutil.iter_modules([path]):
+        if is_package:
+            for m in _iter_all_modules(os.path.join(path, name), prefix=name + '.'):
+                yield prefix + m
+        else:
+            yield prefix + name

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 doc/en/example/simple.txt
--- a/doc/en/example/simple.txt
+++ b/doc/en/example/simple.txt
@@ -682,33 +682,27 @@
 send test files to users so they can run them in their machines, which can be
 invaluable to obtain more information about a hard to reproduce bug.
 
-Unfortunately embedding the ``pytest`` runner into a frozen executable using
-``cx_freeze`` is not as straightforward as one would like,
-because ``pytest`` makes heavy use of dynamic module loading which
-``cx_freeze`` can't resolve by itself.
-
-To solve this, you have to manually include ``pytest`` and ``py``
-modules by using the ``build_exe`` option in your ``setup.py`` script, like this::
+Unfortunately ``cx_freeze`` can't discover them
+automatically because of ``pytest``'s use of dynamic module loading, so you
+must declare them explicitly by using ``pytest.freeze_includes()``::
 
     # contents of setup.py
     from cx_Freeze import setup, Executable
+    import pytest
 
-    includes = [
-        '_pytest.doctest',
-        '_pytest.unittest',
-        # ... lots more
-    ]
     setup(
-        name="runtests",
-        options={"build_exe": {'includes': includes}},
+        name="app_main",
+        executables=[Executable("app_main.py")],
+        options={"build_exe":
+            {
+            'includes': pytest.freeze_includes()}
+            },
         # ... other options
     )
 
-(For the complete list, check out the modules under ``_pytest`` in your
-site-packages).
-
-With that, you can make your program check for a certain flag and pass control
-over to ``pytest``::
+If you don't want to ship a different executable just in order to run your tests,
+you can make your program check for a certain flag and pass control
+over to ``pytest`` instead. For example::
 
     # contents of app_main.py
     import sys
@@ -722,7 +716,6 @@
         ...
 
 This makes it convenient to execute your tests from within your frozen
-application, using standard ``py.test`` command-line::
+application, using standard ``py.test`` command-line options::
 
-    $ ./app_main --pytest --verbose --tb=long --junit-xml=results.xml test-suite/    /bin/sh: 1: ./app_main: not found
-    /bin/sh: 1: ./app_main: not found
+    $ ./app_main --pytest --verbose --tb=long --junit-xml=results.xml test-suite/

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/cx_freeze/runtests_script.py
--- /dev/null
+++ b/testing/cx_freeze/runtests_script.py
@@ -0,0 +1,9 @@
+"""
+This is the script that is actually frozen into an executable: simply executes
+py.test main().
+"""
+
+if __name__ == '__main__':
+    import sys
+    import pytest
+    sys.exit(pytest.main())
\ No newline at end of file

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/cx_freeze/runtests_setup.py
--- /dev/null
+++ b/testing/cx_freeze/runtests_setup.py
@@ -0,0 +1,15 @@
+"""
+Sample setup.py script that generates an executable with pytest runner embedded.
+"""
+if __name__ == '__main__':
+    from cx_Freeze import setup, Executable
+    import pytest
+
+    setup(
+        name="runtests",
+        version="0.1",
+        description="exemple of how embedding py.test into an executable using cx_freeze",
+        executables=[Executable("runtests_script.py")],
+        options={"build_exe": {'includes': pytest.freeze_includes()}},
+    )
+

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/cx_freeze/tests/test_doctest.txt
--- /dev/null
+++ b/testing/cx_freeze/tests/test_doctest.txt
@@ -0,0 +1,6 @@
+
+
+Testing doctest::
+
+    >>> 1 + 1
+    2

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/cx_freeze/tests/test_trivial.py
--- /dev/null
+++ b/testing/cx_freeze/tests/test_trivial.py
@@ -0,0 +1,6 @@
+
+def test_upper():
+    assert 'foo'.upper() == 'FOO'
+
+def test_lower():
+    assert 'FOO'.lower() == 'foo'
\ No newline at end of file

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/cx_freeze/tox_run.py
--- /dev/null
+++ b/testing/cx_freeze/tox_run.py
@@ -0,0 +1,15 @@
+"""
+Called by tox.ini: uses the generated executable to run the tests in ./tests/
+directory.
+
+.. note:: somehow calling "build/runtests_script" directly from tox doesn't
+          seem to work (at least on Windows).
+"""
+if __name__ == '__main__':
+    import os
+    import sys
+
+    executable = os.path.join(os.getcwd(), 'build', 'runtests_script')
+    if sys.platform.startswith('win'):
+        executable += '.exe'
+    sys.exit(os.system('%s tests' % executable))
\ No newline at end of file

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 testing/test_genscript.py
--- a/testing/test_genscript.py
+++ b/testing/test_genscript.py
@@ -36,3 +36,13 @@
     result = standalone.run(anypython, testdir, p)
     assert result.ret != 0
 
+
+def test_freeze_includes():
+    """
+    Smoke test for freeze_includes(), to ensure that it works across all
+    supported python versions.
+    """
+    includes = pytest.freeze_includes()
+    assert len(includes) > 1
+    assert '_pytest.genscript' in includes
+

diff -r ec7b4b6844ff41b31bea9fd772562117de699d1d -r 766d82ca8b71cd455e4d174f595bb71232143626 tox.ini
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 distshare={homedir}/.tox/distshare
-envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py32,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting
+envlist=flakes,py26,py27,py34,pypy,py27-pexpect,py33-pexpect,py27-nobyte,py32,py33,py27-xdist,py33-xdist,py27-trial,py33-trial,doctesting,py27-cxfreeze
 
 [testenv]
 changedir=testing
@@ -123,6 +123,14 @@
     {envpython} {envbindir}/py.test-jython \
         -rfsxX --junitxml={envlogdir}/junit-{envname}2.xml []
 
+[testenv:py27-cxfreeze]
+deps=cx_freeze
+changedir=testing/cx_freeze
+basepython=python2.7
+commands=
+    {envpython} runtests_setup.py build --build-exe build
+    {envpython} tox_run.py
+
 [pytest]
 minversion=2.0
 plugins=pytester


https://bitbucket.org/hpk42/pytest/commits/77bbb3c8bcf4/
Changeset:   77bbb3c8bcf4
Branch:      cx_freeze-support
User:        flub
Date:        2014-09-03 22:56:59
Summary:     Close cx_freeze-support branch
Affected #:  0 files

Repository URL: https://bitbucket.org/hpk42/pytest/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.


More information about the pytest-commit mailing list