diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/base.py | 47 | ||||
-rw-r--r-- | fs/ftpfs.py | 10 | ||||
-rw-r--r-- | fs/httpfs.py | 5 | ||||
-rw-r--r-- | fs/mountfs.py | 78 | ||||
-rw-r--r-- | fs/path.py | 8 | ||||
-rw-r--r-- | fs/remote.py | 9 | ||||
-rw-r--r-- | fs/s3fs.py | 5 | ||||
-rw-r--r-- | fs/sftpfs.py | 4 | ||||
-rw-r--r-- | fs/utils.py | 7 | ||||
-rw-r--r-- | fs/watch.py | 4 | ||||
-rw-r--r-- | fs/zipfs.py | 4 |
11 files changed, 83 insertions, 98 deletions
@@ -8,6 +8,8 @@ Instances of FS represent a filesystem containing files and directories that can be queried and manipulated. To implement a new kind of filesystem, start by sublcassing the base FS class. +For more information regarding implementing a working PyFilesystem interface, see :ref:`implementers`. + """ __all__ = ['DummyLock', @@ -58,7 +60,7 @@ class DummyLock(object): def silence_fserrors(f, *args, **kwargs): - """Perform a function call and return None if FSError is thrown + """Perform a function call and return ``None`` if an :class:`fs.errors.FSError` is thrown :param f: Function to call :param args: Parameters to f @@ -79,7 +81,7 @@ class NoDefaultMeta(object): class NullFile(object): """A NullFile is a file object that has no functionality. - Null files are returned by the 'safeopen' method in FS objects when the + Null files are returned by the :meth:`fs.base.FS.safeopen` method in FS objects when the file doesn't exist. This can simplify code by negating the need to check if a file exists, or handling exceptions. @@ -172,9 +174,9 @@ class FS(object): ignore this value. :param enabled: If True the implementation is permitted to aggressively cache directory - structure / file information. Caching such information speeds up most operations, + structure / file information. Caching such information can speed up many operations, particularly for network based filesystems. The downside of caching is that - changes made to directories or files outside of this interface may not be picked up. + changes made to directories or files outside of this interface may not be picked up immediately. """ pass @@ -231,21 +233,18 @@ class FS(object): * *case_insensitive_paths* True if the file system ignores the case of paths * *atomic.makedir* True if making a directory is an atomic operation * *atomic.rename* True if rename is an atomic operation, (and not implemented as a copy followed by a delete) - * *atomic.setcontents* True if the implementation supports setting the contents of a file as an atomic operation (without opening a file) - - The following are less common: - + * *atomic.setcontents* True if the implementation supports setting the contents of a file as an atomic operation (without opening a file) * *free_space* The free space (in bytes) available on the file system * *total_space* The total space (in bytes) available on the file system - FS implementations may expose non-generic meta data through a self-named namespace. e.g. 'somefs.some_meta' + FS implementations may expose non-generic meta data through a self-named namespace. e.g. ``somefs.some_meta`` Since no meta value is guaranteed to exist, it is advisable to always supply a - default value to `getmeta`. + default value to ``getmeta``. :param meta_name: The name of the meta value to retrieve :param default: An option default to return, if the meta value isn't present - :raises NoMetaError: If specified meta value is not present, and there is no default + :raises `fs.errors.NoMetaError`: If specified meta value is not present, and there is no default """ if meta_name not in self._meta: @@ -278,7 +277,7 @@ class FS(object): :param allow_none: if True, this method will return None when there is no system path, rather than raising NoSysPathError :type allow_none: bool - :raises NoSysPathError: if the path does not map on to a system path, and allow_none is set to False (default) + :raises `fs.errors.NoSysPathError`: if the path does not map on to a system path, and allow_none is set to False (default) :rtype: unicode """ @@ -300,14 +299,14 @@ class FS(object): """Returns a url that corresponds to the given path, if one exists. If the path does not have an equivalent URL form (and allow_none is False) - then a NoPathURLError exception is thrown. Otherwise the URL will be + then a :class:`~fs.errors.NoPathURLError` exception is thrown. Otherwise the URL will be returns as an unicode string. :param path: a path within the filesystem :param allow_none: if true, this method can return None if there is no URL form of the given path :type allow_none: bool - :raises NoPathURLError: If no URL form exists, and allow_none is False (the default) + :raises `fs.errors.NoPathURLError`: If no URL form exists, and allow_none is False (the default) :rtype: unicode """ @@ -341,7 +340,7 @@ class FS(object): def safeopen(self, path, mode="r", **kwargs): """Like :py:meth:`~fs.base.FS.open`, but returns a :py:class:`~fs.base.NullFile` if the file could not be opened. - A NullFile is a dummy file which has all the methods of a file-like object, + A ``NullFile`` is a dummy file which has all the methods of a file-like object, but contains no data. :param path: a path to file that should be opened @@ -415,7 +414,7 @@ class FS(object): :rtype: iterable of paths :raises `fs.errors.ResourceNotFoundError`: if the path is not found - :raises `fs.errror.ResourceInvalidError`: if the path exists, but is not a directory + :raises `fs.errors.ResourceInvalidError`: if the path exists, but is not a directory """ raise UnsupportedError("list directory") @@ -707,7 +706,7 @@ class FS(object): error_callback=None): """Create a new file from a string or file-like object asynchronously - This method returns a `threading.Event` object. Call the `wait` method on the event object + This method returns a ``threading.Event`` object. Call the ``wait`` method on the event object to block until all data has been written, or simply ignore it. :param path: a path of the file to create @@ -770,7 +769,7 @@ class FS(object): """Creates an empty file if it doesn't exist :param path: path to the file to create - :param wipe: If True, the contents of the file will be erased + :param wipe: if True, the contents of the file will be erased """ if not wipe and self.isfile(path): @@ -788,12 +787,10 @@ class FS(object): """Opens a directory and returns a FS object representing its contents. :param path: path to directory to open - :rtype: An FS object + :rtype: an FS object """ - - #if path in ('', '/'): - # return self + from fs.wrapfs.subfs import SubFS if not self.exists(path): raise ResourceNotFoundError(path) @@ -816,8 +813,8 @@ class FS(object): :type dir_wildcard: a string containing a wildcard (e.g. `*.txt`) or a callable that takes the directory name and returns a boolean :param search: a string dentifying the method used to walk the directories. There are two such methods: - * "breadth" yields paths in the top directories first - * "depth" yields the deepest paths first + * ``"breadth"`` yields paths in the top directories first + * ``"depth"`` yields the deepest paths first :param ignore_errors: ignore any errors reading the directory @@ -1184,7 +1181,7 @@ class FS(object): :param path: A path on this filesystem :param read_only: If True, the mmap may not be modified :param copy: If False then changes wont be written back to the file - :raises NoMMapError: Only paths that have a syspath can be opened as a mmap + :raises `fs.errors.NoMMapError`: Only paths that have a syspath can be opened as a mmap """ syspath = self.getsyspath(path, allow_none=True) diff --git a/fs/ftpfs.py b/fs/ftpfs.py index 2d35970..9a5ec70 100644 --- a/fs/ftpfs.py +++ b/fs/ftpfs.py @@ -12,7 +12,6 @@ import fs from fs.base import * from fs.errors import * from fs.path import pathsplit, abspath, dirname, recursepath, normpath, pathjoin, isbase -from fs.remote import RemoteFileBuffer from ftplib import FTP, error_perm, error_temp, error_proto, error_reply @@ -22,9 +21,8 @@ except ImportError: _GLOBAL_DEFAULT_TIMEOUT = object() import threading -from time import sleep import datetime -import re + from socket import error as socket_error from fs.local_functools import wraps @@ -34,7 +32,6 @@ except ImportError: from StringIO import StringIO import time -import sys # ----------------------------------------------- @@ -918,8 +915,7 @@ class FTPFS(FS): if not paths: self.dircache.clear() - else: - remove_paths = [] + else: dircache = self.dircache paths = [normpath(abspath(path)) for path in paths] for cached_path in dircache.keys(): @@ -1189,7 +1185,7 @@ class FTPFS(FS): raise ResourceInvalidError(path) if not force: - for checkpath in self.listdir(path): + for _checkpath in self.listdir(path): raise DirectoryNotEmptyError(path) try: if force: diff --git a/fs/httpfs.py b/fs/httpfs.py index 58692ef..4865195 100644 --- a/fs/httpfs.py +++ b/fs/httpfs.py @@ -8,7 +8,6 @@ fs.httpfs from fs.base import FS from fs.path import normpath from fs.errors import ResourceNotFoundError, UnsupportedError -from urlparse import urlparse from urllib2 import urlopen, URLError class HTTPFS(FS): @@ -33,9 +32,9 @@ class HTTPFS(FS): try: f = urlopen(url) except URLError, e: - raise ResourceNotFoundError(path) + raise ResourceNotFoundError(path, details=e) except OSError, e: - raise ResourceNotFoundError(path) + raise ResourceNotFoundError(path, details=e) return f diff --git a/fs/mountfs.py b/fs/mountfs.py index 2bd2592..7f6a6cf 100644 --- a/fs/mountfs.py +++ b/fs/mountfs.py @@ -122,7 +122,7 @@ class MountFS(FS): return self, "/", path def getsyspath(self, path, allow_none=False): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: if allow_none: return None @@ -131,7 +131,7 @@ class MountFS(FS): return fs.getsyspath(delegate_path, allow_none=allow_none) def getpathurl(self, path, allow_none=False): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: if allow_none: return None @@ -141,7 +141,7 @@ class MountFS(FS): @synchronize def desc(self, path): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self: if fs.isdir(path): return "Mount dir" @@ -151,7 +151,7 @@ class MountFS(FS): @synchronize def isdir(self, path): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: return False if fs is self: @@ -161,7 +161,7 @@ class MountFS(FS): @synchronize def isfile(self, path): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: return False if fs is self: @@ -171,7 +171,7 @@ class MountFS(FS): @synchronize def exists(self, path): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: return False if fs is self: @@ -180,7 +180,7 @@ class MountFS(FS): @synchronize def listdir(self, path="/", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) @@ -222,7 +222,7 @@ class MountFS(FS): @synchronize def ilistdir(self, path="/", wildcard=None, full=False, absolute=False, dirs_only=False, files_only=False): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) @@ -257,7 +257,7 @@ class MountFS(FS): if self.isdir(pathjoin(path,p)): yield mkpath(p) elif files_only: - if self.isfile(pathjoin(path,nm)): + if self.isfile(pathjoin(path,p)): yield mkpath(p) else: yield mkpath(p) @@ -265,7 +265,7 @@ class MountFS(FS): @synchronize def makedir(self, path, recursive=False, allow_recreate=False): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise UnsupportedError("make directory", msg="Can only makedir for mounted paths" ) if not delegate_path: @@ -282,7 +282,7 @@ class MountFS(FS): callable = object.open_callable return callable(path, mode, **kwargs) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise ResourceNotFoundError(path) @@ -294,24 +294,24 @@ class MountFS(FS): object = self.mount_tree.get(path, None) if type(object) is MountFS.FileMount: return super(MountFS,self).setcontents(path, data, chunk_size=chunk_size) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise ParentDirectoryMissingError(path) return fs.setcontents(delegate_path, data, chunk_size) @synchronize - def createfile(self, path): + def createfile(self, path, wipe=False): object = self.mount_tree.get(path, None) if type(object) is MountFS.FileMount: - return super(MountFS,self).setcontents(path, contents, chunk_size=chunk_size) - fs, mount_path, delegate_path = self._delegate(path) + return super(MountFS,self).createfile(path, wipe=wipe) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise ParentDirectoryMissingError(path) - return fs.createfile(delegate_path) + return fs.createfile(delegate_path, wipe=wipe) @synchronize def remove(self, path): - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise UnsupportedError("remove file", msg="Can only remove paths within a mounted dir") return fs.remove(delegate_path) @@ -319,15 +319,15 @@ class MountFS(FS): @synchronize def removedir(self, path, recursive=False, force=False): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is self or fs is None: raise ResourceInvalidError(path, msg="Can not removedir for an un-mounted path") return fs.removedir(delegate_path, recursive, force) @synchronize def rename(self, src, dst): - fs1, mount_path1, delegate_path1 = self._delegate(src) - fs2, mount_path2, delegate_path2 = self._delegate(dst) + fs1, _mount_path1, delegate_path1 = self._delegate(src) + fs2, _mount_path2, delegate_path2 = self._delegate(dst) if fs1 is not fs2: raise OperationFailedError("rename resource", path=src) @@ -335,10 +335,10 @@ class MountFS(FS): if fs1 is not self: return fs1.rename(delegate_path1, delegate_path2) - object = self.mount_tree.get(path_src, None) - object2 = self.mount_tree.get(path_dst, None) + object = self.mount_tree.get(src, None) + _object2 = self.mount_tree.get(dst, None) - if object1 is None: + if object is None: raise ResourceNotFoundError(src) # TODO! @@ -346,8 +346,8 @@ class MountFS(FS): @synchronize def move(self,src,dst,**kwds): - fs1, mount_path1, delegate_path1 = self._delegate(src) - fs2, mount_path2, delegate_path2 = self._delegate(dst) + fs1, _mount_path1, delegate_path1 = self._delegate(src) + fs2, _mount_path2, delegate_path2 = self._delegate(dst) if fs1 is fs2 and fs1 is not self: fs1.move(delegate_path1,delegate_path2,**kwds) else: @@ -355,8 +355,8 @@ class MountFS(FS): @synchronize def movedir(self,src,dst,**kwds): - fs1, mount_path1, delegate_path1 = self._delegate(src) - fs2, mount_path2, delegate_path2 = self._delegate(dst) + fs1, _mount_path1, delegate_path1 = self._delegate(src) + fs2, _mount_path2, delegate_path2 = self._delegate(dst) if fs1 is fs2 and fs1 is not self: fs1.movedir(delegate_path1,delegate_path2,**kwds) else: @@ -364,8 +364,8 @@ class MountFS(FS): @synchronize def copy(self,src,dst,**kwds): - fs1, mount_path1, delegate_path1 = self._delegate(src) - fs2, mount_path2, delegate_path2 = self._delegate(dst) + fs1, _mount_path1, delegate_path1 = self._delegate(src) + fs2, _mount_path2, delegate_path2 = self._delegate(dst) if fs1 is fs2 and fs1 is not self: fs1.copy(delegate_path1,delegate_path2,**kwds) else: @@ -373,8 +373,8 @@ class MountFS(FS): @synchronize def copydir(self,src,dst,**kwds): - fs1, mount_path1, delegate_path1 = self._delegate(src) - fs2, mount_path2, delegate_path2 = self._delegate(dst) + fs1, _mount_path1, delegate_path1 = self._delegate(src) + fs2, _mount_path2, delegate_path2 = self._delegate(dst) if fs1 is fs2 and fs1 is not self: fs1.copydir(delegate_path1,delegate_path2,**kwds) else: @@ -414,7 +414,7 @@ class MountFS(FS): @synchronize def settimes(self, path, accessed_time=None, modified_time=None): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) @@ -427,7 +427,7 @@ class MountFS(FS): def getinfo(self, path): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) @@ -441,7 +441,7 @@ class MountFS(FS): @synchronize def getsize(self, path): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) @@ -462,7 +462,7 @@ class MountFS(FS): @synchronize def getxattr(self,path,name,default=None): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) if fs is self: @@ -472,7 +472,7 @@ class MountFS(FS): @synchronize def setxattr(self,path,name,value): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) if fs is self: @@ -482,17 +482,17 @@ class MountFS(FS): @synchronize def delxattr(self,path,name): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) if fs is self: return True - return fs.delxattr(delegate_path,name) + return fs.delxattr(delegate_path, name) @synchronize def listxattrs(self,path): path = normpath(path) - fs, mount_path, delegate_path = self._delegate(path) + fs, _mount_path, delegate_path = self._delegate(path) if fs is None: raise ResourceNotFoundError(path) if fs is self: @@ -152,10 +152,10 @@ def pathjoin(*paths): relpaths = [] for p in paths: if p: - if p[0] in '\\/': - del relpaths[:] - absolute = True - relpaths.append(p) + if p[0] in '\\/': + del relpaths[:] + absolute = True + relpaths.append(p) path = normpath(u"/".join(relpaths)) if absolute: diff --git a/fs/remote.py b/fs/remote.py index e7862c4..bf4e4a1 100644 --- a/fs/remote.py +++ b/fs/remote.py @@ -22,15 +22,12 @@ FS subclasses interfacing with a remote filesystem. These include: from __future__ import with_statement -import sys -import os import time -import copy import stat as statinfo from errno import EINVAL import fs.utils -from fs.base import FS, threading +from fs.base import threading from fs.wrapfs import WrapFS, wrap_fs_methods from fs.wrapfs.lazyfs import LazyFS from fs.path import * @@ -621,10 +618,10 @@ class CacheFSMixin(WrapFS): return info def listdir(self,path="",*args,**kwds): - return list(nm for (nm,info) in self.listdirinfo(path,*args,**kwds)) + return list(nm for (nm, _info) in self.listdirinfo(path,*args,**kwds)) def ilistdir(self,path="",*args,**kwds): - for (nm,info) in self.ilistdirinfo(path,*args,**kwds): + for (nm, _info) in self.ilistdirinfo(path,*args,**kwds): yield nm def listdirinfo(self,path="",*args,**kwds): @@ -9,10 +9,7 @@ interface for objects stored in Amazon Simple Storage Service (S3). """ -import os -import time import datetime -import hashlib import tempfile from fnmatch import fnmatch import stat as statinfo @@ -322,7 +319,7 @@ class S3FS(FS): return False k = self._s3bukt.get_key(s3path) if k is not None: - return True + return True return False def listdir(self,path="./",wildcard=None,full=False,absolute=False,dirs_only=False,files_only=False): diff --git a/fs/sftpfs.py b/fs/sftpfs.py index f37b314..bdf3377 100644 --- a/fs/sftpfs.py +++ b/fs/sftpfs.py @@ -481,7 +481,7 @@ class SFTPFS(FS): self.client.rename(nsrc,ndst) except IOError, e: if getattr(e,"errno",None) == 2: - raise ResourceNotFoundError(path) + raise ResourceNotFoundError(src) if not self.isdir(dirname(dst)): raise ParentDirectoryMissingError(dst) raise @@ -496,7 +496,7 @@ class SFTPFS(FS): self.client.rename(nsrc,ndst) except IOError, e: if getattr(e,"errno",None) == 2: - raise ResourceNotFoundError(path) + raise ResourceNotFoundError(src) if self.exists(dst): raise DestinationExistsError(dst) if not self.isdir(dirname(dst)): diff --git a/fs/utils.py b/fs/utils.py index e0e071b..8b081ed 100644 --- a/fs/utils.py +++ b/fs/utils.py @@ -14,7 +14,6 @@ __all__ = ['copyfile', 'find_duplicates', 'print_fs'] -import shutil import os import sys import stat @@ -453,9 +452,9 @@ def print_fs(fs, path='/', max_levels=5, file_out=None, terminal_colors=None, hi file_out.write(line.encode(file_encoding, 'replace')+'\n') def wrap_prefix(prefix): - if not terminal_colors: - return prefix - return '\x1b[34m%s\x1b[0m' % prefix + if not terminal_colors: + return prefix + return '\x1b[34m%s\x1b[0m' % prefix def wrap_dirname(dirname): if not terminal_colors: diff --git a/fs/watch.py b/fs/watch.py index aab0d37..be4b4a1 100644 --- a/fs/watch.py +++ b/fs/watch.py @@ -318,7 +318,7 @@ class WatchableFS(WatchableFSMixin,WrapFS): if not existed: self.notify_watchers(CREATED,path) self.notify_watchers(ACCESSED,path) - return retq + return ret def makedir(self,path,recursive=False,allow_recreate=False): existed = self.wrapped_fs.isdir(path) @@ -441,7 +441,7 @@ class WatchableFS(WatchableFSMixin,WrapFS): self.notify_watchers(MODIFIED,path,False) def delxattr(self,path,name): - super(WatchableFS,self).delxattr(path,name,value) + super(WatchableFS,self).delxattr(path,name) self.notify_watchers(MODIFIED,path,False) diff --git a/fs/zipfs.py b/fs/zipfs.py index af143d0..55eaf75 100644 --- a/fs/zipfs.py +++ b/fs/zipfs.py @@ -151,7 +151,7 @@ class ZipFS(FS): if path: self._path_fs.makedir(path, recursive=True, allow_recreate=True) else: - dirpath, filename = pathsplit(path) + dirpath, _filename = pathsplit(path) if dirpath: self._path_fs.makedir(dirpath, recursive=True, allow_recreate=True) f = self._path_fs.open(path, 'w') @@ -191,7 +191,7 @@ class ZipFS(FS): raise OperationFailedError("open file", path=path, msg="2 Zip file must be opened for writing ('w') or appending ('a')") - dirname, filename = pathsplit(path) + dirname, _filename = pathsplit(path) if dirname: self.temp_fs.makedir(dirname, recursive=True, allow_recreate=True) |