Commit 9599a2a7 by rfkelly0

Make failing getinfo() raise ResourceNotFoundError uniformly.

Previously it could raise ResourceInvalidError on some filesystems.
parent 0f63e576
...@@ -13,6 +13,12 @@ except ImportError: ...@@ -13,6 +13,12 @@ except ImportError:
xattr = None xattr = None
@convert_os_errors
def _os_stat(path):
"""Replacement for os.stat that raises FSError subclasses."""
return os.stat(path)
class OSFS(FS): class OSFS(FS):
"""Expose the underlying operating-system filesystem as an FS object. """Expose the underlying operating-system filesystem as an FS object.
...@@ -144,10 +150,17 @@ class OSFS(FS): ...@@ -144,10 +150,17 @@ class OSFS(FS):
path_dst = self.getsyspath(dst) path_dst = self.getsyspath(dst)
os.rename(path_src, path_dst) os.rename(path_src, path_dst)
def _stat(self,path):
"""Stat the given path, normalising error codes."""
sys_path = self.getsyspath(path)
try:
return _os_stat(sys_path)
except ResourceInvalidError:
raise ResourceNotFoundError(path)
@convert_os_errors @convert_os_errors
def getinfo(self, path): def getinfo(self, path):
sys_path = self.getsyspath(path) stats = self._stat(path)
stats = os.stat(sys_path)
info = dict((k, getattr(stats, k)) for k in dir(stats) if not k.startswith('__') ) info = dict((k, getattr(stats, k)) for k in dir(stats) if not k.startswith('__') )
info['size'] = info['st_size'] info['size'] = info['st_size']
# TODO: this doesn't actually mean 'creation time' on unix # TODO: this doesn't actually mean 'creation time' on unix
...@@ -164,9 +177,7 @@ class OSFS(FS): ...@@ -164,9 +177,7 @@ class OSFS(FS):
@convert_os_errors @convert_os_errors
def getsize(self, path): def getsize(self, path):
sys_path = self.getsyspath(path) return self._stat(path).st_size
stats = os.stat(sys_path)
return stats.st_size
# Provide native xattr support if available # Provide native xattr support if available
......
...@@ -90,6 +90,7 @@ class FSTestCases: ...@@ -90,6 +90,7 @@ class FSTestCases:
self.assertFalse(self.fs.isdir("dir1")) self.assertFalse(self.fs.isdir("dir1"))
self.assertTrue(self.fs.exists("a.txt")) self.assertTrue(self.fs.exists("a.txt"))
self.assertTrue(self.fs.isfile("a.txt")) self.assertTrue(self.fs.isfile("a.txt"))
self.assertFalse(self.fs.exists("a.txt/thatsnotadir"))
self.fs.makedir("dir1") self.fs.makedir("dir1")
self.assertTrue(self.fs.isdir("dir1")) self.assertTrue(self.fs.isdir("dir1"))
self.assertTrue(self.fs.exists("dir1")) self.assertTrue(self.fs.exists("dir1"))
...@@ -250,6 +251,8 @@ class FSTestCases: ...@@ -250,6 +251,8 @@ class FSTestCases:
info = self.fs.getinfo("info.txt") info = self.fs.getinfo("info.txt")
self.assertEqual(info['size'], len(test_str)) self.assertEqual(info['size'], len(test_str))
self.fs.desc("info.txt") self.fs.desc("info.txt")
self.assertRaises(ResourceNotFoundError,self.fs.getinfo,"notafile")
self.assertRaises(ResourceNotFoundError,self.fs.getinfo,"info.txt/inval")
def test_getsize(self): def test_getsize(self):
test_str = "*"*23 test_str = "*"*23
......
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