diff --git a/py/apigen/htmlgen.py b/py/apigen/htmlgen.py index 31133d7b7..2e74f84c2 100644 --- a/py/apigen/htmlgen.py +++ b/py/apigen/htmlgen.py @@ -1,4 +1,5 @@ import py +import os import inspect from py.__.apigen.layout import LayoutPage from py.__.apigen.source import browser as source_browser @@ -167,11 +168,11 @@ class SourcePageBuilder(AbstractPageBuilder): def build_navigation(self, fspath): nav = H.Navigation() relpath = fspath.relto(self.projroot) - path = relpath.split('/') + path = relpath.split(os.path.sep) indent = 0 # build links to parents for i in xrange(len(path)): - dirpath = '/'.join(path[:i]) + dirpath = os.path.sep.join(path[:i]) abspath = self.projroot.join(dirpath).strpath if i == 0: text = 'root' @@ -244,15 +245,17 @@ class SourcePageBuilder(AbstractPageBuilder): if fspath.ext in ['.pyc', '.pyo']: continue relfspath = fspath.relto(base) - if relfspath.find('/.') > -1: + if relfspath.find('%s.' % (os.path.sep,)) > -1: # skip hidden dirs and files continue elif fspath.check(dir=True): if relfspath != '': - relfspath += '/' - reloutputpath = 'source/%sindex.html' % (relfspath,) + relfspath += os.path.sep + reloutputpath = 'source%s%sindex.html' % (os.path.sep, + relfspath) else: - reloutputpath = "source/%s.html" % (relfspath,) + reloutputpath = "source%s%s.html" % (os.path.sep, relfspath) + reloutputpath = reloutputpath.replace(os.path.sep, '/') outputpath = self.base.join(reloutputpath) self.linker.set_link(str(fspath), reloutputpath) passed.append((fspath, outputpath)) @@ -279,7 +282,7 @@ class SourcePageBuilder(AbstractPageBuilder): else: tag, nav = self.build_nonpython_page(fspath) title = 'sources for %s' % (fspath.basename,) - reltargetpath = outputpath.relto(self.base) + reltargetpath = outputpath.relto(self.base).replace(os.path.sep, '/') self.write_page(title, reltargetpath, project, tag, nav) class ApiPageBuilder(AbstractPageBuilder): diff --git a/py/apigen/linker.py b/py/apigen/linker.py index d94c35100..2d215ede3 100644 --- a/py/apigen/linker.py +++ b/py/apigen/linker.py @@ -1,4 +1,5 @@ import py +import os html = py.xml.html def getrelfspath(dotted_name): @@ -41,7 +42,27 @@ class Linker(object): finally: del self.fromlocation -def relpath(p1, p2, sep='/', back='..'): +def relpath(p1, p2, sep='/', back='..', normalize=True): + """ create a relative path from p1 to p2 + + sep is the seperator used, set to '\\' on windows (but only + when not using 'normalize'! see below) + + back is the string used to indicate the parent directory + + when 'normalize' is True, any backslashes (\) in the path + will be replaced with forward slashes, resulting in a consistent + output on Windows and the rest of the world (this happens before + the 'sep' argument is used, and therefore renders that useless!) + + paths to directories must end on a / (URL style) + """ + if normalize: + sep = '/' + p1 = p1.replace(os.path.sep, '/') + p2 = p2.replace(os.path.sep, '/') + # XXX would be cool to be able to do long filename expansion and drive + # letter fixes here, and such... iow: windows sucks :( if (p1.startswith(sep) ^ p2.startswith(sep)): raise ValueError("mixed absolute relative path: %r -> %r" %(p1, p2)) fromlist = p1.split(sep) diff --git a/py/apigen/testing/test_apigen_functional.py b/py/apigen/testing/test_apigen_functional.py index b242d27a7..7e2311da5 100644 --- a/py/apigen/testing/test_apigen_functional.py +++ b/py/apigen/testing/test_apigen_functional.py @@ -75,10 +75,14 @@ def test_apigen_functional(): tempdir = py.test.ensuretemp('test_apigen_functional_results') pydir = py.magic.autopath().dirpath().dirpath().dirpath() pkgdir = fs_root.join('pkg') + if py.std.sys.platform == 'win32': + cmd = 'set APIGEN_TARGET=%s && python "%s/bin/py.test"' % (tempdir, + pydir) + else: + cmd = 'APIGEN_TARGET="%s" "%s/bin/py.test"' % (tempdir, pydir) try: - output = py.process.cmdexec('APIGEN_TARGET="%s" %s/bin/py.test ' - '--apigen="%s/apigen.py" "%s"' % ( - tempdir, pydir, pydir.join('apigen'), + output = py.process.cmdexec('%s --apigen="%s/apigen.py" "%s"' % ( + cmd, pydir.join('apigen'), pkgdir)) except py.error.Error, e: print e.out diff --git a/py/apigen/testing/test_linker.py b/py/apigen/testing/test_linker.py index d91ab95ae..2b3997695 100644 --- a/py/apigen/testing/test_linker.py +++ b/py/apigen/testing/test_linker.py @@ -17,8 +17,6 @@ class TestLinker(object): linker.get_target, 'py.path.local') assert relpath == 'path/local.html' - - testspec = [ 'a a/b a/b', '/a /a/b a/b', @@ -28,17 +26,17 @@ testspec = [ '/a/b /c/d ../c/d', 'a/b a ../a', '/a/b /a ../a', -] + 'c:\\foo\\bar c:\\foo ../foo', +] def gen_check(frompath, topath, expected): result = relpath(frompath, topath) - print "linking", frompath, "to", topath assert result == expected def test_gen_check(): for line in testspec: frompath, topath, expected = line.split() - yield gen_check, frompath, topath, expected + yield gen_check, frompath, topath, expected, def test_check_incompatible(): py.test.raises(ValueError, "relpath('/a', 'b')")