174 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
""" functional test for apigen.py
 | 
						|
 | 
						|
    script to build api + source docs from py.test
 | 
						|
"""
 | 
						|
 | 
						|
import py
 | 
						|
from py.__.apigen import apigen
 | 
						|
 | 
						|
 | 
						|
def setup_fs_project(name):
 | 
						|
    temp = py.test.ensuretemp(name)
 | 
						|
    assert temp.listdir() == []
 | 
						|
    temp.ensure("pak/func.py").write(py.code.Source("""\
 | 
						|
        def func(arg1):
 | 
						|
            "docstring"
 | 
						|
 | 
						|
        def func_2(arg1, arg2):
 | 
						|
            return arg1(arg2)
 | 
						|
    """))
 | 
						|
    temp.ensure('pak/sometestclass.py').write(py.code.Source("""\
 | 
						|
        class SomeTestClass(object):
 | 
						|
            " docstring sometestclass "
 | 
						|
            someattr = 'somevalue'
 | 
						|
            def __init__(self, somevar):
 | 
						|
                self.somevar = somevar
 | 
						|
                
 | 
						|
            def get_somevar(self):
 | 
						|
                " get_somevar docstring "
 | 
						|
                return self.somevar
 | 
						|
            
 | 
						|
            def get_some_source(self):
 | 
						|
                ret = py.code.Source('''\\
 | 
						|
                    def foo():
 | 
						|
                      return 'bar'
 | 
						|
                ''')
 | 
						|
                return ret
 | 
						|
 | 
						|
    """))
 | 
						|
    temp.ensure('pak/sometestsubclass.py').write(py.code.Source("""\
 | 
						|
        from sometestclass import SomeTestClass
 | 
						|
        class SomeTestSubClass(SomeTestClass):
 | 
						|
            " docstring sometestsubclass "
 | 
						|
            def get_somevar(self):
 | 
						|
                return self.somevar + 1
 | 
						|
    """))
 | 
						|
    temp.ensure('pak/somenamespace.py').write(py.code.Source("""\
 | 
						|
        def foo():
 | 
						|
            return 'bar'
 | 
						|
        def baz(qux):
 | 
						|
            return qux
 | 
						|
        def _hidden():
 | 
						|
            return 'quux'
 | 
						|
    """))
 | 
						|
    temp.ensure("pak/__init__.py").write(py.code.Source("""\
 | 
						|
        '''pkg docstring'''
 | 
						|
        from py.initpkg import initpkg
 | 
						|
        initpkg(__name__,
 | 
						|
                long_description=globals()['__doc__'],
 | 
						|
                exportdefs={'main.sub.func': ("./func.py", "func"),
 | 
						|
                            'main.func': ("./func.py", "func_2"),
 | 
						|
                            'main.SomeTestClass': ('./sometestclass.py',
 | 
						|
                                                   'SomeTestClass'),
 | 
						|
                            'main.SomeTestSubClass': ('./sometestsubclass.py',
 | 
						|
                                                      'SomeTestSubClass'),
 | 
						|
                            'somenamespace': ('./somenamespace.py', '*')})
 | 
						|
    """))
 | 
						|
    temp.ensure('apigen.py').write(py.code.Source("""\
 | 
						|
        import py
 | 
						|
        py.std.sys.path.insert(0,
 | 
						|
            py.magic.autopath().dirpath().dirpath().dirpath().strpath)
 | 
						|
        from py.__.apigen.apigen import build, \
 | 
						|
            get_documentable_items_pkgdir as get_documentable_items
 | 
						|
    """))
 | 
						|
    temp.ensure('pak/test/test_pak.py').write(py.code.Source("""\
 | 
						|
        import py
 | 
						|
        py.std.sys.path.insert(0,
 | 
						|
            py.magic.autopath().dirpath().dirpath().dirpath().strpath)
 | 
						|
        import pak
 | 
						|
 | 
						|
        # this mainly exists to provide some data to the tracer
 | 
						|
        def test_pak():
 | 
						|
            s = pak.main.SomeTestClass(10)
 | 
						|
            assert s.get_somevar() == 10
 | 
						|
            s = pak.main.SomeTestClass('10')
 | 
						|
            assert s.get_somevar() == '10'
 | 
						|
            s = pak.main.SomeTestSubClass(10)
 | 
						|
            assert s.get_somevar() == 11
 | 
						|
            s = pak.main.SomeTestSubClass('10')
 | 
						|
            py.test.raises(TypeError, 's.get_somevar()')
 | 
						|
            assert pak.main.sub.func(10) is None
 | 
						|
            assert pak.main.sub.func(20) is None
 | 
						|
            s = pak.main.func(pak.main.SomeTestClass, 10)
 | 
						|
            assert isinstance(s, pak.main.SomeTestClass)
 | 
						|
 | 
						|
            # some nice things to confuse the tracer/storage
 | 
						|
            source = py.code.Source('''\
 | 
						|
                pak.main.sub.func(10)
 | 
						|
            ''')
 | 
						|
            c = compile(str(source), '<test>', 'exec')
 | 
						|
            exec c in globals()
 | 
						|
 | 
						|
            assert pak.somenamespace._hidden() == 'quux'
 | 
						|
 | 
						|
            # this just to see a multi-level stack in the docs
 | 
						|
            def foo():
 | 
						|
                return pak.main.sub.func(10)
 | 
						|
            assert foo() is None
 | 
						|
    """))
 | 
						|
    return temp, 'pak'
 | 
						|
 | 
						|
def test_get_documentable_items():
 | 
						|
    fs_root, package_name = setup_fs_project('test_get_documentable_items')
 | 
						|
    pkgname, documentable = apigen.get_documentable_items_pkgdir(
 | 
						|
                                               fs_root.join(package_name))
 | 
						|
    assert pkgname == 'pak'
 | 
						|
    assert sorted(documentable.keys()) ==  [
 | 
						|
        'main.SomeTestClass', 'main.SomeTestSubClass', 'main.func',
 | 
						|
        'main.sub.func', 'somenamespace.baz', 'somenamespace.foo']
 | 
						|
 | 
						|
def test_apigen_functional():
 | 
						|
    #if py.std.sys.platform == "win32":
 | 
						|
    #    py.test.skip("XXX test fails on windows")
 | 
						|
    fs_root, package_name = setup_fs_project('test_apigen_functional')
 | 
						|
    tempdir = py.test.ensuretemp('test_apigen_functional_results')
 | 
						|
    pydir = py.magic.autopath().dirpath().dirpath().dirpath()
 | 
						|
    pakdir = fs_root.join('pak')
 | 
						|
    if py.std.sys.platform == 'win32':
 | 
						|
        cmd = ('set APIGEN_TARGET=%s && set PYTHONPATH=%s && '
 | 
						|
               'python "%s/bin/py.test"') % (tempdir, fs_root, pydir)
 | 
						|
    else:
 | 
						|
        cmd = ('APIGEN_TARGET="%s" PYTHONPATH="%s" '
 | 
						|
               'python "%s/bin/py.test"') % (tempdir, fs_root, pydir)
 | 
						|
    try:
 | 
						|
        output = py.process.cmdexec('%s --apigen="%s/apigen.py" "%s"' % (
 | 
						|
                                        cmd, fs_root, pakdir))
 | 
						|
    except py.error.Error, e:
 | 
						|
        print e.out
 | 
						|
        raise
 | 
						|
    assert output.lower().find('traceback') == -1
 | 
						|
 | 
						|
    # just some quick content checks
 | 
						|
    apidir = tempdir.join('api')
 | 
						|
    assert apidir.check(dir=True)
 | 
						|
    sometestclass_api = apidir.join('main.SomeTestClass.html')
 | 
						|
    assert sometestclass_api.check(file=True)
 | 
						|
    html = sometestclass_api.read()
 | 
						|
    print html
 | 
						|
    assert '<a href="main.SomeTestClass.html">SomeTestClass</a>' in html
 | 
						|
    assert 'someattr: <em>somevalue</em>' in html
 | 
						|
    
 | 
						|
    namespace_api = apidir.join('main.html')
 | 
						|
    assert namespace_api.check(file=True)
 | 
						|
    html = namespace_api.read()
 | 
						|
    assert '<a href="main.SomeTestClass.html">SomeTestClass</a>' in html
 | 
						|
    index = apidir.join('index.html')
 | 
						|
    assert index.check(file=True)
 | 
						|
    html = index.read()
 | 
						|
    assert 'pkg docstring' in html
 | 
						|
 | 
						|
    sourcedir = tempdir.join('source')
 | 
						|
    assert sourcedir.check(dir=True)
 | 
						|
    sometestclass_source = sourcedir.join('sometestclass.py.html')
 | 
						|
    assert sometestclass_source.check(file=True)
 | 
						|
    html = sometestclass_source.read()
 | 
						|
    assert '<div class="project_title">sources for sometestclass.py</div>' in html
 | 
						|
 | 
						|
    index = sourcedir.join('index.html')
 | 
						|
    assert index.check(file=True)
 | 
						|
    html = index.read()
 | 
						|
    print html
 | 
						|
    assert '<a href="test/index.html">test</a>' in html
 | 
						|
    assert 'href="../../py/doc/home.html"'
 | 
						|
 |