import textwrap
import inspect

class Writer:
    def __init__(self, clsname):
        self.clsname = clsname

    def __enter__(self):
        self.file = open("%s.api" % self.clsname, "w")
        return self

    def __exit__(self, *args):
        self.file.close()
        print "wrote", self.file.name

    def line(self, line):
        self.file.write(line+"\n")

    def docmethod(self, method):
        doc = " ".join(method.__doc__.split())
        indent = "         "
        w = textwrap.TextWrapper(initial_indent=indent,
                                 subsequent_indent=indent)

        spec = inspect.getargspec(method)
        del spec.args[0]
        self.line(".. py:method:: " + method.__name__ +
                  inspect.formatargspec(*spec))
        self.line("")
        self.line(w.fill(doc))
        self.line("")

def pytest_funcarg__a(request):
    with Writer("request") as writer:
        writer.docmethod(request.getfuncargvalue)
        writer.docmethod(request.cached_setup)
        writer.docmethod(request.addfinalizer)
        writer.docmethod(request.applymarker)

def test_hello(a):
    pass
