[py-svn] pytest commit 867df79243d4: refine docs and docstrings, fix some small bits here and there while doing that.

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Thu Nov 18 14:58:31 CET 2010


# HG changeset patch -- Bitbucket.org
# Project pytest
# URL http://bitbucket.org/hpk42/pytest/overview
# User holger krekel <holger at merlinux.eu>
# Date 1290088576 -3600
# Node ID 867df79243d4ecc5607d1004e3ab96599c861dd5
# Parent  8431fad888a4d0fd556456a89198f2d47722a8b9
refine docs and docstrings, fix some small bits here and there while doing that.

--- a/testing/test_mark.py
+++ b/testing/test_mark.py
@@ -2,6 +2,10 @@ import py, pytest
 from _pytest.mark import MarkGenerator as Mark
 
 class TestMark:
+    def test_pytest_exists_in_namespace_all(self):
+        assert 'mark' in py.test.__all__
+        assert 'mark' in pytest.__all__
+
     def test_pytest_mark_notcallable(self):
         mark = Mark()
         pytest.raises((AttributeError, TypeError), "mark()")

--- a/_pytest/doctest.py
+++ b/_pytest/doctest.py
@@ -64,12 +64,16 @@ class DoctestItem(pytest.Item):
 
 class DoctestTextfile(DoctestItem, pytest.File):
     def runtest(self):
