[svn r38077] Script to run "py.test --apigen" on the py lib (well, can be used on other
projects too) and rsync the results to some remote host/path (by default codespeak.net, currently to some dir in my home directory, when it's tested better in practice files will go to the website directory). --HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									5c7fb384bc
								
							
						
					
					
						commit
						d11aec0b42
					
				|  | @ -0,0 +1,65 @@ | |||
| #!/usr/bin/env python | ||||
| 
 | ||||
| """ run py.test with the --apigen option and rsync the results to a host | ||||
| 
 | ||||
|     rsyncs the whole package (with all the ReST docs converted to HTML) as well | ||||
|     as the apigen docs to a given remote host and path | ||||
| """ | ||||
| 
 | ||||
| import py | ||||
| import sys | ||||
| 
 | ||||
| def rsync(pkgpath, apidocspath, gateway, remotepath): | ||||
|     """ copy the code and docs to the remote host """ | ||||
|     # copy to a temp dir first, even though both paths (normally) share the | ||||
|     # same parent dir, that may contain other stuff that we don't want to | ||||
|     # copy... | ||||
|     tempdir = py.test.ensuretemp('update_website_rsync_temp') | ||||
|     pkgpath.copy(tempdir.ensure(pkgpath.basename, dir=True)) | ||||
|     apidocspath.copy(tempdir.ensure(apidocspath.basename, dir=True)) | ||||
| 
 | ||||
|     rs = py.execnet.RSync(delete=True) | ||||
|     rs.add_target(gateway, remotepath) | ||||
|     rs.send(tempdir) | ||||
| 
 | ||||
| def run_tests(pkgpath, args=''): | ||||
|     """ run the unit tests and build the docs """ | ||||
|     pypath = py.__package__.getpath() | ||||
|     pytestpath = pypath.join('bin/py.test') | ||||
|     # XXX this would need a Windows specific version if we want to allow | ||||
|     # running this script on that platform, but currently --apigen doesn't | ||||
|     # work there anyway... | ||||
|     apigenpath = pkgpath.join('apigen/apigen.py') # XXX be more general here? | ||||
|     if not apigenpath.check(file=True): | ||||
|         apigenpath = pypath.join('apigen/apigen.py') | ||||
|     cmd = 'PYTHONPATH="%s:%s" "%s" --apigen="%s" "%s" %s' % (pypath.dirpath(), | ||||
|                                                              pkgpath.dirpath(), | ||||
|                                                              pytestpath, | ||||
|                                                              apigenpath, | ||||
|                                                              pkgpath, | ||||
|                                                              args) | ||||
|     status = py.std.os.system(cmd) | ||||
|     return status | ||||
| 
 | ||||
| def main(pkgpath, apidocspath, rhost, rpath, args=''): | ||||
|     print 'running tests' | ||||
|     errors = run_tests(pkgpath, args) | ||||
|     if errors: | ||||
|         print >>sys.stderr, \ | ||||
|               'Errors while running the unit tests: %s' % (errors,) | ||||
|         sys.exit(1) | ||||
|      | ||||
|     print 'rsyncing' | ||||
|     gateway = py.execnet.SshGateway(rhost) | ||||
|     errors = rsync(pkgpath, apidocspath, gateway, rpath) | ||||
|     if errors: | ||||
|         print >>sys.stderr, 'Errors while rsyncing: %s' | ||||
|         sys.exit(1) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     args = ' '.join(sys.argv[1:]) | ||||
|     pkgpath = py.__package__.getpath() | ||||
|     apidocspath = pkgpath.dirpath().join('apigen') | ||||
|     main(pkgpath, apidocspath, 'codespeak.net', | ||||
|          '/home/guido/rsynctests', args) | ||||
| 
 | ||||
|  | @ -0,0 +1,59 @@ | |||
| import py | ||||
| 
 | ||||
| here = py.magic.autopath().dirpath() | ||||
| update_website = here.join('../../bin/_update_website.py').pyimport() | ||||
| 
 | ||||
| def test_rsync(): | ||||
|     temp = py.test.ensuretemp('update_website_rsync') | ||||
|     pkgpath = temp.join('pkg') | ||||
|     apipath = temp.join('apigen') | ||||
|     pkgpath.ensure('foo/bar.txt', file=True).write('baz') | ||||
|     pkgpath.ensure('spam/eggs.txt', file=True).write('spam') | ||||
|     apipath.ensure('api/foo.html', file=True).write('<html />') | ||||
|     apipath.ensure('source/spam.html', file=True).write('<html />') | ||||
| 
 | ||||
|     rsyncpath = temp.join('rsync') | ||||
|     assert not rsyncpath.check() | ||||
|     gateway = py.execnet.PopenGateway() | ||||
|     update_website.rsync(pkgpath, apipath, gateway, rsyncpath.strpath) | ||||
|     assert rsyncpath.check(dir=True) | ||||
|     assert rsyncpath.join('pkg').check(dir=True) | ||||
|     assert rsyncpath.join('pkg/spam/eggs.txt').read() == 'spam' | ||||
|     assert rsyncpath.join('apigen').check(dir=True) | ||||
|     assert rsyncpath.join('apigen/api/foo.html').read() == '<html />' | ||||
| 
 | ||||
| def setup_pkg(testname): | ||||
|     temp = py.test.ensuretemp(testname) | ||||
|     pkgpath = temp.ensure('pkg', dir=True) | ||||
|     pyfile = pkgpath.ensure('mod.py').write(py.code.Source(""" | ||||
|         def foo(x): | ||||
|             return x + 1 | ||||
|     """)) | ||||
|     testfile = pkgpath.ensure('test/test_mod.py').write(py.code.Source(""" | ||||
|         from pkg.sub import foo | ||||
|         def test_foo(): | ||||
|             assert foo(1) == 2 | ||||
|     """)) | ||||
|     initfile = pkgpath.ensure('__init__.py').write(py.code.Source("""\ | ||||
|         import py | ||||
|         from py.__.initpkg import initpkg | ||||
|         initpkg(__name__, exportdefs={ | ||||
|             'sub.foo': ('./mod.py', 'foo'), | ||||
|         }) | ||||
|     """)) | ||||
|     return pkgpath | ||||
| 
 | ||||
| def test_run_tests(): | ||||
|     pkgpath = setup_pkg('update_website_run_tests') | ||||
|     errors = update_website.run_tests(pkgpath) | ||||
|     assert not errors | ||||
|     assert pkgpath.join('../apigen').check(dir=True) | ||||
|     assert pkgpath.join('../apigen/api/sub.foo.html').check(file=True) | ||||
| 
 | ||||
| def test_run_tests_failure(): | ||||
|     pkgpath = setup_pkg('update_website_run_tests_failure') | ||||
|     assert not pkgpath.join('../apigen').check(dir=True) | ||||
|     pkgpath.ensure('../apigen', file=True) | ||||
|     errors = update_website.run_tests(pkgpath) | ||||
|     assert errors # some error message | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue