diff options
author | willmcgugan <willmcgugan@67cdc799-7952-0410-af00-57a81ceafa0f> | 2011-09-10 09:15:37 +0000 |
---|---|---|
committer | willmcgugan <willmcgugan@67cdc799-7952-0410-af00-57a81ceafa0f> | 2011-09-10 09:15:37 +0000 |
commit | e7b412f9ad6d15e12d3fd07a9172b84538b6327b (patch) | |
tree | 7cce71f030373d98b3cbb40def3d16eeb8d7ec95 /fs/opener.py | |
parent | c56e8ae62cd42495243fd4d6df75e6d4cdab5023 (diff) | |
download | pyfilesystem-git-e7b412f9ad6d15e12d3fd07a9172b84538b6327b.tar.gz |
Fixed a circular reference issue
Diffstat (limited to 'fs/opener.py')
-rw-r--r-- | fs/opener.py | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/fs/opener.py b/fs/opener.py index d8b4bbc..08aad1e 100644 --- a/fs/opener.py +++ b/fs/opener.py @@ -67,6 +67,7 @@ __all__ = ['OpenerError', 'HTTPOpener'] from fs.path import pathsplit, join, iswildcard, normpath +from fs.filelike import FileWrapper from os import getcwd import os.path import re @@ -117,6 +118,14 @@ def _split_url_path(url): url = '%s://%s' % (scheme, netloc) return url, path +class _FSClosingFile(FileWrapper): + """A file like object that closes its parent FS when closed itself""" + def close(self): + fs = getattr(self, '_closefs', None) + ret = super(_FSClosingFile).close() + if fs is not None: + fs.close + return ret class OpenerRegistry(object): @@ -254,24 +263,10 @@ class OpenerRegistry(object): writeable = 'w' in mode or 'a' in mode or '+' in mode fs, path = self.parse(fs_url, writeable=writeable) file_object = fs.open(path, mode) - - from fs.filelike import FileWrapper - file_object = FileWrapper(file_object, mode) - - # If we just return the file, then fs goes out of scope and closes, - # which may make the file unusable. To get around this, we store a - # reference in the file object to the FS, and patch the file's - # close method to also close the FS. - - close = file_object.close - close_fs = fs - def replace_close(): - ret = close() - close_fs.close() - return ret - file_object.close = replace_close - - return file_object + + file_object = _FSClosingFile(file_object, mode) + file_object.fs = fs + return file_object def getcontents(self, fs_url): """Gets the contents from a given FS url (if it references a file) |