-        failed, tot = py.std.doctest.testfile(
+        doctest = py.std.doctest
+        failed, tot = doctest.testfile(
             str(self.fspath), module_relative=False,
+            optionflags=doctest.ELLIPSIS,
             raise_on_error=True, verbose=0)
 
 class DoctestModule(DoctestItem, pytest.File):
     def runtest(self):
+        doctest = py.std.doctest
         module = self.fspath.pyimport()
-        failed, tot = py.std.doctest.testmod(
-            module, raise_on_error=True, verbose=0)
+        failed, tot = doctest.testmod(
+            module, raise_on_error=True, verbose=0,
+            optionflags=doctest.ELLIPSIS)

--- a/doc/nose.txt
+++ b/doc/nose.txt
@@ -4,7 +4,6 @@ Running test written for nose
 .. include:: links.inc
 
 py.test has basic support for running tests written for nose_.
-This is implemented in :pymod:`_pytest.nose`.
 
 Usage
 -------------
@@ -13,8 +12,8 @@ type::
 
     py.test  # instead of 'nosetests'
 
-and you should be able to run your nose style tests and at the same
-make full use of py.test's capabilities.
+and you should be able to run your nose style tests and
+make use of py.test's capabilities.
 
 Supported nose Idioms
 ----------------------
@@ -25,18 +24,12 @@ Supported nose Idioms
 * yield-based tests and their setup
 * general usage of nose utilities
 
-Unsupported idioms / issues
+Unsupported idioms / known issues
 ----------------------------------
 
 - nose-style doctests are not collected and executed correctly,
-  also fixtures don't work.
+  also doctest fixtures don't work.
 
 - no nose-configuration is recognized
 
-If you find other issues or have suggestions please run::
 
-    py.test --pastebin=all
-
-and send the resulting URL to a py.test contact channel,
-at best to the mailing list.
-"""

--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -762,19 +762,28 @@ def raises(ExpectedException, *args, **k
         If using Python 2.5 or above, you may use this function as a
         context manager::
 
-        >>> with raises(ZeroDivisionError):
-        ...    1/0
+            >>> with raises(ZeroDivisionError):
+            ...    1/0
 
-        Or you can one of two forms:
+        Or you can specify a callable by passing a to-be-called lambda::
 
-        if args[0] is callable: raise AssertionError if calling it with
-        the remaining arguments does not raise the expected exception.
-        if args[0] is a string: raise AssertionError if executing the
-        the string in the calling scope does not raise expected exception.
-        examples:
-        >>> x = 5
-        >>> raises(TypeError, lambda x: x + 'hello', x=x)
-        >>> raises(TypeError, "x + 'hello'")
+            >>> raises(ZeroDivisionError, lambda: 1/0)
+            <ExceptionInfo ...>
+
+        or you can specify an arbitrary callable with arguments::
+
+            >>> def f(x): return 1/x
+            ...
+            >>> raises(ZeroDivisionError, f, 0)
+            <ExceptionInfo ...>
+            >>> raises(ZeroDivisionError, f, x=0)
+            <ExceptionInfo ...>
+
+        A third possibility is to use a string which which will
+        be executed::
+        
+            >>> raises(ZeroDivisionError, "f(0)")
+            <ExceptionInfo ...>
     """
     __tracebackhide__ = True
 

--- a/doc/index.txt
+++ b/doc/index.txt
@@ -5,8 +5,8 @@ py.test: no-boilerplate testing with Pyt
 
 .. note::
     version 2.0 introduces ``pytest`` as the main Python import name
-    but for compatibility reasons you can continue to use ``py.test``
-    in your test code.
+    but for compatibility reasons you can continue to use ``import py``
+    and ``py.test.XYZ`` to access :ref:`pytest helpers` in your test code.
 
 Welcome to ``py.test`` documentation:
 
@@ -25,6 +25,7 @@ Welcome to ``py.test`` documentation:
    :hidden:
 
    changelog.txt
+   example/attic
 
 Indices and tables
 ==================

--- a/doc/builtin.txt
+++ b/doc/builtin.txt
@@ -1,8 +1,10 @@
+
+.. _`pytest helpers`:
 
 pytest builtin helpers
 ================================================
 
-builtin pytest.* helpers
+builtin pytest.* functions and helping objects
 -----------------------------------------------------
 
 You can always use an interactive Python prompt and type::

--- a/testing/acceptance_test.py
+++ b/testing/acceptance_test.py
@@ -39,7 +39,7 @@ class TestGeneralUsage:
             def test_1(pytestconfig):
                 pytestconfig.getbasetemp().ensure("hello")
         """)
-        result = testdir.runpytest(p, '--basetemp=%s' %mytemp)
+        result = testdir.runpytest(p, '--basetemp=%s' % mytemp)
         assert result.ret == 0
         assert mytemp.join('hello').check()
 
@@ -239,7 +239,7 @@ class TestInvocationVariants:
 
     def test_pydoc(self, testdir):
         for name in ('py.test', 'pytest'):
-            result = testdir.runpython_c("import %s;help(%s)" % (name,name))
+            result = testdir.runpython_c("import %s;help(%s)" % (name, name))
             assert result.ret == 0
             s = result.stdout.str()
             assert 'MarkGenerator' in s
@@ -325,7 +325,7 @@ class TestInvocationVariants:
         class MyPlugin:
             def pytest_addoption(self, parser):
                 parser.addoption("--myopt")
-            
+
         pytest.main(["-h"], plugins=[MyPlugin()])
         out, err = capsys.readouterr()
         assert "--myopt" in out
@@ -358,7 +358,6 @@ class TestInvocationVariants:
             "ERROR*file*or*package*not*found*",
         ])
 
-
     @pytest.mark.xfail(reason="decide: feature or bug")
     def test_noclass_discovery_if_not_testcase(self, testdir):
         testpath = testdir.makepyfile("""

--- a/doc/features.txt
+++ b/doc/features.txt
@@ -5,12 +5,12 @@ no-boilerplate testing with Python
 ----------------------------------
 
 - automatic, fully customizable Python test discovery
-- allows fully :pep:`8` compliant coding style
 - write simple test functions and freely group tests
 - ``assert`` statement for your assertions
 - powerful parametrization of test functions
-- rely on powerful traceback and assertion reporting
+- rely on helpful traceback and failing assertion reporting
 - use ``print`` or ``pdb`` debugging on failures
+- enables fully :pep:`8` compliant coding style
 
 extensive plugin and customization system
 ------------------------------------------------------
@@ -25,11 +25,9 @@ extensive plugin and customization syste
 mature command line testing tool
 --------------------------------------
 
-- powerful :ref:`usage` possibilities
+- powerful :ref:`usage` possibilities, well sorted command line options
 - used in many projects, ranging from 10 to 10K tests
-- simple well sorted command line options
-- runs on Unix, Windows from Python 2.4 up to Python 3.1 and 3.2
-- is itself tested extensively on a CI server
+- tested on Unix and Windows from Python 2.4 up to Python 3.1 and 3.2
 - keyword/testname based selection of tests
 
 integrates well with CI systems
@@ -41,7 +39,6 @@ integrates well with CI systems
 
 .. _`tox`: http://codespeak.net/tox
 
-
 supports common testing practises and methods
 -----------------------------------------------------------
 

--- a/doc/apiref.txt
+++ b/doc/apiref.txt
@@ -15,6 +15,7 @@ py.test reference documentation
    xunit_setup.txt
    capture.txt
    monkeypatch.txt
+   xdist.txt
    tmpdir.txt
    skipping.txt
    mark.txt

--- a/doc/links.inc
+++ b/doc/links.inc
@@ -12,6 +12,7 @@
 .. _`setuptools`: http://pypi.python.org/pypi/setuptools
 
 .. _`easy_install`:
+.. _`distribute docs`:
 .. _`distribute`: http://pypi.python.org/pypi/distribute
 .. _`pip`: http://pypi.python.org/pypi/pip
 .. _`virtualenv`: http://pypi.python.org/pypi/virtualenv

--- a/doc/getting-started.txt
+++ b/doc/getting-started.txt
@@ -36,17 +36,17 @@ That's it. You can execute the test func
     =========================== test session starts ============================
     platform linux2 -- Python 2.6.5 -- pytest-2.0.0.dev30
     test path 1: /tmp/doc-exec-70
-    
+
     test_sample.py F
-    
+
     ================================= FAILURES =================================
     _______________________________ test_answer ________________________________
-    
+
         def test_answer():
     >       assert func(3) == 5
     E       assert 4 == 5
     E        +  where 4 = func(3)
-    
+
     test_sample.py:5: AssertionError
     ========================= 1 failed in 0.02 seconds =========================
 
@@ -120,14 +120,14 @@ run the module by passing its filename::
     .F
     ================================= FAILURES =================================
     ____________________________ TestClass.test_two ____________________________
-    
+
     self = <test_class.TestClass instance at 0x288fc20>
-    
+
         def test_two(self):
             x = "hello"
     >       assert hasattr(x, 'check')
     E       assert hasattr('hello', 'check')
-    
+
     test_class.py:8: AssertionError
     1 failed, 1 passed in 0.02 seconds
 
@@ -156,14 +156,14 @@ before performing the test function call
     F
     ================================= FAILURES =================================
     _____________________________ test_needsfiles ______________________________
-    
+
     tmpdir = local('/tmp/pytest-122/test_needsfiles0')
-    
+
         def test_needsfiles(tmpdir):
             print tmpdir
     >       assert 0
     E       assert 0
-    
+
     test_tmpdir.py:3: AssertionError
     ----------------------------- Captured stdout ------------------------------
     /tmp/pytest-122/test_needsfiles0
@@ -194,29 +194,20 @@ Known Installation issues
 easy_install or pip not found?
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-Consult `distribute docs <distribute>`_ to install the ``easy_install``
-tool on your machine.  You may also use the original but somewhat older
-`setuptools`_ project although we generally recommend to use
-``distribute`` because it contains more bug fixes and also works for
-Python3.
-
-For Python2 you can also consult pip_ for the popular ``pip`` tool.
-
-However, If you want to install on Python3 you need to use Distribute_ which
-provides the ``easy_install`` utility.
-
+Consult `distribute docs`_ to install the ``easy_install``
+tool on your machine.  You may also use the older
+`setuptools`_ project but it lacks bug fixes and does not
+work on Python3.  If you use Python2 you may also install pip_.
 
 py.test not found on Windows despite installation?
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 .. _`Python for Windows`: http://www.imladris.com/Scripts/PythonForWindows.html
 
-
 - **Windows**: If "easy_install" or "py.test" are not found
-  please see here for preparing your environment for running
-  command line tools: `Python for Windows`_.  You may alternatively
-  use an `ActivePython install`_ which makes command line tools
-  automatically available under Windows.
+  you need to add the Python script path to your ``PATH``, see here:
+  `Python for Windows`_.  You may alternatively use an `ActivePython install`_
+  which does this for you automatically.
 
 .. _`ActivePython install`: http://www.activestate.com/activepython/downloads
 

--- a/testing/test_collection.py
+++ b/testing/test_collection.py
@@ -204,12 +204,12 @@ class TestCustomConftests:
                 return path.basename.startswith("x") or \
                        path.basename == "test_one.py"
         """)
-        testdir.mkdir("xy123").ensure("test_hello.py").write(
-            "syntax error"
-        )
+        sub = testdir.mkdir("xy123")
+        sub.ensure("test_hello.py").write("syntax error")
+        sub.join("conftest.py").write("syntax error")
         testdir.makepyfile("def test_hello(): pass")
         testdir.makepyfile(test_one="syntax error")
-        result = testdir.runpytest()
+        result = testdir.runpytest("--fulltrace")
         assert result.ret == 0
         result.stdout.fnmatch_lines(["*1 passed*"])
 

--- a/_pytest/recwarn.py
+++ b/_pytest/recwarn.py
@@ -24,8 +24,8 @@ def pytest_namespace():
     return {'deprecated_call': deprecated_call}
 
 def deprecated_call(func, *args, **kwargs):
-    """ assert that calling func(*args, **kwargs)
-        triggers a DeprecationWarning.
+    """ assert that calling ``func(*args, **kwargs)``
+    triggers a DeprecationWarning.
     """
     warningmodule = py.std.warnings
     l = []

--- a/_pytest/session.py
+++ b/_pytest/session.py
@@ -408,7 +408,8 @@ class Session(FSCollector):
         path = names.pop(0)
         if path.check(dir=1):
             assert not names, "invalid arg %r" %(arg,)
-            for path in path.visit(rec=self._recurse, bf=True, sort=True):
+            for path in path.visit(fil=lambda x: x.check(file=1),
+                rec=self._recurse, bf=True, sort=True):
                 for x in self._collectfile(path):
                     yield x
         else:
@@ -424,12 +425,13 @@ class Session(FSCollector):
         return ihook.pytest_collect_file(path=path, parent=self)
 
     def _recurse(self, path):
-        ihook = self.gethookproxy(path)
+        ihook = self.gethookproxy(path.dirpath())
         if ihook.pytest_ignore_collect(path=path, config=self.config):
            return
         for pat in self._norecursepatterns:
             if path.check(fnmatch=pat):
                 return False
+        ihook = self.gethookproxy(path)
         ihook.pytest_collect_directory(path=path, parent=self)
         return True
 


--- a/tox.ini
+++ b/tox.ini
@@ -24,6 +24,12 @@ commands=
   py.test -n3 -rfsxX \
         --junitxml={envlogdir}/junit-{envname}.xml []
 
+[testenv:doctest]
+changedir=.
+commands=py.test --doctest-modules _pytest
+deps=
+
+
 [testenv:doc]
 basepython=python
 changedir=doc
@@ -57,6 +63,6 @@ commands=
 [pytest]
 minversion=2.0
 plugins=pytester
-addopts= -rxf --pyargs
+addopts= -rxf --pyargs --doctest-modules
 rsyncdirs=tox.ini pytest.py _pytest testing
 

--- a/doc/example/x.txt
+++ /dev/null
@@ -1,123 +0,0 @@
-Looping on the failing test set
------------------------------------------
-
-``py.test --looponfailing`` (implemented through the external
-`pytest-xdist`_ plugin) allows to run a test suite,
-memorize all failures and then loop over the failing set
-of tests until they all pass.  It will re-start running
-the tests when it detects file changes in your project.
-
-select tests by keyword / test name search
------------------------------------------------------
-
-.. _`selection by keyword`:
-
-You can selectively run tests by specifiying a keyword
-on the command line.  Examples::
-
-    py.test -k test_simple
-    py.test -k "-test_simple"
-
-will run all tests matching (or not matching) the
-"test_simple" keyword.  Note that you need to quote
-the keyword if "-" is recognized as an indicator
-for a commandline option.  Lastly, you may use::
-
-    py.test. -k "test_simple:"
-
-which will run all tests after the expression has *matched once*, i.e.
-all tests that are seen after a test that matches the "test_simple"
-keyword.
-
-By default, all filename parts and
-class/function names of a test function are put into the set
-of keywords for a given test.  You can specify additional
-kewords like this:
-
-.. sourcecode:: python
-
-    @py.test.mark.webtest
-    def test_send_http():
-        ...
-
-and then use those keywords to select tests.  See the `pytest_keyword`_
-plugin for more information.
-
-.. _`pytest_keyword`: plugin/mark.html
-skip or expect-to-fail a test
--------------------------------------------
-
-py.test has a dedicated `skipping plugin`_ that allows to define
-
-* define "skip" outcomes indicating a platform or a
-  dependency mismatch.
-
-* "xfail" outcomes indicating an "expected failure" either with
-  with or without running a test.
-
-* skip and xfail outcomes can be applied at module, class or method
-  level or even only for certain argument sets of a parametrized function.
-
-.. _`skipping plugin`: plugin/skipping.html
-.. _`funcargs mechanism`: funcargs.html
-.. _`doctest.py`: http://docs.python.org/library/doctest.html
-.. _`xUnit style setup`: xunit_setup.html
-.. _`pytest_nose`: plugin/nose.html
-
-
-no-boilerplate testing
-----------------------------------
-
-.. _`autocollect`:
-
-automatic Python test discovery
-+++++++++++++++++++++++++++++++++++
-
-By default, all python modules with a ``test_*.py``
-filename are inspected for finding tests:
-
-* functions with a name beginning with ``test_``
-* classes with a leading ``Test`` name and ``test`` prefixed methods.
-* ``unittest.TestCase`` subclasses
-
-parametrizing test functions and functional testing
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-py.test offers the unique `funcargs mechanism`_ for setting up
-and passing project-specific objects to Python test functions.
-Test Parametrization happens by triggering a call to the same test
-function with different argument values.  For doing fixtures
-using the funcarg mechanism makes your test and setup code
-more efficient and more readable. This is especially true
-for functional tests which might depend on command line
-options and a setup that needs to be shared across
-a whole test run.
-
-per-test capturing of output, including subprocesses
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-By default, ``py.test`` captures all writes to stdout/stderr.
-Output from ``print`` statements as well as from subprocesses
-is captured_.  When a test fails, the associated captured outputs are shown.
-This allows you to put debugging print statements in your code without
-being overwhelmed by all the output that might be generated by tests
-that do not fail.
-
-.. _captured: plugin/capture.html
-
-
-information-rich tracebacks, PDB introspection
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-.. _`example tracebacks`: http://paste.pocoo.org/show/134814/
-
-A lot of care is taken to present useful failure information
-and in particular nice and concise Python tracebacks.  This
-is especially useful if you need to regularly look at failures
-from nightly runs, i.e. are detached from the actual test
-running session.  Here are `example tracebacks`_ for a number of failing
-test functions.  You can modify traceback printing styles through the
-command line.  Using the `--pdb`` option you can automatically activate
-a PDB `Python debugger`_ when a test fails.
-
-

--- a/_pytest/nose.py
+++ b/_pytest/nose.py
@@ -1,4 +1,4 @@
-"""run test suites written for nose. """
+""" run test suites written for nose. """
 
 import pytest, py
 import inspect

--- a/doc/plugins.txt
+++ b/doc/plugins.txt
@@ -52,7 +52,6 @@ earlier than further away ones.
     under a package scope or to never import anything from a
     conftest.py file.
 
-.. _`installing plugins`:
 .. _`external plugins`:
 
 Installing External Plugins / Searching
@@ -85,12 +84,11 @@ you can copy from:
 * around 20 `builtin plugins`_ which comprise py.test's own functionality
 * around 10 `external plugins`_ providing additional features
 
-All of these plugins are using the documented `well specified hooks`_
-to implement their wide-ranging functionality.
+All of these plugins implement the documented `well specified hooks`_
+to extend and add functionality.
 
 .. _`setuptools entry points`:
 
-
 Making your plugin installable by others
 -----------------------------------------------
 

--- a/doc/announce/release-2.0.0.txt
+++ b/doc/announce/release-2.0.0.txt
@@ -87,6 +87,7 @@ and "pytest.raises" used as the recommen
 - py.test.config is now only available if you are in a test run.
 
 - the following (mostly already deprecated) functionality was removed:
+
   - removed support for Module/Class/... collection node definitions
     in conftest.py files.  They will cause nothing special.
   - removed support for calling the pre-1.0 collection API of "run()" and "join"



More information about the pytest-commit mailing list