[py-svn] r61766 - py/branch/pytestplugin/py/test/plugin

hpk at codespeak.net hpk at codespeak.net
Thu Feb 12 08:48:08 CET 2009


Author: hpk
Date: Thu Feb 12 08:48:06 2009
New Revision: 61766

Added:
   py/branch/pytestplugin/py/test/plugin/pytest_apigen.py   (contents, props changed)
Log:
add an APIGEN pytest plugin 


Added: py/branch/pytestplugin/py/test/plugin/pytest_apigen.py
==============================================================================
--- (empty file)
+++ py/branch/pytestplugin/py/test/plugin/pytest_apigen.py	Thu Feb 12 08:48:06 2009
@@ -0,0 +1,77 @@
+
+import py
+
+pytest_plugins = 'xfail'
+
+class Apigen:
+    pytest_cmdlineoptions = [
+        py.test.config.Option(
+               '--apigen',
+               action="store_true", dest="apigen",
+               help="generate api documentation")
+        #  "--apigen-script" argument pointing to a script"),
+    ]
+
+    def pytest_configure(self, config):
+        if config.option.apigen:
+            from py.__.apigen.tracer.tracer import Tracer, DocStorage
+            self.pkgdir = py.path.local(config.args[0]).pypkgpath()
+            apigenscriptpath = py.path.local(py.__file__).dirpath("apigen", "apigen.py")
+            apigenscript = apigenscriptpath.pyimport()
+            if not hasattr(apigenscript, 'get_documentable_items'):
+                raise NotImplementedError("%r needs to provide get_documentable_items" %(
+                    apigenscriptpath,))
+            self.apigenscript = apigenscript
+            pkgname, items = apigenscript.get_documentable_items(self.pkgdir)
+            self.docstorage = DocStorage().from_dict(items,
+                                                     module_name=pkgname)
+            self.tracer = Tracer(self.docstorage)
+
+    def pytest_pyfunc_call(self, pyfuncitem, args, kwargs):
+        if hasattr(self, 'tracer'):
+            self.tracer.start_tracing()
+            try:
+                pyfuncitem.obj(*args, **kwargs)
+            finally:
+                self.tracer.end_tracing()
+            return True
+
+    def pytest_terminal_summary(self, terminalreporter):
+        if hasattr(self, 'tracer'):
+            tr = terminalreporter
+            from py.__.apigen.tracer.docstorage import DocStorageAccessor
+            terminalreporter.write_sep("=", "apigen: building documentation")
+            capture = py.io.StdCaptureFD()
+            try:
+                self.apigenscript.build(
+                    self.pkgdir, 
+                    DocStorageAccessor(self.docstorage),
+                    capture)
+            finally:
+                capture.reset()
+            terminalreporter.write_line("apigen build completed")
+
+def test_generic(plugintester):
+    plugintester.apicheck(Apigen)
+
+def test_simple(fstester):
+    sub = fstester.tmpdir.mkdir("test_simple")
+    sub.join("__init__.py").write(py.code.Source("""
+        from py import initpkg 
+        initpkg(__name__, exportdefs={
+            'simple.f': ('./test_simple.py', 'f',),
+        })
+    """))
+    pyfile = sub.join("test_simple.py")
+    pyfile.write(py.code.Source("""
+        def f(arg):
+            pass
+        def test_f():
+            f(42)
+    """))
+    fstester.makepyfile(conftest="pytest_plugins='apigen'")
+    result = fstester.runpytest(pyfile, "--apigen")
+    result.stdout.fnmatch_lines([
+            "*apigen: building documentation*", 
+            "apigen build completed", 
+    ])



More information about the pytest-commit mailing list