[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