Commit 1c7a928c by willmcgugan

Small optimization

parent 5489ce99
...@@ -78,18 +78,22 @@ def recursepath(path, reverse=False): ...@@ -78,18 +78,22 @@ def recursepath(path, reverse=False):
['/', u'/a', u'/a/b', u'/a/b/c'] ['/', u'/a', u'/a/b', u'/a/b/c']
""" """
if reverse: paths = [u'/']
paths = []
append = paths.append append = paths.append
path = abspath(normpath(path)).rstrip("/") path = u'/' + normpath(path.lstrip('/'))
while path: find = path.find
pos = 1
if len(path) > 1:
while 1:
pos = find('/', pos + 1)
if pos == -1:
append(path) append(path)
path = dirname(path).rstrip("/") break
paths.append(u"/") append(path[:pos])
if reverse:
return paths[::-1]
return paths return paths
else:
paths = [u""] + list(iteratepath(path))
return [u"/"] + [u'/'.join(paths[:i+1]) for i in xrange(1,len(paths))]
def abspath(path): def abspath(path):
"""Convert the given path to an absolute path. """Convert the given path to an absolute path.
......
...@@ -7,6 +7,7 @@ Make a temporary file system that exists in a folder provided by the OS. All fil ...@@ -7,6 +7,7 @@ Make a temporary file system that exists in a folder provided by the OS. All fil
""" """
import os import os
import os.path
import time import time
import tempfile import tempfile
...@@ -24,6 +25,7 @@ class TempFS(OSFS): ...@@ -24,6 +25,7 @@ class TempFS(OSFS):
'read_only' : False, 'read_only' : False,
'unicode_paths' : os.path.supports_unicode_filenames, 'unicode_paths' : os.path.supports_unicode_filenames,
'case_insensitive_paths' : os.path.normcase('Aa') == 'aa', 'case_insensitive_paths' : os.path.normcase('Aa') == 'aa',
'pickle_contents': False,
'network' : False, 'network' : False,
'atomic.move' : True, 'atomic.move' : True,
'atomic.copy' : True, 'atomic.copy' : True,
...@@ -55,6 +57,8 @@ class TempFS(OSFS): ...@@ -55,6 +57,8 @@ class TempFS(OSFS):
return u'<TempFS: %s>' % self._temp_dir return u'<TempFS: %s>' % self._temp_dir
def __setstate__(self, state): def __setstate__(self, state):
"""Pickle the TempFS. TempFS delted their contents when closed, so pickling
is not garanteed to preserve the directory contents"""
state = super(TempFS, self).__setstate__(state) state = super(TempFS, self).__setstate__(state)
self._temp_dir = tempfile.mkdtemp(self.identifier or "TempFS", dir=self.temp_dir) self._temp_dir = tempfile.mkdtemp(self.identifier or "TempFS", dir=self.temp_dir)
super(TempFS, self).__init__(self._temp_dir, super(TempFS, self).__init__(self._temp_dir,
......
...@@ -685,11 +685,16 @@ class FSTestCases(object): ...@@ -685,11 +685,16 @@ class FSTestCases(object):
self.assertEquals(self.fs.getcontents('f.txt'),contents) self.assertEquals(self.fs.getcontents('f.txt'),contents)
def test_pickling(self): def test_pickling(self):
if self.fs.getmeta('pickle_contents', True):
self.fs.setcontents("test1","hello world") self.fs.setcontents("test1","hello world")
fs2 = pickle.loads(pickle.dumps(self.fs)) fs2 = pickle.loads(pickle.dumps(self.fs))
self.assert_(fs2.isfile("test1")) self.assert_(fs2.isfile("test1"))
fs3 = pickle.loads(pickle.dumps(self.fs,-1)) fs3 = pickle.loads(pickle.dumps(self.fs,-1))
self.assert_(fs3.isfile("test1")) self.assert_(fs3.isfile("test1"))
else:
# Just make sure it doesn't throw an exception
fs2 = pickle.loads(pickle.dumps(self.fs))
def test_big_file(self): def test_big_file(self):
chunk_size = 1024 * 256 chunk_size = 1024 * 256
......
...@@ -103,6 +103,7 @@ class TestPathFunctions(unittest.TestCase): ...@@ -103,6 +103,7 @@ class TestPathFunctions(unittest.TestCase):
self.assertEquals(recursepath("hello",reverse=True),["/hello","/"]) self.assertEquals(recursepath("hello",reverse=True),["/hello","/"])
self.assertEquals(recursepath("",reverse=True),["/"]) self.assertEquals(recursepath("",reverse=True),["/"])
def test_isdotfile(self): def test_isdotfile(self):
for path in ['.foo', for path in ['.foo',
'.svn', '.svn',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment