From f3fcb5e6d3c8ed4557e44a30a758c7c5df7461ad Mon Sep 17 00:00:00 2001 From: holger krekel <holger@merlinux.eu> Date: Thu, 20 Aug 2009 19:43:13 +0200 Subject: [PATCH] - strike lots of basically unused code around local path implementation. and tweak things a bit to make py.path.local at least importable on 3k - also strike unused somewhat related code in initpkg.py --HG-- branch : trunk --- py/__init__.py | 2 +- py/initpkg.py | 48 ---- py/magic/autopath.py | 15 +- py/misc/testing/test_initpkg.py | 34 --- py/path/common.py | 351 +++++++++--------------------- py/path/gateway/remotepath.py | 2 +- py/path/local.py | 88 ++------ py/path/svn/svncommon.py | 6 +- py/path/svn/wccommand.py | 4 +- py/path/testing/common.py | 27 +-- py/path/testing/fscommon.py | 37 +--- py/path/testing/test_api.py | 54 ----- py/path/testing/test_local.py | 4 +- py/test/plugin/pytest_terminal.py | 4 +- setup.py | 3 +- 15 files changed, 144 insertions(+), 535 deletions(-) delete mode 100644 py/path/testing/test_api.py diff --git a/py/__init__.py b/py/__init__.py index e09aeb696..9276c296a 100644 --- a/py/__init__.py +++ b/py/__init__.py @@ -17,7 +17,7 @@ For questions please check out http://pylib.org/contact.html .. _`py.code`: http://pylib.org/code.html """ -from initpkg import initpkg +from py.initpkg import initpkg trunk = "trunk" version = trunk or "1.0.1" diff --git a/py/initpkg.py b/py/initpkg.py index fe5c73933..7f5d37747 100644 --- a/py/initpkg.py +++ b/py/initpkg.py @@ -107,54 +107,6 @@ class Package(object): assert base.check() return base - def _iterfiles(self): - from py.__.path.common import checker - base = self.getpath() - for x in base.visit(checker(file=1, notext='.pyc'), - rec=checker(dotfile=0)): - yield x - - def shahexdigest(self, cache=[]): - """ return sha hexdigest for files contained in package. """ - if cache: - return cache[0] - from sha import sha - sum = sha() - # XXX the checksum depends on the order in which visit() enumerates - # the files, and it doesn't depend on the file names and paths - for x in self._iterfiles(): - sum.update(x.read()) - cache.append(sum.hexdigest()) - return cache[0] - - def getzipdata(self): - """ return string representing a zipfile containing the package. """ - import zipfile - import py - try: - from cStringIO import StringIO - except ImportError: - from StringIO import StringIO - base = py.__pkg__.getpath().dirpath() - outf = StringIO() - f = zipfile.ZipFile(outf, 'w', compression=zipfile.ZIP_DEFLATED) - try: - for x in self._iterfiles(): - f.write(str(x), x.relto(base)) - finally: - f.close() - return outf.getvalue() - - def getrev(self): - import py - p = py.path.svnwc(self.module.__file__).dirpath() - try: - return p.info().rev - except (KeyboardInterrupt, MemoryError, SystemExit): - raise - except: - return 'unknown' - def setmodule(modpath, module): #print "sys.modules[%r] = %r" % (modpath, module) sys.modules[modpath] = module diff --git a/py/magic/autopath.py b/py/magic/autopath.py index 4fed7850d..f26521651 100644 --- a/py/magic/autopath.py +++ b/py/magic/autopath.py @@ -1,6 +1,5 @@ import os, sys from py.path import local -from py.__.path.common import PathStr def autopath(globs=None, basefile='__init__.py'): """ return the (local) path of the "current" file pointed to by globals @@ -20,21 +19,17 @@ def autopath(globs=None, basefile='__init__.py'): raise ValueError, "cannot compute autopath in interactive mode" __file__ = os.path.abspath(sys.argv[0]) - custom__file__ = isinstance(__file__, PathStr) - if custom__file__: - ret = __file__.__path__ - else: - ret = local(__file__) - if ret.ext in ('.pyc', '.pyo'): - ret = ret.new(ext='.py') + ret = local(__file__) + if ret.ext in ('.pyc', '.pyo'): + ret = ret.new(ext='.py') current = pkgdir = ret.dirpath() while 1: - if basefile in current: + if basefile in current.listdir(): pkgdir = current current = current.dirpath() if pkgdir != current: continue - elif not custom__file__ and str(current) not in sys.path: + elif str(current) not in sys.path: sys.path.insert(0, str(current)) break ret.pkgdir = pkgdir diff --git a/py/misc/testing/test_initpkg.py b/py/misc/testing/test_initpkg.py index 29cdfe699..6f9d647c3 100644 --- a/py/misc/testing/test_initpkg.py +++ b/py/misc/testing/test_initpkg.py @@ -88,40 +88,6 @@ def check_import(modpath): print "checking import", modpath assert __import__(modpath) -def test_shahexdigest(): - hex = py.__pkg__.shahexdigest() - assert len(hex) == 40 - -def test_getzipdata(): - s = py.__pkg__.getzipdata() - -def test_getrev(): - if not py.path.local(py.__file__).dirpath('.svn').check(): - py.test.skip("py package is not a svn checkout") - d = py.__pkg__.getrev() - svnversion = py.path.local.sysfind('svnversion') - if svnversion is None: - py.test.skip("cannot test svnversion, 'svnversion' binary not found") - v = svnversion.sysexec(py.path.local(py.__file__).dirpath()) - assert v.startswith(str(d)) - -# the following test should abasically work in the future -def XXXtest_virtual_on_the_fly(): - py.initpkg('my', { - 'x.abspath' : 'os.path.abspath', - 'x.local' : 'py.path.local', - 'y' : 'smtplib', - 'z.cmdexec' : 'py.process.cmdexec', - }) - from my.x import abspath - from my.x import local - import smtplib - from my import y - assert y is smtplib - from my.z import cmdexec - from py.process import cmdexec as cmdexec2 - assert cmdexec is cmdexec2 - # # test support for importing modules # diff --git a/py/path/common.py b/py/path/common.py index 3a46ce8d9..6cb4b3909 100644 --- a/py/path/common.py +++ b/py/path/common.py @@ -1,40 +1,28 @@ """ -module with base functionality for std.path package - """ -from __future__ import generators import os, sys import py -def checktype(pathinstance, kw): - names = ('local', 'svnwc', 'svnurl', 'py', ) - for name,value in kw.items(): - if name in names: - cls = getattr(py.path, name) - if bool(isinstance(pathinstance, cls)) ^ bool(value): - return False - del kw[name] - return True - -class checker: - """ deprecated: return checker callable checking for the given - kwargs-specified specification. - """ - def __init__(self, **kwargs): - py.log._apiwarn("0.9.0", - "py.path.checker is deprecated, construct " - "calls to pathobj.check() instead", - ) - self.kwargs = kwargs - def __call__(self, p): - return p.check(**self.kwargs) - class Checkers: - _depend_on_existence = 'exists', 'link' + _depend_on_existence = 'exists', 'link', 'dir', 'file' def __init__(self, path): self.path = path + def dir(self): + raise NotImplementedError + + def file(self): + raise NotImplementedError + + def dotfile(self): + return self.path.basename.startswith('.') + + def ext(self, arg): + if not arg.startswith('.'): + arg = '.' + arg + return self.path.ext == arg + def exists(self): raise NotImplementedError @@ -48,7 +36,7 @@ class Checkers: return self.path.relto(arg) def fnmatch(self, arg): - return fnmatch(arg)(self.path) + return FNMatcher(arg)(self.path) def endswith(self, arg): return str(self.path).endswith(arg) @@ -67,7 +55,8 @@ class Checkers: except AttributeError: pass if meth is None: - raise TypeError, "no %r checker available for %r" % (name, self.path) + raise TypeError( + "no %r checker available for %r" % (name, self.path)) try: if meth.im_func.func_code.co_argcount > 1: if (not meth(value)) ^ invert: @@ -93,6 +82,78 @@ class PathBase(object): """ shared implementation for filesystem path objects.""" Checkers = Checkers + def __div__(self, other): + return self.join(str(other)) + + def basename(self): + """ basename part of path. """ + return self._getbyspec('basename')[0] + basename = property(basename, None, None, basename.__doc__) + + def purebasename(self): + """ pure base name of the path.""" + return self._getbyspec('purebasename')[0] + purebasename = property(purebasename, None, None, purebasename.__doc__) + + def ext(self): + """ extension of the path (including the '.').""" + return self._getbyspec('ext')[0] + ext = property(ext, None, None, ext.__doc__) + + def dirpath(self, *args, **kwargs): + """ return the directory Path of the current Path joined + with any given path arguments. + """ + return self.new(basename='').join(*args, **kwargs) + + def read(self, mode='rb'): + """ read and return a bytestring from reading the path. """ + if sys.version_info < (2,3): + for x in 'u', 'U': + if x in mode: + mode = mode.replace(x, '') + f = self.open(mode) + try: + return f.read() + finally: + f.close() + + def readlines(self, cr=1): + """ read and return a list of lines from the path. if cr is False, the +newline will be removed from the end of each line. """ + if not cr: + content = self.read('rU') + return content.split('\n') + else: + f = self.open('rU') + try: + return f.readlines() + finally: + f.close() + + def load(self): + """ return object unpickled from self.read() """ + f = self.open('rb') + try: + from cPickle import load + return self._callex(load, f) + finally: + f.close() + + def move(self, target): + """ move this path to target. """ + if target.relto(self): + raise py.error.EINVAL(target, "cannot move path into a subdirectory of itself") + try: + self.rename(target) + except py.error.EXDEV: # invalid cross-device link + self.copy(target) + self.remove() + + def __repr__(self): + """ return a string representation of this path. """ + return repr(str(self)) + def check(self, **kw): """ check a path for existence, or query its properties @@ -106,31 +167,10 @@ class PathBase(object): when for example the keyword argument 'ext' is '.py', this will return True if self.ext == '.py', False otherwise """ - if kw: - kw = kw.copy() - if not checktype(self, kw): - return False - else: + if not kw: kw = {'exists' : 1} return self.Checkers(self)._evaluate(kw) - def __iter__(self): - for i in self.listdir(): - yield i - - def __contains__(self, other): - if isinstance(other, str): - return self.join(other).check() - else: - if other.dirpath() != self: - return False - p = self.join(other.basename) - return p.check() - - def basename(self): - return self._getbyspec('basename')[0] - basename = property(basename, None, None, 'basename part of path') - def relto(self, relpath): """ return a string which is the relative part of the path to the given 'relpath'. @@ -213,10 +253,6 @@ class PathBase(object): except AttributeError: return cmp(str(self), str(other)) # self.path, other.path) - def __repr__(self): - """ return a string representation of this path. """ - return repr(str(self)) - def visit(self, fil=None, rec=None, ignore=_dummyclass): """ yields all paths below the current one @@ -231,7 +267,7 @@ class PathBase(object): on any of the paths (by default, all exceptions are reported) """ if isinstance(fil, str): - fil = fnmatch(fil) + fil = FNMatcher(fil) if rec: if isinstance(rec, str): rec = fnmatch(fil) @@ -257,14 +293,14 @@ class PathBase(object): return func(*args) except py.error.Error: raise - except EnvironmentError, e: - if not hasattr(e, 'errno'): + except EnvironmentError: + cls, value, tb = sys.exc_info() + if not hasattr(value, 'errno'): raise __tracebackhide__ = False - cls, value, tb = sys.exc_info() - errno = e.errno + errno = value.errno try: - if not isinstance(e, WindowsError): + if not isinstance(value, WindowsError): raise NameError except NameError: # we are not on Windows, or we got a proper OSError @@ -273,21 +309,12 @@ class PathBase(object): try: cls = py.error._getwinerrnoclass(errno) except KeyError: - raise cls, value, tb + raise cls(value) # tb? value = cls("%s%r" % (func.__name__, args)) __tracebackhide__ = True - raise cls, value + raise cls(value) - def _gethashinstance(self, hashtype): - if hashtype == "md5": - return py.std.md5.md5() - elif hashtype == "sha": - return py.std.sha.sha() - else: - raise ValueError("unknown hash type: %r" %(hashtype,)) - - -class fnmatch: +class FNMatcher: def __init__(self, pattern): self.pattern = pattern def __call__(self, path): @@ -314,181 +341,3 @@ class fnmatch: from fnmatch import fnmatch return fnmatch(name, pattern) - -class FSCheckers(Checkers): - _depend_on_existence = Checkers._depend_on_existence+('dir', 'file') - - def dir(self): - raise NotImplementedError - - def file(self): - raise NotImplementedError - - def dotfile(self): - return self.path.basename.startswith('.') - - def ext(self, arg): - if not arg.startswith('.'): - arg = '.' + arg - return self.path.ext == arg - -class FSPathBase(PathBase): - """ shared implementation for filesystem path objects.""" - Checkers = FSCheckers - - def __div__(self, other): - return self.join(str(other)) - - def dirpath(self, *args, **kwargs): - """ return the directory Path of the current Path joined - with any given path arguments. - """ - return self.new(basename='').join(*args, **kwargs) - - def ext(self): - """ extension of the path (including the '.').""" - return self._getbyspec('ext')[0] - ext = property(ext, None, None, 'extension part of path') - - def purebasename(self): - """ pure base name of the path.""" - return self._getbyspec('purebasename')[0] - purebasename = property(purebasename, None, None, 'basename without extension') - - def read(self, mode='rb'): - """ read and return a bytestring from reading the path. """ - if py.std.sys.version_info < (2,3): - for x in 'u', 'U': - if x in mode: - mode = mode.replace(x, '') - f = self.open(mode) - try: - return f.read() - finally: - f.close() - - def readlines(self, cr=1): - """ read and return a list of lines from the path. if cr is False, the -newline will be removed from the end of each line. """ - if not cr: - content = self.read('rU') - return content.split('\n') - else: - f = self.open('rU') - try: - return f.readlines() - finally: - f.close() - - def load(self): - """ return object unpickled from self.read() """ - f = self.open('rb') - try: - from cPickle import load - return self._callex(load, f) - finally: - f.close() - - def move(self, target): - """ move this path to target. """ - if target.relto(self): - raise py.error.EINVAL(target, "cannot move path into a subdirectory of itself") - try: - self.rename(target) - except py.error.EXDEV: # invalid cross-device link - self.copy(target) - self.remove() - - def _getpymodule(self): - """resolve this path to a module python object. """ - modname = str(self) - modname = modname.replace('.', self.sep) - try: - return sys.modules[modname] - except KeyError: - co = self._getpycodeobj() - mod = py.std.new.module(modname) - mod.__file__ = PathStr(self) - if self.basename == '__init__.py': - mod.__path__ = [str(self.dirpath())] - sys.modules[modname] = mod - try: - exec co in mod.__dict__ - except: - del sys.modules[modname] - raise - return mod - - def _getpycodeobj(self): - """ read the path and compile it to a py.code.Code object. """ - s = self.read('rU') - # XXX str(self) should show up somewhere in the code's filename - return py.code.compile(s) - -class PathStr(str): - def __init__(self, path): - global old_import_hook - self.__path__ = path - if old_import_hook is None: - import __builtin__ - old_import_hook = __builtin__.__import__ - __builtin__.__import__ = custom_import_hook - -def relativeimport(p, name, parent=None): - names = name.split('.') - last_list = [False] * (len(names)-1) + [True] - modules = [] - for name, is_last in zip(names, last_list): - if hasattr(parent, name): - # shortcut if there is already the correct name - # in the parent package - submodule = getattr(parent, name) - else: - if is_last and p.new(basename=name+'.py').check(): - p = p.new(basename=name+'.py') - else: - p = p.new(basename=name).join('__init__.py') - if not p.check(): - return None # not found - submodule = p._getpymodule() - if parent is not None: - setattr(parent, name, submodule) - modules.append(submodule) - parent = submodule - return modules # success - - -old_import_hook = None - -def custom_import_hook(name, glob=None, loc=None, fromlist=None, extra=None, level=None): - __tracebackhide__ = False - __file__ = glob and glob.get('__file__') - if isinstance(__file__, PathStr): - # try to perform a relative import - # for cooperation with py.magic.autopath, first look in the pkgdir - modules = None - if hasattr(__file__.__path__, 'pkgdir'): - modules = relativeimport(__file__.__path__.pkgdir, name) - if not modules: - modules = relativeimport(__file__.__path__, name) - if modules: - if fromlist: - submodule = modules[-1] # innermost submodule - # try to import submodules named in the 'fromlist' if the - # 'submodule' is a package - p = submodule.__file__.__path__ - if p.check(basename='__init__.py'): - for name in fromlist: - relativeimport(p, name, parent=submodule) - # failures are fine - return submodule - else: - return modules[0] # outermost package - # fall-back - __tracebackhide__ = True - try: - return old_import_hook(name, glob, loc, fromlist, level) - except TypeError: - return old_import_hook(name, glob, loc, fromlist) - - diff --git a/py/path/gateway/remotepath.py b/py/path/gateway/remotepath.py index a8d8d8529..e032a766f 100644 --- a/py/path/gateway/remotepath.py +++ b/py/path/gateway/remotepath.py @@ -3,7 +3,7 @@ from py.__.path import common COUNTER = itertools.count() -class RemotePath(common.FSPathBase): +class RemotePath(common.PathBase): sep = '/' def __init__(self, channel, id, basename=None): diff --git a/py/path/local.py b/py/path/local.py index 92bfdd957..daa5c542f 100644 --- a/py/path/local.py +++ b/py/path/local.py @@ -9,12 +9,8 @@ from py.__.path import common iswin32 = sys.platform == "win32" class Stat(object): - pformat = "%s = property(lambda x: getattr(x._osstatresult, 'st_%s'))" - - for name in ('atime blksize blocks ctime dev gid ' - 'ino mode mtime nlink rdev size uid'.split()): - code = pformat.replace("%s", name) - exec code + def __getattr__(self, name): + return getattr(self._osstatresult, "st_" + name) def __init__(self, path, osstatresult): self.path = path @@ -37,7 +33,7 @@ class Stat(object): return entry[0] group = property(group) -class PosixPath(common.FSPathBase): +class PosixPath(common.PathBase): def chown(self, user, group, rec=0): """ change ownership to the given user and group. user and group may be specified by a number or @@ -89,14 +85,14 @@ def getgroupid(group): group = grp.getgrnam(group)[2] return group -FSBase = not iswin32 and PosixPath or common.FSPathBase +FSBase = not iswin32 and PosixPath or common.PathBase class LocalPath(FSBase): """ object oriented interface to os.path and other local filesystem related information. """ sep = os.sep - class Checkers(common.FSCheckers): + class Checkers(common.Checkers): def _stat(self): try: return self._statcache @@ -129,7 +125,7 @@ class LocalPath(FSBase): Note also that passing in a local path object will simply return the exact same path object. Use new() to get a new copy. """ - if isinstance(path, common.FSPathBase): + if isinstance(path, common.PathBase): if path.__class__ == cls: return path path = path.strpath @@ -154,18 +150,25 @@ class LocalPath(FSBase): if rec: # force remove of readonly files on windows if iswin32: - self.chmod(0700, rec=1) + self.chmod(448, rec=1) # octcal 0700 self._callex(py.std.shutil.rmtree, self.strpath) else: self._callex(os.rmdir, self.strpath) else: if iswin32: - self.chmod(0700) + self.chmod(448) # octcal 0700 self._callex(os.remove, self.strpath) def computehash(self, hashtype="md5", chunksize=524288): """ return hexdigest of hashvalue for this file. """ - hash = self._gethashinstance(hashtype) + try: + try: + import hashlib as mod + except ImportError: + mod = __import__(hashtype) + hash = getattr(mod, hashtype)() + except (AttributeError, ImportError): + raise ValueError("Don't know how to compute %r hash" %(hashtype,)) f = self.open('rb') try: while 1: @@ -247,7 +250,7 @@ class LocalPath(FSBase): elif name == 'ext': append(ext) else: - raise ValueError, "invalid part specification %r" % name + raise ValueError("invalid part specification %r" % name) return res def join(self, *args, **kwargs): @@ -297,7 +300,7 @@ class LocalPath(FSBase): and possibly sorted. """ if isinstance(fil, str): - fil = common.fnmatch(fil) + fil = common.FNMatcher(fil) res = [] for name in self._callex(os.listdir, self.strpath): childurl = self.join(name) @@ -525,61 +528,6 @@ class LocalPath(FSBase): raise return mod - def _getpymodule(self): - """resolve this path to a module python object. """ - if self.ext != '.c': - return super(LocalPath, self)._getpymodule() - from py.__.misc.buildcmodule import make_module_from_c - mod = make_module_from_c(self) - return mod - - def _getpycodeobj(self): - """ read the path and compile it to a code object. """ - dotpy = self.ext == ".py" - if dotpy: - my_magic = py.std.imp.get_magic() - my_timestamp = int(self.mtime()) - if __debug__: - pycfile = self + 'c' - else: - pycfile = self + 'o' - try: - f = pycfile.open('rb') - try: - header = f.read(8) - if len(header) == 8: - magic, timestamp = py.std.struct.unpack('<4si', header) - if magic == my_magic and timestamp == my_timestamp: - co = py.std.marshal.load(f) - path1 = co.co_filename - path2 = str(self) - if path1 == path2: - return co - try: - if os.path.samefile(path1, path2): - return co - except (OSError, # probably path1 not found - AttributeError): # samefile() not available - pass - finally: - f.close() - except py.error.Error: - pass - s = self.read(mode='rU') + '\n' - codeobj = compile(s, str(self), 'exec', generators.compiler_flag) - if dotpy: - try: - f = pycfile.open('wb') - f.write(py.std.struct.pack('<4si', 'TEMP', -1)) # fixed below - py.std.marshal.dump(codeobj, f) - f.flush() - f.seek(0) - f.write(py.std.struct.pack('<4si', my_magic, my_timestamp)) - f.close() - except py.error.Error: - pass - return codeobj - def sysexec(self, *argv): """ return stdout-put from executing a system child process, where the self path points to the binary (XXX or script) diff --git a/py/path/svn/svncommon.py b/py/path/svn/svncommon.py index 92e098ed0..97d3c6740 100644 --- a/py/path/svn/svncommon.py +++ b/py/path/svn/svncommon.py @@ -48,7 +48,7 @@ def checkbadchars(url): #_______________________________________________________________ -class SvnPathBase(common.FSPathBase): +class SvnPathBase(common.PathBase): """ Base implementation for SvnPath implementations. """ sep = '/' @@ -168,7 +168,7 @@ class SvnPathBase(common.FSPathBase): and possibly sorted. """ if isinstance(fil, str): - fil = common.fnmatch(fil) + fil = common.FNMatcher(fil) nameinfo_seq = self._listdir_nameinfo() if len(nameinfo_seq) == 1: name, info = nameinfo_seq[0] @@ -244,7 +244,7 @@ class SvnPathBase(common.FSPathBase): # raise IOError, "could not determine newest repo revision for %s" % self # return rev - class Checkers(common.FSCheckers): + class Checkers(common.Checkers): def dir(self): try: return self.path.info().kind == 'dir' diff --git a/py/path/svn/wccommand.py b/py/path/svn/wccommand.py index 51394b69b..aaf0ec070 100644 --- a/py/path/svn/wccommand.py +++ b/py/path/svn/wccommand.py @@ -18,7 +18,7 @@ DEBUG = 0 rex_blame = re.compile(r'\s*(\d+)\s*(\S+) (.*)') -class SvnWCCommandPath(common.FSPathBase): +class SvnWCCommandPath(common.PathBase): """ path implementation offering access/modification to svn working copies. It has methods similar to the functions in os.path and similar to the commands of the svn client. @@ -416,7 +416,7 @@ recursively. """ depending on implementation choices. """ if isinstance(fil, str): - fil = common.fnmatch(fil) + fil = common.FNMatcher(fil) # XXX unify argument naming with LocalPath.listdir def notsvn(path): return path.basename != '.svn' diff --git a/py/path/testing/common.py b/py/path/testing/common.py index c56fda0b5..cb2f4b785 100644 --- a/py/path/testing/common.py +++ b/py/path/testing/common.py @@ -1,4 +1,3 @@ -from py.__.path.common import checker import py class CommonPathTests(object): @@ -99,9 +98,6 @@ class CommonPathTests(object): assert self.root.join('samplefile').check(notdir=1) assert not self.root.join("samplefile").check(dir=1) - def test_filter_dir(self): - assert checker(dir=1)(self.root.join("sampledir")) - def test_fnmatch_file(self): assert self.root.join("samplefile").check(fnmatch='s*e') assert self.root.join("samplefile").check(notfnmatch='s*x') @@ -151,12 +147,12 @@ class CommonPathTests(object): assert l[0], self.root.join('sampledir') def test_listdir_filter(self): - l = self.root.listdir(checker(dir=1)) + l = self.root.listdir(lambda x: x.check(dir=1)) assert self.root.join('sampledir') in l assert not self.root.join('samplefile') in l def test_listdir_sorted(self): - l = self.root.listdir(checker(basestarts="sample"), sort=True) + l = self.root.listdir(lambda x: x.check(basestarts="sample"), sort=True) assert self.root.join('sampledir') == l[0] assert self.root.join('samplefile') == l[1] assert self.root.join('samplepickle') == l[2] @@ -189,7 +185,7 @@ class CommonPathTests(object): def test_visit_endswith(self): l = [] - for i in self.root.visit(checker(endswith="file")): + for i in self.root.visit(lambda x: x.check(endswith="file")): l.append(i.relto(self.root)) assert self.root.sep.join(["sampledir", "otherfile"]) in l assert "samplefile" in l @@ -205,23 +201,6 @@ class CommonPathTests(object): assert cmp(path1, path2) == cmp('samplefile', 'samplefile2') assert cmp(path1, path1) == 0 - def test_contains_path(self): - path1 = self.root.join('samplefile') - assert path1 in self.root - assert not self.root.join('not existing') in self.root - - def test_contains_path_with_basename(self): - assert 'samplefile' in self.root - assert 'not_existing' not in self.root - - def featuretest_check_docstring(self): - here = self.root.__class__ - assert here.check.__doc__ - doc = here.check.__doc__ - for name in dir(local.Checkers): - if name[0] != '_': - assert name in doc - def test_simple_read(self): x = self.root.join('samplefile').read('ru') assert x == 'samplefile\n' diff --git a/py/path/testing/fscommon.py b/py/path/testing/fscommon.py index 4a6f9ace8..36d0d7909 100644 --- a/py/path/testing/fscommon.py +++ b/py/path/testing/fscommon.py @@ -207,8 +207,12 @@ class CommonFSTests(common.CommonPathTests): assert newp.check(file=1) assert not p.check() finally: - newp.move(p) - assert p.check() + dp = newp.dirpath() + if hasattr(dp, 'revert'): + dp.revert() + else: + newp.move(p) + assert p.check() def test_move_directory(self): source = self.root.join('sampledir') @@ -217,32 +221,3 @@ class CommonFSTests(common.CommonPathTests): assert dest.check(dir=1) assert dest.join('otherfile').check(file=1) assert not source.join('sampledir').check() - - def test__getpymodule(self): - obj = self.root.join('execfile')._getpymodule() - assert obj.x == 42 - - def test_not_has_resolve(self): - # because this would mean confusion with respect to - # py.path.extpy - assert not hasattr(self.root, 'resolve') - - def test__getpymodule_a(self): - otherdir = self.root.join('otherdir') - mod = otherdir.join('a.py')._getpymodule() - assert mod.result == "got it" - - def test__getpymodule_b(self): - otherdir = self.root.join('otherdir') - mod = otherdir.join('b.py')._getpymodule() - assert mod.stuff == "got it" - - def test__getpymodule_c(self): - otherdir = self.root.join('otherdir') - mod = otherdir.join('c.py')._getpymodule() - assert mod.value == "got it" - - def test__getpymodule_d(self): - otherdir = self.root.join('otherdir') - mod = otherdir.join('d.py')._getpymodule() - assert mod.value2 == "got it" diff --git a/py/path/testing/test_api.py b/py/path/testing/test_api.py deleted file mode 100644 index c8647aca4..000000000 --- a/py/path/testing/test_api.py +++ /dev/null @@ -1,54 +0,0 @@ -from py import path, test -import py -from py.__.path.svn.testing.test_wccommand import getrepowc - -class TestAPI: - - def setup_class(cls): - cls.root = py.test.ensuretemp(cls.__name__) - - def repr_eval_test(self, p): - r = repr(p) - from py.path import local,svnurl, svnwc - y = eval(r) - assert y == p - - def test_defaultlocal(self): - p = path.local() - assert hasattr(p, 'atime') - #assert hasattr(p, 'group') # XXX win32? - assert hasattr(p, 'setmtime') - assert p.check() - assert p.check(local=1) - assert p.check(svnwc=0) - assert not p.check(svnwc=1) - self.repr_eval_test(p) - - #assert p.std.path() - - def test_local(self): - p = path.local() - assert hasattr(p, 'atime') - assert hasattr(p, 'setmtime') - assert p.check() - assert p.check(local=1) - self.repr_eval_test(p) - - def test_svnurl(self): - p = path.svnurl('http://codespeak.net/svn/py') - assert p.check(svnurl=1) - self.repr_eval_test(p) - - def test_svnwc(self): - p = path.svnwc(self.root) - assert p.check(svnwc=1) - self.repr_eval_test(p) - - #def test_fspy(self): - # p = path.py('smtplib.SMTP') - # self.repr_eval_test(p) - - -if __name__ == '__main__': - test.main() - diff --git a/py/path/testing/test_local.py b/py/path/testing/test_local.py index 43943dbd1..519f4b070 100644 --- a/py/path/testing/test_local.py +++ b/py/path/testing/test_local.py @@ -29,7 +29,9 @@ class TestLocalPath(LocalSetup, CommonFSTests): fn = self.tmpdir.join("testhashfile") fn.write("hello") assert fn.computehash("md5") == md5.md5("hello").hexdigest() - assert fn.computehash("sha") == sha.sha("hello").hexdigest() + #assert fn.computehash("sha") == sha.sha("hello").hexdigest() + if sys.version_info >= (2,4): + assert fn.computehash("sha1") == sha.sha("hello").hexdigest() py.test.raises(ValueError, fn.computehash, "asdasd") def test_remove_removes_readonly_file(self): diff --git a/py/test/plugin/pytest_terminal.py b/py/test/plugin/pytest_terminal.py index 7eee7ace3..fa6a2ad6d 100644 --- a/py/test/plugin/pytest_terminal.py +++ b/py/test/plugin/pytest_terminal.py @@ -234,9 +234,7 @@ class TerminalReporter: self.write_line(msg) if self.config.option.debug or self.config.option.traceconfig: - rev = py.__pkg__.getrev() - self.write_line("using py lib: %s <rev %s>" % ( - py.path.local(py.__file__).dirpath(), rev)) + self.write_line("using py lib: %s" % (py.path.local(py.__file__).dirpath())) if self.config.option.traceconfig: plugins = [] for plugin in self.config.pluginmanager.comregistry: diff --git a/setup.py b/setup.py index a41946f07..6a6a28146 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ """ py lib / py.test setup.py file, autogenerated by gensetup.py - """ import os, sys @@ -143,4 +142,4 @@ def main(): if __name__ == '__main__': main() - \ No newline at end of file +