summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/base.py47
-rw-r--r--fs/ftpfs.py10
-rw-r--r--fs/httpfs.py5
-rw-r--r--fs/mountfs.py78
-rw-r--r--fs/path.py8
-rw-r--r--fs/remote.py9
-rw-r--r--fs/s3fs.py5
-rw-r--r--fs/sftpfs.py4
-rw-r--r--fs/utils.py7
-rw-r--r--fs/watch.py4
-rw-r--r--fs/zipfs.py4
11 files changed, 83 insertions, 98 deletions
diff --git a/fs/base.py b/fs/base.py
index 65a4d01..d7b75d4 100644
--- a/fs/base.py
+++ b/fs/base.py
@@ -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:
diff --git a/fs/path.py b/fs/path.py
index 8b5fd1b..ada8a56 100644
--- a/fs/path.py
+++ b/fs/path.py
@@ -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):
diff --git a/fs/s3fs.py b/fs/s3fs.py
index e6cbf5c..91b6202 100644
--- a/fs/s3fs.py
+++ b/fs/s3fs.py
@@ -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)