mirror of
https://git.freebsd.org/ports.git
synced 2025-04-29 01:56:37 -04:00
The filesystems category houses file systems and file system utilities. It is added mainly to turn the sysutils/fusefs-* pseudo-category into a proper one, but is also useful for the sundry of other file systems related ports found in the tree. Ports that seem like they belong there are moved to the new category. Two ports, sysutils/fusefs-funionfs and sysutils/fusefs-fusepak are not moved as they currently don't fetch and don't have TIMESTAMP set in their distinfo, but that is required to be able to push a rename of the port by the pre-receive hook. Approved by: portmgr (rene) Reviewed by: mat Pull Request: https://github.com/freebsd/freebsd-ports/pull/302 PR: 281988
5882 lines
233 KiB
Text
5882 lines
233 KiB
Text
--- fs/appdirfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/appdirfs.py
|
|
@@ -84,6 +84,6 @@ class UserLogFS(OSFS):
|
|
|
|
if __name__ == "__main__":
|
|
udfs = UserDataFS('exampleapp', appauthor='pyfs')
|
|
- print udfs
|
|
+ print(udfs)
|
|
udfs2 = UserDataFS('exampleapp2', appauthor='pyfs', create=False)
|
|
- print udfs2
|
|
+ print(udfs2)
|
|
--- fs/appdirs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/appdirs.py
|
|
@@ -21,7 +21,7 @@ import os
|
|
PY3 = sys.version_info[0] == 3
|
|
|
|
if PY3:
|
|
- unicode = str
|
|
+ str = str
|
|
|
|
class AppDirsError(Exception):
|
|
pass
|
|
@@ -248,7 +248,7 @@ def _get_win_folder_from_registry(csidl_name):
|
|
registry for this guarantees us the correct answer for all CSIDL_*
|
|
names.
|
|
"""
|
|
- import _winreg
|
|
+ import winreg
|
|
|
|
shell_folder_name = {
|
|
"CSIDL_APPDATA": "AppData",
|
|
@@ -256,9 +256,9 @@ def _get_win_folder_from_registry(csidl_name):
|
|
"CSIDL_LOCAL_APPDATA": "Local AppData",
|
|
}[csidl_name]
|
|
|
|
- key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
|
|
+ key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
|
|
r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
|
|
- dir, type = _winreg.QueryValueEx(key, shell_folder_name)
|
|
+ dir, type = winreg.QueryValueEx(key, shell_folder_name)
|
|
return dir
|
|
|
|
def _get_win_folder_with_pywin32(csidl_name):
|
|
@@ -268,7 +268,7 @@ def _get_win_folder_with_pywin32(csidl_name):
|
|
# not return unicode strings when there is unicode data in the
|
|
# path.
|
|
try:
|
|
- dir = unicode(dir)
|
|
+ dir = str(dir)
|
|
|
|
# Downgrade to short path name if have highbit chars. See
|
|
# <http://bugs.activestate.com/show_bug.cgi?id=85099>.
|
|
@@ -337,9 +337,9 @@ if __name__ == "__main__":
|
|
print("-- app dirs (without optional 'version')")
|
|
dirs = AppDirs(appname, appauthor, version="1.0")
|
|
for prop in props:
|
|
- print("%s: %s" % (prop, getattr(dirs, prop)))
|
|
+ print(("%s: %s" % (prop, getattr(dirs, prop))))
|
|
|
|
print("\n-- app dirs (with optional 'version')")
|
|
dirs = AppDirs(appname, appauthor)
|
|
for prop in props:
|
|
- print("%s: %s" % (prop, getattr(dirs, prop)))
|
|
+ print(("%s: %s" % (prop, getattr(dirs, prop))))
|
|
--- fs/base.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/base.py
|
|
@@ -12,8 +12,8 @@ For more information regarding implementing a working
|
|
|
|
"""
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
__all__ = ['DummyLock',
|
|
'silence_fserrors',
|
|
'NullFile',
|
|
@@ -109,7 +109,7 @@ class NullFile(object):
|
|
def flush(self):
|
|
pass
|
|
|
|
- def next(self):
|
|
+ def __next__(self):
|
|
raise StopIteration
|
|
|
|
def readline(self, *args, **kwargs):
|
|
@@ -900,7 +900,7 @@ class FS(object):
|
|
chunk_size=1024 * 64,
|
|
progress_callback=progress_callback,
|
|
finished_callback=finished_callback)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
if error_callback is not None:
|
|
error_callback(e)
|
|
finally:
|
|
@@ -1156,7 +1156,7 @@ class FS(object):
|
|
def _shutil_copyfile(cls, src_syspath, dst_syspath):
|
|
try:
|
|
shutil.copyfile(src_syspath, dst_syspath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
# shutil reports ENOENT when a parent directory is missing
|
|
if getattr(e, "errno", None) == errno.ENOENT:
|
|
if not os.path.exists(dirname(dst_syspath)):
|
|
--- fs/browsewin.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/browsewin.py
|
|
@@ -24,7 +24,7 @@ class InfoFrame(wx.Frame):
|
|
|
|
self.SetTitle("FS Object info - %s (%s)" % (path, desc))
|
|
|
|
- keys = info.keys()
|
|
+ keys = list(info.keys())
|
|
keys.sort()
|
|
|
|
self.list_ctrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
|
|
@@ -36,7 +36,7 @@ class InfoFrame(wx.Frame):
|
|
self.list_ctrl.SetColumnWidth(1, 300)
|
|
|
|
for key in sorted(keys, key=lambda k:k.lower()):
|
|
- self.list_ctrl.Append((key, unicode(info.get(key))))
|
|
+ self.list_ctrl.Append((key, str(info.get(key))))
|
|
|
|
self.Center()
|
|
|
|
@@ -50,7 +50,7 @@ class BrowseFrame(wx.Frame):
|
|
|
|
self.fs = fs
|
|
self.hide_dotfiles = hide_dotfiles
|
|
- self.SetTitle("FS Browser - " + unicode(fs))
|
|
+ self.SetTitle("FS Browser - " + str(fs))
|
|
|
|
self.tree = wx.gizmos.TreeListCtrl(self, -1, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT)
|
|
|
|
@@ -105,7 +105,7 @@ class BrowseFrame(wx.Frame):
|
|
try:
|
|
paths = ( [(True, p) for p in self.fs.listdir(path, absolute=True, dirs_only=True)] +
|
|
[(False, p) for p in self.fs.listdir(path, absolute=True, files_only=True)] )
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
msg = "Failed to get directory listing for %s\n\nThe following error was reported:\n\n%s" % (path, e)
|
|
wx.MessageDialog(self, msg, "Error listing directory", wx.OK).ShowModal()
|
|
paths = []
|
|
@@ -194,6 +194,6 @@ def browse(fs, hide_dotfiles=False):
|
|
|
|
|
|
if __name__ == "__main__":
|
|
- from osfs import OSFS
|
|
+ from .osfs import OSFS
|
|
home_fs = OSFS("~/")
|
|
browse(home_fs, True)
|
|
--- fs/commands/fscp.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/commands/fscp.py
|
|
@@ -3,7 +3,7 @@ from fs.utils import copyfile, copyfile_non_atomic
|
|
from fs.path import pathjoin, iswildcard
|
|
from fs.commands.runner import Command
|
|
import sys
|
|
-import Queue as queue
|
|
+import queue as queue
|
|
import time
|
|
import threading
|
|
|
|
@@ -31,7 +31,7 @@ class FileOpThread(threading.Thread):
|
|
self.dest_fs.makedir(path, recursive=True, allow_recreate=True)
|
|
else:
|
|
self.action(fs, path, self.dest_fs, dest_path, overwrite=True)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
self.on_error(e)
|
|
self.queue.task_done()
|
|
break
|
|
@@ -147,7 +147,7 @@ Copy SOURCE to DESTINATION"""
|
|
file_queue,
|
|
self.on_done,
|
|
self.on_error)
|
|
- for i in xrange(options.threads)]
|
|
+ for i in range(options.threads)]
|
|
|
|
for thread in threads:
|
|
thread.start()
|
|
@@ -188,7 +188,7 @@ Copy SOURCE to DESTINATION"""
|
|
|
|
if self.action_errors:
|
|
for error in self.action_errors:
|
|
- self.error(self.wrap_error(unicode(error)) + '\n')
|
|
+ self.error(self.wrap_error(str(error)) + '\n')
|
|
sys.stdout.flush()
|
|
else:
|
|
if complete and options.progress:
|
|
@@ -204,9 +204,9 @@ Copy SOURCE to DESTINATION"""
|
|
try:
|
|
if self.options.verbose:
|
|
if path_type == self.DIR:
|
|
- print "mkdir %s" % dst_fs.desc(dst_path)
|
|
+ print("mkdir %s" % dst_fs.desc(dst_path))
|
|
else:
|
|
- print "%s -> %s" % (src_fs.desc(src_path), dst_fs.desc(dst_path))
|
|
+ print("%s -> %s" % (src_fs.desc(src_path), dst_fs.desc(dst_path)))
|
|
elif self.options.progress:
|
|
self.done_files += 1
|
|
sys.stdout.write(self.progress_bar(self.total_files, self.done_files, self.get_verb()))
|
|
--- fs/commands/fsinfo.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/commands/fsinfo.py
|
|
@@ -31,12 +31,12 @@ Display information regarding an FS resource"""
|
|
return val
|
|
|
|
def make_printable(text):
|
|
- if not isinstance(text, basestring):
|
|
+ if not isinstance(text, str):
|
|
try:
|
|
text = str(text)
|
|
except:
|
|
try:
|
|
- text = unicode(text)
|
|
+ text = str(text)
|
|
except:
|
|
text = repr(text)
|
|
return text
|
|
@@ -48,16 +48,16 @@ Display information regarding an FS resource"""
|
|
dirs_only=options.dirsonly):
|
|
if not options.omit:
|
|
if options.simple:
|
|
- file_line = u'%s\n' % self.wrap_filename(path)
|
|
+ file_line = '%s\n' % self.wrap_filename(path)
|
|
else:
|
|
- file_line = u'[%s] %s\n' % (self.wrap_filename(path), self.wrap_faded(fs.desc(path)))
|
|
+ file_line = '[%s] %s\n' % (self.wrap_filename(path), self.wrap_faded(fs.desc(path)))
|
|
self.output(file_line)
|
|
info = fs.getinfo(path)
|
|
|
|
- for k, v in info.items():
|
|
+ for k, v in list(info.items()):
|
|
if k.startswith('_'):
|
|
del info[k]
|
|
- elif not isinstance(v, (basestring, int, long, float, bool, datetime)):
|
|
+ elif not isinstance(v, (str, int, float, bool, datetime)):
|
|
del info[k]
|
|
|
|
if keys:
|
|
--- fs/commands/fsls.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/commands/fsls.py
|
|
@@ -37,7 +37,7 @@ List contents of [PATH]"""
|
|
output = self.output
|
|
|
|
if not args:
|
|
- args = [u'.']
|
|
+ args = ['.']
|
|
|
|
dir_paths = []
|
|
file_paths = []
|
|
@@ -75,13 +75,13 @@ List contents of [PATH]"""
|
|
|
|
if options.syspath:
|
|
# Path without a syspath, just won't be displayed
|
|
- dir_paths = filter(None, [fs.getsyspath(path, allow_none=True) for path in dir_paths])
|
|
- file_paths = filter(None, [fs.getsyspath(path, allow_none=True) for path in file_paths])
|
|
+ dir_paths = [_f for _f in [fs.getsyspath(path, allow_none=True) for path in dir_paths] if _f]
|
|
+ file_paths = [_f for _f in [fs.getsyspath(path, allow_none=True) for path in file_paths] if _f]
|
|
|
|
if options.url:
|
|
# Path without a syspath, just won't be displayed
|
|
- dir_paths = filter(None, [fs.getpathurl(path, allow_none=True) for path in dir_paths])
|
|
- file_paths = filter(None, [fs.getpathurl(path, allow_none=True) for path in file_paths])
|
|
+ dir_paths = [_f for _f in [fs.getpathurl(path, allow_none=True) for path in dir_paths] if _f]
|
|
+ file_paths = [_f for _f in [fs.getpathurl(path, allow_none=True) for path in file_paths] if _f]
|
|
|
|
dirs = frozenset(dir_paths)
|
|
paths = sorted(dir_paths + file_paths, key=lambda p: p.lower())
|
|
@@ -95,7 +95,7 @@ List contents of [PATH]"""
|
|
def columnize(paths, num_columns):
|
|
|
|
col_height = (len(paths) + num_columns - 1) / num_columns
|
|
- columns = [[] for _ in xrange(num_columns)]
|
|
+ columns = [[] for _ in range(num_columns)]
|
|
col_no = 0
|
|
col_pos = 0
|
|
for path in paths:
|
|
@@ -128,11 +128,11 @@ List contents of [PATH]"""
|
|
|
|
def condense_columns(columns):
|
|
max_column_height = max([len(col) for col in columns])
|
|
- lines = [[] for _ in xrange(max_column_height)]
|
|
+ lines = [[] for _ in range(max_column_height)]
|
|
for column in columns:
|
|
for line, path in zip(lines, column):
|
|
line.append(path)
|
|
- return '\n'.join(u' '.join(line) for line in lines)
|
|
+ return '\n'.join(' '.join(line) for line in lines)
|
|
|
|
if options.long:
|
|
for path in paths:
|
|
@@ -151,7 +151,7 @@ List contents of [PATH]"""
|
|
while num_cols:
|
|
col_height = (num_paths + num_cols - 1) // num_cols
|
|
line_width = 0
|
|
- for col_no in xrange(num_cols):
|
|
+ for col_no in range(num_cols):
|
|
try:
|
|
col_width = max(path_widths[col_no * col_height: (col_no + 1) * col_height])
|
|
except ValueError:
|
|
--- fs/commands/fsserve.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/commands/fsserve.py
|
|
@@ -82,7 +82,7 @@ Serves the contents of PATH with one of a number of me
|
|
try:
|
|
self.output("Starting sftp server on %s:%i\n" % (options.addr, port), verbose=True)
|
|
server.serve_forever()
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
pass
|
|
finally:
|
|
server.server_close()
|
|
@@ -90,7 +90,7 @@ Serves the contents of PATH with one of a number of me
|
|
else:
|
|
self.error("Server type '%s' not recognised\n" % options.type)
|
|
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if e.errno == errno.EACCES:
|
|
self.error('Permission denied\n')
|
|
return 1
|
|
--- fs/commands/fstree.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/commands/fstree.py
|
|
@@ -34,7 +34,7 @@ Recursively display the contents of PATH in an ascii t
|
|
|
|
for fs, path, is_dir in self.get_resources(args, single=True):
|
|
if not is_dir:
|
|
- self.error(u"'%s' is not a dir\n" % path)
|
|
+ self.error("'%s' is not a dir\n" % path)
|
|
return 1
|
|
fs.cache_hint(True)
|
|
if options.gui:
|
|
--- fs/commands/runner.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/commands/runner.py
|
|
@@ -68,7 +68,7 @@ else:
|
|
|
|
|
|
def _unicode(text):
|
|
- if not isinstance(text, unicode):
|
|
+ if not isinstance(text, str):
|
|
return text.decode('ascii', 'replace')
|
|
return text
|
|
|
|
@@ -128,17 +128,17 @@ class Command(object):
|
|
text = _unicode(text)
|
|
if not self.terminal_colors:
|
|
return text
|
|
- return u'\x1b[2m%s\x1b[0m' % text
|
|
+ return '\x1b[2m%s\x1b[0m' % text
|
|
|
|
def wrap_link(self, text):
|
|
if not self.terminal_colors:
|
|
return text
|
|
- return u'\x1b[1;33m%s\x1b[0m' % text
|
|
+ return '\x1b[1;33m%s\x1b[0m' % text
|
|
|
|
def wrap_strong(self, text):
|
|
if not self.terminal_colors:
|
|
return text
|
|
- return u'\x1b[1m%s\x1b[0m' % text
|
|
+ return '\x1b[1m%s\x1b[0m' % text
|
|
|
|
def wrap_table_header(self, name):
|
|
if not self.terminal_colors:
|
|
@@ -215,10 +215,10 @@ class Command(object):
|
|
return resources
|
|
|
|
def ask(self, msg):
|
|
- return raw_input('%s: %s ' % (self.name, msg))
|
|
+ return input('%s: %s ' % (self.name, msg))
|
|
|
|
def text_encode(self, text):
|
|
- if not isinstance(text, unicode):
|
|
+ if not isinstance(text, str):
|
|
text = text.decode('ascii', 'replace')
|
|
text = text.encode(self.encoding, 'replace')
|
|
return text
|
|
@@ -226,7 +226,7 @@ class Command(object):
|
|
def output(self, msgs, verbose=False):
|
|
if verbose and not self.options.verbose:
|
|
return
|
|
- if isinstance(msgs, basestring):
|
|
+ if isinstance(msgs, str):
|
|
msgs = (msgs,)
|
|
for msg in msgs:
|
|
self.output_file.write(self.text_encode(msg))
|
|
@@ -276,7 +276,7 @@ class Command(object):
|
|
|
|
opener_table = []
|
|
|
|
- for fs_opener in opener.openers.itervalues():
|
|
+ for fs_opener in opener.openers.values():
|
|
names = fs_opener.names
|
|
desc = getattr(fs_opener, 'desc', '')
|
|
opener_table.append((names, desc))
|
|
@@ -346,12 +346,12 @@ class Command(object):
|
|
opener.add(new_opener)
|
|
|
|
if not six.PY3:
|
|
- args = [unicode(arg, sys.getfilesystemencoding()) for arg in args]
|
|
+ args = [str(arg, sys.getfilesystemencoding()) for arg in args]
|
|
self.verbose = options.verbose
|
|
try:
|
|
return self.do_run(options, args) or 0
|
|
- except FSError, e:
|
|
- self.error(self.wrap_error(unicode(e)) + '\n')
|
|
+ except FSError as e:
|
|
+ self.error(self.wrap_error(str(e)) + '\n')
|
|
if options.debug:
|
|
raise
|
|
return 1
|
|
@@ -361,8 +361,8 @@ class Command(object):
|
|
return 0
|
|
except SystemExit:
|
|
return 0
|
|
- except Exception, e:
|
|
- self.error(self.wrap_error('Error - %s\n' % unicode(e)))
|
|
+ except Exception as e:
|
|
+ self.error(self.wrap_error('Error - %s\n' % str(e)))
|
|
if options.debug:
|
|
raise
|
|
return 1
|
|
--- fs/contrib/archivefs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/archivefs.py
|
|
@@ -62,7 +62,7 @@ class ArchiveFS(FS):
|
|
:param thread_synchronize: set to True (default) to enable thread-safety
|
|
"""
|
|
super(ArchiveFS, self).__init__(thread_synchronize=thread_synchronize)
|
|
- if isinstance(f, basestring):
|
|
+ if isinstance(f, str):
|
|
self.fileobj = None
|
|
self.root_path = f
|
|
else:
|
|
@@ -83,7 +83,7 @@ class ArchiveFS(FS):
|
|
return "<ArchiveFS: %s>" % self.root_path
|
|
|
|
def __unicode__(self):
|
|
- return u"<ArchiveFS: %s>" % self.root_path
|
|
+ return "<ArchiveFS: %s>" % self.root_path
|
|
|
|
def getmeta(self, meta_name, default=NoDefaultMeta):
|
|
if meta_name == 'read_only':
|
|
@@ -446,7 +446,7 @@ class ArchiveMountFS(mountfs.MountFS):
|
|
else:
|
|
listing = self.listdir(path, *args, **kwargs)
|
|
if dirs_only:
|
|
- listing = filter(isdir, listing)
|
|
+ listing = list(filter(isdir, listing))
|
|
return listing
|
|
|
|
if wildcard is None:
|
|
--- fs/contrib/bigfs/__init__.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/bigfs/__init__.py
|
|
@@ -149,7 +149,7 @@ class _ExceptionProxy(object):
|
|
def __setattr__(self, name, value):
|
|
raise ValueError("File has been closed")
|
|
|
|
- def __nonzero__(self):
|
|
+ def __bool__(self):
|
|
return False
|
|
|
|
|
|
@@ -193,7 +193,7 @@ class BigFS(FS):
|
|
return "<BigFS: %s>" % self.big_path
|
|
|
|
def __unicode__(self):
|
|
- return unicode(self.__str__())
|
|
+ return str(self.__str__())
|
|
|
|
|
|
def _parse_resource_list(self, g):
|
|
--- fs/contrib/bigfs/subrangefile.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/bigfs/subrangefile.py
|
|
@@ -33,7 +33,7 @@ class SubrangeFile:
|
|
return "<SubrangeFile: %s@%d size=%d>" % (self.name, self.startOffset, self.fileSize)
|
|
|
|
def __unicode__(self):
|
|
- return unicode(self.__str__())
|
|
+ return str(self.__str__())
|
|
|
|
def size(self):
|
|
return self.fileSize
|
|
--- fs/contrib/davfs/__init__.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/contrib/davfs/__init__.py
|
|
@@ -16,21 +16,21 @@ Requires the dexml module:
|
|
# Copyright (c) 2009-2010, Cloud Matrix Pty. Ltd.
|
|
# All rights reserved; available under the terms of the MIT License.
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
import os
|
|
import sys
|
|
-import httplib
|
|
+import http.client
|
|
import socket
|
|
-from urlparse import urlparse
|
|
+from urllib.parse import urlparse
|
|
import stat as statinfo
|
|
-from urllib import quote as urlquote
|
|
-from urllib import unquote as urlunquote
|
|
+from urllib.parse import quote as urlquote
|
|
+from urllib.parse import unquote as urlunquote
|
|
import base64
|
|
import re
|
|
import time
|
|
import datetime
|
|
-import cookielib
|
|
+import http.cookiejar
|
|
import fnmatch
|
|
import xml.dom.pulldom
|
|
import threading
|
|
@@ -78,8 +78,8 @@ class DAVFS(FS):
|
|
"""
|
|
|
|
connection_classes = {
|
|
- "http": httplib.HTTPConnection,
|
|
- "https": httplib.HTTPSConnection,
|
|
+ "http": http.client.HTTPConnection,
|
|
+ "https": http.client.HTTPSConnection,
|
|
}
|
|
|
|
_DEFAULT_PORT_NUMBERS = {
|
|
@@ -116,7 +116,7 @@ class DAVFS(FS):
|
|
self._connections = []
|
|
self._free_connections = {}
|
|
self._connection_lock = threading.Lock()
|
|
- self._cookiejar = cookielib.CookieJar()
|
|
+ self._cookiejar = http.cookiejar.CookieJar()
|
|
super(DAVFS,self).__init__(thread_synchronize=thread_synchronize)
|
|
# Check that the server speaks WebDAV, and normalize the URL
|
|
# after any redirects have been followed.
|
|
@@ -221,14 +221,14 @@ class DAVFS(FS):
|
|
self._free_connections = {}
|
|
self._connection_lock = threading.Lock()
|
|
self._url_p = urlparse(self.url)
|
|
- self._cookiejar = cookielib.CookieJar()
|
|
+ self._cookiejar = http.cookiejar.CookieJar()
|
|
|
|
def getpathurl(self, path, allow_none=False):
|
|
"""Convert a client-side path into a server-side URL."""
|
|
path = relpath(normpath(path))
|
|
if path.endswith("/"):
|
|
path = path[:-1]
|
|
- if isinstance(path,unicode):
|
|
+ if isinstance(path,str):
|
|
path = path.encode("utf8")
|
|
return self.url + urlquote(path)
|
|
|
|
@@ -291,7 +291,7 @@ class DAVFS(FS):
|
|
"""Perform a single HTTP request, without any error handling."""
|
|
if self.closed:
|
|
raise RemoteConnectionError("",msg="FS is closed")
|
|
- if isinstance(url,basestring):
|
|
+ if isinstance(url,str):
|
|
url = urlparse(url)
|
|
if self.credentials is not None:
|
|
username = self.credentials.get("username","")
|
|
@@ -310,7 +310,7 @@ class DAVFS(FS):
|
|
if hasattr(body,"md5"):
|
|
md5 = body.md5.decode("hex").encode("base64")
|
|
con.putheader("Content-MD5",md5)
|
|
- for hdr,val in headers.iteritems():
|
|
+ for hdr,val in headers.items():
|
|
con.putheader(hdr,val)
|
|
self._cookiejar.add_cookie_header(FakeReq(con,url.scheme,url.path))
|
|
con.endheaders()
|
|
@@ -332,7 +332,7 @@ class DAVFS(FS):
|
|
self._give_connection(url,con)
|
|
resp.close = new_close
|
|
return resp
|
|
- except socket.error, e:
|
|
+ except socket.error as e:
|
|
if not fresh:
|
|
return self._raw_request(url,method,body,headers,num_tries)
|
|
if e.args[0] in _RETRYABLE_ERRORS:
|
|
@@ -479,7 +479,7 @@ class DAVFS(FS):
|
|
if not entry_ok:
|
|
continue
|
|
if wildcard is not None:
|
|
- if isinstance(wildcard,basestring):
|
|
+ if isinstance(wildcard,str):
|
|
if not fnmatch.fnmatch(nm,wildcard):
|
|
continue
|
|
else:
|
|
@@ -530,7 +530,7 @@ class DAVFS(FS):
|
|
if not entry_ok:
|
|
continue
|
|
if wildcard is not None:
|
|
- if isinstance(wildcard,basestring):
|
|
+ if isinstance(wildcard,str):
|
|
if not fnmatch.fnmatch(nm,wildcard):
|
|
continue
|
|
else:
|
|
@@ -610,7 +610,7 @@ class DAVFS(FS):
|
|
if self._isurl(path,res.href):
|
|
info.update(self._info_from_propfind(res))
|
|
if "st_mode" not in info:
|
|
- info["st_mode"] = 0700 | statinfo.S_IFREG
|
|
+ info["st_mode"] = 0o700 | statinfo.S_IFREG
|
|
return info
|
|
finally:
|
|
response.close()
|
|
@@ -647,7 +647,7 @@ class DAVFS(FS):
|
|
# TODO: should check for status of the propfind first...
|
|
# check for directory indicator
|
|
if findElements("DAV:","collection"):
|
|
- info["st_mode"] = 0700 | statinfo.S_IFDIR
|
|
+ info["st_mode"] = 0o700 | statinfo.S_IFDIR
|
|
# check for content length
|
|
cl = findElements("DAV:","getcontentlength")
|
|
if cl:
|
|
@@ -674,7 +674,7 @@ class DAVFS(FS):
|
|
if etag:
|
|
info["etag"] = etag
|
|
if "st_mode" not in info:
|
|
- info["st_mode"] = 0700 | statinfo.S_IFREG
|
|
+ info["st_mode"] = 0o700 | statinfo.S_IFREG
|
|
return info
|
|
|
|
|
|
--- fs/contrib/davfs/util.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/davfs/util.py
|
|
@@ -8,7 +8,7 @@
|
|
|
|
import os
|
|
import re
|
|
-import cookielib
|
|
+import http.cookiejar
|
|
|
|
|
|
def get_fileno(file):
|
|
@@ -130,7 +130,7 @@ class FakeResp:
|
|
# is a tweaked version of the cookielib function of the same name.
|
|
#
|
|
_test_cookie = "sessionid=e9c9b002befa93bd865ce155270307ef; Domain=.cloud.me; expires=Wed, 10-Feb-2010 03:27:20 GMT; httponly; Max-Age=1209600; Path=/, sessionid_https=None; Domain=.cloud.me; expires=Wed, 10-Feb-2010 03:27:20 GMT; httponly; Max-Age=1209600; Path=/; secure"
|
|
-if len(cookielib.parse_ns_headers([_test_cookie])) != 2:
|
|
+if len(http.cookiejar.parse_ns_headers([_test_cookie])) != 2:
|
|
def parse_ns_headers(ns_headers):
|
|
"""Improved parser for netscape-style cookies.
|
|
|
|
@@ -170,13 +170,13 @@ if len(cookielib.parse_ns_headers([_test_cookie])) !=
|
|
# convert expires date to seconds since epoch
|
|
if v.startswith('"'): v = v[1:]
|
|
if v.endswith('"'): v = v[:-1]
|
|
- v = cookielib.http2time(v) # None if invalid
|
|
+ v = http.cookiejar.http2time(v) # None if invalid
|
|
pairs.append((k, v))
|
|
if pairs:
|
|
if not version_set:
|
|
pairs.append(("version", "0"))
|
|
result.append(pairs)
|
|
return result
|
|
- cookielib.parse_ns_headers = parse_ns_headers
|
|
- assert len(cookielib.parse_ns_headers([_test_cookie])) == 2
|
|
+ http.cookiejar.parse_ns_headers = parse_ns_headers
|
|
+ assert len(http.cookiejar.parse_ns_headers([_test_cookie])) == 2
|
|
|
|
--- fs/contrib/davfs/xmlobj.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/davfs/xmlobj.py
|
|
@@ -9,9 +9,9 @@ of dexml.Model subclasses.
|
|
|
|
"""
|
|
|
|
-from urlparse import urlparse, urlunparse
|
|
+from urllib.parse import urlparse, urlunparse
|
|
|
|
-from httplib import responses as STATUS_CODE_TEXT
|
|
+from http.client import responses as STATUS_CODE_TEXT
|
|
STATUS_CODE_TEXT[207] = "Multi-Status"
|
|
|
|
import dexml
|
|
@@ -86,7 +86,7 @@ class StatusField(fields.Value):
|
|
return val
|
|
|
|
def __set__(self,instance,value):
|
|
- if isinstance(value,basestring):
|
|
+ if isinstance(value,str):
|
|
# sanity check it
|
|
bits = value.split(" ")
|
|
if len(bits) < 3 or bits[0] != "HTTP/1.1":
|
|
--- fs/contrib/sqlitefs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/contrib/sqlitefs.py
|
|
@@ -24,7 +24,7 @@ def fetchone(cursor):
|
|
'''
|
|
row = None
|
|
try:
|
|
- row = cursor.next()
|
|
+ row = next(cursor)
|
|
except:
|
|
pass
|
|
return(row)
|
|
@@ -62,7 +62,7 @@ class SqliteFsFileBase(object):
|
|
__repr__ = __str__
|
|
|
|
def __unicode__(self):
|
|
- return u"<SqliteFS File in %s %s>" % (self.fs, self.path)
|
|
+ return "<SqliteFS File in %s %s>" % (self.fs, self.path)
|
|
|
|
def __del__(self):
|
|
if not self.closed:
|
|
@@ -74,7 +74,7 @@ class SqliteFsFileBase(object):
|
|
def __iter__(self):
|
|
raise OperationFailedError('__iter__', self.path)
|
|
|
|
- def next(self):
|
|
+ def __next__(self):
|
|
raise OperationFailedError('next', self.path)
|
|
|
|
def readline(self, *args, **kwargs):
|
|
@@ -139,8 +139,8 @@ class SqliteReadableFile(SqliteFsFileBase):
|
|
def __iter__(self):
|
|
return iter(self.real_stream)
|
|
|
|
- def next(self):
|
|
- return self.real_stream.next()
|
|
+ def __next__(self):
|
|
+ return next(self.real_stream)
|
|
|
|
def readline(self, *args, **kwargs):
|
|
return self.real_stream.readline(*args, **kwargs)
|
|
@@ -438,7 +438,7 @@ class SqliteFS(FS):
|
|
get the directory information dictionary.
|
|
'''
|
|
info = dict()
|
|
- info['st_mode'] = 0755
|
|
+ info['st_mode'] = 0o755
|
|
return info
|
|
|
|
def _get_file_info(self, path):
|
|
@@ -460,7 +460,7 @@ class SqliteFS(FS):
|
|
info['created'] = row[2]
|
|
info['last_modified'] = row[3]
|
|
info['last_accessed'] = row[4]
|
|
- info['st_mode'] = 0666
|
|
+ info['st_mode'] = 0o666
|
|
return(info)
|
|
|
|
def _isfile(self,path):
|
|
@@ -551,7 +551,7 @@ class SqliteFS(FS):
|
|
pass
|
|
|
|
if( absolute == False):
|
|
- pathlist = map(lambda dpath:frombase(path,dpath), pathlist)
|
|
+ pathlist = [frombase(path,dpath) for dpath in pathlist]
|
|
|
|
return(pathlist)
|
|
|
|
--- fs/contrib/tahoelafs/__init__.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/tahoelafs/__init__.py
|
|
@@ -70,8 +70,8 @@ from fs import _thread_synchronize_default, SEEK_END
|
|
from fs.remote import CacheFSMixin, RemoteFileBuffer
|
|
from fs.base import fnmatch, NoDefaultMeta
|
|
|
|
-from util import TahoeUtil
|
|
-from connection import Connection
|
|
+from .util import TahoeUtil
|
|
+from .connection import Connection
|
|
|
|
from six import b
|
|
|
|
@@ -240,7 +240,7 @@ class _TahoeLAFS(FS):
|
|
continue
|
|
|
|
if wildcard is not None:
|
|
- if isinstance(wildcard,basestring):
|
|
+ if isinstance(wildcard,str):
|
|
if not fnmatch.fnmatch(item['name'], wildcard):
|
|
continue
|
|
else:
|
|
@@ -269,7 +269,7 @@ class _TahoeLAFS(FS):
|
|
|
|
try:
|
|
self.tahoeutil.unlink(self.dircap, path)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
raise errors.ResourceInvalidError(path)
|
|
|
|
@_fix_path
|
|
@@ -341,8 +341,8 @@ class _TahoeLAFS(FS):
|
|
|
|
def _log(self, level, message):
|
|
if not logger.isEnabledFor(level): return
|
|
- logger.log(level, u'(%d) %s' % (id(self),
|
|
- unicode(message).encode('ASCII', 'replace')))
|
|
+ logger.log(level, '(%d) %s' % (id(self),
|
|
+ str(message).encode('ASCII', 'replace')))
|
|
|
|
@_fix_path
|
|
def getpathurl(self, path, allow_none=False, webapi=None):
|
|
@@ -353,11 +353,11 @@ class _TahoeLAFS(FS):
|
|
webapi = self.connection.webapi
|
|
self._log(DEBUG, "Retrieving URL for %s over %s" % (path, webapi))
|
|
path = self.tahoeutil.fixwinpath(path, False)
|
|
- return u"%s/uri/%s%s" % (webapi, self.dircap, path)
|
|
+ return "%s/uri/%s%s" % (webapi, self.dircap, path)
|
|
|
|
@_fix_path
|
|
def getrange(self, path, offset, length=None):
|
|
- return self.connection.get(u'/uri/%s%s' % (self.dircap, path),
|
|
+ return self.connection.get('/uri/%s%s' % (self.dircap, path),
|
|
offset=offset, length=length)
|
|
|
|
@_fix_path
|
|
@@ -379,10 +379,10 @@ class _TahoeLAFS(FS):
|
|
file.seek(0)
|
|
|
|
if size > self.largefilesize:
|
|
- self.connection.put(u'/uri/%s%s' % (self.dircap, path),
|
|
+ self.connection.put('/uri/%s%s' % (self.dircap, path),
|
|
"PyFilesystem.TahoeLAFS: Upload started, final size %d" % size)
|
|
|
|
- self.connection.put(u'/uri/%s%s' % (self.dircap, path), file, size=size)
|
|
+ self.connection.put('/uri/%s%s' % (self.dircap, path), file, size=size)
|
|
|
|
@_fix_path
|
|
def getinfo(self, path):
|
|
--- fs/contrib/tahoelafs/connection.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/contrib/tahoelafs/connection.py
|
|
@@ -10,17 +10,19 @@ if python3:
|
|
from urllib.parse import urlencode, pathname2url, quote
|
|
from urllib.request import Request, urlopen
|
|
else:
|
|
- from urllib import urlencode, pathname2url
|
|
- from urllib2 import Request, urlopen, quote
|
|
+ from urllib.parse import urlencode
|
|
+ from urllib.request import pathname2url
|
|
+ from urllib.request import Request, urlopen
|
|
+ from urllib.parse import quote
|
|
|
|
class PutRequest(Request):
|
|
def __init__(self, *args, **kwargs):
|
|
- self.get_method = lambda: u'PUT'
|
|
+ self.get_method = lambda: 'PUT'
|
|
Request.__init__(self, *args, **kwargs)
|
|
|
|
class DeleteRequest(Request):
|
|
def __init__(self, *args, **kwargs):
|
|
- self.get_method = lambda: u'DELETE'
|
|
+ self.get_method = lambda: 'DELETE'
|
|
Request.__init__(self, *args, **kwargs)
|
|
|
|
class Connection:
|
|
@@ -32,7 +34,7 @@ class Connection:
|
|
'''
|
|
Retrieve length of string or file object and prepare HTTP headers.
|
|
'''
|
|
- if isinstance(f, basestring):
|
|
+ if isinstance(f, str):
|
|
# Just set up content length
|
|
size = len(f)
|
|
elif getattr(f, 'read', None):
|
|
@@ -50,20 +52,20 @@ class Connection:
|
|
|
|
def _urlencode(self, data):
|
|
_data = {}
|
|
- for k, v in data.items():
|
|
+ for k, v in list(data.items()):
|
|
_data[k.encode('utf-8')] = v.encode('utf-8')
|
|
return urlencode(_data)
|
|
|
|
def _quotepath(self, path, params={}):
|
|
q = quote(path.encode('utf-8'), safe='/')
|
|
if params:
|
|
- return u"%s?%s" % (q, self._urlencode(params))
|
|
+ return "%s?%s" % (q, self._urlencode(params))
|
|
return q
|
|
|
|
def _urlopen(self, req):
|
|
try:
|
|
return urlopen(req)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
if not getattr(e, 'getcode', None):
|
|
raise errors.RemoteConnectionError(str(e))
|
|
code = e.getcode()
|
|
@@ -85,7 +87,7 @@ class Connection:
|
|
data = self._urlencode(data)
|
|
path = self._quotepath(path)
|
|
if data:
|
|
- path = u'?'.join([path, data])
|
|
+ path = '?'.join([path, data])
|
|
|
|
headers = {}
|
|
headers.update(self.headers)
|
|
--- fs/contrib/tahoelafs/test_tahoelafs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/tahoelafs/test_tahoelafs.py
|
|
@@ -35,7 +35,7 @@ class TestTahoeLAFS(unittest.TestCase,FSTestCases):#,T
|
|
|
|
def test_dircap(self):
|
|
# Is dircap in correct format?
|
|
- self.assert_(self.dircap.startswith('URI:DIR2:') and len(self.dircap) > 50)
|
|
+ self.assertTrue(self.dircap.startswith('URI:DIR2:') and len(self.dircap) > 50)
|
|
|
|
def test_concurrent_copydir(self):
|
|
# makedir() on TahoeLAFS is currently not atomic
|
|
--- fs/contrib/tahoelafs/util.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/contrib/tahoelafs/util.py
|
|
@@ -19,7 +19,7 @@ except ImportError:
|
|
try:
|
|
import json
|
|
except ImportError:
|
|
- print "simplejson (http://pypi.python.org/pypi/simplejson/) required"
|
|
+ print("simplejson (http://pypi.python.org/pypi/simplejson/) required")
|
|
raise
|
|
|
|
from .connection import Connection
|
|
@@ -29,22 +29,22 @@ python3 = int(platform.python_version_tuple()[0]) > 2
|
|
if python3:
|
|
from urllib.error import HTTPError
|
|
else:
|
|
- from urllib2 import HTTPError
|
|
+ from urllib.error import HTTPError
|
|
|
|
class TahoeUtil:
|
|
def __init__(self, webapi):
|
|
self.connection = Connection(webapi)
|
|
|
|
def createdircap(self):
|
|
- return self.connection.post(u'/uri', params={u't': u'mkdir'}).read()
|
|
+ return self.connection.post('/uri', params={'t': 'mkdir'}).read()
|
|
|
|
def unlink(self, dircap, path=None):
|
|
path = self.fixwinpath(path, False)
|
|
- self.connection.delete(u'/uri/%s%s' % (dircap, path))
|
|
+ self.connection.delete('/uri/%s%s' % (dircap, path))
|
|
|
|
def info(self, dircap, path):
|
|
path = self.fixwinpath(path, False)
|
|
- meta = json.load(self.connection.get(u'/uri/%s%s' % (dircap, path), {u't': u'json'}))
|
|
+ meta = json.load(self.connection.get('/uri/%s%s' % (dircap, path), {'t': 'json'}))
|
|
return self._info(path, meta)
|
|
|
|
def fixwinpath(self, path, direction=True):
|
|
@@ -74,7 +74,7 @@ class TahoeUtil:
|
|
if type == 'unknown':
|
|
raise errors.ResourceNotFoundError(path)
|
|
|
|
- info = {'name': unicode(self.fixwinpath(path, True)),
|
|
+ info = {'name': str(self.fixwinpath(path, True)),
|
|
'type': type,
|
|
'size': data.get('size', 0),
|
|
'ctime': None,
|
|
@@ -83,22 +83,22 @@ class TahoeUtil:
|
|
info['ctime'] = data['metadata'].get('ctime')
|
|
|
|
if info['type'] == 'dirnode':
|
|
- info['st_mode'] = 0777 | statinfo.S_IFDIR
|
|
+ info['st_mode'] = 0o777 | statinfo.S_IFDIR
|
|
else:
|
|
- info['st_mode'] = 0644
|
|
+ info['st_mode'] = 0o644
|
|
|
|
return info
|
|
|
|
def list(self, dircap, path=None):
|
|
path = self.fixwinpath(path, False)
|
|
|
|
- data = json.load(self.connection.get(u'/uri/%s%s' % (dircap, path), {u't': u'json'}))
|
|
+ data = json.load(self.connection.get('/uri/%s%s' % (dircap, path), {'t': 'json'}))
|
|
|
|
if len(data) < 2 or data[0] != 'dirnode':
|
|
raise errors.ResourceInvalidError('Metadata in unknown format!')
|
|
|
|
data = data[1]['children']
|
|
- for i in data.keys():
|
|
+ for i in list(data.keys()):
|
|
x = self._info(i, data[i])
|
|
yield x
|
|
|
|
@@ -106,7 +106,7 @@ class TahoeUtil:
|
|
path = self.fixwinpath(path, False)
|
|
path = pathsplit(path)
|
|
|
|
- self.connection.post(u"/uri/%s%s" % (dircap, path[0]), data={u't': u'mkdir', u'name': path[1]})
|
|
+ self.connection.post("/uri/%s%s" % (dircap, path[0]), data={'t': 'mkdir', 'name': path[1]})
|
|
|
|
def move(self, dircap, src, dst):
|
|
if src == '/' or dst == '/':
|
|
@@ -120,8 +120,8 @@ class TahoeUtil:
|
|
|
|
if src_tuple[0] == dst_tuple[0]:
|
|
# Move inside one directory
|
|
- self.connection.post(u"/uri/%s%s" % (dircap, src_tuple[0]), data={u't': u'rename',
|
|
- u'from_name': src_tuple[1], u'to_name': dst_tuple[1]})
|
|
+ self.connection.post("/uri/%s%s" % (dircap, src_tuple[0]), data={'t': 'rename',
|
|
+ 'from_name': src_tuple[1], 'to_name': dst_tuple[1]})
|
|
return
|
|
|
|
# Move to different directory. Firstly create link on dst, then remove from src
|
|
@@ -133,7 +133,7 @@ class TahoeUtil:
|
|
self.unlink(dircap, dst)
|
|
|
|
uri = self.info(dircap, src)['uri']
|
|
- self.connection.put(u"/uri/%s%s" % (dircap, dst), data=uri, params={u't': u'uri'})
|
|
+ self.connection.put("/uri/%s%s" % (dircap, dst), data=uri, params={'t': 'uri'})
|
|
if uri != self.info(dircap, dst)['uri']:
|
|
raise errors.OperationFailedError('Move failed')
|
|
|
|
--- fs/errors.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/errors.py
|
|
@@ -57,19 +57,19 @@ class FSError(Exception):
|
|
|
|
def __str__(self):
|
|
keys = {}
|
|
- for k,v in self.__dict__.iteritems():
|
|
- if isinstance(v,unicode):
|
|
+ for k,v in self.__dict__.items():
|
|
+ if isinstance(v,str):
|
|
v = v.encode(sys.getfilesystemencoding())
|
|
keys[k] = v
|
|
return str(self.msg % keys)
|
|
|
|
def __unicode__(self):
|
|
keys = {}
|
|
- for k,v in self.__dict__.iteritems():
|
|
+ for k,v in self.__dict__.items():
|
|
if isinstance(v, six.binary_type):
|
|
v = v.decode(sys.getfilesystemencoding(), 'replace')
|
|
keys[k] = v
|
|
- return unicode(self.msg, encoding=sys.getfilesystemencoding(), errors='replace') % keys
|
|
+ return str(self.msg, encoding=sys.getfilesystemencoding(), errors='replace') % keys
|
|
|
|
def __reduce__(self):
|
|
return (self.__class__,(),self.__dict__.copy(),)
|
|
@@ -217,33 +217,33 @@ def convert_fs_errors(func):
|
|
def wrapper(*args,**kwds):
|
|
try:
|
|
return func(*args,**kwds)
|
|
- except ResourceNotFoundError, e:
|
|
+ except ResourceNotFoundError as e:
|
|
raise OSError(errno.ENOENT,str(e))
|
|
- except ParentDirectoryMissingError, e:
|
|
+ except ParentDirectoryMissingError as e:
|
|
if sys.platform == "win32":
|
|
raise OSError(errno.ESRCH,str(e))
|
|
else:
|
|
raise OSError(errno.ENOENT,str(e))
|
|
- except ResourceInvalidError, e:
|
|
+ except ResourceInvalidError as e:
|
|
raise OSError(errno.EINVAL,str(e))
|
|
- except PermissionDeniedError, e:
|
|
+ except PermissionDeniedError as e:
|
|
raise OSError(errno.EACCES,str(e))
|
|
- except ResourceLockedError, e:
|
|
+ except ResourceLockedError as e:
|
|
if sys.platform == "win32":
|
|
raise WindowsError(32,str(e))
|
|
else:
|
|
raise OSError(errno.EACCES,str(e))
|
|
- except DirectoryNotEmptyError, e:
|
|
+ except DirectoryNotEmptyError as e:
|
|
raise OSError(errno.ENOTEMPTY,str(e))
|
|
- except DestinationExistsError, e:
|
|
+ except DestinationExistsError as e:
|
|
raise OSError(errno.EEXIST,str(e))
|
|
- except StorageSpaceError, e:
|
|
+ except StorageSpaceError as e:
|
|
raise OSError(errno.ENOSPC,str(e))
|
|
- except RemoteConnectionError, e:
|
|
+ except RemoteConnectionError as e:
|
|
raise OSError(errno.ENETDOWN,str(e))
|
|
- except UnsupportedError, e:
|
|
+ except UnsupportedError as e:
|
|
raise OSError(errno.ENOSYS,str(e))
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
raise OSError(errno.EFAULT,str(e))
|
|
return wrapper
|
|
|
|
@@ -255,7 +255,7 @@ def convert_os_errors(func):
|
|
def wrapper(self,*args,**kwds):
|
|
try:
|
|
return func(self,*args,**kwds)
|
|
- except (OSError,IOError), e:
|
|
+ except (OSError,IOError) as e:
|
|
(exc_type,exc_inst,tb) = sys.exc_info()
|
|
path = getattr(e,"filename",None)
|
|
if path and path[0] == "/" and hasattr(self,"root_path"):
|
|
@@ -263,53 +263,53 @@ def convert_os_errors(func):
|
|
if isprefix(self.root_path,path):
|
|
path = path[len(self.root_path):]
|
|
if not hasattr(e,"errno") or not e.errno:
|
|
- raise OperationFailedError(opname,details=e),None,tb
|
|
+ raise OperationFailedError(opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENOENT:
|
|
- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.EFAULT:
|
|
# This can happen when listdir a directory that is deleted by another thread
|
|
# Best to interpret it as a resource not found
|
|
- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ESRCH:
|
|
- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENOTEMPTY:
|
|
- raise DirectoryNotEmptyError(path,opname=opname,details=e),None,tb
|
|
+ raise DirectoryNotEmptyError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.EEXIST:
|
|
- raise DestinationExistsError(path,opname=opname,details=e),None,tb
|
|
+ raise DestinationExistsError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == 183: # some sort of win32 equivalent to EEXIST
|
|
- raise DestinationExistsError(path,opname=opname,details=e),None,tb
|
|
+ raise DestinationExistsError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENOTDIR:
|
|
- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.EISDIR:
|
|
- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.EINVAL:
|
|
- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENOSPC:
|
|
- raise StorageSpaceError(opname,path=path,details=e),None,tb
|
|
+ raise StorageSpaceError(opname,path=path,details=e).with_traceback(tb)
|
|
if e.errno == errno.EPERM:
|
|
- raise PermissionDeniedError(opname,path=path,details=e),None,tb
|
|
+ raise PermissionDeniedError(opname,path=path,details=e).with_traceback(tb)
|
|
if hasattr(errno,"ENONET") and e.errno == errno.ENONET:
|
|
- raise RemoteConnectionError(opname,path=path,details=e),None,tb
|
|
+ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENETDOWN:
|
|
- raise RemoteConnectionError(opname,path=path,details=e),None,tb
|
|
+ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
|
|
if e.errno == errno.ECONNRESET:
|
|
- raise RemoteConnectionError(opname,path=path,details=e),None,tb
|
|
+ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
|
|
if e.errno == errno.EACCES:
|
|
if sys.platform == "win32":
|
|
if e.args[0] and e.args[0] == 32:
|
|
- raise ResourceLockedError(path,opname=opname,details=e),None,tb
|
|
- raise PermissionDeniedError(opname,details=e),None,tb
|
|
+ raise ResourceLockedError(path,opname=opname,details=e).with_traceback(tb)
|
|
+ raise PermissionDeniedError(opname,details=e).with_traceback(tb)
|
|
# Sometimes windows gives some random errors...
|
|
if sys.platform == "win32":
|
|
if e.errno in (13,):
|
|
- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
|
|
+ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENAMETOOLONG:
|
|
- raise PathError(path,details=e),None,tb
|
|
+ raise PathError(path,details=e).with_traceback(tb)
|
|
if e.errno == errno.EOPNOTSUPP:
|
|
- raise UnsupportedError(opname,details=e),None,tb
|
|
+ raise UnsupportedError(opname,details=e).with_traceback(tb)
|
|
if e.errno == errno.ENOSYS:
|
|
- raise UnsupportedError(opname,details=e),None,tb
|
|
- raise OperationFailedError(opname,details=e),None,tb
|
|
+ raise UnsupportedError(opname,details=e).with_traceback(tb)
|
|
+ raise OperationFailedError(opname,details=e).with_traceback(tb)
|
|
return wrapper
|
|
|
|
|
|
--- fs/expose/dokan/__init__.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/dokan/__init__.py
|
|
@@ -54,8 +54,8 @@ systems with Dokan installed.
|
|
# Copyright (c) 2009-2010, Cloud Matrix Pty. Ltd.
|
|
# All rights reserved; available under the terms of the MIT License.
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
import sys
|
|
|
|
import os
|
|
@@ -64,7 +64,7 @@ import errno
|
|
import time
|
|
import stat as statinfo
|
|
import subprocess
|
|
-import cPickle
|
|
+import pickle
|
|
import datetime
|
|
import ctypes
|
|
from collections import deque
|
|
@@ -76,7 +76,7 @@ from fs.local_functools import wraps
|
|
from fs.wrapfs import WrapFS
|
|
|
|
try:
|
|
- import libdokan
|
|
+ from . import libdokan
|
|
except (NotImplementedError, EnvironmentError, ImportError, NameError,):
|
|
is_available = False
|
|
sys.modules.pop("fs.expose.dokan.libdokan", None)
|
|
@@ -171,12 +171,12 @@ def handle_fs_errors(func):
|
|
def wrapper(*args,**kwds):
|
|
try:
|
|
res = func(*args,**kwds)
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
if e.errno:
|
|
res = -1 * _errno2syserrcode(e.errno)
|
|
else:
|
|
res = -1
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
raise
|
|
else:
|
|
if res is None:
|
|
@@ -424,7 +424,7 @@ class FSOperations(object):
|
|
info.contents.Context = 1
|
|
try:
|
|
f = self.fs.open(path, mode)
|
|
- print path, mode, repr(f)
|
|
+ print(path, mode, repr(f))
|
|
except ResourceInvalidError:
|
|
info.contents.IsDirectory = True
|
|
except FSError:
|
|
@@ -896,10 +896,10 @@ def mount(fs, drive, foreground=False, ready_callback=
|
|
def check_ready(mp=None):
|
|
if ready_callback is not False:
|
|
check_alive(mp)
|
|
- for _ in xrange(100):
|
|
+ for _ in range(100):
|
|
try:
|
|
os.stat(drive+":\\")
|
|
- except EnvironmentError, e:
|
|
+ except EnvironmentError as e:
|
|
check_alive(mp)
|
|
time.sleep(0.05)
|
|
else:
|
|
@@ -989,7 +989,7 @@ class MountProcess(subprocess.Popen):
|
|
cmd = cmd + "data = cPickle.loads(%s); "
|
|
cmd = cmd + "from fs.expose.dokan import MountProcess; "
|
|
cmd = cmd + "MountProcess._do_mount(data)"
|
|
- cmd = cmd % (repr(cPickle.dumps((fs,drive,dokan_opts,nowait),-1)),)
|
|
+ cmd = cmd % (repr(pickle.dumps((fs,drive,dokan_opts,nowait),-1)),)
|
|
cmd = [sys.executable,"-c",cmd]
|
|
super(MountProcess,self).__init__(cmd,**kwds)
|
|
|
|
--- fs/expose/ftp.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/ftp.py
|
|
@@ -28,7 +28,7 @@ from fs.osfs import OSFS
|
|
from fs.errors import convert_fs_errors
|
|
from fs import iotools
|
|
|
|
-from six import text_type as unicode
|
|
+from six import text_type as str
|
|
|
|
|
|
# Get these once so we can reuse them:
|
|
@@ -107,9 +107,9 @@ class FTPFS(ftpserver.AbstractedFS):
|
|
def chdir(self, path):
|
|
# We dont' use the decorator here, we actually decode a version of the
|
|
# path for use with pyfs, but keep the original for use with pyftpdlib.
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
# pyftpdlib 0.7.x
|
|
- unipath = unicode(path, self.encoding)
|
|
+ unipath = str(path, self.encoding)
|
|
else:
|
|
# pyftpdlib 1.x
|
|
unipath = path
|
|
@@ -134,7 +134,7 @@ class FTPFS(ftpserver.AbstractedFS):
|
|
@convert_fs_errors
|
|
@decode_args
|
|
def listdir(self, path):
|
|
- return map(lambda x: x.encode(self.encoding), self.fs.listdir(path))
|
|
+ return [x.encode(self.encoding) for x in self.fs.listdir(path)]
|
|
|
|
@convert_fs_errors
|
|
@decode_args
|
|
@@ -190,7 +190,7 @@ class FTPFS(ftpserver.AbstractedFS):
|
|
kwargs['st_mode'] = info['mode']
|
|
else:
|
|
# Otherwise, build one. Not executable by default.
|
|
- mode = 0660
|
|
+ mode = 0o660
|
|
# Merge in the type (dir or file). File is tested first, some file systems
|
|
# such as ArchiveMountFS treat archive files as directories too. By checking
|
|
# file first, any such files will be only files (not directories).
|
|
@@ -198,7 +198,7 @@ class FTPFS(ftpserver.AbstractedFS):
|
|
mode |= stat.S_IFREG
|
|
elif self.fs.isdir(path):
|
|
mode |= stat.S_IFDIR
|
|
- mode |= 0110 # Merge in exec bit to signal dir is listable
|
|
+ mode |= 0o110 # Merge in exec bit to signal dir is listable
|
|
kwargs['st_mode'] = mode
|
|
return FakeStat(**kwargs)
|
|
|
|
--- fs/expose/fuse/__init__.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/fuse/__init__.py
|
|
@@ -56,7 +56,7 @@ import errno
|
|
import time
|
|
import stat as statinfo
|
|
import subprocess
|
|
-import cPickle
|
|
+import pickle
|
|
|
|
import logging
|
|
logger = logging.getLogger("fs.expose.fuse")
|
|
@@ -404,9 +404,9 @@ class FSOperations(Operations):
|
|
# The interesting stuff
|
|
if 'st_mode' not in info:
|
|
if self.fs.isdir(path):
|
|
- info['st_mode'] = 0755
|
|
+ info['st_mode'] = 0o755
|
|
else:
|
|
- info['st_mode'] = 0666
|
|
+ info['st_mode'] = 0o666
|
|
mode = info['st_mode']
|
|
if not statinfo.S_ISDIR(mode) and not statinfo.S_ISREG(mode):
|
|
if self.fs.isdir(path):
|
|
@@ -432,7 +432,7 @@ class FSOperations(Operations):
|
|
except KeyError:
|
|
pass
|
|
else:
|
|
- info["st_size"] = max(written_sizes.values() + [info["st_size"]])
|
|
+ info["st_size"] = max(list(written_sizes.values()) + [info["st_size"]])
|
|
return info
|
|
|
|
|
|
@@ -491,7 +491,7 @@ def unmount(path):
|
|
else:
|
|
args = ["fusermount", "-u", path]
|
|
|
|
- for num_tries in xrange(3):
|
|
+ for num_tries in range(3):
|
|
p = subprocess.Popen(args,
|
|
stderr=subprocess.PIPE,
|
|
stdout=subprocess.PIPE)
|
|
@@ -554,7 +554,7 @@ class MountProcess(subprocess.Popen):
|
|
cmd = cmd + 'data = loads(%s); '
|
|
cmd = cmd + 'from fs.expose.fuse import MountProcess; '
|
|
cmd = cmd + 'MountProcess._do_mount_nowait(data)'
|
|
- cmd = cmd % (repr(cPickle.dumps((fs, path, fuse_opts), -1)),)
|
|
+ cmd = cmd % (repr(pickle.dumps((fs, path, fuse_opts), -1)),)
|
|
cmd = [sys.executable, "-c", cmd]
|
|
super(MountProcess, self).__init__(cmd, **kwds)
|
|
else:
|
|
@@ -567,7 +567,7 @@ class MountProcess(subprocess.Popen):
|
|
cmd = cmd + 'data = loads(%s); '
|
|
cmd = cmd + 'from fs.expose.fuse import MountProcess; '
|
|
cmd = cmd + 'MountProcess._do_mount_wait(data)'
|
|
- cmd = cmd % (repr(cPickle.dumps((fs, path, fuse_opts, r, w), -1)),)
|
|
+ cmd = cmd % (repr(pickle.dumps((fs, path, fuse_opts, r, w), -1)),)
|
|
cmd = [sys.executable, "-c", cmd]
|
|
super(MountProcess, self).__init__(cmd, **kwds)
|
|
os.close(w)
|
|
@@ -635,8 +635,8 @@ class MountProcess(subprocess.Popen):
|
|
opts["unmount_callback"] = unmount_callback
|
|
try:
|
|
mount(fs, path, **opts)
|
|
- except Exception, e:
|
|
- os.write(w, b("E") + unicode(e).encode('ascii', errors='replace'))
|
|
+ except Exception as e:
|
|
+ os.write(w, b("E") + str(e).encode('ascii', errors='replace'))
|
|
os.close(w)
|
|
|
|
if not successful:
|
|
@@ -653,5 +653,5 @@ if __name__ == "__main__":
|
|
os.makedirs(mount_point)
|
|
|
|
def ready_callback():
|
|
- print "READY"
|
|
+ print("READY")
|
|
mount(TempFS(), mount_point, foreground=True, ready_callback=ready_callback)
|
|
--- fs/expose/fuse/fuse_ctypes.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/fuse/fuse_ctypes.py
|
|
@@ -12,8 +12,8 @@
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
-from __future__ import division
|
|
|
|
+
|
|
from ctypes import *
|
|
from ctypes.util import find_library
|
|
from errno import *
|
|
@@ -273,7 +273,7 @@ def time_of_timespec(ts):
|
|
return ts.tv_sec + ts.tv_nsec / 10 ** 9
|
|
|
|
def set_st_attrs(st, attrs):
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if key in ('st_atime', 'st_mtime', 'st_ctime'):
|
|
timespec = getattr(st, key + 'spec')
|
|
timespec.tv_sec = int(val)
|
|
@@ -314,7 +314,7 @@ class FUSE(object):
|
|
kwargs.setdefault('fsname', operations.__class__.__name__)
|
|
args.append('-o')
|
|
args.append(','.join(key if val == True else '%s=%s' % (key, val)
|
|
- for key, val in kwargs.items()))
|
|
+ for key, val in list(kwargs.items())))
|
|
args.append(mountpoint)
|
|
argv = (c_char_p * len(args))(*args)
|
|
|
|
@@ -331,7 +331,7 @@ class FUSE(object):
|
|
"""Decorator for the methods that follow"""
|
|
try:
|
|
return func(*args, **kwargs) or 0
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
return -(e.errno or EFAULT)
|
|
except:
|
|
print_exc()
|
|
@@ -400,7 +400,7 @@ class FUSE(object):
|
|
def statfs(self, path, buf):
|
|
stv = buf.contents
|
|
attrs = self.operations('statfs', path)
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if hasattr(stv, key):
|
|
setattr(stv, key, val)
|
|
return 0
|
|
@@ -576,7 +576,7 @@ class Operations(object):
|
|
|
|
if path != '/':
|
|
raise OSError(ENOENT, '')
|
|
- return dict(st_mode=(S_IFDIR | 0755), st_nlink=2)
|
|
+ return dict(st_mode=(S_IFDIR | 0o755), st_nlink=2)
|
|
|
|
def getxattr(self, path, name, position=0):
|
|
raise OSError(ENOTSUP, '')
|
|
@@ -667,13 +667,13 @@ class Operations(object):
|
|
|
|
class LoggingMixIn:
|
|
def __call__(self, op, path, *args):
|
|
- print '->', op, path, repr(args)
|
|
+ print('->', op, path, repr(args))
|
|
ret = '[Unknown Error]'
|
|
try:
|
|
ret = getattr(self, op)(path, *args)
|
|
return ret
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
ret = str(e)
|
|
raise
|
|
finally:
|
|
- print '<-', op, repr(ret)
|
|
+ print('<-', op, repr(ret))
|
|
--- fs/expose/fuse/fuse.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/fuse/fuse.py
|
|
@@ -12,8 +12,8 @@
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
-from __future__ import division
|
|
|
|
+
|
|
from ctypes import *
|
|
from ctypes.util import find_library
|
|
from errno import *
|
|
@@ -269,7 +269,7 @@ def time_of_timespec(ts):
|
|
return ts.tv_sec + ts.tv_nsec / 10 ** 9
|
|
|
|
def set_st_attrs(st, attrs):
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if key in ('st_atime', 'st_mtime', 'st_ctime'):
|
|
timespec = getattr(st, key + 'spec')
|
|
timespec.tv_sec = int(val)
|
|
@@ -312,7 +312,7 @@ class FUSE(object):
|
|
kwargs.setdefault('fsname', operations.__class__.__name__)
|
|
args.append('-o')
|
|
args.append(','.join(key if val == True else '%s=%s' % (key, val)
|
|
- for key, val in kwargs.items()))
|
|
+ for key, val in list(kwargs.items())))
|
|
args.append(mountpoint)
|
|
argv = (c_char_p * len(args))(*args)
|
|
|
|
@@ -331,7 +331,7 @@ class FUSE(object):
|
|
"""Decorator for the methods that follow"""
|
|
try:
|
|
return func(*args, **kwargs) or 0
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
return -(e.errno or EFAULT)
|
|
except:
|
|
print_exc()
|
|
@@ -406,7 +406,7 @@ class FUSE(object):
|
|
def statfs(self, path, buf):
|
|
stv = buf.contents
|
|
attrs = self.operations('statfs', path)
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if hasattr(stv, key):
|
|
setattr(stv, key, val)
|
|
return 0
|
|
@@ -579,7 +579,7 @@ class Operations(object):
|
|
|
|
if path != '/':
|
|
raise FuseOSError(ENOENT)
|
|
- return dict(st_mode=(S_IFDIR | 0755), st_nlink=2)
|
|
+ return dict(st_mode=(S_IFDIR | 0o755), st_nlink=2)
|
|
|
|
def getxattr(self, path, name, position=0):
|
|
raise FuseOSError(ENOTSUP)
|
|
@@ -670,13 +670,13 @@ class Operations(object):
|
|
|
|
class LoggingMixIn:
|
|
def __call__(self, op, path, *args):
|
|
- print '->', op, path, repr(args)
|
|
+ print('->', op, path, repr(args))
|
|
ret = '[Unhandled Exception]'
|
|
try:
|
|
ret = getattr(self, op)(path, *args)
|
|
return ret
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
ret = str(e)
|
|
raise
|
|
finally:
|
|
- print '<-', op, repr(ret)
|
|
+ print('<-', op, repr(ret))
|
|
--- fs/expose/fuse/fuse3.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/expose/fuse/fuse3.py
|
|
@@ -229,7 +229,7 @@ def time_of_timespec(ts):
|
|
return ts.tv_sec + ts.tv_nsec / 10 ** 9
|
|
|
|
def set_st_attrs(st, attrs):
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if key in ('st_atime', 'st_mtime', 'st_ctime'):
|
|
timespec = getattr(st, key + 'spec')
|
|
timespec.tv_sec = int(val)
|
|
@@ -274,7 +274,7 @@ class FUSE(object):
|
|
kwargs.setdefault('fsname', operations.__class__.__name__)
|
|
args.append('-o')
|
|
args.append(','.join(key if val == True else '%s=%s' % (key, val)
|
|
- for key, val in kwargs.items()))
|
|
+ for key, val in list(kwargs.items())))
|
|
args.append(mountpoint)
|
|
argv = (c_char_p * len(args))(*args)
|
|
|
|
@@ -361,7 +361,7 @@ class FUSE(object):
|
|
def statfs(self, path, buf):
|
|
stv = buf.contents
|
|
attrs = self.operations('statfs', path)
|
|
- for key, val in attrs.items():
|
|
+ for key, val in list(attrs.items()):
|
|
if hasattr(stv, key):
|
|
setattr(stv, key, val)
|
|
return 0
|
|
--- fs/expose/http.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/http.py
|
|
@@ -1,13 +1,13 @@
|
|
__all__ = ["serve_fs"]
|
|
|
|
-import SimpleHTTPServer
|
|
-import SocketServer
|
|
+import http.server
|
|
+import socketserver
|
|
from fs.path import pathjoin, dirname
|
|
from fs.errors import FSError
|
|
from time import mktime
|
|
-from cStringIO import StringIO
|
|
+from io import StringIO
|
|
import cgi
|
|
-import urllib
|
|
+import urllib.request, urllib.parse, urllib.error
|
|
import posixpath
|
|
import time
|
|
import threading
|
|
@@ -16,13 +16,13 @@ import socket
|
|
def _datetime_to_epoch(d):
|
|
return mktime(d.timetuple())
|
|
|
|
-class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|
+class FSHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
|
|
|
|
"""A hacked together version of SimpleHTTPRequestHandler"""
|
|
|
|
def __init__(self, fs, request, client_address, server):
|
|
self._fs = fs
|
|
- SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, request, client_address, server)
|
|
+ http.server.SimpleHTTPRequestHandler.__init__(self, request, client_address, server)
|
|
|
|
def do_GET(self):
|
|
"""Serve a GET request."""
|
|
@@ -69,7 +69,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
|
|
try:
|
|
info = self._fs.getinfo(path)
|
|
f = self._fs.open(path, 'rb')
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
self.send_error(404, str(e))
|
|
return None
|
|
self.send_response(200)
|
|
@@ -98,7 +98,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
|
|
paths = [p+'/' for p in sorted(dir_paths, key=lambda p:p.lower())] + sorted(file_paths, key=lambda p:p.lower())
|
|
#list.sort(key=lambda a: a.lower())
|
|
f = StringIO()
|
|
- displaypath = cgi.escape(urllib.unquote(self.path))
|
|
+ displaypath = cgi.escape(urllib.parse.unquote(self.path))
|
|
f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
|
|
f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath)
|
|
f.write("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath)
|
|
@@ -106,11 +106,11 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
|
|
|
|
parent = dirname(path)
|
|
if path != parent:
|
|
- f.write('<li><a href="%s">../</a></li>' % urllib.quote(parent.rstrip('/') + '/'))
|
|
+ f.write('<li><a href="%s">../</a></li>' % urllib.parse.quote(parent.rstrip('/') + '/'))
|
|
|
|
for path in paths:
|
|
f.write('<li><a href="%s">%s</a>\n'
|
|
- % (urllib.quote(path), cgi.escape(path)))
|
|
+ % (urllib.parse.quote(path), cgi.escape(path)))
|
|
f.write("</ul>\n<hr>\n</body>\n</html>\n")
|
|
length = f.tell()
|
|
f.seek(0)
|
|
@@ -124,7 +124,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
|
|
# abandon query parameters
|
|
path = path.split('?',1)[0]
|
|
path = path.split('#',1)[0]
|
|
- path = posixpath.normpath(urllib.unquote(path))
|
|
+ path = posixpath.normpath(urllib.parse.unquote(path))
|
|
return path
|
|
|
|
|
|
@@ -143,7 +143,7 @@ def serve_fs(fs, address='', port=8000):
|
|
|
|
#class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
|
# pass
|
|
- httpd = SocketServer.TCPServer((address, port), Handler, bind_and_activate=False)
|
|
+ httpd = socketserver.TCPServer((address, port), Handler, bind_and_activate=False)
|
|
#httpd = ThreadedTCPServer((address, port), Handler, bind_and_activate=False)
|
|
httpd.allow_reuse_address = True
|
|
httpd.server_bind()
|
|
--- fs/expose/importhook.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/importhook.py
|
|
@@ -60,7 +60,7 @@ class FSImportHook(object):
|
|
def __init__(self,fs_or_url):
|
|
# If given a string, try to open it as an FS url.
|
|
# Don't open things on the local filesystem though.
|
|
- if isinstance(fs_or_url,basestring):
|
|
+ if isinstance(fs_or_url,str):
|
|
if ":/" not in fs_or_url:
|
|
raise ImportError
|
|
try:
|
|
@@ -182,7 +182,7 @@ class FSImportHook(object):
|
|
mod.__loader__ = self
|
|
sys.modules[fullname] = mod
|
|
try:
|
|
- exec code in mod.__dict__
|
|
+ exec(code, mod.__dict__)
|
|
mod.__file__ = self.get_filename(fullname,info)
|
|
if self.is_package(fullname,info):
|
|
if self.path is None:
|
|
@@ -231,7 +231,7 @@ class FSImportHook(object):
|
|
"""Read the specified data file."""
|
|
try:
|
|
return self.fs.getcontents(path, 'rb')
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
raise IOError(str(e))
|
|
|
|
def get_filename(self,fullname,info=None):
|
|
--- fs/expose/sftp.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/sftp.py
|
|
@@ -24,12 +24,12 @@ is, you probably don't want to use it.
|
|
|
|
"""
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
import os
|
|
import stat as statinfo
|
|
import time
|
|
-import SocketServer
|
|
+import socketserver
|
|
import threading
|
|
|
|
import paramiko
|
|
@@ -73,11 +73,11 @@ def report_sftp_errors(func):
|
|
def wrapper(*args,**kwds):
|
|
try:
|
|
return func(*args, **kwds)
|
|
- except ResourceNotFoundError, e:
|
|
+ except ResourceNotFoundError as e:
|
|
return paramiko.SFTP_NO_SUCH_FILE
|
|
- except UnsupportedError, e:
|
|
+ except UnsupportedError as e:
|
|
return paramiko.SFTP_OP_UNSUPPORTED
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
return paramiko.SFTP_FAILURE
|
|
return wrapper
|
|
|
|
@@ -114,7 +114,7 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
|
|
|
|
@report_sftp_errors
|
|
def list_folder(self, path):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
stats = []
|
|
for entry in self.fs.listdir(path, absolute=True):
|
|
@@ -125,7 +125,7 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
|
|
|
|
@report_sftp_errors
|
|
def stat(self, path):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
|
|
info = self.fs.getinfo(path)
|
|
@@ -146,9 +146,9 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
|
|
stat.st_mtime = time.mktime(info.get("modified_time").timetuple())
|
|
|
|
if isdir(self.fs, path, info):
|
|
- stat.st_mode = 0777 | statinfo.S_IFDIR
|
|
+ stat.st_mode = 0o777 | statinfo.S_IFDIR
|
|
else:
|
|
- stat.st_mode = 0777 | statinfo.S_IFREG
|
|
+ stat.st_mode = 0o777 | statinfo.S_IFREG
|
|
return stat
|
|
|
|
def lstat(self, path):
|
|
@@ -156,16 +156,16 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
|
|
|
|
@report_sftp_errors
|
|
def remove(self, path):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
self.fs.remove(path)
|
|
return paramiko.SFTP_OK
|
|
|
|
@report_sftp_errors
|
|
def rename(self, oldpath, newpath):
|
|
- if not isinstance(oldpath, unicode):
|
|
+ if not isinstance(oldpath, str):
|
|
oldpath = oldpath.decode(self.encoding)
|
|
- if not isinstance(newpath, unicode):
|
|
+ if not isinstance(newpath, str):
|
|
newpath = newpath.decode(self.encoding)
|
|
if self.fs.isfile(oldpath):
|
|
self.fs.move(oldpath, newpath)
|
|
@@ -175,14 +175,14 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
|
|
|
|
@report_sftp_errors
|
|
def mkdir(self, path, attr):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
self.fs.makedir(path)
|
|
return paramiko.SFTP_OK
|
|
|
|
@report_sftp_errors
|
|
def rmdir(self, path):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
self.fs.removedir(path)
|
|
return paramiko.SFTP_OK
|
|
@@ -224,7 +224,7 @@ class SFTPHandle(paramiko.SFTPHandle):
|
|
super(SFTPHandle, self).__init__(flags)
|
|
mode = flags_to_mode(flags)
|
|
self.owner = owner
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.owner.encoding)
|
|
self.path = path
|
|
self._file = owner.fs.open(path, mode)
|
|
@@ -263,7 +263,7 @@ class SFTPServer(paramiko.SFTPServer):
|
|
super(SFTPServer, self).finish_subsystem()
|
|
|
|
|
|
-class SFTPRequestHandler(SocketServer.BaseRequestHandler):
|
|
+class SFTPRequestHandler(socketserver.BaseRequestHandler):
|
|
"""SocketServer RequestHandler subclass for BaseSFTPServer.
|
|
|
|
This RequestHandler subclass creates a paramiko Transport, sets up the
|
|
@@ -305,7 +305,7 @@ class SFTPRequestHandler(SocketServer.BaseRequestHandl
|
|
|
|
|
|
|
|
-class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
|
+class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
|
pass
|
|
|
|
|
|
@@ -334,7 +334,7 @@ class BaseSFTPServer(ThreadedTCPServer):
|
|
self.host_key = host_key
|
|
if RequestHandlerClass is None:
|
|
RequestHandlerClass = SFTPRequestHandler
|
|
- SocketServer.TCPServer.__init__(self, address, RequestHandlerClass)
|
|
+ socketserver.TCPServer.__init__(self, address, RequestHandlerClass)
|
|
|
|
def shutdown_request(self, request):
|
|
# Prevent TCPServer from closing the connection prematurely
|
|
--- fs/expose/wsgi/__init__.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/expose/wsgi/__init__.py
|
|
@@ -1 +1 @@
|
|
-from wsgi import serve_fs
|
|
+from .wsgi import serve_fs
|
|
--- fs/expose/wsgi/serve_home.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/wsgi/serve_home.py
|
|
@@ -1,10 +1,10 @@
|
|
from wsgiref.simple_server import make_server
|
|
|
|
from fs.osfs import OSFS
|
|
-from wsgi import serve_fs
|
|
+from .wsgi import serve_fs
|
|
osfs = OSFS('~/')
|
|
application = serve_fs(osfs)
|
|
|
|
httpd = make_server('', 8000, application)
|
|
-print "Serving on http://127.0.0.1:8000"
|
|
+print("Serving on http://127.0.0.1:8000")
|
|
httpd.serve_forever()
|
|
--- fs/expose/wsgi/wsgi.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/expose/wsgi/wsgi.py
|
|
@@ -1,5 +1,5 @@
|
|
|
|
-import urlparse
|
|
+import urllib.parse
|
|
import mimetypes
|
|
|
|
from fs.errors import FSError
|
|
@@ -10,7 +10,7 @@ from datetime import datetime
|
|
try:
|
|
from mako.template import Template
|
|
except ImportError:
|
|
- print "Requires mako templates http://www.makotemplates.org/"
|
|
+ print("Requires mako templates http://www.makotemplates.org/")
|
|
raise
|
|
|
|
|
|
@@ -28,7 +28,7 @@ class WSGIServer(object):
|
|
def __init__(self, serve_fs, indexes=True, dir_template=None, chunk_size=16*1024*1024):
|
|
|
|
if dir_template is None:
|
|
- from dirtemplate import template as dir_template
|
|
+ from .dirtemplate import template as dir_template
|
|
|
|
self.serve_fs = serve_fs
|
|
self.indexes = indexes
|
|
@@ -57,7 +57,7 @@ class WSGIServer(object):
|
|
serving_file = None
|
|
try:
|
|
serving_file = self.serve_fs.open(path, 'rb')
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
if serving_file is not None:
|
|
serving_file.close()
|
|
return self.serve_500(request, str(e))
|
|
--- fs/expose/xmlrpc.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/expose/xmlrpc.py
|
|
@@ -15,8 +15,8 @@ an FS object, which can then be exposed using whatever
|
|
|
|
"""
|
|
|
|
-import xmlrpclib
|
|
-from SimpleXMLRPCServer import SimpleXMLRPCServer
|
|
+import xmlrpc.client
|
|
+from xmlrpc.server import SimpleXMLRPCServer
|
|
from datetime import datetime
|
|
import base64
|
|
|
|
@@ -61,13 +61,13 @@ class RPCFSInterface(object):
|
|
|
|
def getmeta(self, meta_name):
|
|
meta = self.fs.getmeta(meta_name)
|
|
- if isinstance(meta, basestring):
|
|
+ if isinstance(meta, str):
|
|
meta = self.decode_path(meta)
|
|
return meta
|
|
|
|
def getmeta_default(self, meta_name, default):
|
|
meta = self.fs.getmeta(meta_name, default)
|
|
- if isinstance(meta, basestring):
|
|
+ if isinstance(meta, str):
|
|
meta = self.decode_path(meta)
|
|
return meta
|
|
|
|
@@ -77,7 +77,7 @@ class RPCFSInterface(object):
|
|
def get_contents(self, path, mode="rb"):
|
|
path = self.decode_path(path)
|
|
data = self.fs.getcontents(path, mode)
|
|
- return xmlrpclib.Binary(data)
|
|
+ return xmlrpc.client.Binary(data)
|
|
|
|
def set_contents(self, path, data):
|
|
path = self.decode_path(path)
|
|
@@ -119,16 +119,16 @@ class RPCFSInterface(object):
|
|
|
|
def settimes(self, path, accessed_time, modified_time):
|
|
path = self.decode_path(path)
|
|
- if isinstance(accessed_time, xmlrpclib.DateTime):
|
|
+ if isinstance(accessed_time, xmlrpc.client.DateTime):
|
|
accessed_time = datetime.strptime(accessed_time.value, "%Y%m%dT%H:%M:%S")
|
|
- if isinstance(modified_time, xmlrpclib.DateTime):
|
|
+ if isinstance(modified_time, xmlrpc.client.DateTime):
|
|
modified_time = datetime.strptime(modified_time.value, "%Y%m%dT%H:%M:%S")
|
|
return self.fs.settimes(path, accessed_time, modified_time)
|
|
|
|
def getinfo(self, path):
|
|
path = self.decode_path(path)
|
|
info = self.fs.getinfo(path)
|
|
- info = dict((k, v) for k, v in info.iteritems()
|
|
+ info = dict((k, v) for k, v in info.items()
|
|
if k in self._allowed_info)
|
|
return info
|
|
|
|
--- fs/filelike.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/filelike.py
|
|
@@ -52,9 +52,9 @@ if PY3:
|
|
from six import BytesIO as _StringIO
|
|
else:
|
|
try:
|
|
- from cStringIO import StringIO as _StringIO
|
|
+ from io import StringIO as _StringIO
|
|
except ImportError:
|
|
- from StringIO import StringIO as _StringIO
|
|
+ from io import StringIO as _StringIO
|
|
|
|
|
|
class FileLikeBase(object):
|
|
@@ -305,7 +305,7 @@ class FileLikeBase(object):
|
|
self.close()
|
|
return False
|
|
|
|
- def next(self):
|
|
+ def __next__(self):
|
|
"""next() method complying with the iterator protocol.
|
|
|
|
File-like objects are their own iterators, with each call to
|
|
--- fs/ftpfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/ftpfs.py
|
|
@@ -37,9 +37,9 @@ if PY3:
|
|
from six import BytesIO as StringIO
|
|
else:
|
|
try:
|
|
- from cStringIO import StringIO
|
|
+ from io import StringIO
|
|
except ImportError:
|
|
- from StringIO import StringIO
|
|
+ from io import StringIO
|
|
|
|
import time
|
|
|
|
@@ -221,10 +221,10 @@ class FTPListDataParser(object):
|
|
elif c == 'r':
|
|
result.try_retr = True
|
|
elif c == 's':
|
|
- result.size = long(buf[i+1:j])
|
|
+ result.size = int(buf[i+1:j])
|
|
elif c == 'm':
|
|
result.mtime_type = MTIME_TYPE.LOCAL
|
|
- result.mtime = long(buf[i+1:j])
|
|
+ result.mtime = int(buf[i+1:j])
|
|
elif c == 'i':
|
|
result.id_type = ID_TYPE.FULL
|
|
result.id = buf[i+1:j-i-1]
|
|
@@ -285,7 +285,7 @@ class FTPListDataParser(object):
|
|
|
|
elif state == 4: # getting tentative size
|
|
try:
|
|
- size = long(buf[i:j])
|
|
+ size = int(buf[i:j])
|
|
except ValueError:
|
|
pass
|
|
state = 5
|
|
@@ -295,25 +295,25 @@ class FTPListDataParser(object):
|
|
if month >= 0:
|
|
state = 6
|
|
else:
|
|
- size = long(buf[i:j])
|
|
+ size = int(buf[i:j])
|
|
|
|
elif state == 6: # have size and month
|
|
- mday = long(buf[i:j])
|
|
+ mday = int(buf[i:j])
|
|
state = 7
|
|
|
|
elif state == 7: # have size, month, mday
|
|
if (j - i == 4) and (buf[i+1] == ':'):
|
|
- hour = long(buf[i])
|
|
- minute = long(buf[i+2:i+4])
|
|
+ hour = int(buf[i])
|
|
+ minute = int(buf[i+2:i+4])
|
|
result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
|
|
result.mtime = self._guess_time(month, mday, hour, minute)
|
|
elif (j - i == 5) and (buf[i+2] == ':'):
|
|
- hour = long(buf[i:i+2])
|
|
- minute = long(buf[i+3:i+5])
|
|
+ hour = int(buf[i:i+2])
|
|
+ minute = int(buf[i+3:i+5])
|
|
result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
|
|
result.mtime = self._guess_time(month, mday, hour, minute)
|
|
elif j - i >= 4:
|
|
- year = long(buf[i:j])
|
|
+ year = int(buf[i:j])
|
|
result.mtime_type = MTIME_TYPE.REMOTE_DAY
|
|
result.mtime = self._get_mtime(year, month, mday)
|
|
else:
|
|
@@ -379,7 +379,7 @@ class FTPListDataParser(object):
|
|
j = i
|
|
|
|
j = buf.index('-', j)
|
|
- mday = long(buf[i:j])
|
|
+ mday = int(buf[i:j])
|
|
|
|
j = _skip(buf, j, '-')
|
|
i = j
|
|
@@ -391,13 +391,13 @@ class FTPListDataParser(object):
|
|
j = _skip(buf, j, '-')
|
|
i = j
|
|
j = buf.index(' ', j)
|
|
- year = long(buf[i:j])
|
|
+ year = int(buf[i:j])
|
|
|
|
j = _skip(buf, j, ' ')
|
|
i = j
|
|
|
|
j = buf.index(':', j)
|
|
- hour = long(buf[i:j])
|
|
+ hour = int(buf[i:j])
|
|
j = _skip(buf, j, ':')
|
|
i = j
|
|
|
|
@@ -406,7 +406,7 @@ class FTPListDataParser(object):
|
|
if j == buflen:
|
|
raise IndexError # abort, abort!
|
|
|
|
- minute = long(buf[i:j])
|
|
+ minute = int(buf[i:j])
|
|
|
|
result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
|
|
result.mtime = self._get_mtime(year, month, mday, hour, minute)
|
|
@@ -430,17 +430,17 @@ class FTPListDataParser(object):
|
|
result = FTPListData(buf)
|
|
|
|
j = buf.index('-', j)
|
|
- month = long(buf[i:j])
|
|
+ month = int(buf[i:j])
|
|
|
|
j = _skip(buf, j, '-')
|
|
i = j
|
|
j = buf.index('-', j)
|
|
- mday = long(buf[i:j])
|
|
+ mday = int(buf[i:j])
|
|
|
|
j = _skip(buf, j, '-')
|
|
i = j
|
|
j = buf.index(' ', j)
|
|
- year = long(buf[i:j])
|
|
+ year = int(buf[i:j])
|
|
if year < 50:
|
|
year += 2000
|
|
if year < 1000:
|
|
@@ -449,14 +449,14 @@ class FTPListDataParser(object):
|
|
j = _skip(buf, j, ' ')
|
|
i = j
|
|
j = buf.index(':', j)
|
|
- hour = long(buf[i:j])
|
|
+ hour = int(buf[i:j])
|
|
j = _skip(buf, j, ':')
|
|
i = j
|
|
while not (buf[j] in 'AP'):
|
|
j += 1
|
|
if j == buflen:
|
|
raise IndexError
|
|
- minute = long(buf[i:j])
|
|
+ minute = int(buf[i:j])
|
|
|
|
if buf[j] == 'A':
|
|
j += 1
|
|
@@ -482,7 +482,7 @@ class FTPListDataParser(object):
|
|
i = j
|
|
j = buf.index(' ', j)
|
|
|
|
- result.size = long(buf[i:j])
|
|
+ result.size = int(buf[i:j])
|
|
result.try_retr = True
|
|
|
|
j = _skip(buf, j, ' ')
|
|
@@ -546,10 +546,10 @@ class FTPMlstDataParser(object):
|
|
int(factvalue[12:14]),
|
|
0, 0, 0))
|
|
elif factname == 'size':
|
|
- result.size = long(factvalue)
|
|
+ result.size = int(factvalue)
|
|
elif factname == 'sizd':
|
|
# some FTP servers report directory size with sizd
|
|
- result.size = long(factvalue)
|
|
+ result.size = int(factvalue)
|
|
elif factname == 'type':
|
|
if factvalue.lower() == 'file':
|
|
result.try_retr = True
|
|
@@ -605,7 +605,7 @@ def fileftperrors(f):
|
|
try:
|
|
try:
|
|
ret = f(self, *args, **kwargs)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
self.ftpfs._translate_exception(args[0] if args else '', e)
|
|
finally:
|
|
self._lock.release()
|
|
@@ -795,16 +795,16 @@ class _FTPFile(object):
|
|
self.conn.close()
|
|
self.conn = None
|
|
self.ftp.voidresp()
|
|
- except error_temp, error_perm:
|
|
+ except error_temp as error_perm:
|
|
pass
|
|
if self.ftp is not None:
|
|
try:
|
|
self.ftp.close()
|
|
- except error_temp, error_perm:
|
|
+ except error_temp as error_perm:
|
|
pass
|
|
self.closed = True
|
|
|
|
- def next(self):
|
|
+ def __next__(self):
|
|
return self.readline()
|
|
|
|
def readline(self, size=None):
|
|
@@ -823,7 +823,7 @@ def ftperrors(f):
|
|
try:
|
|
try:
|
|
ret = f(self, *args, **kwargs)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
self._translate_exception(args[0] if args else '', e)
|
|
finally:
|
|
self._leave_dircache()
|
|
@@ -834,7 +834,7 @@ def ftperrors(f):
|
|
|
|
|
|
def _encode(s):
|
|
- if isinstance(s, unicode):
|
|
+ if isinstance(s, str):
|
|
return s.encode('utf-8')
|
|
return s
|
|
|
|
@@ -956,7 +956,7 @@ class FTPFS(FS):
|
|
return features
|
|
|
|
def on_line(line):
|
|
- if not isinstance(line, unicode):
|
|
+ if not isinstance(line, str):
|
|
line = line.decode('utf-8')
|
|
info = parse_ftp_list_line(line, self.use_mlst)
|
|
if info:
|
|
@@ -986,7 +986,7 @@ class FTPFS(FS):
|
|
else: # Matrix FTP server has bug
|
|
on_line(list_line)
|
|
# if it's a dir, then we can send a MLSD
|
|
- if dirlist[dirlist.keys()[0]]['try_cwd']:
|
|
+ if dirlist[list(dirlist.keys())[0]]['try_cwd']:
|
|
dirlist = {}
|
|
self.ftp.retrlines("MLSD " + encoded_path, on_line)
|
|
else:
|
|
@@ -996,11 +996,11 @@ class FTPFS(FS):
|
|
self.dircache[path] = dirlist
|
|
|
|
def is_symlink(info):
|
|
- return info['try_retr'] and info['try_cwd'] and info.has_key('target')
|
|
+ return info['try_retr'] and info['try_cwd'] and 'target' in info
|
|
|
|
def resolve_symlink(linkpath):
|
|
linkinfo = self.getinfo(linkpath)
|
|
- if not linkinfo.has_key('resolved'):
|
|
+ if 'resolved' not in linkinfo:
|
|
linkinfo['resolved'] = linkpath
|
|
if is_symlink(linkinfo):
|
|
target = linkinfo['target']
|
|
@@ -1036,7 +1036,7 @@ class FTPFS(FS):
|
|
else:
|
|
dircache = self.dircache
|
|
paths = [normpath(abspath(path)) for path in paths]
|
|
- for cached_path in dircache.keys():
|
|
+ for cached_path in list(dircache.keys()):
|
|
for path in paths:
|
|
if isbase(cached_path, path):
|
|
dircache.pop(cached_path, None)
|
|
@@ -1083,7 +1083,7 @@ class FTPFS(FS):
|
|
else:
|
|
ftp.connect(self.host, self.port, self.timeout)
|
|
ftp.login(self.user, self.passwd, self.acct)
|
|
- except socket_error, e:
|
|
+ except socket_error as e:
|
|
raise RemoteConnectionError(str(e), details=e)
|
|
return ftp
|
|
|
|
@@ -1104,7 +1104,7 @@ class FTPFS(FS):
|
|
return '<FTPFS %s>' % self.host
|
|
|
|
def __unicode__(self):
|
|
- return u'<FTPFS %s>' % self.host
|
|
+ return '<FTPFS %s>' % self.host
|
|
|
|
@convert_os_errors
|
|
def _translate_exception(self, path, exception):
|
|
@@ -1225,7 +1225,7 @@ class FTPFS(FS):
|
|
raise ResourceNotFoundError(path)
|
|
if not self.isdir(path):
|
|
raise ResourceInvalidError(path)
|
|
- paths = self._readdir(path).keys()
|
|
+ paths = list(self._readdir(path).keys())
|
|
|
|
return self._listdir_helper(path, paths, wildcard, full, absolute, dirs_only, files_only)
|
|
|
|
@@ -1266,7 +1266,7 @@ class FTPFS(FS):
|
|
self.ftp.mkd(_encode(path))
|
|
except error_reply:
|
|
return
|
|
- except error_perm, e:
|
|
+ except error_perm as e:
|
|
if recursive or allow_recreate:
|
|
return
|
|
if str(e).split(' ', 1)[0]=='550':
|
|
@@ -1337,7 +1337,7 @@ class FTPFS(FS):
|
|
try:
|
|
self.refresh_dircache(dirname(src), dirname(dst))
|
|
self.ftp.rename(_encode(src), _encode(dst))
|
|
- except error_perm, exception:
|
|
+ except error_perm as exception:
|
|
code, message = str(exception).split(' ', 1)
|
|
if code == "550":
|
|
if not self.exists(dirname(dst)):
|
|
--- fs/httpfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/httpfs.py
|
|
@@ -10,8 +10,8 @@ from fs.path import normpath
|
|
from fs.errors import ResourceNotFoundError, UnsupportedError
|
|
from fs.filelike import FileWrapper
|
|
from fs import iotools
|
|
-
|
|
-from urllib2 import urlopen, URLError
|
|
+from urllib.request import urlopen
|
|
+from urllib.error import URLError
|
|
from datetime import datetime
|
|
|
|
|
|
@@ -50,9 +50,9 @@ class HTTPFS(FS):
|
|
url = self._make_url(path)
|
|
try:
|
|
f = urlopen(url)
|
|
- except URLError, e:
|
|
+ except URLError as e:
|
|
raise ResourceNotFoundError(path, details=e)
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
raise ResourceNotFoundError(path, details=e)
|
|
|
|
return FileWrapper(f)
|
|
--- fs/iotools.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/iotools.py
|
|
@@ -1,6 +1,6 @@
|
|
-from __future__ import unicode_literals
|
|
-from __future__ import print_function
|
|
|
|
+
|
|
+
|
|
from fs import SEEK_SET, SEEK_CUR, SEEK_END
|
|
|
|
import io
|
|
@@ -178,7 +178,7 @@ def make_bytes_io(data, encoding=None, errors=None):
|
|
if hasattr(data, 'mode') and 'b' in data.mode:
|
|
# It's already a binary file
|
|
return data
|
|
- if not isinstance(data, basestring):
|
|
+ if not isinstance(data, str):
|
|
# It's a file, but we don't know if its binary
|
|
# TODO: Is there a better way than reading the entire file?
|
|
data = data.read() or b''
|
|
--- fs/memoryfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/memoryfs.py
|
|
@@ -78,10 +78,10 @@ class MemoryFile(object):
|
|
return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
|
|
|
|
def __repr__(self):
|
|
- return u"<MemoryFile in %s %s>" % (self.memory_fs, self.path)
|
|
+ return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
|
|
|
|
def __unicode__(self):
|
|
- return u"<MemoryFile in %s %s>" % (self.memory_fs, self.path)
|
|
+ return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
|
|
|
|
def __del__(self):
|
|
if not self.closed:
|
|
@@ -101,7 +101,7 @@ class MemoryFile(object):
|
|
def next(self):
|
|
if 'r' not in self.mode and '+' not in self.mode:
|
|
raise IOError("File not open for reading")
|
|
- return self.mem_file.next()
|
|
+ return next(self.mem_file)
|
|
|
|
@seek_and_lock
|
|
def readline(self, *args, **kwargs):
|
|
@@ -218,7 +218,7 @@ class DirEntry(object):
|
|
if self.isfile():
|
|
return "<file %s>" % self.name
|
|
elif self.isdir():
|
|
- return "<dir %s>" % "".join("%s: %s" % (k, v.desc_contents()) for k, v in self.contents.iteritems())
|
|
+ return "<dir %s>" % "".join("%s: %s" % (k, v.desc_contents()) for k, v in self.contents.items())
|
|
|
|
def isdir(self):
|
|
return self.type == "dir"
|
|
@@ -559,10 +559,10 @@ class MemoryFS(FS):
|
|
raise ResourceNotFoundError(path)
|
|
if dir_entry.isfile():
|
|
raise ResourceInvalidError(path, msg="not a directory: %(path)s")
|
|
- paths = dir_entry.contents.keys()
|
|
+ paths = list(dir_entry.contents.keys())
|
|
for (i,p) in enumerate(paths):
|
|
- if not isinstance(p,unicode):
|
|
- paths[i] = unicode(p)
|
|
+ if not isinstance(p,str):
|
|
+ paths[i] = str(p)
|
|
return self._listdir_helper(path, paths, wildcard, full, absolute, dirs_only, files_only)
|
|
|
|
@synchronize
|
|
@@ -578,10 +578,10 @@ class MemoryFS(FS):
|
|
info['accessed_time'] = dir_entry.accessed_time
|
|
|
|
if dir_entry.isdir():
|
|
- info['st_mode'] = 0755 | stat.S_IFDIR
|
|
+ info['st_mode'] = 0o755 | stat.S_IFDIR
|
|
else:
|
|
info['size'] = len(dir_entry.data or b(''))
|
|
- info['st_mode'] = 0666 | stat.S_IFREG
|
|
+ info['st_mode'] = 0o666 | stat.S_IFREG
|
|
|
|
return info
|
|
|
|
@@ -671,12 +671,12 @@ class MemoryFS(FS):
|
|
@synchronize
|
|
def setxattr(self, path, key, value):
|
|
dir_entry = self._dir_entry(path)
|
|
- key = unicode(key)
|
|
+ key = str(key)
|
|
dir_entry.xattrs[key] = value
|
|
|
|
@synchronize
|
|
def getxattr(self, path, key, default=None):
|
|
- key = unicode(key)
|
|
+ key = str(key)
|
|
dir_entry = self._dir_entry(path)
|
|
return dir_entry.xattrs.get(key, default)
|
|
|
|
@@ -691,4 +691,4 @@ class MemoryFS(FS):
|
|
@synchronize
|
|
def listxattrs(self, path):
|
|
dir_entry = self._dir_entry(path)
|
|
- return dir_entry.xattrs.keys()
|
|
+ return list(dir_entry.xattrs.keys())
|
|
--- fs/mountfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/mountfs.py
|
|
@@ -61,7 +61,7 @@ class DirMount(object):
|
|
return "<DirMount %s, %s>" % (self.path, self.fs)
|
|
|
|
def __unicode__(self):
|
|
- return u"<DirMount %s, %s>" % (self.path, self.fs)
|
|
+ return "<DirMount %s, %s>" % (self.path, self.fs)
|
|
|
|
|
|
class FileMount(object):
|
|
@@ -90,12 +90,12 @@ class MountFS(FS):
|
|
self.mount_tree = PathMap()
|
|
|
|
def __str__(self):
|
|
- return "<%s [%s]>" % (self.__class__.__name__,self.mount_tree.items(),)
|
|
+ return "<%s [%s]>" % (self.__class__.__name__,list(self.mount_tree.items()),)
|
|
|
|
__repr__ = __str__
|
|
|
|
def __unicode__(self):
|
|
- return u"<%s [%s]>" % (self.__class__.__name__,self.mount_tree.items(),)
|
|
+ return "<%s [%s]>" % (self.__class__.__name__,list(self.mount_tree.items()),)
|
|
|
|
def _delegate(self, path):
|
|
path = abspath(normpath(path))
|
|
@@ -119,7 +119,7 @@ class MountFS(FS):
|
|
return self, "/", path
|
|
|
|
try:
|
|
- self.mount_tree.iternames(path).next()
|
|
+ next(self.mount_tree.iternames(path))
|
|
except StopIteration:
|
|
return None, None, None
|
|
else:
|
|
@@ -129,7 +129,7 @@ class MountFS(FS):
|
|
def close(self):
|
|
# Explicitly closes children if requested
|
|
if self.auto_close:
|
|
- for mount in self.mount_tree.itervalues():
|
|
+ for mount in self.mount_tree.values():
|
|
mount.fs.close()
|
|
# Free references (which may incidently call the close method of the child filesystems)
|
|
self.mount_tree.clear()
|
|
--- fs/multifs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/multifs.py
|
|
@@ -106,7 +106,7 @@ class MultiFS(FS):
|
|
|
|
@synchronize
|
|
def __unicode__(self):
|
|
- return u"<MultiFS: %s>" % ", ".join(unicode(fs) for fs in self.fs_sequence)
|
|
+ return "<MultiFS: %s>" % ", ".join(str(fs) for fs in self.fs_sequence)
|
|
|
|
def _get_priority(self, name):
|
|
return self.fs_priorities[name]
|
|
@@ -128,7 +128,7 @@ class MultiFS(FS):
|
|
|
|
def _priority_sort(self):
|
|
"""Sort filesystems by priority order"""
|
|
- priority_order = sorted(self.fs_lookup.keys(), key=lambda n: self.fs_priorities[n], reverse=True)
|
|
+ priority_order = sorted(list(self.fs_lookup.keys()), key=lambda n: self.fs_priorities[n], reverse=True)
|
|
self.fs_sequence = [self.fs_lookup[name] for name in priority_order]
|
|
|
|
@synchronize
|
|
@@ -214,7 +214,7 @@ class MultiFS(FS):
|
|
return self.writefs
|
|
for fs in self:
|
|
if fs.exists(path):
|
|
- for fs_name, fs_object in self.fs_lookup.iteritems():
|
|
+ for fs_name, fs_object in self.fs_lookup.items():
|
|
if fs is fs_object:
|
|
return fs_name, fs
|
|
raise ResourceNotFoundError(path, msg="Path does not map to any filesystem: %(path)s")
|
|
--- fs/opener.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/opener.py
|
|
@@ -72,7 +72,7 @@ from fs.filelike import FileWrapper
|
|
from os import getcwd
|
|
import os.path
|
|
import re
|
|
-from urlparse import urlparse
|
|
+from urllib.parse import urlparse
|
|
|
|
class OpenerError(Exception):
|
|
"""The base exception thrown by openers"""
|
|
@@ -794,7 +794,7 @@ example:
|
|
def get_fs(cls, registry, fs_name, fs_name_params, fs_path, writeable, create_dir):
|
|
|
|
from fs.mountfs import MountFS
|
|
- from ConfigParser import ConfigParser
|
|
+ from configparser import ConfigParser
|
|
cfg = ConfigParser()
|
|
|
|
if '#' in fs_path:
|
|
@@ -830,7 +830,7 @@ example:
|
|
def get_fs(cls, registry, fs_name, fs_name_params, fs_path, writeable, create_dir):
|
|
|
|
from fs.multifs import MultiFS
|
|
- from ConfigParser import ConfigParser
|
|
+ from configparser import ConfigParser
|
|
cfg = ConfigParser()
|
|
|
|
if '#' in fs_path:
|
|
--- fs/osfs/__init__.py.orig 2015-11-13 22:18:37 UTC
|
|
+++ fs/osfs/__init__.py
|
|
@@ -48,13 +48,13 @@ def _os_stat(path):
|
|
|
|
|
|
@convert_os_errors
|
|
-def _os_mkdir(name, mode=0777):
|
|
+def _os_mkdir(name, mode=0o777):
|
|
"""Replacement for os.mkdir that raises FSError subclasses."""
|
|
return os.mkdir(name, mode)
|
|
|
|
|
|
@convert_os_errors
|
|
-def _os_makedirs(name, mode=0777):
|
|
+def _os_makedirs(name, mode=0o777):
|
|
"""Replacement for os.makdirs that raises FSError subclasses.
|
|
|
|
This implementation also correctly handles win32 long filenames (those
|
|
@@ -71,7 +71,7 @@ def _os_makedirs(name, mode=0777):
|
|
if head and tail and not os.path.exists(head):
|
|
try:
|
|
_os_makedirs(head, mode)
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
if e.errno != errno.EEXIST:
|
|
raise
|
|
if tail == os.curdir:
|
|
@@ -98,11 +98,11 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
'atomic.setcontents': False}
|
|
|
|
if platform.system() == 'Windows':
|
|
- _meta["invalid_path_chars"] = ''.join(chr(n) for n in xrange(31)) + '\\:*?"<>|'
|
|
+ _meta["invalid_path_chars"] = ''.join(chr(n) for n in range(31)) + '\\:*?"<>|'
|
|
else:
|
|
_meta["invalid_path_chars"] = '\0'
|
|
|
|
- def __init__(self, root_path, thread_synchronize=_thread_synchronize_default, encoding=None, create=False, dir_mode=0700, use_long_paths=True):
|
|
+ def __init__(self, root_path, thread_synchronize=_thread_synchronize_default, encoding=None, create=False, dir_mode=0o700, use_long_paths=True):
|
|
"""
|
|
Creates an FS object that represents the OS Filesystem under a given root path
|
|
|
|
@@ -124,13 +124,13 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
if sys.platform == "win32":
|
|
if use_long_paths and not root_path.startswith("\\\\?\\"):
|
|
if not root_path.startswith("\\"):
|
|
- root_path = u"\\\\?\\" + root_path
|
|
+ root_path = "\\\\?\\" + root_path
|
|
else:
|
|
# Explicitly mark UNC paths, seems to work better.
|
|
if root_path.startswith("\\\\"):
|
|
- root_path = u"\\\\?\\UNC\\" + root_path[2:]
|
|
+ root_path = "\\\\?\\UNC\\" + root_path[2:]
|
|
else:
|
|
- root_path = u"\\\\?" + root_path
|
|
+ root_path = "\\\\?" + root_path
|
|
# If it points at the root of a drive, it needs a trailing slash.
|
|
if len(root_path) == 6 and not root_path.endswith("\\"):
|
|
root_path = root_path + "\\"
|
|
@@ -155,16 +155,16 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
return "<OSFS: %r>" % self.root_path
|
|
|
|
def __unicode__(self):
|
|
- return u"<OSFS: %s>" % self.root_path
|
|
+ return "<OSFS: %s>" % self.root_path
|
|
|
|
def _decode_path(self, p):
|
|
- if isinstance(p, unicode):
|
|
+ if isinstance(p, str):
|
|
return p
|
|
return p.decode(self.encoding, 'replace')
|
|
|
|
def getsyspath(self, path, allow_none=False):
|
|
self.validatepath(path)
|
|
- path = relpath(normpath(path)).replace(u"/", os.sep)
|
|
+ path = relpath(normpath(path)).replace("/", os.sep)
|
|
path = os.path.join(self.root_path, path)
|
|
if not path.startswith(self.root_path):
|
|
raise PathError(path, msg="OSFS given path outside root: %(path)s")
|
|
@@ -234,7 +234,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
encoding = encoding or 'utf-8'
|
|
try:
|
|
return io.open(sys_path, mode=mode, buffering=buffering, encoding=encoding, errors=errors, newline=newline)
|
|
- except EnvironmentError, e:
|
|
+ except EnvironmentError as e:
|
|
# Win32 gives EACCES when opening a directory.
|
|
if sys.platform == "win32" and e.errno in (errno.EACCES,):
|
|
if self.isdir(path):
|
|
@@ -301,7 +301,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
sys_path = self.getsyspath(path)
|
|
try:
|
|
os.remove(sys_path)
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
if e.errno == errno.EACCES and sys.platform == "win32":
|
|
# sometimes windows says this for attempts to remove a dir
|
|
if os.path.isdir(sys_path):
|
|
@@ -338,7 +338,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
|
|
path_dst = self.getsyspath(dst)
|
|
try:
|
|
os.rename(path_src, path_dst)
|
|
- except OSError, e:
|
|
+ except OSError as e:
|
|
if e.errno:
|
|
# POSIX rename() can rename over an empty directory but gives
|
|
# ENOTEMPTY if the dir has contents. Raise UnsupportedError
|
|
--- fs/osfs/watch_inotify.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/osfs/watch_inotify.py
|
|
@@ -18,7 +18,7 @@ from fs.watch import *
|
|
|
|
try:
|
|
import pyinotify
|
|
-except Exception, e:
|
|
+except Exception as e:
|
|
# pyinotify sometimes raises its own custom errors on import.
|
|
# How on earth are we supposed to catch them when we can't import them?
|
|
if isinstance(e,ImportError):
|
|
@@ -39,7 +39,7 @@ class OSFSWatchMixin(WatchableFSMixin):
|
|
def close(self):
|
|
super(OSFSWatchMixin,self).close()
|
|
self.notify_watchers(CLOSED)
|
|
- for watcher_list in self._watchers.values():
|
|
+ for watcher_list in list(self._watchers.values()):
|
|
for watcher in watcher_list:
|
|
self.del_watcher(watcher)
|
|
self.__watch_lock.acquire()
|
|
@@ -58,7 +58,7 @@ class OSFSWatchMixin(WatchableFSMixin):
|
|
w = super_add_watcher(callback,path,events,recursive)
|
|
w._pyinotify_id = None
|
|
syspath = self.getsyspath(path)
|
|
- if isinstance(syspath,unicode):
|
|
+ if isinstance(syspath,str):
|
|
syspath = syspath.encode(sys.getfilesystemencoding())
|
|
# Each watch gets its own WatchManager, since it's tricky to make
|
|
# a single WatchManager handle multiple callbacks with different
|
|
@@ -73,7 +73,7 @@ class OSFSWatchMixin(WatchableFSMixin):
|
|
kwds = dict(rec=recursive,auto_add=recursive,quiet=False)
|
|
try:
|
|
wids = wm.add_watch(syspath,evtmask,process_events,**kwds)
|
|
- except pyinotify.WatchManagerError, e:
|
|
+ except pyinotify.WatchManagerError as e:
|
|
raise OperationFailedError("add_watcher",details=e)
|
|
w._pyinotify_id = wids[syspath]
|
|
self.__watch_lock.acquire()
|
|
@@ -239,7 +239,7 @@ class SharedThreadedNotifier(threading.Thread):
|
|
while self.running:
|
|
try:
|
|
ready_fds = self._poller.poll()
|
|
- except _select_error, e:
|
|
+ except _select_error as e:
|
|
if e[0] != errno.EINTR:
|
|
raise
|
|
else:
|
|
--- fs/osfs/watch_win32.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/osfs/watch_win32.py
|
|
@@ -10,7 +10,7 @@ import os
|
|
import sys
|
|
import errno
|
|
import threading
|
|
-import Queue
|
|
+import queue
|
|
import stat
|
|
import struct
|
|
import ctypes
|
|
@@ -226,7 +226,7 @@ class WatchedDirectory(object):
|
|
ctypes.byref(self.result),len(self.result),
|
|
self.recursive,self.flags,None,
|
|
overlapped,None)
|
|
- except WindowsError, e:
|
|
+ except WindowsError as e:
|
|
self.error = e
|
|
self.close()
|
|
|
|
@@ -262,7 +262,7 @@ class WatchThread(threading.Thread):
|
|
self.watched_directories = {}
|
|
self.ready = threading.Event()
|
|
self._iocp = None
|
|
- self._new_watches = Queue.Queue()
|
|
+ self._new_watches = queue.Queue()
|
|
|
|
def close(self):
|
|
if not self.closed:
|
|
@@ -383,11 +383,11 @@ class WatchThread(threading.Thread):
|
|
hash(w),0)
|
|
w.post()
|
|
w.ready.set()
|
|
- except Queue.Empty:
|
|
+ except queue.Empty:
|
|
pass
|
|
finally:
|
|
self.ready.set()
|
|
- for w in self.watched_directories.itervalues():
|
|
+ for w in self.watched_directories.values():
|
|
w.close()
|
|
if self._iocp:
|
|
CloseHandle(self._iocp)
|
|
--- fs/osfs/xattrs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/osfs/xattrs.py
|
|
@@ -49,7 +49,7 @@ if xattr is not None:
|
|
|
|
@convert_os_errors
|
|
def listxattrs(self, path):
|
|
- return xattr.xattr(self.getsyspath(path)).keys()
|
|
+ return list(xattr.xattr(self.getsyspath(path)).keys())
|
|
|
|
else:
|
|
|
|
--- fs/path.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/path.py
|
|
@@ -44,7 +44,7 @@ def normpath(path):
|
|
if not _requires_normalization(path):
|
|
return path.rstrip('/')
|
|
|
|
- prefix = u'/' if path.startswith('/') else u''
|
|
+ prefix = '/' if path.startswith('/') else ''
|
|
components = []
|
|
append = components.append
|
|
special = ('..', '.', '').__contains__
|
|
@@ -60,7 +60,7 @@ def normpath(path):
|
|
# causing a circular import.
|
|
from fs.errors import BackReferenceError
|
|
raise BackReferenceError('Too many backrefs in \'%s\'' % path)
|
|
- return prefix + u'/'.join(components)
|
|
+ return prefix + '/'.join(components)
|
|
|
|
|
|
if os.sep != '/':
|
|
@@ -100,11 +100,11 @@ def recursepath(path, reverse=False):
|
|
"""
|
|
|
|
if path in ('', '/'):
|
|
- return [u'/']
|
|
+ return ['/']
|
|
|
|
path = abspath(normpath(path)) + '/'
|
|
|
|
- paths = [u'/']
|
|
+ paths = ['/']
|
|
find = path.find
|
|
append = paths.append
|
|
pos = 1
|
|
@@ -133,7 +133,7 @@ def abspath(path):
|
|
|
|
"""
|
|
if not path.startswith('/'):
|
|
- return u'/' + path
|
|
+ return '/' + path
|
|
return path
|
|
|
|
|
|
@@ -176,7 +176,7 @@ def pathjoin(*paths):
|
|
absolute = True
|
|
relpaths.append(p)
|
|
|
|
- path = normpath(u"/".join(relpaths))
|
|
+ path = normpath("/".join(relpaths))
|
|
if absolute:
|
|
path = abspath(path)
|
|
return path
|
|
@@ -419,7 +419,7 @@ def relativefrom(base, path):
|
|
break
|
|
common += 1
|
|
|
|
- return u'/'.join([u'..'] * (len(base) - common) + path[common:])
|
|
+ return '/'.join(['..'] * (len(base) - common) + path[common:])
|
|
|
|
|
|
class PathMap(object):
|
|
@@ -559,7 +559,7 @@ class PathMap(object):
|
|
m = m[name]
|
|
except KeyError:
|
|
return
|
|
- for (nm, subm) in m.iteritems():
|
|
+ for (nm, subm) in m.items():
|
|
if not nm:
|
|
yield abspath(root)
|
|
else:
|
|
@@ -568,7 +568,7 @@ class PathMap(object):
|
|
yield subk
|
|
|
|
def __iter__(self):
|
|
- return self.iterkeys()
|
|
+ return iter(self.keys())
|
|
|
|
def keys(self,root="/"):
|
|
return list(self.iterkeys(root))
|
|
@@ -583,7 +583,7 @@ class PathMap(object):
|
|
m = m[name]
|
|
except KeyError:
|
|
return
|
|
- for (nm, subm) in m.iteritems():
|
|
+ for (nm, subm) in m.items():
|
|
if not nm:
|
|
yield subm
|
|
else:
|
|
@@ -604,7 +604,7 @@ class PathMap(object):
|
|
m = m[name]
|
|
except KeyError:
|
|
return
|
|
- for (nm, subm) in m.iteritems():
|
|
+ for (nm, subm) in m.items():
|
|
if not nm:
|
|
yield (abspath(normpath(root)), subm)
|
|
else:
|
|
@@ -627,7 +627,7 @@ class PathMap(object):
|
|
m = m[name]
|
|
except KeyError:
|
|
return
|
|
- for (nm, subm) in m.iteritems():
|
|
+ for (nm, subm) in m.items():
|
|
if nm and subm:
|
|
yield nm
|
|
|
|
@@ -651,9 +651,9 @@ def iswildcard(path):
|
|
return not _wild_chars.isdisjoint(path)
|
|
|
|
if __name__ == "__main__":
|
|
- print recursepath('a/b/c')
|
|
+ print(recursepath('a/b/c'))
|
|
|
|
- print relativefrom('/', '/foo')
|
|
- print relativefrom('/foo/bar', '/foo/baz')
|
|
- print relativefrom('/foo/bar/baz', '/foo/egg')
|
|
- print relativefrom('/foo/bar/baz/egg', '/foo/egg')
|
|
+ print(relativefrom('/', '/foo'))
|
|
+ print(relativefrom('/foo/bar', '/foo/baz'))
|
|
+ print(relativefrom('/foo/bar/baz', '/foo/egg'))
|
|
+ print(relativefrom('/foo/bar/baz/egg', '/foo/egg'))
|
|
--- fs/remote.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/remote.py
|
|
@@ -20,8 +20,8 @@ FS subclasses interfacing with a remote filesystem. T
|
|
|
|
"""
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
import time
|
|
import stat as statinfo
|
|
from errno import EINVAL
|
|
@@ -422,11 +422,11 @@ class CachedInfo(object):
|
|
self.has_full_children = other.has_full_children
|
|
@classmethod
|
|
def new_file_stub(cls):
|
|
- info = {"info" : 0700 | statinfo.S_IFREG}
|
|
+ info = {"info" : 0o700 | statinfo.S_IFREG}
|
|
return cls(info,has_full_info=False)
|
|
@classmethod
|
|
def new_dir_stub(cls):
|
|
- info = {"info" : 0700 | statinfo.S_IFDIR}
|
|
+ info = {"info" : 0o700 | statinfo.S_IFDIR}
|
|
return cls(info,has_full_info=False)
|
|
|
|
|
|
@@ -512,7 +512,7 @@ class CacheFSMixin(FS):
|
|
if self.max_cache_size is not None and old_ci is None:
|
|
while self.__cache_size >= self.max_cache_size:
|
|
try:
|
|
- to_del = iter(self.__cache).next()
|
|
+ to_del = next(iter(self.__cache))
|
|
except StopIteration:
|
|
break
|
|
else:
|
|
@@ -592,7 +592,7 @@ class CacheFSMixin(FS):
|
|
|
|
def isdir(self, path):
|
|
try:
|
|
- self.__cache.iternames(path).next()
|
|
+ next(self.__cache.iternames(path))
|
|
return True
|
|
except StopIteration:
|
|
pass
|
|
@@ -607,7 +607,7 @@ class CacheFSMixin(FS):
|
|
|
|
def isfile(self, path):
|
|
try:
|
|
- self.__cache.iternames(path).next()
|
|
+ next(self.__cache.iternames(path))
|
|
return False
|
|
except StopIteration:
|
|
pass
|
|
--- fs/remotefs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/remotefs.py
|
|
@@ -1,5 +1,5 @@
|
|
# Work in Progress - Do not use
|
|
-from __future__ import with_statement
|
|
+
|
|
from fs.base import FS
|
|
from fs.expose.serve import packetstream
|
|
|
|
@@ -7,7 +7,7 @@ from collections import defaultdict
|
|
import threading
|
|
from threading import Lock, RLock
|
|
from json import dumps
|
|
-import Queue as queue
|
|
+import queue as queue
|
|
import socket
|
|
|
|
from six import b
|
|
@@ -35,12 +35,12 @@ class PacketHandler(threading.Thread):
|
|
while True:
|
|
data = read(1024*16)
|
|
if not data:
|
|
- print "No data"
|
|
+ print("No data")
|
|
break
|
|
- print "data", repr(data)
|
|
+ print("data", repr(data))
|
|
for header, payload in decoder.feed(data):
|
|
- print repr(header)
|
|
- print repr(payload)
|
|
+ print(repr(header))
|
|
+ print(repr(payload))
|
|
on_packet(header, payload)
|
|
|
|
def _new_call_id(self):
|
|
@@ -77,8 +77,8 @@ class PacketHandler(threading.Thread):
|
|
|
|
while True:
|
|
header, payload = queue.get()
|
|
- print repr(header)
|
|
- print repr(payload)
|
|
+ print(repr(header))
|
|
+ print(repr(payload))
|
|
if client_ref is not None and header.get('client_ref') != client_ref:
|
|
continue
|
|
break
|
|
@@ -167,9 +167,9 @@ class RemoteFS(FS):
|
|
def ping(self, msg):
|
|
call_id = self.packet_handler.send_packet({'type':'rpc', 'method':'ping'}, msg)
|
|
header, payload = self.packet_handler.get_packet(call_id)
|
|
- print "PING"
|
|
- print header
|
|
- print payload
|
|
+ print("PING")
|
|
+ print(header)
|
|
+ print(payload)
|
|
|
|
def close(self):
|
|
self.transport.close()
|
|
--- fs/rpcfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/rpcfs.py
|
|
@@ -8,7 +8,7 @@ class from the :mod:`fs.expose.xmlrpc` module.
|
|
|
|
"""
|
|
|
|
-import xmlrpclib
|
|
+import xmlrpc.client
|
|
import socket
|
|
import base64
|
|
|
|
@@ -28,11 +28,11 @@ def re_raise_faults(func):
|
|
def wrapper(*args, **kwds):
|
|
try:
|
|
return func(*args, **kwds)
|
|
- except (xmlrpclib.Fault), f:
|
|
+ except (xmlrpc.client.Fault) as f:
|
|
#raise
|
|
# Make sure it's in a form we can handle
|
|
|
|
- print f.faultString
|
|
+ print(f.faultString)
|
|
bits = f.faultString.split(" ")
|
|
if bits[0] not in ["<type", "<class"]:
|
|
raise f
|
|
@@ -41,7 +41,7 @@ def re_raise_faults(func):
|
|
cls = bits[0]
|
|
msg = ">:".join(bits[1:])
|
|
cls = cls.strip('\'')
|
|
- print "-" + cls
|
|
+ print("-" + cls)
|
|
cls = _object_by_name(cls)
|
|
# Re-raise using the remainder of the fault code as message
|
|
if cls:
|
|
@@ -50,7 +50,7 @@ def re_raise_faults(func):
|
|
else:
|
|
raise cls(msg)
|
|
raise f
|
|
- except socket.error, e:
|
|
+ except socket.error as e:
|
|
raise RemoteConnectionError(str(e), details=e)
|
|
return wrapper
|
|
|
|
@@ -126,9 +126,9 @@ class RPCFS(FS):
|
|
kwds = dict(allow_none=True, use_datetime=True)
|
|
|
|
if self._transport is not None:
|
|
- proxy = xmlrpclib.ServerProxy(self.uri, self._transport, **kwds)
|
|
+ proxy = xmlrpc.client.ServerProxy(self.uri, self._transport, **kwds)
|
|
else:
|
|
- proxy = xmlrpclib.ServerProxy(self.uri, **kwds)
|
|
+ proxy = xmlrpc.client.ServerProxy(self.uri, **kwds)
|
|
|
|
return ReRaiseFaults(proxy)
|
|
|
|
@@ -170,7 +170,7 @@ class RPCFS(FS):
|
|
meta = self.proxy.getmeta(meta_name)
|
|
else:
|
|
meta = self.proxy.getmeta_default(meta_name, default)
|
|
- if isinstance(meta, basestring):
|
|
+ if isinstance(meta, str):
|
|
# To allow transport of meta with invalid xml chars (like null)
|
|
meta = self.encode_path(meta)
|
|
return meta
|
|
@@ -185,7 +185,7 @@ class RPCFS(FS):
|
|
# TODO: chunked transport of large files
|
|
epath = self.encode_path(path)
|
|
if "w" in mode:
|
|
- self.proxy.set_contents(epath, xmlrpclib.Binary(b("")))
|
|
+ self.proxy.set_contents(epath, xmlrpc.client.Binary(b("")))
|
|
if "r" in mode or "a" in mode or "+" in mode:
|
|
try:
|
|
data = self.proxy.get_contents(epath, "rb").data
|
|
@@ -194,7 +194,7 @@ class RPCFS(FS):
|
|
raise ResourceNotFoundError(path)
|
|
if not self.isdir(dirname(path)):
|
|
raise ParentDirectoryMissingError(path)
|
|
- self.proxy.set_contents(path, xmlrpclib.Binary(b("")))
|
|
+ self.proxy.set_contents(path, xmlrpc.client.Binary(b("")))
|
|
else:
|
|
data = b("")
|
|
f = StringIO(data)
|
|
@@ -210,7 +210,7 @@ class RPCFS(FS):
|
|
self._lock.acquire()
|
|
try:
|
|
oldflush()
|
|
- self.proxy.set_contents(epath, xmlrpclib.Binary(f.getvalue()))
|
|
+ self.proxy.set_contents(epath, xmlrpc.client.Binary(f.getvalue()))
|
|
finally:
|
|
self._lock.release()
|
|
|
|
--- fs/s3fs.py.orig 2015-11-13 16:37:26 UTC
|
|
+++ fs/s3fs.py
|
|
@@ -41,7 +41,7 @@ else:
|
|
try:
|
|
return self._map[(threading.currentThread(),attr)]
|
|
except KeyError:
|
|
- raise AttributeError, attr
|
|
+ raise AttributeError(attr)
|
|
def __setattr__(self,attr,value):
|
|
self._map[(threading.currentThread(),attr)] = value
|
|
|
|
@@ -106,7 +106,7 @@ class S3FS(FS):
|
|
prefix = prefix[1:]
|
|
if not prefix.endswith(separator) and prefix != "":
|
|
prefix = prefix + separator
|
|
- if isinstance(prefix,unicode):
|
|
+ if isinstance(prefix,str):
|
|
prefix = prefix.encode("utf8")
|
|
if aws_access_key is None:
|
|
if "AWS_ACCESS_KEY_ID" not in os.environ:
|
|
@@ -149,7 +149,7 @@ class S3FS(FS):
|
|
b.get_key(self._prefix)
|
|
else:
|
|
b = self._s3conn.get_bucket(self._bucket_name, validate=1)
|
|
- except S3ResponseError, e:
|
|
+ except S3ResponseError as e:
|
|
if "404 Not Found" not in str(e):
|
|
raise
|
|
b = self._s3conn.create_bucket(self._bucket_name)
|
|
@@ -179,7 +179,7 @@ class S3FS(FS):
|
|
s3path = self._prefix + path
|
|
if s3path and s3path[-1] == self._separator:
|
|
s3path = s3path[:-1]
|
|
- if isinstance(s3path,unicode):
|
|
+ if isinstance(s3path,str):
|
|
s3path = s3path.encode("utf8")
|
|
return s3path
|
|
|
|
@@ -220,9 +220,9 @@ class S3FS(FS):
|
|
|
|
def _sync_set_contents(self,key,contents):
|
|
"""Synchronously set the contents of a key."""
|
|
- if isinstance(key,basestring):
|
|
+ if isinstance(key,str):
|
|
key = self._s3bukt.new_key(key)
|
|
- if isinstance(contents,basestring):
|
|
+ if isinstance(contents,str):
|
|
key.set_contents_from_string(contents)
|
|
elif hasattr(contents,"md5"):
|
|
hexmd5 = contents.md5
|
|
@@ -338,7 +338,7 @@ class S3FS(FS):
|
|
# the directory itself, which other tools may not create.
|
|
ks = self._s3bukt.list(prefix=s3path,delimiter=self._separator)
|
|
try:
|
|
- iter(ks).next()
|
|
+ next(iter(ks))
|
|
except StopIteration:
|
|
return False
|
|
else:
|
|
@@ -398,7 +398,7 @@ class S3FS(FS):
|
|
# Skip over the entry for the directory itself, if it exists
|
|
name = self._uns3path(k.name,s3path)
|
|
if name != "":
|
|
- if not isinstance(name,unicode):
|
|
+ if not isinstance(name,str):
|
|
name = name.decode("utf8")
|
|
if name.endswith(self._separator):
|
|
name = name[:-1]
|
|
@@ -572,14 +572,14 @@ class S3FS(FS):
|
|
else:
|
|
info["name"] = basename(self._uns3key(k.name))
|
|
if self._key_is_dir(key):
|
|
- info["st_mode"] = 0700 | statinfo.S_IFDIR
|
|
+ info["st_mode"] = 0o700 | statinfo.S_IFDIR
|
|
else:
|
|
- info["st_mode"] = 0700 | statinfo.S_IFREG
|
|
+ info["st_mode"] = 0o700 | statinfo.S_IFREG
|
|
if hasattr(key,"size"):
|
|
info['size'] = int(key.size)
|
|
etag = getattr(key,"etag",None)
|
|
if etag is not None:
|
|
- if isinstance(etag,unicode):
|
|
+ if isinstance(etag,str):
|
|
etag = etag.encode("utf8")
|
|
info['etag'] = etag.strip('"').strip("'")
|
|
if hasattr(key,"last_modified"):
|
|
@@ -632,7 +632,7 @@ class S3FS(FS):
|
|
s3path_src = self._s3path(src)
|
|
try:
|
|
self._s3bukt.copy_key(s3path_dst,self._bucket_name,s3path_src)
|
|
- except S3ResponseError, e:
|
|
+ except S3ResponseError as e:
|
|
if "404 Not Found" in str(e):
|
|
msg = "Source is not a file: %(path)s"
|
|
raise ResourceInvalidError(src, msg=msg)
|
|
@@ -663,7 +663,7 @@ class S3FS(FS):
|
|
for k in self._s3bukt.list(prefix=prefix):
|
|
name = relpath(self._uns3path(k.name,prefix))
|
|
if name != "":
|
|
- if not isinstance(name,unicode):
|
|
+ if not isinstance(name,str):
|
|
name = name.decode("utf8")
|
|
if not k.name.endswith(self._separator):
|
|
if wildcard is not None:
|
|
@@ -691,7 +691,7 @@ class S3FS(FS):
|
|
for k in self._s3bukt.list(prefix=prefix):
|
|
name = relpath(self._uns3path(k.name,prefix))
|
|
if name != "":
|
|
- if not isinstance(name,unicode):
|
|
+ if not isinstance(name,str):
|
|
name = name.decode("utf8")
|
|
if wildcard is not None:
|
|
if callable(wildcard):
|
|
@@ -718,7 +718,7 @@ class S3FS(FS):
|
|
for k in self._s3bukt.list(prefix=prefix):
|
|
name = relpath(self._uns3path(k.name,prefix))
|
|
if name != "":
|
|
- if not isinstance(name,unicode):
|
|
+ if not isinstance(name,str):
|
|
name = name.decode("utf8")
|
|
if not k.name.endswith(self._separator):
|
|
if wildcard is not None:
|
|
@@ -733,16 +733,16 @@ class S3FS(FS):
|
|
|
|
|
|
def _eq_utf8(name1,name2):
|
|
- if isinstance(name1,unicode):
|
|
+ if isinstance(name1,str):
|
|
name1 = name1.encode("utf8")
|
|
- if isinstance(name2,unicode):
|
|
+ if isinstance(name2,str):
|
|
name2 = name2.encode("utf8")
|
|
return name1 == name2
|
|
|
|
def _startswith_utf8(name1,name2):
|
|
- if isinstance(name1,unicode):
|
|
+ if isinstance(name1,str):
|
|
name1 = name1.encode("utf8")
|
|
- if isinstance(name2,unicode):
|
|
+ if isinstance(name2,str):
|
|
name2 = name2.encode("utf8")
|
|
return name1.startswith(name2)
|
|
|
|
--- fs/sftpfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/sftpfs.py
|
|
@@ -131,7 +131,7 @@ class SFTPFS(FS):
|
|
self._client = None
|
|
|
|
self.hostname = None
|
|
- if isinstance(connection, basestring):
|
|
+ if isinstance(connection, str):
|
|
self.hostname = connection
|
|
elif isinstance(connection, tuple):
|
|
self.hostname = '%s:%s' % connection
|
|
@@ -183,7 +183,7 @@ class SFTPFS(FS):
|
|
if not connection.is_authenticated():
|
|
try:
|
|
connection.auth_none(username)
|
|
- except paramiko.BadAuthenticationType, e:
|
|
+ except paramiko.BadAuthenticationType as e:
|
|
self.close()
|
|
allowed = ', '.join(e.allowed_types)
|
|
raise RemoteConnectionError(msg='no auth - server requires one of the following: %s' % allowed, details=e)
|
|
@@ -192,14 +192,14 @@ class SFTPFS(FS):
|
|
self.close()
|
|
raise RemoteConnectionError(msg='no auth')
|
|
|
|
- except paramiko.SSHException, e:
|
|
+ except paramiko.SSHException as e:
|
|
self.close()
|
|
raise RemoteConnectionError(msg='SSH exception (%s)' % str(e), details=e)
|
|
|
|
self._transport = connection
|
|
|
|
def __unicode__(self):
|
|
- return u'<SFTPFS: %s>' % self.desc('/')
|
|
+ return '<SFTPFS: %s>' % self.desc('/')
|
|
|
|
@classmethod
|
|
def _agent_auth(cls, transport, username):
|
|
@@ -307,7 +307,7 @@ class SFTPFS(FS):
|
|
self.closed = True
|
|
|
|
def _normpath(self, path):
|
|
- if not isinstance(path, unicode):
|
|
+ if not isinstance(path, str):
|
|
path = path.decode(self.encoding)
|
|
npath = pathjoin(self.root_path, relpath(normpath(path)))
|
|
if not isprefix(self.root_path, npath):
|
|
@@ -355,10 +355,10 @@ class SFTPFS(FS):
|
|
def desc(self, path):
|
|
npath = self._normpath(path)
|
|
if self.hostname:
|
|
- return u'sftp://%s%s' % (self.hostname, path)
|
|
+ return 'sftp://%s%s' % (self.hostname, path)
|
|
else:
|
|
addr, port = self._transport.getpeername()
|
|
- return u'sftp://%s:%i%s' % (addr, port, self.client.normalize(npath))
|
|
+ return 'sftp://%s:%i%s' % (addr, port, self.client.normalize(npath))
|
|
|
|
@synchronize
|
|
@convert_os_errors
|
|
@@ -368,7 +368,7 @@ class SFTPFS(FS):
|
|
npath = self._normpath(path)
|
|
try:
|
|
self.client.stat(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
return False
|
|
raise
|
|
@@ -382,7 +382,7 @@ class SFTPFS(FS):
|
|
npath = self._normpath(path)
|
|
try:
|
|
stat = self.client.stat(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
return False
|
|
raise
|
|
@@ -394,7 +394,7 @@ class SFTPFS(FS):
|
|
npath = self._normpath(path)
|
|
try:
|
|
stat = self.client.stat(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
return False
|
|
raise
|
|
@@ -409,10 +409,10 @@ class SFTPFS(FS):
|
|
if dirs_only or files_only:
|
|
attrs = self.client.listdir_attr(npath)
|
|
attrs_map = dict((a.filename, a) for a in attrs)
|
|
- paths = list(attrs_map.iterkeys())
|
|
+ paths = list(attrs_map.keys())
|
|
else:
|
|
paths = self.client.listdir(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
if self.isfile(path):
|
|
raise ResourceInvalidError(path,msg="Can't list directory contents of a file: %(path)s")
|
|
@@ -424,19 +424,19 @@ class SFTPFS(FS):
|
|
if attrs_map:
|
|
if dirs_only:
|
|
filter_paths = []
|
|
- for apath, attr in attrs_map.iteritems():
|
|
+ for apath, attr in attrs_map.items():
|
|
if isdir(self, path, attr.__dict__):
|
|
filter_paths.append(apath)
|
|
paths = filter_paths
|
|
elif files_only:
|
|
filter_paths = []
|
|
- for apath, attr in attrs_map.iteritems():
|
|
+ for apath, attr in attrs_map.items():
|
|
if isfile(self, apath, attr.__dict__):
|
|
filter_paths.append(apath)
|
|
paths = filter_paths
|
|
|
|
for (i,p) in enumerate(paths):
|
|
- if not isinstance(p,unicode):
|
|
+ if not isinstance(p,str):
|
|
paths[i] = p.decode(self.encoding)
|
|
|
|
return self._listdir_helper(path, paths, wildcard, full, absolute, False, False)
|
|
@@ -448,8 +448,8 @@ class SFTPFS(FS):
|
|
try:
|
|
attrs = self.client.listdir_attr(npath)
|
|
attrs_map = dict((a.filename, a) for a in attrs)
|
|
- paths = attrs_map.keys()
|
|
- except IOError, e:
|
|
+ paths = list(attrs_map.keys())
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
if self.isfile(path):
|
|
raise ResourceInvalidError(path,msg="Can't list directory contents of a file: %(path)s")
|
|
@@ -460,19 +460,19 @@ class SFTPFS(FS):
|
|
|
|
if dirs_only:
|
|
filter_paths = []
|
|
- for path, attr in attrs_map.iteritems():
|
|
+ for path, attr in attrs_map.items():
|
|
if isdir(self, path, attr.__dict__):
|
|
filter_paths.append(path)
|
|
paths = filter_paths
|
|
elif files_only:
|
|
filter_paths = []
|
|
- for path, attr in attrs_map.iteritems():
|
|
+ for path, attr in attrs_map.items():
|
|
if isfile(self, path, attr.__dict__):
|
|
filter_paths.append(path)
|
|
paths = filter_paths
|
|
|
|
for (i, p) in enumerate(paths):
|
|
- if not isinstance(p, unicode):
|
|
+ if not isinstance(p, str):
|
|
paths[i] = p.decode(self.encoding)
|
|
|
|
def getinfo(p):
|
|
@@ -491,7 +491,7 @@ class SFTPFS(FS):
|
|
npath = self._normpath(path)
|
|
try:
|
|
self.client.mkdir(npath)
|
|
- except IOError, _e:
|
|
+ except IOError as _e:
|
|
# Error code is unreliable, try to figure out what went wrong
|
|
try:
|
|
stat = self.client.stat(npath)
|
|
@@ -519,7 +519,7 @@ class SFTPFS(FS):
|
|
npath = self._normpath(path)
|
|
try:
|
|
self.client.remove(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
raise ResourceNotFoundError(path)
|
|
elif self.isdir(path):
|
|
@@ -542,7 +542,7 @@ class SFTPFS(FS):
|
|
raise ResourceNotFoundError(path)
|
|
try:
|
|
self.client.rmdir(npath)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
if self.isfile(path):
|
|
raise ResourceInvalidError(path,msg="Can't use removedir() on a file: %(path)s")
|
|
@@ -565,7 +565,7 @@ class SFTPFS(FS):
|
|
ndst = self._normpath(dst)
|
|
try:
|
|
self.client.rename(nsrc,ndst)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
raise ResourceNotFoundError(src)
|
|
if not self.isdir(dirname(dst)):
|
|
@@ -581,7 +581,7 @@ class SFTPFS(FS):
|
|
self.remove(dst)
|
|
try:
|
|
self.client.rename(nsrc,ndst)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
raise ResourceNotFoundError(src)
|
|
if self.exists(dst):
|
|
@@ -599,7 +599,7 @@ class SFTPFS(FS):
|
|
self.removedir(dst)
|
|
try:
|
|
self.client.rename(nsrc,ndst)
|
|
- except IOError, e:
|
|
+ except IOError as e:
|
|
if getattr(e,"errno",None) == ENOENT:
|
|
raise ResourceNotFoundError(src)
|
|
if self.exists(dst):
|
|
@@ -612,7 +612,7 @@ class SFTPFS(FS):
|
|
@classmethod
|
|
def _extract_info(cls, stats):
|
|
fromtimestamp = datetime.datetime.fromtimestamp
|
|
- info = dict((k, v) for k, v in stats.iteritems() if k in cls._info_vars and not k.startswith('_'))
|
|
+ info = dict((k, v) for k, v in stats.items() if k in cls._info_vars and not k.startswith('_'))
|
|
info['size'] = info['st_size']
|
|
ct = info.get('st_ctime')
|
|
if ct is not None:
|
|
--- fs/tempfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/tempfs.py
|
|
@@ -29,7 +29,7 @@ class TempFS(OSFS):
|
|
_meta['atomic.move'] = True
|
|
_meta['atomic.copy'] = True
|
|
|
|
- def __init__(self, identifier=None, temp_dir=None, dir_mode=0700, thread_synchronize=_thread_synchronize_default):
|
|
+ def __init__(self, identifier=None, temp_dir=None, dir_mode=0o700, thread_synchronize=_thread_synchronize_default):
|
|
"""Creates a temporary Filesystem
|
|
|
|
identifier -- A string that is included in the name of the temporary directory,
|
|
@@ -49,7 +49,7 @@ class TempFS(OSFS):
|
|
__str__ = __repr__
|
|
|
|
def __unicode__(self):
|
|
- return u'<TempFS: %s>' % self._temp_dir
|
|
+ return '<TempFS: %s>' % self._temp_dir
|
|
|
|
def __getstate__(self):
|
|
# If we are picking a TempFS, we want to preserve its contents,
|
|
--- fs/tests/__init__.py.orig 2015-11-13 22:33:26 UTC
|
|
+++ fs/tests/__init__.py
|
|
@@ -5,8 +5,8 @@
|
|
|
|
"""
|
|
|
|
-from __future__ import with_statement
|
|
|
|
+
|
|
# Send any output from the logging module to stdout, so it will
|
|
# be captured by nose and reported appropriately
|
|
import sys
|
|
@@ -61,7 +61,7 @@ class FSTestCases(object):
|
|
self.assertEqual(self.fs.validatepath('.foo'), None)
|
|
self.assertEqual(self.fs.validatepath('foo'), None)
|
|
self.assertEqual(self.fs.validatepath('foo/bar'), None)
|
|
- self.assert_(self.fs.isvalidpath('foo/bar'))
|
|
+ self.assertTrue(self.fs.isvalidpath('foo/bar'))
|
|
|
|
def test_tree(self):
|
|
"""Test tree print"""
|
|
@@ -79,8 +79,8 @@ class FSTestCases(object):
|
|
stupid_meta = 'thismetashouldnotexist!"r$$%^&&*()_+'
|
|
self.assertRaises(NoMetaError, self.fs.getmeta, stupid_meta)
|
|
self.assertFalse(self.fs.hasmeta(stupid_meta))
|
|
- self.assertEquals(None, self.fs.getmeta(stupid_meta, None))
|
|
- self.assertEquals(3.14, self.fs.getmeta(stupid_meta, 3.14))
|
|
+ self.assertEqual(None, self.fs.getmeta(stupid_meta, None))
|
|
+ self.assertEqual(3.14, self.fs.getmeta(stupid_meta, 3.14))
|
|
for meta_name in meta_names:
|
|
try:
|
|
meta = self.fs.getmeta(meta_name)
|
|
@@ -101,15 +101,15 @@ class FSTestCases(object):
|
|
except NoSysPathError:
|
|
pass
|
|
else:
|
|
- self.assertTrue(isinstance(syspath, unicode))
|
|
+ self.assertTrue(isinstance(syspath, str))
|
|
syspath = self.fs.getsyspath("/", allow_none=True)
|
|
if syspath is not None:
|
|
- self.assertTrue(isinstance(syspath, unicode))
|
|
+ self.assertTrue(isinstance(syspath, str))
|
|
|
|
def test_debug(self):
|
|
str(self.fs)
|
|
repr(self.fs)
|
|
- self.assert_(hasattr(self.fs, 'desc'))
|
|
+ self.assertTrue(hasattr(self.fs, 'desc'))
|
|
|
|
def test_open_on_directory(self):
|
|
self.fs.makedir("testdir")
|
|
@@ -132,20 +132,20 @@ class FSTestCases(object):
|
|
f.close()
|
|
self.assertTrue(self.check("test1.txt"))
|
|
f = self.fs.open("test1.txt", "rb")
|
|
- self.assertEquals(f.read(), b("testing"))
|
|
+ self.assertEqual(f.read(), b("testing"))
|
|
f.close()
|
|
f = self.fs.open("test1.txt", "wb")
|
|
f.write(b("test file overwrite"))
|
|
f.close()
|
|
self.assertTrue(self.check("test1.txt"))
|
|
f = self.fs.open("test1.txt", "rb")
|
|
- self.assertEquals(f.read(), b("test file overwrite"))
|
|
+ self.assertEqual(f.read(), b("test file overwrite"))
|
|
f.close()
|
|
|
|
def test_createfile(self):
|
|
test = b('now with content')
|
|
self.fs.createfile("test.txt")
|
|
- self.assert_(self.fs.exists("test.txt"))
|
|
+ self.assertTrue(self.fs.exists("test.txt"))
|
|
self.assertEqual(self.fs.getcontents("test.txt", "rb"), b(''))
|
|
self.fs.setcontents("test.txt", test)
|
|
self.fs.createfile("test.txt")
|
|
@@ -163,36 +163,36 @@ class FSTestCases(object):
|
|
def test_setcontents(self):
|
|
# setcontents() should accept both a string...
|
|
self.fs.setcontents("hello", b("world"))
|
|
- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
|
|
+ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
|
|
# ...and a file-like object
|
|
self.fs.setcontents("hello", StringIO(b("to you, good sir!")))
|
|
- self.assertEquals(self.fs.getcontents(
|
|
+ self.assertEqual(self.fs.getcontents(
|
|
"hello", "rb"), b("to you, good sir!"))
|
|
# setcontents() should accept both a string...
|
|
self.fs.setcontents("hello", b("world"), chunk_size=2)
|
|
- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
|
|
+ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
|
|
# ...and a file-like object
|
|
self.fs.setcontents("hello", StringIO(
|
|
b("to you, good sir!")), chunk_size=2)
|
|
- self.assertEquals(self.fs.getcontents(
|
|
+ self.assertEqual(self.fs.getcontents(
|
|
"hello", "rb"), b("to you, good sir!"))
|
|
self.fs.setcontents("hello", b(""))
|
|
- self.assertEquals(self.fs.getcontents("hello", "rb"), b(""))
|
|
+ self.assertEqual(self.fs.getcontents("hello", "rb"), b(""))
|
|
|
|
def test_setcontents_async(self):
|
|
# setcontents() should accept both a string...
|
|
self.fs.setcontents_async("hello", b("world")).wait()
|
|
- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
|
|
+ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
|
|
# ...and a file-like object
|
|
self.fs.setcontents_async("hello", StringIO(
|
|
b("to you, good sir!"))).wait()
|
|
- self.assertEquals(self.fs.getcontents("hello"), b("to you, good sir!"))
|
|
+ self.assertEqual(self.fs.getcontents("hello"), b("to you, good sir!"))
|
|
self.fs.setcontents_async("hello", b("world"), chunk_size=2).wait()
|
|
- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
|
|
+ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
|
|
# ...and a file-like object
|
|
self.fs.setcontents_async("hello", StringIO(
|
|
b("to you, good sir!")), chunk_size=2).wait()
|
|
- self.assertEquals(self.fs.getcontents(
|
|
+ self.assertEqual(self.fs.getcontents(
|
|
"hello", "rb"), b("to you, good sir!"))
|
|
|
|
def test_isdir_isfile(self):
|
|
@@ -214,19 +214,19 @@ class FSTestCases(object):
|
|
def test_listdir(self):
|
|
def check_unicode(items):
|
|
for item in items:
|
|
- self.assertTrue(isinstance(item, unicode))
|
|
- self.fs.setcontents(u"a", b(''))
|
|
+ self.assertTrue(isinstance(item, str))
|
|
+ self.fs.setcontents("a", b(''))
|
|
self.fs.setcontents("b", b(''))
|
|
self.fs.setcontents("foo", b(''))
|
|
self.fs.setcontents("bar", b(''))
|
|
# Test listing of the root directory
|
|
d1 = self.fs.listdir()
|
|
self.assertEqual(len(d1), 4)
|
|
- self.assertEqual(sorted(d1), [u"a", u"b", u"bar", u"foo"])
|
|
+ self.assertEqual(sorted(d1), ["a", "b", "bar", "foo"])
|
|
check_unicode(d1)
|
|
d1 = self.fs.listdir("")
|
|
self.assertEqual(len(d1), 4)
|
|
- self.assertEqual(sorted(d1), [u"a", u"b", u"bar", u"foo"])
|
|
+ self.assertEqual(sorted(d1), ["a", "b", "bar", "foo"])
|
|
check_unicode(d1)
|
|
d1 = self.fs.listdir("/")
|
|
self.assertEqual(len(d1), 4)
|
|
@@ -234,7 +234,7 @@ class FSTestCases(object):
|
|
# Test listing absolute paths
|
|
d2 = self.fs.listdir(absolute=True)
|
|
self.assertEqual(len(d2), 4)
|
|
- self.assertEqual(sorted(d2), [u"/a", u"/b", u"/bar", u"/foo"])
|
|
+ self.assertEqual(sorted(d2), ["/a", "/b", "/bar", "/foo"])
|
|
check_unicode(d2)
|
|
# Create some deeper subdirectories, to make sure their
|
|
# contents are not inadvertantly included
|
|
@@ -248,25 +248,25 @@ class FSTestCases(object):
|
|
dirs_only = self.fs.listdir(dirs_only=True)
|
|
files_only = self.fs.listdir(files_only=True)
|
|
contains_a = self.fs.listdir(wildcard="*a*")
|
|
- self.assertEqual(sorted(dirs_only), [u"p", u"q"])
|
|
- self.assertEqual(sorted(files_only), [u"a", u"b", u"bar", u"foo"])
|
|
- self.assertEqual(sorted(contains_a), [u"a", u"bar"])
|
|
+ self.assertEqual(sorted(dirs_only), ["p", "q"])
|
|
+ self.assertEqual(sorted(files_only), ["a", "b", "bar", "foo"])
|
|
+ self.assertEqual(sorted(contains_a), ["a", "bar"])
|
|
check_unicode(dirs_only)
|
|
check_unicode(files_only)
|
|
check_unicode(contains_a)
|
|
# Test listing a subdirectory
|
|
d3 = self.fs.listdir("p/1/2/3")
|
|
self.assertEqual(len(d3), 4)
|
|
- self.assertEqual(sorted(d3), [u"a", u"b", u"bar", u"foo"])
|
|
+ self.assertEqual(sorted(d3), ["a", "b", "bar", "foo"])
|
|
check_unicode(d3)
|
|
# Test listing a subdirectory with absoliute and full paths
|
|
d4 = self.fs.listdir("p/1/2/3", absolute=True)
|
|
self.assertEqual(len(d4), 4)
|
|
- self.assertEqual(sorted(d4), [u"/p/1/2/3/a", u"/p/1/2/3/b", u"/p/1/2/3/bar", u"/p/1/2/3/foo"])
|
|
+ self.assertEqual(sorted(d4), ["/p/1/2/3/a", "/p/1/2/3/b", "/p/1/2/3/bar", "/p/1/2/3/foo"])
|
|
check_unicode(d4)
|
|
d4 = self.fs.listdir("p/1/2/3", full=True)
|
|
self.assertEqual(len(d4), 4)
|
|
- self.assertEqual(sorted(d4), [u"p/1/2/3/a", u"p/1/2/3/b", u"p/1/2/3/bar", u"p/1/2/3/foo"])
|
|
+ self.assertEqual(sorted(d4), ["p/1/2/3/a", "p/1/2/3/b", "p/1/2/3/bar", "p/1/2/3/foo"])
|
|
check_unicode(d4)
|
|
# Test that appropriate errors are raised
|
|
self.assertRaises(ResourceNotFoundError, self.fs.listdir, "zebra")
|
|
@@ -275,32 +275,32 @@ class FSTestCases(object):
|
|
def test_listdirinfo(self):
|
|
def check_unicode(items):
|
|
for (nm, info) in items:
|
|
- self.assertTrue(isinstance(nm, unicode))
|
|
+ self.assertTrue(isinstance(nm, str))
|
|
|
|
def check_equal(items, target):
|
|
names = [nm for (nm, info) in items]
|
|
self.assertEqual(sorted(names), sorted(target))
|
|
- self.fs.setcontents(u"a", b(''))
|
|
+ self.fs.setcontents("a", b(''))
|
|
self.fs.setcontents("b", b(''))
|
|
self.fs.setcontents("foo", b(''))
|
|
self.fs.setcontents("bar", b(''))
|
|
# Test listing of the root directory
|
|
d1 = self.fs.listdirinfo()
|
|
self.assertEqual(len(d1), 4)
|
|
- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
|
|
+ check_equal(d1, ["a", "b", "bar", "foo"])
|
|
check_unicode(d1)
|
|
d1 = self.fs.listdirinfo("")
|
|
self.assertEqual(len(d1), 4)
|
|
- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
|
|
+ check_equal(d1, ["a", "b", "bar", "foo"])
|
|
check_unicode(d1)
|
|
d1 = self.fs.listdirinfo("/")
|
|
self.assertEqual(len(d1), 4)
|
|
- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
|
|
+ check_equal(d1, ["a", "b", "bar", "foo"])
|
|
check_unicode(d1)
|
|
# Test listing absolute paths
|
|
d2 = self.fs.listdirinfo(absolute=True)
|
|
self.assertEqual(len(d2), 4)
|
|
- check_equal(d2, [u"/a", u"/b", u"/bar", u"/foo"])
|
|
+ check_equal(d2, ["/a", "/b", "/bar", "/foo"])
|
|
check_unicode(d2)
|
|
# Create some deeper subdirectories, to make sure their
|
|
# contents are not inadvertantly included
|
|
@@ -314,25 +314,25 @@ class FSTestCases(object):
|
|
dirs_only = self.fs.listdirinfo(dirs_only=True)
|
|
files_only = self.fs.listdirinfo(files_only=True)
|
|
contains_a = self.fs.listdirinfo(wildcard="*a*")
|
|
- check_equal(dirs_only, [u"p", u"q"])
|
|
- check_equal(files_only, [u"a", u"b", u"bar", u"foo"])
|
|
- check_equal(contains_a, [u"a", u"bar"])
|
|
+ check_equal(dirs_only, ["p", "q"])
|
|
+ check_equal(files_only, ["a", "b", "bar", "foo"])
|
|
+ check_equal(contains_a, ["a", "bar"])
|
|
check_unicode(dirs_only)
|
|
check_unicode(files_only)
|
|
check_unicode(contains_a)
|
|
# Test listing a subdirectory
|
|
d3 = self.fs.listdirinfo("p/1/2/3")
|
|
self.assertEqual(len(d3), 4)
|
|
- check_equal(d3, [u"a", u"b", u"bar", u"foo"])
|
|
+ check_equal(d3, ["a", "b", "bar", "foo"])
|
|
check_unicode(d3)
|
|
# Test listing a subdirectory with absoliute and full paths
|
|
d4 = self.fs.listdirinfo("p/1/2/3", absolute=True)
|
|
self.assertEqual(len(d4), 4)
|
|
- check_equal(d4, [u"/p/1/2/3/a", u"/p/1/2/3/b", u"/p/1/2/3/bar", u"/p/1/2/3/foo"])
|
|
+ check_equal(d4, ["/p/1/2/3/a", "/p/1/2/3/b", "/p/1/2/3/bar", "/p/1/2/3/foo"])
|
|
check_unicode(d4)
|
|
d4 = self.fs.listdirinfo("p/1/2/3", full=True)
|
|
self.assertEqual(len(d4), 4)
|
|
- check_equal(d4, [u"p/1/2/3/a", u"p/1/2/3/b", u"p/1/2/3/bar", u"p/1/2/3/foo"])
|
|
+ check_equal(d4, ["p/1/2/3/a", "p/1/2/3/b", "p/1/2/3/bar", "p/1/2/3/foo"])
|
|
check_unicode(d4)
|
|
# Test that appropriate errors are raised
|
|
self.assertRaises(ResourceNotFoundError, self.fs.listdirinfo, "zebra")
|
|
@@ -343,7 +343,7 @@ class FSTestCases(object):
|
|
self.fs.setcontents('b.txt', b('world'))
|
|
self.fs.makeopendir('foo').setcontents('c', b('123'))
|
|
sorted_walk = sorted([(d, sorted(fs)) for (d, fs) in self.fs.walk()])
|
|
- self.assertEquals(sorted_walk,
|
|
+ self.assertEqual(sorted_walk,
|
|
[("/", ["a.txt", "b.txt"]),
|
|
("/foo", ["c"])])
|
|
# When searching breadth-first, shallow entries come first
|
|
@@ -371,10 +371,10 @@ class FSTestCases(object):
|
|
self.fs.makeopendir('.svn').setcontents('ignored', b(''))
|
|
for dir_path, paths in self.fs.walk(wildcard='*.txt'):
|
|
for path in paths:
|
|
- self.assert_(path.endswith('.txt'))
|
|
+ self.assertTrue(path.endswith('.txt'))
|
|
for dir_path, paths in self.fs.walk(wildcard=lambda fn: fn.endswith('.txt')):
|
|
for path in paths:
|
|
- self.assert_(path.endswith('.txt'))
|
|
+ self.assertTrue(path.endswith('.txt'))
|
|
|
|
def test_walk_dir_wildcard(self):
|
|
self.fs.setcontents('a.txt', b('hello'))
|
|
@@ -383,35 +383,35 @@ class FSTestCases(object):
|
|
self.fs.makeopendir('.svn').setcontents('ignored', b(''))
|
|
for dir_path, paths in self.fs.walk(dir_wildcard=lambda fn: not fn.endswith('.svn')):
|
|
for path in paths:
|
|
- self.assert_('.svn' not in path)
|
|
+ self.assertTrue('.svn' not in path)
|
|
|
|
def test_walkfiles(self):
|
|
self.fs.makeopendir('bar').setcontents('a.txt', b('123'))
|
|
self.fs.makeopendir('foo').setcontents('b', b('123'))
|
|
- self.assertEquals(sorted(
|
|
+ self.assertEqual(sorted(
|
|
self.fs.walkfiles()), ["/bar/a.txt", "/foo/b"])
|
|
- self.assertEquals(sorted(self.fs.walkfiles(
|
|
+ self.assertEqual(sorted(self.fs.walkfiles(
|
|
dir_wildcard="*foo*")), ["/foo/b"])
|
|
- self.assertEquals(sorted(self.fs.walkfiles(
|
|
+ self.assertEqual(sorted(self.fs.walkfiles(
|
|
wildcard="*.txt")), ["/bar/a.txt"])
|
|
|
|
def test_walkdirs(self):
|
|
self.fs.makeopendir('bar').setcontents('a.txt', b('123'))
|
|
self.fs.makeopendir('foo').makeopendir(
|
|
"baz").setcontents('b', b('123'))
|
|
- self.assertEquals(sorted(self.fs.walkdirs()), [
|
|
+ self.assertEqual(sorted(self.fs.walkdirs()), [
|
|
"/", "/bar", "/foo", "/foo/baz"])
|
|
- self.assertEquals(sorted(self.fs.walkdirs(
|
|
+ self.assertEqual(sorted(self.fs.walkdirs(
|
|
wildcard="*foo*")), ["/", "/foo", "/foo/baz"])
|
|
|
|
def test_unicode(self):
|
|
- alpha = u"\N{GREEK SMALL LETTER ALPHA}"
|
|
- beta = u"\N{GREEK SMALL LETTER BETA}"
|
|
+ alpha = "\N{GREEK SMALL LETTER ALPHA}"
|
|
+ beta = "\N{GREEK SMALL LETTER BETA}"
|
|
self.fs.makedir(alpha)
|
|
self.fs.setcontents(alpha + "/a", b(''))
|
|
self.fs.setcontents(alpha + "/" + beta, b(''))
|
|
self.assertTrue(self.check(alpha))
|
|
- self.assertEquals(sorted(self.fs.listdir(alpha)), ["a", beta])
|
|
+ self.assertEqual(sorted(self.fs.listdir(alpha)), ["a", beta])
|
|
|
|
def test_makedir(self):
|
|
check = self.check
|
|
@@ -420,11 +420,11 @@ class FSTestCases(object):
|
|
self.assertRaises(
|
|
ParentDirectoryMissingError, self.fs.makedir, "a/b/c")
|
|
self.fs.makedir("a/b/c", recursive=True)
|
|
- self.assert_(check("a/b/c"))
|
|
+ self.assertTrue(check("a/b/c"))
|
|
self.fs.makedir("foo/bar/baz", recursive=True)
|
|
- self.assert_(check("foo/bar/baz"))
|
|
+ self.assertTrue(check("foo/bar/baz"))
|
|
self.fs.makedir("a/b/child")
|
|
- self.assert_(check("a/b/child"))
|
|
+ self.assertTrue(check("a/b/child"))
|
|
self.assertRaises(DestinationExistsError, self.fs.makedir, "/a/b")
|
|
self.fs.makedir("/a/b", allow_recreate=True)
|
|
self.fs.setcontents("/a/file", b(''))
|
|
@@ -446,30 +446,30 @@ class FSTestCases(object):
|
|
def test_removedir(self):
|
|
check = self.check
|
|
self.fs.makedir("a")
|
|
- self.assert_(check("a"))
|
|
+ self.assertTrue(check("a"))
|
|
self.fs.removedir("a")
|
|
self.assertRaises(ResourceNotFoundError, self.fs.removedir, "a")
|
|
- self.assert_(not check("a"))
|
|
+ self.assertTrue(not check("a"))
|
|
self.fs.makedir("a/b/c/d", recursive=True)
|
|
self.assertRaises(DirectoryNotEmptyError, self.fs.removedir, "a/b")
|
|
self.fs.removedir("a/b/c/d")
|
|
- self.assert_(not check("a/b/c/d"))
|
|
+ self.assertTrue(not check("a/b/c/d"))
|
|
self.fs.removedir("a/b/c")
|
|
- self.assert_(not check("a/b/c"))
|
|
+ self.assertTrue(not check("a/b/c"))
|
|
self.fs.removedir("a/b")
|
|
- self.assert_(not check("a/b"))
|
|
+ self.assertTrue(not check("a/b"))
|
|
# Test recursive removal of empty parent dirs
|
|
self.fs.makedir("foo/bar/baz", recursive=True)
|
|
self.fs.removedir("foo/bar/baz", recursive=True)
|
|
- self.assert_(not check("foo/bar/baz"))
|
|
- self.assert_(not check("foo/bar"))
|
|
- self.assert_(not check("foo"))
|
|
+ self.assertTrue(not check("foo/bar/baz"))
|
|
+ self.assertTrue(not check("foo/bar"))
|
|
+ self.assertTrue(not check("foo"))
|
|
self.fs.makedir("foo/bar/baz", recursive=True)
|
|
self.fs.setcontents("foo/file.txt", b("please don't delete me"))
|
|
self.fs.removedir("foo/bar/baz", recursive=True)
|
|
- self.assert_(not check("foo/bar/baz"))
|
|
- self.assert_(not check("foo/bar"))
|
|
- self.assert_(check("foo/file.txt"))
|
|
+ self.assertTrue(not check("foo/bar/baz"))
|
|
+ self.assertTrue(not check("foo/bar"))
|
|
+ self.assertTrue(check("foo/file.txt"))
|
|
# Ensure that force=True works as expected
|
|
self.fs.makedir("frollic/waggle", recursive=True)
|
|
self.fs.setcontents("frollic/waddle.txt", b("waddlewaddlewaddle"))
|
|
@@ -477,41 +477,41 @@ class FSTestCases(object):
|
|
self.assertRaises(
|
|
ResourceInvalidError, self.fs.removedir, "frollic/waddle.txt")
|
|
self.fs.removedir("frollic", force=True)
|
|
- self.assert_(not check("frollic"))
|
|
+ self.assertTrue(not check("frollic"))
|
|
# Test removing unicode dirs
|
|
- kappa = u"\N{GREEK CAPITAL LETTER KAPPA}"
|
|
+ kappa = "\N{GREEK CAPITAL LETTER KAPPA}"
|
|
self.fs.makedir(kappa)
|
|
- self.assert_(self.fs.isdir(kappa))
|
|
+ self.assertTrue(self.fs.isdir(kappa))
|
|
self.fs.removedir(kappa)
|
|
self.assertRaises(ResourceNotFoundError, self.fs.removedir, kappa)
|
|
- self.assert_(not self.fs.isdir(kappa))
|
|
+ self.assertTrue(not self.fs.isdir(kappa))
|
|
self.fs.makedir(pathjoin("test", kappa), recursive=True)
|
|
- self.assert_(check(pathjoin("test", kappa)))
|
|
+ self.assertTrue(check(pathjoin("test", kappa)))
|
|
self.fs.removedir("test", force=True)
|
|
- self.assert_(not check("test"))
|
|
+ self.assertTrue(not check("test"))
|
|
|
|
def test_rename(self):
|
|
check = self.check
|
|
# test renaming a file in the same directory
|
|
self.fs.setcontents("foo.txt", b("Hello, World!"))
|
|
- self.assert_(check("foo.txt"))
|
|
+ self.assertTrue(check("foo.txt"))
|
|
self.fs.rename("foo.txt", "bar.txt")
|
|
- self.assert_(check("bar.txt"))
|
|
- self.assert_(not check("foo.txt"))
|
|
+ self.assertTrue(check("bar.txt"))
|
|
+ self.assertTrue(not check("foo.txt"))
|
|
# test renaming a directory in the same directory
|
|
self.fs.makedir("dir_a")
|
|
self.fs.setcontents("dir_a/test.txt", b("testerific"))
|
|
- self.assert_(check("dir_a"))
|
|
+ self.assertTrue(check("dir_a"))
|
|
self.fs.rename("dir_a", "dir_b")
|
|
- self.assert_(check("dir_b"))
|
|
- self.assert_(check("dir_b/test.txt"))
|
|
- self.assert_(not check("dir_a/test.txt"))
|
|
- self.assert_(not check("dir_a"))
|
|
+ self.assertTrue(check("dir_b"))
|
|
+ self.assertTrue(check("dir_b/test.txt"))
|
|
+ self.assertTrue(not check("dir_a/test.txt"))
|
|
+ self.assertTrue(not check("dir_a"))
|
|
# test renaming a file into a different directory
|
|
self.fs.makedir("dir_a")
|
|
self.fs.rename("dir_b/test.txt", "dir_a/test.txt")
|
|
- self.assert_(not check("dir_b/test.txt"))
|
|
- self.assert_(check("dir_a/test.txt"))
|
|
+ self.assertTrue(not check("dir_b/test.txt"))
|
|
+ self.assertTrue(check("dir_a/test.txt"))
|
|
# test renaming a file into a non-existent directory
|
|
self.assertRaises(ParentDirectoryMissingError,
|
|
self.fs.rename, "dir_a/test.txt", "nonexistent/test.txt")
|
|
@@ -530,7 +530,7 @@ class FSTestCases(object):
|
|
test_str = b("Hello, World!")
|
|
self.fs.setcontents("info.txt", test_str)
|
|
info = self.fs.getinfo("info.txt")
|
|
- for k, v in info.iteritems():
|
|
+ for k, v in info.items():
|
|
self.assertEqual(self.fs.getinfokeys('info.txt', k), {k: v})
|
|
|
|
test_info = {}
|
|
@@ -562,26 +562,26 @@ class FSTestCases(object):
|
|
|
|
self.fs.makedir("foo/bar", recursive=True)
|
|
makefile("foo/bar/a.txt")
|
|
- self.assert_(check("foo/bar/a.txt"))
|
|
- self.assert_(checkcontents("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("foo/bar/a.txt"))
|
|
+ self.assertTrue(checkcontents("foo/bar/a.txt"))
|
|
self.fs.move("foo/bar/a.txt", "foo/b.txt")
|
|
- self.assert_(not check("foo/bar/a.txt"))
|
|
- self.assert_(check("foo/b.txt"))
|
|
- self.assert_(checkcontents("foo/b.txt"))
|
|
+ self.assertTrue(not check("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("foo/b.txt"))
|
|
+ self.assertTrue(checkcontents("foo/b.txt"))
|
|
|
|
self.fs.move("foo/b.txt", "c.txt")
|
|
- self.assert_(not check("foo/b.txt"))
|
|
- self.assert_(check("/c.txt"))
|
|
- self.assert_(checkcontents("/c.txt"))
|
|
+ self.assertTrue(not check("foo/b.txt"))
|
|
+ self.assertTrue(check("/c.txt"))
|
|
+ self.assertTrue(checkcontents("/c.txt"))
|
|
|
|
makefile("foo/bar/a.txt")
|
|
self.assertRaises(
|
|
DestinationExistsError, self.fs.move, "foo/bar/a.txt", "/c.txt")
|
|
- self.assert_(check("foo/bar/a.txt"))
|
|
- self.assert_(check("/c.txt"))
|
|
+ self.assertTrue(check("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("/c.txt"))
|
|
self.fs.move("foo/bar/a.txt", "/c.txt", overwrite=True)
|
|
- self.assert_(not check("foo/bar/a.txt"))
|
|
- self.assert_(check("/c.txt"))
|
|
+ self.assertTrue(not check("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("/c.txt"))
|
|
|
|
def test_movedir(self):
|
|
check = self.check
|
|
@@ -602,29 +602,29 @@ class FSTestCases(object):
|
|
|
|
self.fs.movedir("a", "copy of a")
|
|
|
|
- self.assert_(self.fs.isdir("copy of a"))
|
|
- self.assert_(check("copy of a/1.txt"))
|
|
- self.assert_(check("copy of a/2.txt"))
|
|
- self.assert_(check("copy of a/3.txt"))
|
|
- self.assert_(check("copy of a/foo/bar/baz.txt"))
|
|
+ self.assertTrue(self.fs.isdir("copy of a"))
|
|
+ self.assertTrue(check("copy of a/1.txt"))
|
|
+ self.assertTrue(check("copy of a/2.txt"))
|
|
+ self.assertTrue(check("copy of a/3.txt"))
|
|
+ self.assertTrue(check("copy of a/foo/bar/baz.txt"))
|
|
|
|
- self.assert_(not check("a/1.txt"))
|
|
- self.assert_(not check("a/2.txt"))
|
|
- self.assert_(not check("a/3.txt"))
|
|
- self.assert_(not check("a/foo/bar/baz.txt"))
|
|
- self.assert_(not check("a/foo/bar"))
|
|
- self.assert_(not check("a/foo"))
|
|
- self.assert_(not check("a"))
|
|
+ self.assertTrue(not check("a/1.txt"))
|
|
+ self.assertTrue(not check("a/2.txt"))
|
|
+ self.assertTrue(not check("a/3.txt"))
|
|
+ self.assertTrue(not check("a/foo/bar/baz.txt"))
|
|
+ self.assertTrue(not check("a/foo/bar"))
|
|
+ self.assertTrue(not check("a/foo"))
|
|
+ self.assertTrue(not check("a"))
|
|
|
|
self.fs.makedir("a")
|
|
self.assertRaises(
|
|
DestinationExistsError, self.fs.movedir, "copy of a", "a")
|
|
self.fs.movedir("copy of a", "a", overwrite=True)
|
|
- self.assert_(not check("copy of a"))
|
|
- self.assert_(check("a/1.txt"))
|
|
- self.assert_(check("a/2.txt"))
|
|
- self.assert_(check("a/3.txt"))
|
|
- self.assert_(check("a/foo/bar/baz.txt"))
|
|
+ self.assertTrue(not check("copy of a"))
|
|
+ self.assertTrue(check("a/1.txt"))
|
|
+ self.assertTrue(check("a/2.txt"))
|
|
+ self.assertTrue(check("a/3.txt"))
|
|
+ self.assertTrue(check("a/foo/bar/baz.txt"))
|
|
|
|
def test_cant_copy_from_os(self):
|
|
sys_executable = os.path.abspath(os.path.realpath(sys.executable))
|
|
@@ -645,28 +645,28 @@ class FSTestCases(object):
|
|
|
|
self.fs.makedir("foo/bar", recursive=True)
|
|
makefile("foo/bar/a.txt")
|
|
- self.assert_(check("foo/bar/a.txt"))
|
|
- self.assert_(checkcontents("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("foo/bar/a.txt"))
|
|
+ self.assertTrue(checkcontents("foo/bar/a.txt"))
|
|
# import rpdb2; rpdb2.start_embedded_debugger('password');
|
|
self.fs.copy("foo/bar/a.txt", "foo/b.txt")
|
|
- self.assert_(check("foo/bar/a.txt"))
|
|
- self.assert_(check("foo/b.txt"))
|
|
- self.assert_(checkcontents("foo/bar/a.txt"))
|
|
- self.assert_(checkcontents("foo/b.txt"))
|
|
+ self.assertTrue(check("foo/bar/a.txt"))
|
|
+ self.assertTrue(check("foo/b.txt"))
|
|
+ self.assertTrue(checkcontents("foo/bar/a.txt"))
|
|
+ self.assertTrue(checkcontents("foo/b.txt"))
|
|
|
|
self.fs.copy("foo/b.txt", "c.txt")
|
|
- self.assert_(check("foo/b.txt"))
|
|
- self.assert_(check("/c.txt"))
|
|
- self.assert_(checkcontents("/c.txt"))
|
|
+ self.assertTrue(check("foo/b.txt"))
|
|
+ self.assertTrue(check("/c.txt"))
|
|
+ self.assertTrue(checkcontents("/c.txt"))
|
|
|
|
makefile("foo/bar/a.txt", b("different contents"))
|
|
- self.assert_(checkcontents("foo/bar/a.txt", b("different contents")))
|
|
+ self.assertTrue(checkcontents("foo/bar/a.txt", b("different contents")))
|
|
self.assertRaises(
|
|
DestinationExistsError, self.fs.copy, "foo/bar/a.txt", "/c.txt")
|
|
- self.assert_(checkcontents("/c.txt"))
|
|
+ self.assertTrue(checkcontents("/c.txt"))
|
|
self.fs.copy("foo/bar/a.txt", "/c.txt", overwrite=True)
|
|
- self.assert_(checkcontents("foo/bar/a.txt", b("different contents")))
|
|
- self.assert_(checkcontents("/c.txt", b("different contents")))
|
|
+ self.assertTrue(checkcontents("foo/bar/a.txt", b("different contents")))
|
|
+ self.assertTrue(checkcontents("/c.txt", b("different contents")))
|
|
|
|
def test_copydir(self):
|
|
check = self.check
|
|
@@ -690,24 +690,24 @@ class FSTestCases(object):
|
|
makefile("a/foo/bar/baz.txt")
|
|
|
|
self.fs.copydir("a", "copy of a")
|
|
- self.assert_(check("copy of a/1.txt"))
|
|
- self.assert_(check("copy of a/2.txt"))
|
|
- self.assert_(check("copy of a/3.txt"))
|
|
- self.assert_(check("copy of a/foo/bar/baz.txt"))
|
|
+ self.assertTrue(check("copy of a/1.txt"))
|
|
+ self.assertTrue(check("copy of a/2.txt"))
|
|
+ self.assertTrue(check("copy of a/3.txt"))
|
|
+ self.assertTrue(check("copy of a/foo/bar/baz.txt"))
|
|
checkcontents("copy of a/1.txt")
|
|
|
|
- self.assert_(check("a/1.txt"))
|
|
- self.assert_(check("a/2.txt"))
|
|
- self.assert_(check("a/3.txt"))
|
|
- self.assert_(check("a/foo/bar/baz.txt"))
|
|
+ self.assertTrue(check("a/1.txt"))
|
|
+ self.assertTrue(check("a/2.txt"))
|
|
+ self.assertTrue(check("a/3.txt"))
|
|
+ self.assertTrue(check("a/foo/bar/baz.txt"))
|
|
checkcontents("a/1.txt")
|
|
|
|
self.assertRaises(DestinationExistsError, self.fs.copydir, "a", "b")
|
|
self.fs.copydir("a", "b", overwrite=True)
|
|
- self.assert_(check("b/1.txt"))
|
|
- self.assert_(check("b/2.txt"))
|
|
- self.assert_(check("b/3.txt"))
|
|
- self.assert_(check("b/foo/bar/baz.txt"))
|
|
+ self.assertTrue(check("b/1.txt"))
|
|
+ self.assertTrue(check("b/2.txt"))
|
|
+ self.assertTrue(check("b/3.txt"))
|
|
+ self.assertTrue(check("b/foo/bar/baz.txt"))
|
|
checkcontents("b/1.txt")
|
|
|
|
def test_copydir_with_dotfile(self):
|
|
@@ -724,13 +724,13 @@ class FSTestCases(object):
|
|
makefile("a/.hidden.txt")
|
|
|
|
self.fs.copydir("a", "copy of a")
|
|
- self.assert_(check("copy of a/1.txt"))
|
|
- self.assert_(check("copy of a/2.txt"))
|
|
- self.assert_(check("copy of a/.hidden.txt"))
|
|
+ self.assertTrue(check("copy of a/1.txt"))
|
|
+ self.assertTrue(check("copy of a/2.txt"))
|
|
+ self.assertTrue(check("copy of a/.hidden.txt"))
|
|
|
|
- self.assert_(check("a/1.txt"))
|
|
- self.assert_(check("a/2.txt"))
|
|
- self.assert_(check("a/.hidden.txt"))
|
|
+ self.assertTrue(check("a/1.txt"))
|
|
+ self.assertTrue(check("a/2.txt"))
|
|
+ self.assertTrue(check("a/.hidden.txt"))
|
|
|
|
def test_readwriteappendseek(self):
|
|
def checkcontents(path, check_contents):
|
|
@@ -743,7 +743,7 @@ class FSTestCases(object):
|
|
all_strings = b("").join(test_strings)
|
|
|
|
self.assertRaises(ResourceNotFoundError, self.fs.open, "a.txt", "r")
|
|
- self.assert_(not self.fs.exists("a.txt"))
|
|
+ self.assertTrue(not self.fs.exists("a.txt"))
|
|
f1 = self.fs.open("a.txt", "wb")
|
|
pos = 0
|
|
for s in test_strings:
|
|
@@ -751,26 +751,26 @@ class FSTestCases(object):
|
|
pos += len(s)
|
|
self.assertEqual(pos, f1.tell())
|
|
f1.close()
|
|
- self.assert_(self.fs.exists("a.txt"))
|
|
- self.assert_(checkcontents("a.txt", all_strings))
|
|
+ self.assertTrue(self.fs.exists("a.txt"))
|
|
+ self.assertTrue(checkcontents("a.txt", all_strings))
|
|
|
|
f2 = self.fs.open("b.txt", "wb")
|
|
f2.write(test_strings[0])
|
|
f2.close()
|
|
- self.assert_(checkcontents("b.txt", test_strings[0]))
|
|
+ self.assertTrue(checkcontents("b.txt", test_strings[0]))
|
|
f3 = self.fs.open("b.txt", "ab")
|
|
# On win32, tell() gives zero until you actually write to the file
|
|
# self.assertEquals(f3.tell(),len(test_strings[0]))
|
|
f3.write(test_strings[1])
|
|
- self.assertEquals(f3.tell(), len(test_strings[0])+len(test_strings[1]))
|
|
+ self.assertEqual(f3.tell(), len(test_strings[0])+len(test_strings[1]))
|
|
f3.write(test_strings[2])
|
|
- self.assertEquals(f3.tell(), len(all_strings))
|
|
+ self.assertEqual(f3.tell(), len(all_strings))
|
|
f3.close()
|
|
- self.assert_(checkcontents("b.txt", all_strings))
|
|
+ self.assertTrue(checkcontents("b.txt", all_strings))
|
|
f4 = self.fs.open("b.txt", "wb")
|
|
f4.write(test_strings[2])
|
|
f4.close()
|
|
- self.assert_(checkcontents("b.txt", test_strings[2]))
|
|
+ self.assertTrue(checkcontents("b.txt", test_strings[2]))
|
|
f5 = self.fs.open("c.txt", "wb")
|
|
for s in test_strings:
|
|
f5.write(s+b("\n"))
|
|
@@ -815,7 +815,7 @@ class FSTestCases(object):
|
|
with self.fs.open("hello", "wb") as f:
|
|
f.truncate(30)
|
|
|
|
- self.assertEquals(self.fs.getsize("hello"), 30)
|
|
+ self.assertEqual(self.fs.getsize("hello"), 30)
|
|
|
|
# Some file systems (FTPFS) don't support both reading and writing
|
|
if self.fs.getmeta('file.read_and_write', True):
|
|
@@ -825,7 +825,7 @@ class FSTestCases(object):
|
|
|
|
with self.fs.open("hello", "rb") as f:
|
|
f.seek(25)
|
|
- self.assertEquals(f.read(), b("123456"))
|
|
+ self.assertEqual(f.read(), b("123456"))
|
|
|
|
def test_write_past_end_of_file(self):
|
|
if self.fs.getmeta('file.read_and_write', True):
|
|
@@ -833,7 +833,7 @@ class FSTestCases(object):
|
|
f.seek(25)
|
|
f.write(b("EOF"))
|
|
with self.fs.open("write_at_end", "rb") as f:
|
|
- self.assertEquals(f.read(), b("\x00")*25 + b("EOF"))
|
|
+ self.assertEqual(f.read(), b("\x00")*25 + b("EOF"))
|
|
|
|
def test_with_statement(self):
|
|
# This is a little tricky since 'with' is actually new syntax.
|
|
@@ -856,15 +856,15 @@ class FSTestCases(object):
|
|
code += " raise ValueError\n"
|
|
code = compile(code, "<string>", 'exec')
|
|
self.assertRaises(ValueError, eval, code, globals(), locals())
|
|
- self.assertEquals(self.fs.getcontents('f.txt', 'rb'), contents)
|
|
+ self.assertEqual(self.fs.getcontents('f.txt', 'rb'), contents)
|
|
|
|
def test_pickling(self):
|
|
if self.fs.getmeta('pickle_contents', True):
|
|
self.fs.setcontents("test1", b("hello world"))
|
|
fs2 = pickle.loads(pickle.dumps(self.fs))
|
|
- self.assert_(fs2.isfile("test1"))
|
|
+ self.assertTrue(fs2.isfile("test1"))
|
|
fs3 = pickle.loads(pickle.dumps(self.fs, -1))
|
|
- self.assert_(fs3.isfile("test1"))
|
|
+ self.assertTrue(fs3.isfile("test1"))
|
|
else:
|
|
# Just make sure it doesn't throw an exception
|
|
fs2 = pickle.loads(pickle.dumps(self.fs))
|
|
@@ -879,9 +879,9 @@ class FSTestCases(object):
|
|
r = random.Random(0)
|
|
randint = r.randint
|
|
int2byte = six.int2byte
|
|
- for _i in xrange(num_chunks):
|
|
+ for _i in range(num_chunks):
|
|
c = b("").join(int2byte(randint(
|
|
- 0, 255)) for _j in xrange(chunk_size//8))
|
|
+ 0, 255)) for _j in range(chunk_size//8))
|
|
yield c * 8
|
|
f = self.fs.open("bigfile", "wb")
|
|
try:
|
|
@@ -894,7 +894,7 @@ class FSTestCases(object):
|
|
try:
|
|
try:
|
|
while True:
|
|
- if chunks.next() != f.read(chunk_size):
|
|
+ if next(chunks) != f.read(chunk_size):
|
|
assert False, "bigfile was corrupted"
|
|
except StopIteration:
|
|
if f.read() != b(""):
|
|
@@ -929,9 +929,9 @@ class FSTestCases(object):
|
|
"""Test read(0) returns empty string"""
|
|
self.fs.setcontents('foo.txt', b('Hello, World'))
|
|
with self.fs.open('foo.txt', 'rb') as f:
|
|
- self.assert_(len(f.read(0)) == 0)
|
|
+ self.assertTrue(len(f.read(0)) == 0)
|
|
with self.fs.open('foo.txt', 'rt') as f:
|
|
- self.assert_(len(f.read(0)) == 0)
|
|
+ self.assertTrue(len(f.read(0)) == 0)
|
|
|
|
# May be disabled - see end of file
|
|
|
|
@@ -977,7 +977,7 @@ class ThreadingTestCases(object):
|
|
for t in threads:
|
|
t.join()
|
|
for (c, e, t) in errors:
|
|
- raise e, None, t
|
|
+ raise e.with_traceback(t)
|
|
finally:
|
|
sys.setcheckinterval(check_interval)
|
|
|
|
@@ -994,12 +994,12 @@ class ThreadingTestCases(object):
|
|
def thread1():
|
|
c = b("thread1 was 'ere")
|
|
setcontents("thread1.txt", c)
|
|
- self.assertEquals(self.fs.getcontents("thread1.txt", 'rb'), c)
|
|
+ self.assertEqual(self.fs.getcontents("thread1.txt", 'rb'), c)
|
|
|
|
def thread2():
|
|
c = b("thread2 was 'ere")
|
|
setcontents("thread2.txt", c)
|
|
- self.assertEquals(self.fs.getcontents("thread2.txt", 'rb'), c)
|
|
+ self.assertEqual(self.fs.getcontents("thread2.txt", 'rb'), c)
|
|
self._runThreads(thread1, thread2)
|
|
|
|
def test_setcontents_threaded_samefile(self):
|
|
@@ -1016,19 +1016,19 @@ class ThreadingTestCases(object):
|
|
c = b("thread1 was 'ere")
|
|
setcontents("threads.txt", c)
|
|
self._yield()
|
|
- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
|
|
+ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
|
|
|
|
def thread2():
|
|
c = b("thread2 was 'ere")
|
|
setcontents("threads.txt", c)
|
|
self._yield()
|
|
- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
|
|
+ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
|
|
|
|
def thread3():
|
|
c = b("thread3 was 'ere")
|
|
setcontents("threads.txt", c)
|
|
self._yield()
|
|
- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
|
|
+ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
|
|
try:
|
|
self._runThreads(thread1, thread2, thread3)
|
|
except ResourceLockedError:
|
|
@@ -1079,23 +1079,23 @@ class ThreadingTestCases(object):
|
|
def makedir():
|
|
try:
|
|
self.fs.makedir("testdir")
|
|
- except DestinationExistsError, e:
|
|
+ except DestinationExistsError as e:
|
|
errors.append(e)
|
|
|
|
def makedir_noerror():
|
|
try:
|
|
self.fs.makedir("testdir", allow_recreate=True)
|
|
- except DestinationExistsError, e:
|
|
+ except DestinationExistsError as e:
|
|
errors.append(e)
|
|
|
|
def removedir():
|
|
try:
|
|
self.fs.removedir("testdir")
|
|
- except (ResourceNotFoundError, ResourceLockedError), e:
|
|
+ except (ResourceNotFoundError, ResourceLockedError) as e:
|
|
errors.append(e)
|
|
# One thread should succeed, one should error
|
|
self._runThreads(makedir, makedir)
|
|
- self.assertEquals(len(errors), 1)
|
|
+ self.assertEqual(len(errors), 1)
|
|
self.fs.removedir("testdir")
|
|
# One thread should succeed, two should error
|
|
errors = []
|
|
@@ -1106,18 +1106,18 @@ class ThreadingTestCases(object):
|
|
# All threads should succeed
|
|
errors = []
|
|
self._runThreads(makedir_noerror, makedir_noerror, makedir_noerror)
|
|
- self.assertEquals(len(errors), 0)
|
|
+ self.assertEqual(len(errors), 0)
|
|
self.assertTrue(self.fs.isdir("testdir"))
|
|
self.fs.removedir("testdir")
|
|
# makedir() can beat removedir() and vice-versa
|
|
errors = []
|
|
self._runThreads(makedir, removedir)
|
|
if self.fs.isdir("testdir"):
|
|
- self.assertEquals(len(errors), 1)
|
|
+ self.assertEqual(len(errors), 1)
|
|
self.assertFalse(isinstance(errors[0], DestinationExistsError))
|
|
self.fs.removedir("testdir")
|
|
else:
|
|
- self.assertEquals(len(errors), 0)
|
|
+ self.assertEqual(len(errors), 0)
|
|
|
|
def test_concurrent_copydir(self):
|
|
self.fs.makedir("a")
|
|
@@ -1136,10 +1136,10 @@ class ThreadingTestCases(object):
|
|
# This should error out since we're not overwriting
|
|
self.assertRaises(
|
|
DestinationExistsError, self._runThreads, copydir, copydir)
|
|
- self.assert_(self.fs.isdir('a'))
|
|
- self.assert_(self.fs.isdir('a'))
|
|
+ self.assertTrue(self.fs.isdir('a'))
|
|
+ self.assertTrue(self.fs.isdir('a'))
|
|
copydir_overwrite()
|
|
- self.assert_(self.fs.isdir('a'))
|
|
+ self.assertTrue(self.fs.isdir('a'))
|
|
# This should run to completion and give a valid state, unless
|
|
# files get locked when written to.
|
|
try:
|
|
@@ -1160,19 +1160,19 @@ class ThreadingTestCases(object):
|
|
"contents the second"), b("number three")]
|
|
|
|
def thread1():
|
|
- for i in xrange(30):
|
|
+ for i in range(30):
|
|
for c in contents:
|
|
self.fs.setcontents("thread1.txt", c)
|
|
- self.assertEquals(self.fs.getsize("thread1.txt"), len(c))
|
|
- self.assertEquals(self.fs.getcontents(
|
|
+ self.assertEqual(self.fs.getsize("thread1.txt"), len(c))
|
|
+ self.assertEqual(self.fs.getcontents(
|
|
"thread1.txt", 'rb'), c)
|
|
|
|
def thread2():
|
|
- for i in xrange(30):
|
|
+ for i in range(30):
|
|
for c in contents:
|
|
self.fs.setcontents("thread2.txt", c)
|
|
- self.assertEquals(self.fs.getsize("thread2.txt"), len(c))
|
|
- self.assertEquals(self.fs.getcontents(
|
|
+ self.assertEqual(self.fs.getsize("thread2.txt"), len(c))
|
|
+ self.assertEqual(self.fs.getcontents(
|
|
"thread2.txt", 'rb'), c)
|
|
self._runThreads(thread1, thread2)
|
|
|
|
--- fs/tests/test_archivefs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_archivefs.py
|
|
@@ -58,7 +58,7 @@ class TestReadArchiveFS(unittest.TestCase):
|
|
contents = f.read()
|
|
return contents
|
|
def check_contents(path, expected):
|
|
- self.assert_(read_contents(path)==expected)
|
|
+ self.assertTrue(read_contents(path)==expected)
|
|
check_contents("a.txt", b("Hello, World!"))
|
|
check_contents("1.txt", b("1"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
@@ -67,29 +67,29 @@ class TestReadArchiveFS(unittest.TestCase):
|
|
def read_contents(path):
|
|
return self.fs.getcontents(path)
|
|
def check_contents(path, expected):
|
|
- self.assert_(read_contents(path)==expected)
|
|
+ self.assertTrue(read_contents(path)==expected)
|
|
check_contents("a.txt", b("Hello, World!"))
|
|
check_contents("1.txt", b("1"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
|
|
def test_is(self):
|
|
- self.assert_(self.fs.isfile('a.txt'))
|
|
- self.assert_(self.fs.isfile('1.txt'))
|
|
- self.assert_(self.fs.isfile('foo/bar/baz.txt'))
|
|
- self.assert_(self.fs.isdir('foo'))
|
|
- self.assert_(self.fs.isdir('foo/bar'))
|
|
- self.assert_(self.fs.exists('a.txt'))
|
|
- self.assert_(self.fs.exists('1.txt'))
|
|
- self.assert_(self.fs.exists('foo/bar/baz.txt'))
|
|
- self.assert_(self.fs.exists('foo'))
|
|
- self.assert_(self.fs.exists('foo/bar'))
|
|
+ self.assertTrue(self.fs.isfile('a.txt'))
|
|
+ self.assertTrue(self.fs.isfile('1.txt'))
|
|
+ self.assertTrue(self.fs.isfile('foo/bar/baz.txt'))
|
|
+ self.assertTrue(self.fs.isdir('foo'))
|
|
+ self.assertTrue(self.fs.isdir('foo/bar'))
|
|
+ self.assertTrue(self.fs.exists('a.txt'))
|
|
+ self.assertTrue(self.fs.exists('1.txt'))
|
|
+ self.assertTrue(self.fs.exists('foo/bar/baz.txt'))
|
|
+ self.assertTrue(self.fs.exists('foo'))
|
|
+ self.assertTrue(self.fs.exists('foo/bar'))
|
|
|
|
def test_listdir(self):
|
|
def check_listing(path, expected):
|
|
dir_list = self.fs.listdir(path)
|
|
- self.assert_(sorted(dir_list) == sorted(expected))
|
|
+ self.assertTrue(sorted(dir_list) == sorted(expected))
|
|
for item in dir_list:
|
|
- self.assert_(isinstance(item,unicode))
|
|
+ self.assertTrue(isinstance(item,str))
|
|
check_listing('/', ['a.txt', '1.txt', 'foo', 'b.txt'])
|
|
check_listing('foo', ['second.txt', 'bar'])
|
|
check_listing('foo/bar', ['baz.txt'])
|
|
@@ -114,7 +114,7 @@ class TestWriteArchiveFS(unittest.TestCase):
|
|
|
|
makefile("a.txt", b("Hello, World!"))
|
|
makefile("b.txt", b("b"))
|
|
- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
+ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
makefile("foo/bar/baz.txt", b("baz"))
|
|
makefile("foo/second.txt", b("hai"))
|
|
|
|
@@ -125,7 +125,7 @@ class TestWriteArchiveFS(unittest.TestCase):
|
|
|
|
def test_valid(self):
|
|
zf = zipfile.ZipFile(self.temp_filename, "r")
|
|
- self.assert_(zf.testzip() is None)
|
|
+ self.assertTrue(zf.testzip() is None)
|
|
zf.close()
|
|
|
|
def test_creation(self):
|
|
@@ -140,7 +140,7 @@ class TestWriteArchiveFS(unittest.TestCase):
|
|
check_contents("b.txt", b("b"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
check_contents("foo/second.txt", b("hai"))
|
|
- check_contents(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
+ check_contents("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
|
|
|
|
#~ class TestAppendArchiveFS(TestWriteArchiveFS):
|
|
--- fs/tests/test_errors.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_errors.py
|
|
@@ -29,4 +29,4 @@ class TestFSError(unittest.TestCase):
|
|
|
|
def test_unicode_representation_of_error_with_non_ascii_characters(self):
|
|
path_error = PathError('/Shïrê/Frødø')
|
|
- _ = unicode(path_error)
|
|
\ No newline at end of file
|
|
+ _ = str(path_error)
|
|
--- fs/tests/test_expose.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_expose.py
|
|
@@ -149,7 +149,7 @@ if dokan.is_available:
|
|
|
|
def tearDown(self):
|
|
self.mount_proc.unmount()
|
|
- for _ in xrange(10):
|
|
+ for _ in range(10):
|
|
try:
|
|
if self.mount_proc.poll() is None:
|
|
self.mount_proc.terminate()
|
|
--- fs/tests/test_fs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_fs.py
|
|
@@ -20,7 +20,7 @@ from fs import osfs
|
|
class TestOSFS(unittest.TestCase,FSTestCases,ThreadingTestCases):
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest")
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest")
|
|
self.fs = osfs.OSFS(self.temp_dir)
|
|
|
|
def tearDown(self):
|
|
@@ -35,14 +35,14 @@ class TestOSFS(unittest.TestCase,FSTestCases,Threading
|
|
|
|
self.assertRaises(errors.InvalidCharsInPathError, self.fs.open, 'invalid\0file', 'wb')
|
|
self.assertFalse(self.fs.isvalidpath('invalid\0file'))
|
|
- self.assert_(self.fs.isvalidpath('validfile'))
|
|
- self.assert_(self.fs.isvalidpath('completely_valid/path/foo.bar'))
|
|
+ self.assertTrue(self.fs.isvalidpath('validfile'))
|
|
+ self.assertTrue(self.fs.isvalidpath('completely_valid/path/foo.bar'))
|
|
|
|
|
|
class TestSubFS(unittest.TestCase,FSTestCases,ThreadingTestCases):
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest")
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest")
|
|
self.parent_fs = osfs.OSFS(self.temp_dir)
|
|
self.parent_fs.makedir("foo/bar", recursive=True)
|
|
self.fs = self.parent_fs.opendir("foo/bar")
|
|
@@ -118,7 +118,7 @@ class TestTempFS(unittest.TestCase,FSTestCases,Threadi
|
|
def tearDown(self):
|
|
td = self.fs._temp_dir
|
|
self.fs.close()
|
|
- self.assert_(not os.path.exists(td))
|
|
+ self.assertTrue(not os.path.exists(td))
|
|
|
|
def check(self, p):
|
|
td = self.fs._temp_dir
|
|
@@ -129,5 +129,5 @@ class TestTempFS(unittest.TestCase,FSTestCases,Threadi
|
|
|
|
self.assertRaises(errors.InvalidCharsInPathError, self.fs.open, 'invalid\0file', 'wb')
|
|
self.assertFalse(self.fs.isvalidpath('invalid\0file'))
|
|
- self.assert_(self.fs.isvalidpath('validfile'))
|
|
- self.assert_(self.fs.isvalidpath('completely_valid/path/foo.bar'))
|
|
+ self.assertTrue(self.fs.isvalidpath('validfile'))
|
|
+ self.assertTrue(self.fs.isvalidpath('completely_valid/path/foo.bar'))
|
|
--- fs/tests/test_ftpfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_ftpfs.py
|
|
@@ -10,7 +10,7 @@ import tempfile
|
|
import subprocess
|
|
import time
|
|
from os.path import abspath
|
|
-import urllib
|
|
+import urllib.request, urllib.parse, urllib.error
|
|
|
|
from six import PY3
|
|
|
|
@@ -37,7 +37,7 @@ class TestFTPFS(unittest.TestCase, FSTestCases, Thread
|
|
ftp_port += 1
|
|
use_port = str(ftp_port)
|
|
#ftp_port = 10000
|
|
- self.temp_dir = tempfile.mkdtemp(u"ftpfstests")
|
|
+ self.temp_dir = tempfile.mkdtemp("ftpfstests")
|
|
|
|
file_path = __file__
|
|
if ':' not in file_path:
|
|
@@ -58,7 +58,7 @@ class TestFTPFS(unittest.TestCase, FSTestCases, Thread
|
|
start_time = time.time()
|
|
while time.time() - start_time < 5:
|
|
try:
|
|
- ftpurl = urllib.urlopen('ftp://127.0.0.1:%s' % use_port)
|
|
+ ftpurl = urllib.request.urlopen('ftp://127.0.0.1:%s' % use_port)
|
|
except IOError:
|
|
time.sleep(0)
|
|
else:
|
|
--- fs/tests/test_importhook.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_importhook.py
|
|
@@ -25,7 +25,7 @@ class TestFSImportHook(unittest.TestCase):
|
|
for ph in list(sys.path_hooks):
|
|
if issubclass(ph,FSImportHook):
|
|
sys.path_hooks.remove(mph)
|
|
- for (k,v) in sys.modules.items():
|
|
+ for (k,v) in list(sys.modules.items()):
|
|
if k.startswith("fsih_"):
|
|
del sys.modules[k]
|
|
elif hasattr(v,"__loader__"):
|
|
@@ -64,22 +64,22 @@ class TestFSImportHook(unittest.TestCase):
|
|
ih = FSImportHook(t)
|
|
sys.meta_path.append(ih)
|
|
try:
|
|
- self.assertEquals(ih.find_module("fsih_hello"),ih)
|
|
- self.assertEquals(ih.find_module("fsih_helo"),None)
|
|
- self.assertEquals(ih.find_module("fsih_pkg"),ih)
|
|
- self.assertEquals(ih.find_module("fsih_pkg.sub1"),ih)
|
|
- self.assertEquals(ih.find_module("fsih_pkg.sub2"),ih)
|
|
- self.assertEquals(ih.find_module("fsih_pkg.sub3"),None)
|
|
+ self.assertEqual(ih.find_module("fsih_hello"),ih)
|
|
+ self.assertEqual(ih.find_module("fsih_helo"),None)
|
|
+ self.assertEqual(ih.find_module("fsih_pkg"),ih)
|
|
+ self.assertEqual(ih.find_module("fsih_pkg.sub1"),ih)
|
|
+ self.assertEqual(ih.find_module("fsih_pkg.sub2"),ih)
|
|
+ self.assertEqual(ih.find_module("fsih_pkg.sub3"),None)
|
|
m = ih.load_module("fsih_hello")
|
|
- self.assertEquals(m.message,"hello world!")
|
|
+ self.assertEqual(m.message,"hello world!")
|
|
self.assertRaises(ImportError,ih.load_module,"fsih_helo")
|
|
ih.load_module("fsih_pkg")
|
|
m = ih.load_module("fsih_pkg.sub1")
|
|
- self.assertEquals(m.message,"hello world!")
|
|
- self.assertEquals(m.a,42)
|
|
+ self.assertEqual(m.message,"hello world!")
|
|
+ self.assertEqual(m.a,42)
|
|
m = ih.load_module("fsih_pkg.sub2")
|
|
- self.assertEquals(m.message,"hello world!")
|
|
- self.assertEquals(m.a,42 * 2)
|
|
+ self.assertEqual(m.message,"hello world!")
|
|
+ self.assertEqual(m.a,42 * 2)
|
|
self.assertRaises(ImportError,ih.load_module,"fsih_pkg.sub3")
|
|
finally:
|
|
sys.meta_path.remove(ih)
|
|
@@ -88,7 +88,7 @@ class TestFSImportHook(unittest.TestCase):
|
|
def _check_imports_are_working(self):
|
|
try:
|
|
import fsih_hello
|
|
- self.assertEquals(fsih_hello.message,"hello world!")
|
|
+ self.assertEqual(fsih_hello.message,"hello world!")
|
|
try:
|
|
import fsih_helo
|
|
except ImportError:
|
|
@@ -97,11 +97,11 @@ class TestFSImportHook(unittest.TestCase):
|
|
assert False, "ImportError not raised"
|
|
import fsih_pkg
|
|
import fsih_pkg.sub1
|
|
- self.assertEquals(fsih_pkg.sub1.message,"hello world!")
|
|
- self.assertEquals(fsih_pkg.sub1.a,42)
|
|
+ self.assertEqual(fsih_pkg.sub1.message,"hello world!")
|
|
+ self.assertEqual(fsih_pkg.sub1.a,42)
|
|
import fsih_pkg.sub2
|
|
- self.assertEquals(fsih_pkg.sub2.message,"hello world!")
|
|
- self.assertEquals(fsih_pkg.sub2.a,42 * 2)
|
|
+ self.assertEqual(fsih_pkg.sub2.message,"hello world!")
|
|
+ self.assertEqual(fsih_pkg.sub2.a,42 * 2)
|
|
try:
|
|
import fsih_pkg.sub3
|
|
except ImportError:
|
|
@@ -109,7 +109,7 @@ class TestFSImportHook(unittest.TestCase):
|
|
else:
|
|
assert False, "ImportError not raised"
|
|
finally:
|
|
- for k in sys.modules.keys():
|
|
+ for k in list(sys.modules.keys()):
|
|
if k.startswith("fsih_"):
|
|
del sys.modules[k]
|
|
|
|
--- fs/tests/test_iotools.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_iotools.py
|
|
@@ -1,5 +1,5 @@
|
|
-from __future__ import unicode_literals
|
|
|
|
+
|
|
from fs import iotools
|
|
|
|
import io
|
|
@@ -7,9 +7,9 @@ import unittest
|
|
from os.path import dirname, join, abspath
|
|
|
|
try:
|
|
- unicode
|
|
+ str
|
|
except NameError:
|
|
- unicode = str
|
|
+ str = str
|
|
|
|
|
|
class OpenFilelike(object):
|
|
@@ -37,20 +37,20 @@ class TestIOTools(unittest.TestCase):
|
|
"""Test make_stream"""
|
|
with self.get_bin_file() as f:
|
|
text = f.read()
|
|
- self.assert_(isinstance(text, bytes))
|
|
+ self.assertTrue(isinstance(text, bytes))
|
|
|
|
with self.get_bin_file() as f:
|
|
with iotools.make_stream("data/UTF-8-demo.txt", f, 'rt') as f2:
|
|
text = f2.read()
|
|
- self.assert_(isinstance(text, unicode))
|
|
+ self.assertTrue(isinstance(text, str))
|
|
|
|
def test_decorator(self):
|
|
"""Test filelike_to_stream decorator"""
|
|
o = OpenFilelike(self.get_bin_file)
|
|
with o.open('file', 'rb') as f:
|
|
text = f.read()
|
|
- self.assert_(isinstance(text, bytes))
|
|
+ self.assertTrue(isinstance(text, bytes))
|
|
|
|
with o.open('file', 'rt') as f:
|
|
text = f.read()
|
|
- self.assert_(isinstance(text, unicode))
|
|
+ self.assertTrue(isinstance(text, str))
|
|
--- fs/tests/test_mountfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_mountfs.py
|
|
@@ -12,11 +12,11 @@ class TestMountFS(unittest.TestCase):
|
|
m2 = MemoryFS()
|
|
multi_fs.mount('/m1', m1)
|
|
multi_fs.mount('/m2', m2)
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
multi_fs.close()
|
|
- self.assert_(m1.closed)
|
|
- self.assert_(m2.closed)
|
|
+ self.assertTrue(m1.closed)
|
|
+ self.assertTrue(m2.closed)
|
|
|
|
def test_no_auto_close(self):
|
|
"""Test MountFS auto close can be disabled"""
|
|
@@ -25,11 +25,11 @@ class TestMountFS(unittest.TestCase):
|
|
m2 = MemoryFS()
|
|
multi_fs.mount('/m1', m1)
|
|
multi_fs.mount('/m2', m2)
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
multi_fs.close()
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
|
|
def test_mountfile(self):
|
|
"""Test mounting a file"""
|
|
@@ -42,16 +42,16 @@ class TestMountFS(unittest.TestCase):
|
|
mount_fs = MountFS()
|
|
mount_fs.mountfile('bar.txt', foo_dir.open, foo_dir.getinfo)
|
|
|
|
- self.assert_(mount_fs.isdir('/'))
|
|
- self.assert_(mount_fs.isdir('./'))
|
|
- self.assert_(mount_fs.isdir(''))
|
|
+ self.assertTrue(mount_fs.isdir('/'))
|
|
+ self.assertTrue(mount_fs.isdir('./'))
|
|
+ self.assertTrue(mount_fs.isdir(''))
|
|
|
|
# Check we can see the mounted file in the dir list
|
|
self.assertEqual(mount_fs.listdir(), ["bar.txt"])
|
|
- self.assert_(not mount_fs.exists('nobodyhere.txt'))
|
|
- self.assert_(mount_fs.exists('bar.txt'))
|
|
- self.assert_(mount_fs.isfile('bar.txt'))
|
|
- self.assert_(not mount_fs.isdir('bar.txt'))
|
|
+ self.assertTrue(not mount_fs.exists('nobodyhere.txt'))
|
|
+ self.assertTrue(mount_fs.exists('bar.txt'))
|
|
+ self.assertTrue(mount_fs.isfile('bar.txt'))
|
|
+ self.assertTrue(not mount_fs.isdir('bar.txt'))
|
|
|
|
# Check open and getinfo callables
|
|
self.assertEqual(mount_fs.getcontents('bar.txt'), quote)
|
|
@@ -67,9 +67,9 @@ class TestMountFS(unittest.TestCase):
|
|
self.assertEqual(mem_fs.getsize('foo/bar.txt'), len('baz'))
|
|
|
|
# Check unmount
|
|
- self.assert_(mount_fs.unmount("bar.txt"))
|
|
+ self.assertTrue(mount_fs.unmount("bar.txt"))
|
|
self.assertEqual(mount_fs.listdir(), [])
|
|
- self.assert_(not mount_fs.exists('bar.txt'))
|
|
+ self.assertTrue(not mount_fs.exists('bar.txt'))
|
|
|
|
# Check unount a second time is a null op, and returns False
|
|
self.assertFalse(mount_fs.unmount("bar.txt"))
|
|
--- fs/tests/test_multifs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_multifs.py
|
|
@@ -13,11 +13,11 @@ class TestMultiFS(unittest.TestCase):
|
|
m2 = MemoryFS()
|
|
multi_fs.addfs('m1', m1)
|
|
multi_fs.addfs('m2', m2)
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
multi_fs.close()
|
|
- self.assert_(m1.closed)
|
|
- self.assert_(m2.closed)
|
|
+ self.assertTrue(m1.closed)
|
|
+ self.assertTrue(m2.closed)
|
|
|
|
def test_no_auto_close(self):
|
|
"""Test MultiFS auto close can be disables"""
|
|
@@ -26,11 +26,11 @@ class TestMultiFS(unittest.TestCase):
|
|
m2 = MemoryFS()
|
|
multi_fs.addfs('m1', m1)
|
|
multi_fs.addfs('m2', m2)
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
multi_fs.close()
|
|
- self.assert_(not m1.closed)
|
|
- self.assert_(not m2.closed)
|
|
+ self.assertTrue(not m1.closed)
|
|
+ self.assertTrue(not m2.closed)
|
|
|
|
|
|
def test_priority(self):
|
|
@@ -45,7 +45,7 @@ class TestMultiFS(unittest.TestCase):
|
|
multi_fs.addfs("m1", m1)
|
|
multi_fs.addfs("m2", m2)
|
|
multi_fs.addfs("m3", m3)
|
|
- self.assert_(multi_fs.getcontents("name") == b("m3"))
|
|
+ self.assertTrue(multi_fs.getcontents("name") == b("m3"))
|
|
|
|
m1 = MemoryFS()
|
|
m2 = MemoryFS()
|
|
@@ -57,7 +57,7 @@ class TestMultiFS(unittest.TestCase):
|
|
multi_fs.addfs("m1", m1)
|
|
multi_fs.addfs("m2", m2, priority=10)
|
|
multi_fs.addfs("m3", m3)
|
|
- self.assert_(multi_fs.getcontents("name") == b("m2"))
|
|
+ self.assertTrue(multi_fs.getcontents("name") == b("m2"))
|
|
|
|
m1 = MemoryFS()
|
|
m2 = MemoryFS()
|
|
@@ -69,7 +69,7 @@ class TestMultiFS(unittest.TestCase):
|
|
multi_fs.addfs("m1", m1)
|
|
multi_fs.addfs("m2", m2, priority=10)
|
|
multi_fs.addfs("m3", m3, priority=10)
|
|
- self.assert_(multi_fs.getcontents("name") == b("m3"))
|
|
+ self.assertTrue(multi_fs.getcontents("name") == b("m3"))
|
|
|
|
m1 = MemoryFS()
|
|
m2 = MemoryFS()
|
|
@@ -81,5 +81,5 @@ class TestMultiFS(unittest.TestCase):
|
|
multi_fs.addfs("m1", m1, priority=11)
|
|
multi_fs.addfs("m2", m2, priority=10)
|
|
multi_fs.addfs("m3", m3, priority=10)
|
|
- self.assert_(multi_fs.getcontents("name") == b("m1"))
|
|
+ self.assertTrue(multi_fs.getcontents("name") == b("m1"))
|
|
|
|
--- fs/tests/test_opener.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_opener.py
|
|
@@ -14,7 +14,7 @@ from fs import path
|
|
class TestOpener(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest_opener")
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest_opener")
|
|
|
|
def tearDown(self):
|
|
shutil.rmtree(self.temp_dir)
|
|
--- fs/tests/test_path.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_path.py
|
|
@@ -23,7 +23,7 @@ class TestPathFunctions(unittest.TestCase):
|
|
("a/b/c", "a/b/c"),
|
|
("a/b/../c/", "a/c"),
|
|
("/","/"),
|
|
- (u"a/\N{GREEK SMALL LETTER BETA}/c",u"a/\N{GREEK SMALL LETTER BETA}/c"),
|
|
+ ("a/\N{GREEK SMALL LETTER BETA}/c","a/\N{GREEK SMALL LETTER BETA}/c"),
|
|
]
|
|
for path, result in tests:
|
|
self.assertEqual(normpath(path), result)
|
|
@@ -44,7 +44,7 @@ class TestPathFunctions(unittest.TestCase):
|
|
("a/b", "./d", "e", "a/b/d/e"),
|
|
("/", "/", "/"),
|
|
("/", "", "/"),
|
|
- (u"a/\N{GREEK SMALL LETTER BETA}","c",u"a/\N{GREEK SMALL LETTER BETA}/c"),
|
|
+ ("a/\N{GREEK SMALL LETTER BETA}","c","a/\N{GREEK SMALL LETTER BETA}/c"),
|
|
]
|
|
for testpaths in tests:
|
|
paths = testpaths[:-1]
|
|
@@ -101,12 +101,12 @@ class TestPathFunctions(unittest.TestCase):
|
|
self.assertEqual(pathsplit(path), result)
|
|
|
|
def test_recursepath(self):
|
|
- self.assertEquals(recursepath("/"),["/"])
|
|
- self.assertEquals(recursepath("hello"),["/","/hello"])
|
|
- self.assertEquals(recursepath("/hello/world/"),["/","/hello","/hello/world"])
|
|
- self.assertEquals(recursepath("/hello/world/",reverse=True),["/hello/world","/hello","/"])
|
|
- self.assertEquals(recursepath("hello",reverse=True),["/hello","/"])
|
|
- self.assertEquals(recursepath("",reverse=True),["/"])
|
|
+ self.assertEqual(recursepath("/"),["/"])
|
|
+ self.assertEqual(recursepath("hello"),["/","/hello"])
|
|
+ self.assertEqual(recursepath("/hello/world/"),["/","/hello","/hello/world"])
|
|
+ self.assertEqual(recursepath("/hello/world/",reverse=True),["/hello/world","/hello","/"])
|
|
+ self.assertEqual(recursepath("hello",reverse=True),["/hello","/"])
|
|
+ self.assertEqual(recursepath("",reverse=True),["/"])
|
|
|
|
def test_isdotfile(self):
|
|
for path in ['.foo',
|
|
@@ -114,7 +114,7 @@ class TestPathFunctions(unittest.TestCase):
|
|
'foo/.svn',
|
|
'foo/bar/.svn',
|
|
'/foo/.bar']:
|
|
- self.assert_(isdotfile(path))
|
|
+ self.assertTrue(isdotfile(path))
|
|
|
|
for path in ['asfoo',
|
|
'df.svn',
|
|
@@ -142,10 +142,10 @@ class TestPathFunctions(unittest.TestCase):
|
|
self.assertEqual(basename(path), test_basename)
|
|
|
|
def test_iswildcard(self):
|
|
- self.assert_(iswildcard('*'))
|
|
- self.assert_(iswildcard('*.jpg'))
|
|
- self.assert_(iswildcard('foo/*'))
|
|
- self.assert_(iswildcard('foo/{}'))
|
|
+ self.assertTrue(iswildcard('*'))
|
|
+ self.assertTrue(iswildcard('*.jpg'))
|
|
+ self.assertTrue(iswildcard('foo/*'))
|
|
+ self.assertTrue(iswildcard('foo/{}'))
|
|
self.assertFalse(iswildcard('foo'))
|
|
self.assertFalse(iswildcard('img.jpg'))
|
|
self.assertFalse(iswildcard('foo/bar'))
|
|
@@ -171,9 +171,9 @@ class Test_PathMap(unittest.TestCase):
|
|
def test_basics(self):
|
|
map = PathMap()
|
|
map["hello"] = "world"
|
|
- self.assertEquals(map["/hello"],"world")
|
|
- self.assertEquals(map["/hello/"],"world")
|
|
- self.assertEquals(map.get("hello"),"world")
|
|
+ self.assertEqual(map["/hello"],"world")
|
|
+ self.assertEqual(map["/hello/"],"world")
|
|
+ self.assertEqual(map.get("hello"),"world")
|
|
|
|
def test_iteration(self):
|
|
map = PathMap()
|
|
@@ -183,17 +183,17 @@ class Test_PathMap(unittest.TestCase):
|
|
map["hello/kitty"] = 4
|
|
map["hello/kitty/islame"] = 5
|
|
map["batman/isawesome"] = 6
|
|
- self.assertEquals(set(map.iterkeys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/hello/kitty/islame","/batman/isawesome")))
|
|
- self.assertEquals(sorted(map.values()),range(1,7))
|
|
- self.assertEquals(sorted(map.items("/hello/world/")),[("/hello/world",1),("/hello/world/howareya",2),("/hello/world/iamfine",3)])
|
|
- self.assertEquals(zip(map.keys(),map.values()),map.items())
|
|
- self.assertEquals(zip(map.keys("batman"),map.values("batman")),map.items("batman"))
|
|
- self.assertEquals(set(map.iternames("hello")),set(("world","kitty")))
|
|
- self.assertEquals(set(map.iternames("/hello/kitty")),set(("islame",)))
|
|
+ self.assertEqual(set(map.keys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/hello/kitty/islame","/batman/isawesome")))
|
|
+ self.assertEqual(sorted(map.values()),list(range(1,7)))
|
|
+ self.assertEqual(sorted(map.items("/hello/world/")),[("/hello/world",1),("/hello/world/howareya",2),("/hello/world/iamfine",3)])
|
|
+ self.assertEqual(list(zip(list(map.keys()),list(map.values()))),list(map.items()))
|
|
+ self.assertEqual(list(zip(map.keys("batman"),map.values("batman"))),map.items("batman"))
|
|
+ self.assertEqual(set(map.iternames("hello")),set(("world","kitty")))
|
|
+ self.assertEqual(set(map.iternames("/hello/kitty")),set(("islame",)))
|
|
|
|
del map["hello/kitty/islame"]
|
|
- self.assertEquals(set(map.iternames("/hello/kitty")),set())
|
|
- self.assertEquals(set(map.iterkeys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/batman/isawesome")))
|
|
- self.assertEquals(set(map.values()),set(range(1,7)) - set((5,)))
|
|
+ self.assertEqual(set(map.iternames("/hello/kitty")),set())
|
|
+ self.assertEqual(set(map.keys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/batman/isawesome")))
|
|
+ self.assertEqual(set(map.values()),set(range(1,7)) - set((5,)))
|
|
|
|
|
|
--- fs/tests/test_remote.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_remote.py
|
|
@@ -116,37 +116,37 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
|
|
self.fakeOn()
|
|
|
|
f = self.fs.open('test.txt', 'rb')
|
|
- self.assertEquals(f.read(10), contents[:10])
|
|
+ self.assertEqual(f.read(10), contents[:10])
|
|
f.wrapped_file.seek(0, SEEK_END)
|
|
- self.assertEquals(f._rfile.tell(), 10)
|
|
+ self.assertEqual(f._rfile.tell(), 10)
|
|
f.seek(20)
|
|
- self.assertEquals(f.tell(), 20)
|
|
- self.assertEquals(f._rfile.tell(), 20)
|
|
+ self.assertEqual(f.tell(), 20)
|
|
+ self.assertEqual(f._rfile.tell(), 20)
|
|
f.seek(0, SEEK_END)
|
|
- self.assertEquals(f._rfile.tell(), len(contents))
|
|
+ self.assertEqual(f._rfile.tell(), len(contents))
|
|
f.close()
|
|
|
|
f = self.fs.open('test.txt', 'ab')
|
|
- self.assertEquals(f.tell(), len(contents))
|
|
+ self.assertEqual(f.tell(), len(contents))
|
|
f.close()
|
|
|
|
self.fakeOff()
|
|
|
|
# Writing over the rfile edge
|
|
f = self.fs.open('test.txt', 'wb+')
|
|
- self.assertEquals(f.tell(), 0)
|
|
+ self.assertEqual(f.tell(), 0)
|
|
f.seek(len(contents) - 5)
|
|
# Last 5 characters not loaded from remote file
|
|
- self.assertEquals(f._rfile.tell(), len(contents) - 5)
|
|
+ self.assertEqual(f._rfile.tell(), len(contents) - 5)
|
|
# Confirm that last 5 characters are still in rfile buffer
|
|
- self.assertEquals(f._rfile.read(), contents[-5:])
|
|
+ self.assertEqual(f._rfile.read(), contents[-5:])
|
|
# Rollback position 5 characters before eof
|
|
f._rfile.seek(len(contents[:-5]))
|
|
# Write 10 new characters (will make contents longer for 5 chars)
|
|
f.write(b('1234567890'))
|
|
f.flush()
|
|
# We are on the end of file (and buffer not serve anything anymore)
|
|
- self.assertEquals(f.read(), b(''))
|
|
+ self.assertEqual(f.read(), b(''))
|
|
f.close()
|
|
|
|
self.fakeOn()
|
|
@@ -154,7 +154,7 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
|
|
# Check if we wrote everything OK from
|
|
# previous writing over the remote buffer edge
|
|
f = self.fs.open('test.txt', 'rb')
|
|
- self.assertEquals(f.read(), contents[:-5] + b('1234567890'))
|
|
+ self.assertEqual(f.read(), contents[:-5] + b('1234567890'))
|
|
f.close()
|
|
|
|
self.fakeOff()
|
|
@@ -199,36 +199,36 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
|
|
|
|
f = self.fs.open('test.txt', 'rb+')
|
|
# Check if we read just 10 characters
|
|
- self.assertEquals(f.read(10), contents[:10])
|
|
- self.assertEquals(f._rfile.tell(), 10)
|
|
+ self.assertEqual(f.read(10), contents[:10])
|
|
+ self.assertEqual(f._rfile.tell(), 10)
|
|
# Write garbage to file to mark it as _changed
|
|
f.write(b('x'))
|
|
# This should read the rest of file and store file back to again.
|
|
f.flush()
|
|
f.seek(0)
|
|
# Try if we have unocrrupted file locally...
|
|
- self.assertEquals(f.read(), contents[:10] + b('x') + contents[11:])
|
|
+ self.assertEqual(f.read(), contents[:10] + b('x') + contents[11:])
|
|
f.close()
|
|
|
|
# And if we have uncorrupted file also on storage
|
|
f = self.fs.open('test.txt', 'rb')
|
|
- self.assertEquals(f.read(), contents[:10] + b('x') + contents[11:])
|
|
+ self.assertEqual(f.read(), contents[:10] + b('x') + contents[11:])
|
|
f.close()
|
|
|
|
# Now try it again, but write garbage behind edge of remote file
|
|
f = self.fs.open('test.txt', 'rb+')
|
|
- self.assertEquals(f.read(10), contents[:10])
|
|
+ self.assertEqual(f.read(10), contents[:10])
|
|
# Write garbage to file to mark it as _changed
|
|
f.write(contents2)
|
|
f.flush()
|
|
f.seek(0)
|
|
# Try if we have unocrrupted file locally...
|
|
- self.assertEquals(f.read(), contents[:10] + contents2)
|
|
+ self.assertEqual(f.read(), contents[:10] + contents2)
|
|
f.close()
|
|
|
|
# And if we have uncorrupted file also on storage
|
|
f = self.fs.open('test.txt', 'rb')
|
|
- self.assertEquals(f.read(), contents[:10] + contents2)
|
|
+ self.assertEqual(f.read(), contents[:10] + contents2)
|
|
f.close()
|
|
|
|
|
|
--- fs/tests/test_rpcfs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/tests/test_rpcfs.py
|
|
@@ -48,7 +48,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
|
|
while not self.server:
|
|
try:
|
|
self.server = self.makeServer(self.temp_fs,("127.0.0.1",port))
|
|
- except socket.error, e:
|
|
+ except socket.error as e:
|
|
if e.args[1] == "Address already in use":
|
|
port += 1
|
|
else:
|
|
@@ -63,7 +63,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
|
|
#self.server.serve_forever()
|
|
while self.serve_more_requests:
|
|
self.server.handle_request()
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
pass
|
|
|
|
self.end_event.set()
|
|
@@ -93,7 +93,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
|
|
sock.settimeout(.1)
|
|
sock.connect(sa)
|
|
sock.send(b("\n"))
|
|
- except socket.error, e:
|
|
+ except socket.error as e:
|
|
pass
|
|
finally:
|
|
if sock is not None:
|
|
--- fs/tests/test_utils.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_utils.py
|
|
@@ -16,11 +16,11 @@ class TestUtils(unittest.TestCase):
|
|
fs.setcontents("foo/bar/fruit", b("apple"))
|
|
|
|
def _check_fs(self, fs):
|
|
- self.assert_(fs.isfile("f1"))
|
|
- self.assert_(fs.isfile("f2"))
|
|
- self.assert_(fs.isfile("f3"))
|
|
- self.assert_(fs.isdir("foo/bar"))
|
|
- self.assert_(fs.isfile("foo/bar/fruit"))
|
|
+ self.assertTrue(fs.isfile("f1"))
|
|
+ self.assertTrue(fs.isfile("f2"))
|
|
+ self.assertTrue(fs.isfile("f3"))
|
|
+ self.assertTrue(fs.isdir("foo/bar"))
|
|
+ self.assertTrue(fs.isfile("foo/bar/fruit"))
|
|
self.assertEqual(fs.getcontents("f1", "rb"), b("file 1"))
|
|
self.assertEqual(fs.getcontents("f2", "rb"), b("file 2"))
|
|
self.assertEqual(fs.getcontents("f3", "rb"), b("file 3"))
|
|
@@ -61,7 +61,7 @@ class TestUtils(unittest.TestCase):
|
|
fs1sub = fs1.makeopendir("from")
|
|
self._make_fs(fs1sub)
|
|
utils.movedir((fs1, "from"), (fs2, "copy"))
|
|
- self.assert_(not fs1.exists("from"))
|
|
+ self.assertTrue(not fs1.exists("from"))
|
|
self._check_fs(fs2.opendir("copy"))
|
|
|
|
fs1 = TempFS()
|
|
@@ -69,7 +69,7 @@ class TestUtils(unittest.TestCase):
|
|
fs1sub = fs1.makeopendir("from")
|
|
self._make_fs(fs1sub)
|
|
utils.movedir((fs1, "from"), (fs2, "copy"))
|
|
- self.assert_(not fs1.exists("from"))
|
|
+ self.assertTrue(not fs1.exists("from"))
|
|
self._check_fs(fs2.opendir("copy"))
|
|
|
|
def test_movedir_root(self):
|
|
@@ -79,7 +79,7 @@ class TestUtils(unittest.TestCase):
|
|
fs1sub = fs1.makeopendir("from")
|
|
self._make_fs(fs1sub)
|
|
utils.movedir((fs1, "from"), fs2)
|
|
- self.assert_(not fs1.exists("from"))
|
|
+ self.assertTrue(not fs1.exists("from"))
|
|
self._check_fs(fs2)
|
|
|
|
fs1 = TempFS()
|
|
@@ -87,7 +87,7 @@ class TestUtils(unittest.TestCase):
|
|
fs1sub = fs1.makeopendir("from")
|
|
self._make_fs(fs1sub)
|
|
utils.movedir((fs1, "from"), fs2)
|
|
- self.assert_(not fs1.exists("from"))
|
|
+ self.assertTrue(not fs1.exists("from"))
|
|
self._check_fs(fs2)
|
|
|
|
def test_remove_all(self):
|
|
@@ -101,15 +101,15 @@ class TestUtils(unittest.TestCase):
|
|
fs.setcontents("foo/baz", b("baz"))
|
|
|
|
utils.remove_all(fs, "foo/bar")
|
|
- self.assert_(not fs.exists("foo/bar/fruit"))
|
|
- self.assert_(fs.exists("foo/bar"))
|
|
- self.assert_(fs.exists("foo/baz"))
|
|
+ self.assertTrue(not fs.exists("foo/bar/fruit"))
|
|
+ self.assertTrue(fs.exists("foo/bar"))
|
|
+ self.assertTrue(fs.exists("foo/baz"))
|
|
utils.remove_all(fs, "")
|
|
- self.assert_(not fs.exists("foo/bar/fruit"))
|
|
- self.assert_(not fs.exists("foo/bar/baz"))
|
|
- self.assert_(not fs.exists("foo/baz"))
|
|
- self.assert_(not fs.exists("foo"))
|
|
- self.assert_(not fs.exists("f1"))
|
|
- self.assert_(fs.isdirempty('/'))
|
|
+ self.assertTrue(not fs.exists("foo/bar/fruit"))
|
|
+ self.assertTrue(not fs.exists("foo/bar/baz"))
|
|
+ self.assertTrue(not fs.exists("foo/baz"))
|
|
+ self.assertTrue(not fs.exists("foo"))
|
|
+ self.assertTrue(not fs.exists("f1"))
|
|
+ self.assertTrue(fs.isdirempty('/'))
|
|
|
|
|
|
--- fs/tests/test_watch.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_watch.py
|
|
@@ -71,7 +71,7 @@ class WatcherTestCases:
|
|
for event in event_list:
|
|
if isinstance(event,cls):
|
|
if path is None or event.path == path:
|
|
- for (k,v) in attrs.iteritems():
|
|
+ for (k,v) in attrs.items():
|
|
if getattr(event,k) != v:
|
|
break
|
|
else:
|
|
@@ -98,7 +98,7 @@ class WatcherTestCases:
|
|
self.assertEventOccurred(CREATED,"/hello")
|
|
self.clearCapturedEvents()
|
|
old_atime = self.fs.getinfo("hello").get("accessed_time")
|
|
- self.assertEquals(self.fs.getcontents("hello"), b("hello world"))
|
|
+ self.assertEqual(self.fs.getcontents("hello"), b("hello world"))
|
|
if not isinstance(self.watchfs,PollingWatchableFS):
|
|
# Help it along by updting the atime.
|
|
# TODO: why is this necessary?
|
|
@@ -113,7 +113,7 @@ class WatcherTestCases:
|
|
# update it if it's too old, or don't update it at all!
|
|
# Try to force the issue, wait for it to change, but eventually
|
|
# give up and bail out.
|
|
- for i in xrange(10):
|
|
+ for i in range(10):
|
|
if self.fs.getinfo("hello").get("accessed_time") != old_atime:
|
|
if not self.checkEventOccurred(MODIFIED,"/hello"):
|
|
self.assertEventOccurred(ACCESSED,"/hello")
|
|
@@ -142,7 +142,7 @@ class WatcherTestCases:
|
|
self.waitForEvents()
|
|
for evt in events:
|
|
assert isinstance(evt,MODIFIED)
|
|
- self.assertEquals(evt.path,"/hello")
|
|
+ self.assertEqual(evt.path,"/hello")
|
|
|
|
def test_watch_single_file_remove(self):
|
|
self.fs.makedir("testing")
|
|
@@ -153,9 +153,9 @@ class WatcherTestCases:
|
|
self.waitForEvents()
|
|
self.fs.remove("testing/hello")
|
|
self.waitForEvents()
|
|
- self.assertEquals(len(events),1)
|
|
+ self.assertEqual(len(events),1)
|
|
assert isinstance(events[0],REMOVED)
|
|
- self.assertEquals(events[0].path,"/testing/hello")
|
|
+ self.assertEqual(events[0].path,"/testing/hello")
|
|
|
|
def test_watch_iter_changes(self):
|
|
changes = iter_changes(self.watchfs)
|
|
@@ -195,9 +195,9 @@ class TestWatchers_TempFS(unittest.TestCase,FSTestCase
|
|
watchfs = osfs.OSFS(self.fs.root_path)
|
|
self.watchfs = ensure_watchable(watchfs,poll_interval=0.1)
|
|
if watch_inotify is not None:
|
|
- self.assertEquals(watchfs,self.watchfs)
|
|
+ self.assertEqual(watchfs,self.watchfs)
|
|
if watch_win32 is not None:
|
|
- self.assertEquals(watchfs,self.watchfs)
|
|
+ self.assertEqual(watchfs,self.watchfs)
|
|
|
|
def tearDown(self):
|
|
self.watchfs.close()
|
|
--- fs/tests/test_wrapfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_wrapfs.py
|
|
@@ -26,7 +26,7 @@ class TestWrapFS(unittest.TestCase, FSTestCases, Threa
|
|
#__test__ = False
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest")
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest")
|
|
self.fs = wrapfs.WrapFS(osfs.OSFS(self.temp_dir))
|
|
|
|
def tearDown(self):
|
|
@@ -41,7 +41,7 @@ from fs.wrapfs.lazyfs import LazyFS
|
|
class TestLazyFS(unittest.TestCase, FSTestCases, ThreadingTestCases):
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest")
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest")
|
|
self.fs = LazyFS((osfs.OSFS,(self.temp_dir,)))
|
|
|
|
def tearDown(self):
|
|
@@ -63,13 +63,13 @@ class TestLimitSizeFS(TestWrapFS):
|
|
|
|
def tearDown(self):
|
|
remove_all(self.fs, "/")
|
|
- self.assertEquals(self.fs.cur_size,0)
|
|
+ self.assertEqual(self.fs.cur_size,0)
|
|
super(TestLimitSizeFS,self).tearDown()
|
|
self.fs.close()
|
|
|
|
def test_storage_error(self):
|
|
total_written = 0
|
|
- for i in xrange(1024*2):
|
|
+ for i in range(1024*2):
|
|
try:
|
|
total_written += 1030
|
|
self.fs.setcontents("file %i" % i, b("C")*1030)
|
|
@@ -85,11 +85,11 @@ from fs.wrapfs.hidedotfilesfs import HideDotFilesFS
|
|
class TestHideDotFilesFS(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
- self.temp_dir = tempfile.mkdtemp(u"fstest")
|
|
- open(os.path.join(self.temp_dir, u".dotfile"), 'w').close()
|
|
- open(os.path.join(self.temp_dir, u"regularfile"), 'w').close()
|
|
- os.mkdir(os.path.join(self.temp_dir, u".dotdir"))
|
|
- os.mkdir(os.path.join(self.temp_dir, u"regulardir"))
|
|
+ self.temp_dir = tempfile.mkdtemp("fstest")
|
|
+ open(os.path.join(self.temp_dir, ".dotfile"), 'w').close()
|
|
+ open(os.path.join(self.temp_dir, "regularfile"), 'w').close()
|
|
+ os.mkdir(os.path.join(self.temp_dir, ".dotdir"))
|
|
+ os.mkdir(os.path.join(self.temp_dir, "regulardir"))
|
|
self.fs = HideDotFilesFS(osfs.OSFS(self.temp_dir))
|
|
|
|
def tearDown(self):
|
|
@@ -97,15 +97,15 @@ class TestHideDotFilesFS(unittest.TestCase):
|
|
self.fs.close()
|
|
|
|
def test_hidden(self):
|
|
- self.assertEquals(len(self.fs.listdir(hidden=False)), 2)
|
|
- self.assertEquals(len(list(self.fs.ilistdir(hidden=False))), 2)
|
|
+ self.assertEqual(len(self.fs.listdir(hidden=False)), 2)
|
|
+ self.assertEqual(len(list(self.fs.ilistdir(hidden=False))), 2)
|
|
|
|
def test_nonhidden(self):
|
|
- self.assertEquals(len(self.fs.listdir(hidden=True)), 4)
|
|
- self.assertEquals(len(list(self.fs.ilistdir(hidden=True))), 4)
|
|
+ self.assertEqual(len(self.fs.listdir(hidden=True)), 4)
|
|
+ self.assertEqual(len(list(self.fs.ilistdir(hidden=True))), 4)
|
|
|
|
def test_default(self):
|
|
- self.assertEquals(len(self.fs.listdir()), 2)
|
|
- self.assertEquals(len(list(self.fs.ilistdir())), 2)
|
|
+ self.assertEqual(len(self.fs.listdir()), 2)
|
|
+ self.assertEqual(len(list(self.fs.ilistdir())), 2)
|
|
|
|
|
|
--- fs/tests/test_xattr.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_xattr.py
|
|
@@ -37,19 +37,19 @@ class XAttrTestCases:
|
|
|
|
def test_list_xattrs(self):
|
|
def do_list(p):
|
|
- self.assertEquals(sorted(self.fs.listxattrs(p)),[])
|
|
+ self.assertEqual(sorted(self.fs.listxattrs(p)),[])
|
|
self.fs.setxattr(p,"xattr1","value1")
|
|
- self.assertEquals(self.fs.getxattr(p,"xattr1"),"value1")
|
|
- self.assertEquals(sorted(self.fs.listxattrs(p)),["xattr1"])
|
|
- self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
|
|
+ self.assertEqual(self.fs.getxattr(p,"xattr1"),"value1")
|
|
+ self.assertEqual(sorted(self.fs.listxattrs(p)),["xattr1"])
|
|
+ self.assertTrue(isinstance(self.fs.listxattrs(p)[0],str))
|
|
self.fs.setxattr(p,"attr2","value2")
|
|
- self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2","xattr1"])
|
|
- self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
|
|
- self.assertTrue(isinstance(self.fs.listxattrs(p)[1],unicode))
|
|
+ self.assertEqual(sorted(self.fs.listxattrs(p)),["attr2","xattr1"])
|
|
+ self.assertTrue(isinstance(self.fs.listxattrs(p)[0],str))
|
|
+ self.assertTrue(isinstance(self.fs.listxattrs(p)[1],str))
|
|
self.fs.delxattr(p,"xattr1")
|
|
- self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2"])
|
|
+ self.assertEqual(sorted(self.fs.listxattrs(p)),["attr2"])
|
|
self.fs.delxattr(p,"attr2")
|
|
- self.assertEquals(sorted(self.fs.listxattrs(p)),[])
|
|
+ self.assertEqual(sorted(self.fs.listxattrs(p)),[])
|
|
self.fs.setcontents("test.txt",b("hello"))
|
|
do_list("test.txt")
|
|
self.fs.makedir("mystuff")
|
|
@@ -64,16 +64,16 @@ class XAttrTestCases:
|
|
self.fs.makedir("stuff")
|
|
self.fs.copy("a.txt","stuff/a.txt")
|
|
self.assertTrue(self.fs.exists("stuff/a.txt"))
|
|
- self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
|
|
- self.assertEquals(self.fs.getxattr("a.txt","myattr"),"myvalue")
|
|
- self.assertEquals(self.fs.getxattr("a.txt","testattr"),"testvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
|
|
+ self.assertEqual(self.fs.getxattr("a.txt","myattr"),"myvalue")
|
|
+ self.assertEqual(self.fs.getxattr("a.txt","testattr"),"testvalue")
|
|
self.fs.setxattr("stuff","dirattr","a directory")
|
|
self.fs.copydir("stuff","stuff2")
|
|
- self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")
|
|
- self.assertEquals(self.fs.getxattr("stuff","dirattr"),"a directory")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2","dirattr"),"a directory")
|
|
+ self.assertEqual(self.fs.getxattr("stuff","dirattr"),"a directory")
|
|
|
|
def test_move_xattrs(self):
|
|
self.fs.setcontents("a.txt",b("content"))
|
|
@@ -82,29 +82,29 @@ class XAttrTestCases:
|
|
self.fs.makedir("stuff")
|
|
self.fs.move("a.txt","stuff/a.txt")
|
|
self.assertTrue(self.fs.exists("stuff/a.txt"))
|
|
- self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
|
|
self.fs.setxattr("stuff","dirattr","a directory")
|
|
self.fs.movedir("stuff","stuff2")
|
|
- self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
|
|
- self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
|
|
+ self.assertEqual(self.fs.getxattr("stuff2","dirattr"),"a directory")
|
|
|
|
def test_remove_file(self):
|
|
def listxattrs(path):
|
|
return list(self.fs.listxattrs(path))
|
|
# Check that xattrs aren't preserved after a file is removed
|
|
self.fs.createfile("myfile")
|
|
- self.assertEquals(listxattrs("myfile"),[])
|
|
+ self.assertEqual(listxattrs("myfile"),[])
|
|
self.fs.setxattr("myfile","testattr","testvalue")
|
|
- self.assertEquals(listxattrs("myfile"),["testattr"])
|
|
+ self.assertEqual(listxattrs("myfile"),["testattr"])
|
|
self.fs.remove("myfile")
|
|
self.assertRaises(ResourceNotFoundError,listxattrs,"myfile")
|
|
self.fs.createfile("myfile")
|
|
- self.assertEquals(listxattrs("myfile"),[])
|
|
+ self.assertEqual(listxattrs("myfile"),[])
|
|
self.fs.setxattr("myfile","testattr2","testvalue2")
|
|
- self.assertEquals(listxattrs("myfile"),["testattr2"])
|
|
- self.assertEquals(self.fs.getxattr("myfile","testattr2"),"testvalue2")
|
|
+ self.assertEqual(listxattrs("myfile"),["testattr2"])
|
|
+ self.assertEqual(self.fs.getxattr("myfile","testattr2"),"testvalue2")
|
|
# Check that removing a file without xattrs still works
|
|
self.fs.createfile("myfile2")
|
|
self.fs.remove("myfile2")
|
|
@@ -114,16 +114,16 @@ class XAttrTestCases:
|
|
return list(self.fs.listxattrs(path))
|
|
# Check that xattrs aren't preserved after a dir is removed
|
|
self.fs.makedir("mydir")
|
|
- self.assertEquals(listxattrs("mydir"),[])
|
|
+ self.assertEqual(listxattrs("mydir"),[])
|
|
self.fs.setxattr("mydir","testattr","testvalue")
|
|
- self.assertEquals(listxattrs("mydir"),["testattr"])
|
|
+ self.assertEqual(listxattrs("mydir"),["testattr"])
|
|
self.fs.removedir("mydir")
|
|
self.assertRaises(ResourceNotFoundError,listxattrs,"mydir")
|
|
self.fs.makedir("mydir")
|
|
- self.assertEquals(listxattrs("mydir"),[])
|
|
+ self.assertEqual(listxattrs("mydir"),[])
|
|
self.fs.setxattr("mydir","testattr2","testvalue2")
|
|
- self.assertEquals(listxattrs("mydir"),["testattr2"])
|
|
- self.assertEquals(self.fs.getxattr("mydir","testattr2"),"testvalue2")
|
|
+ self.assertEqual(listxattrs("mydir"),["testattr2"])
|
|
+ self.assertEqual(self.fs.getxattr("mydir","testattr2"),"testvalue2")
|
|
# Check that removing a dir without xattrs still works
|
|
self.fs.makedir("mydir2")
|
|
self.fs.removedir("mydir2")
|
|
@@ -149,7 +149,7 @@ class TestXAttr_TempFS(unittest.TestCase,FSTestCases,X
|
|
except AttributeError:
|
|
td = self.fs.wrapped_fs._temp_dir
|
|
self.fs.close()
|
|
- self.assert_(not os.path.exists(td))
|
|
+ self.assertTrue(not os.path.exists(td))
|
|
|
|
def check(self, p):
|
|
try:
|
|
--- fs/tests/test_zipfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/tests/test_zipfs.py
|
|
@@ -52,7 +52,7 @@ class TestReadZipFS(unittest.TestCase):
|
|
return contents
|
|
|
|
def check_contents(path, expected):
|
|
- self.assert_(read_contents(path) == expected)
|
|
+ self.assertTrue(read_contents(path) == expected)
|
|
check_contents("a.txt", b("Hello, World!"))
|
|
check_contents("1.txt", b("1"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
@@ -62,30 +62,30 @@ class TestReadZipFS(unittest.TestCase):
|
|
return self.fs.getcontents(path, 'rb')
|
|
|
|
def check_contents(path, expected):
|
|
- self.assert_(read_contents(path) == expected)
|
|
+ self.assertTrue(read_contents(path) == expected)
|
|
check_contents("a.txt", b("Hello, World!"))
|
|
check_contents("1.txt", b("1"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
|
|
def test_is(self):
|
|
- self.assert_(self.fs.isfile('a.txt'))
|
|
- self.assert_(self.fs.isfile('1.txt'))
|
|
- self.assert_(self.fs.isfile('foo/bar/baz.txt'))
|
|
- self.assert_(self.fs.isdir('foo'))
|
|
- self.assert_(self.fs.isdir('foo/bar'))
|
|
- self.assert_(self.fs.exists('a.txt'))
|
|
- self.assert_(self.fs.exists('1.txt'))
|
|
- self.assert_(self.fs.exists('foo/bar/baz.txt'))
|
|
- self.assert_(self.fs.exists('foo'))
|
|
- self.assert_(self.fs.exists('foo/bar'))
|
|
+ self.assertTrue(self.fs.isfile('a.txt'))
|
|
+ self.assertTrue(self.fs.isfile('1.txt'))
|
|
+ self.assertTrue(self.fs.isfile('foo/bar/baz.txt'))
|
|
+ self.assertTrue(self.fs.isdir('foo'))
|
|
+ self.assertTrue(self.fs.isdir('foo/bar'))
|
|
+ self.assertTrue(self.fs.exists('a.txt'))
|
|
+ self.assertTrue(self.fs.exists('1.txt'))
|
|
+ self.assertTrue(self.fs.exists('foo/bar/baz.txt'))
|
|
+ self.assertTrue(self.fs.exists('foo'))
|
|
+ self.assertTrue(self.fs.exists('foo/bar'))
|
|
|
|
def test_listdir(self):
|
|
|
|
def check_listing(path, expected):
|
|
dir_list = self.fs.listdir(path)
|
|
- self.assert_(sorted(dir_list) == sorted(expected))
|
|
+ self.assertTrue(sorted(dir_list) == sorted(expected))
|
|
for item in dir_list:
|
|
- self.assert_(isinstance(item, unicode))
|
|
+ self.assertTrue(isinstance(item, str))
|
|
check_listing('/', ['a.txt', '1.txt', 'foo', 'b.txt'])
|
|
check_listing('foo', ['second.txt', 'bar'])
|
|
check_listing('foo/bar', ['baz.txt'])
|
|
@@ -108,7 +108,7 @@ class TestWriteZipFS(unittest.TestCase):
|
|
|
|
makefile("a.txt", b("Hello, World!"))
|
|
makefile("b.txt", b("b"))
|
|
- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
+ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
makefile("foo/bar/baz.txt", b("baz"))
|
|
makefile("foo/second.txt", b("hai"))
|
|
|
|
@@ -119,7 +119,7 @@ class TestWriteZipFS(unittest.TestCase):
|
|
|
|
def test_valid(self):
|
|
zf = zipfile.ZipFile(self.temp_filename, "r")
|
|
- self.assert_(zf.testzip() is None)
|
|
+ self.assertTrue(zf.testzip() is None)
|
|
zf.close()
|
|
|
|
def test_creation(self):
|
|
@@ -134,7 +134,7 @@ class TestWriteZipFS(unittest.TestCase):
|
|
check_contents("b.txt", b("b"))
|
|
check_contents("foo/bar/baz.txt", b("baz"))
|
|
check_contents("foo/second.txt", b("hai"))
|
|
- check_contents(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
+ check_contents("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
|
|
|
|
class TestAppendZipFS(TestWriteZipFS):
|
|
@@ -159,7 +159,7 @@ class TestAppendZipFS(TestWriteZipFS):
|
|
zip_fs = zipfs.ZipFS(self.temp_filename, 'a')
|
|
|
|
makefile("foo/bar/baz.txt", b("baz"))
|
|
- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
+ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
|
|
makefile("foo/second.txt", b("hai"))
|
|
|
|
zip_fs.close()
|
|
--- fs/utils.py.orig 2015-11-13 23:12:33 UTC
|
|
+++ fs/utils.py
|
|
@@ -384,7 +384,7 @@ def isfile(fs,path,info=None):
|
|
def contains_files(fs, path='/'):
|
|
"""Check if there are any files in the filesystem"""
|
|
try:
|
|
- iter(fs.walkfiles(path)).next()
|
|
+ next(iter(fs.walkfiles(path)))
|
|
except StopIteration:
|
|
return False
|
|
return True
|
|
@@ -426,7 +426,7 @@ def find_duplicates(fs,
|
|
for path in compare_paths:
|
|
file_sizes[fs.getsize(path)].append(path)
|
|
|
|
- size_duplicates = [paths for paths in file_sizes.itervalues() if len(paths) > 1]
|
|
+ size_duplicates = [paths for paths in file_sizes.values() if len(paths) > 1]
|
|
|
|
signatures = defaultdict(list)
|
|
|
|
@@ -453,7 +453,7 @@ def find_duplicates(fs,
|
|
# If 'quick' is True then the signature comparison is adequate (although
|
|
# it may result in false positives)
|
|
if quick:
|
|
- for paths in signatures.itervalues():
|
|
+ for paths in signatures.values():
|
|
if len(paths) > 1:
|
|
yield paths
|
|
return
|
|
@@ -482,7 +482,7 @@ def find_duplicates(fs,
|
|
# byte by byte.
|
|
# All path groups in this loop have the same size and same signature, so are
|
|
# highly likely to be identical.
|
|
- for paths in signatures.itervalues():
|
|
+ for paths in signatures.values():
|
|
|
|
while len(paths) > 1:
|
|
|
|
@@ -535,7 +535,7 @@ def print_fs(fs,
|
|
if file_out is None:
|
|
file_out = sys.stdout
|
|
|
|
- file_encoding = getattr(file_out, 'encoding', u'utf-8') or u'utf-8'
|
|
+ file_encoding = getattr(file_out, 'encoding', 'utf-8') or 'utf-8'
|
|
file_encoding = file_encoding.upper()
|
|
|
|
if terminal_colors is None:
|
|
@@ -546,44 +546,44 @@ def print_fs(fs,
|
|
|
|
def write(line):
|
|
if PY3:
|
|
- file_out.write((line + u'\n'))
|
|
+ file_out.write((line + '\n'))
|
|
else:
|
|
- file_out.write((line + u'\n').encode(file_encoding, 'replace'))
|
|
+ file_out.write((line + '\n').encode(file_encoding, 'replace'))
|
|
|
|
def wrap_prefix(prefix):
|
|
if not terminal_colors:
|
|
return prefix
|
|
- return u'\x1b[32m%s\x1b[0m' % prefix
|
|
+ return '\x1b[32m%s\x1b[0m' % prefix
|
|
|
|
def wrap_dirname(dirname):
|
|
if not terminal_colors:
|
|
return dirname
|
|
- return u'\x1b[1;34m%s\x1b[0m' % dirname
|
|
+ return '\x1b[1;34m%s\x1b[0m' % dirname
|
|
|
|
def wrap_error(msg):
|
|
if not terminal_colors:
|
|
return msg
|
|
- return u'\x1b[31m%s\x1b[0m' % msg
|
|
+ return '\x1b[31m%s\x1b[0m' % msg
|
|
|
|
def wrap_filename(fname):
|
|
if not terminal_colors:
|
|
return fname
|
|
- if fname.startswith(u'.'):
|
|
- fname = u'\x1b[33m%s\x1b[0m' % fname
|
|
+ if fname.startswith('.'):
|
|
+ fname = '\x1b[33m%s\x1b[0m' % fname
|
|
return fname
|
|
dircount = [0]
|
|
filecount = [0]
|
|
def print_dir(fs, path, levels=[]):
|
|
if file_encoding == 'UTF-8' and terminal_colors:
|
|
- char_vertline = u'│'
|
|
- char_newnode = u'├'
|
|
- char_line = u'──'
|
|
- char_corner = u'╰'
|
|
+ char_vertline = '│'
|
|
+ char_newnode = '├'
|
|
+ char_line = '──'
|
|
+ char_corner = '╰'
|
|
else:
|
|
- char_vertline = u'|'
|
|
- char_newnode = u'|'
|
|
- char_line = u'--'
|
|
- char_corner = u'`'
|
|
+ char_vertline = '|'
|
|
+ char_newnode = '|'
|
|
+ char_line = '--'
|
|
+ char_corner = '`'
|
|
|
|
try:
|
|
dirs = fs.listdir(path, dirs_only=True)
|
|
@@ -593,18 +593,18 @@ def print_fs(fs,
|
|
files = fs.listdir(path, files_only=True, wildcard=files_wildcard)
|
|
dir_listing = ( [(True, p) for p in dirs] +
|
|
[(False, p) for p in files] )
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
prefix = ''.join([(char_vertline + ' ', ' ')[last] for last in levels]) + ' '
|
|
- write(wrap_prefix(prefix[:-1] + ' ') + wrap_error(u"unable to retrieve directory list (%s) ..." % str(e)))
|
|
+ write(wrap_prefix(prefix[:-1] + ' ') + wrap_error("unable to retrieve directory list (%s) ..." % str(e)))
|
|
return 0
|
|
|
|
if hide_dotfiles:
|
|
dir_listing = [(isdir, p) for isdir, p in dir_listing if not p.startswith('.')]
|
|
|
|
if dirs_first:
|
|
- dir_listing.sort(key = lambda (isdir, p):(not isdir, p.lower()))
|
|
+ dir_listing.sort(key = lambda isdir_p:(not isdir_p[0], isdir_p[1].lower()))
|
|
else:
|
|
- dir_listing.sort(key = lambda (isdir, p):p.lower())
|
|
+ dir_listing.sort(key = lambda isdir_p1:isdir_p1[1].lower())
|
|
|
|
for i, (is_dir, item) in enumerate(dir_listing):
|
|
if is_dir:
|
|
@@ -685,9 +685,9 @@ if __name__ == "__main__":
|
|
t1.tree()
|
|
|
|
t2 = TempFS()
|
|
- print t2.listdir()
|
|
+ print(t2.listdir())
|
|
movedir(t1, t2)
|
|
|
|
- print t2.listdir()
|
|
+ print(t2.listdir())
|
|
t1.tree()
|
|
t2.tree()
|
|
--- fs/watch.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/watch.py
|
|
@@ -32,7 +32,7 @@ an iterator over the change events.
|
|
import sys
|
|
import weakref
|
|
import threading
|
|
-import Queue
|
|
+import queue
|
|
import traceback
|
|
|
|
from fs.path import *
|
|
@@ -54,10 +54,10 @@ class EVENT(object):
|
|
self.path = path
|
|
|
|
def __str__(self):
|
|
- return unicode(self).encode("utf8")
|
|
+ return str(self).encode("utf8")
|
|
|
|
def __unicode__(self):
|
|
- return u"<fs.watch.%s object (path='%s') at %s>" % (self.__class__.__name__,self.path,hex(id(self)))
|
|
+ return "<fs.watch.%s object (path='%s') at %s>" % (self.__class__.__name__,self.path,hex(id(self)))
|
|
|
|
def clone(self,fs=None,path=None):
|
|
if fs is None:
|
|
@@ -102,7 +102,7 @@ class MOVED_DST(EVENT):
|
|
self.source = source
|
|
|
|
def __unicode__(self):
|
|
- return u"<fs.watch.%s object (path=%r,src=%r) at %s>" % (self.__class__.__name__,self.path,self.source,hex(id(self)))
|
|
+ return "<fs.watch.%s object (path=%r,src=%r) at %s>" % (self.__class__.__name__,self.path,self.source,hex(id(self)))
|
|
|
|
def clone(self,fs=None,path=None,source=None):
|
|
evt = super(MOVED_DST,self).clone(fs,path)
|
|
@@ -120,7 +120,7 @@ class MOVED_SRC(EVENT):
|
|
self.destination = destination
|
|
|
|
def __unicode__(self):
|
|
- return u"<fs.watch.%s object (path=%r,dst=%r) at %s>" % (self.__class__.__name__,self.path,self.destination,hex(id(self)))
|
|
+ return "<fs.watch.%s object (path=%r,dst=%r) at %s>" % (self.__class__.__name__,self.path,self.destination,hex(id(self)))
|
|
|
|
def clone(self,fs=None,path=None,destination=None):
|
|
evt = super(MOVED_SRC,self).clone(fs,path)
|
|
@@ -182,7 +182,7 @@ class Watcher(object):
|
|
try:
|
|
self.callback(event)
|
|
except Exception:
|
|
- print >>sys.stderr, "error in FS watcher callback", self.callback
|
|
+ print("error in FS watcher callback", self.callback, file=sys.stderr)
|
|
traceback.print_exc()
|
|
|
|
|
|
@@ -213,7 +213,7 @@ class WatchableFSMixin(FS):
|
|
if isinstance(watcher_or_callback,Watcher):
|
|
self._watchers[watcher_or_callback.path].remove(watcher_or_callback)
|
|
else:
|
|
- for watchers in self._watchers.itervalues():
|
|
+ for watchers in self._watchers.values():
|
|
for i,watcher in enumerate(watchers):
|
|
if watcher.callback is watcher_or_callback:
|
|
del watchers[i]
|
|
@@ -221,7 +221,7 @@ class WatchableFSMixin(FS):
|
|
|
|
def _find_watchers(self,callback):
|
|
"""Find watchers registered with the given callback."""
|
|
- for watchers in self._watchers.itervalues():
|
|
+ for watchers in self._watchers.values():
|
|
for watcher in watchers:
|
|
if watcher.callback is callback:
|
|
yield watcher
|
|
@@ -235,7 +235,7 @@ class WatchableFSMixin(FS):
|
|
if path is None:
|
|
path = event.path
|
|
if path is None:
|
|
- for watchers in self._watchers.itervalues():
|
|
+ for watchers in self._watchers.values():
|
|
for watcher in watchers:
|
|
watcher.handle_event(event)
|
|
else:
|
|
@@ -443,7 +443,7 @@ class WatchableFS(WatchableFSMixin,WrapFS):
|
|
|
|
def _post_move(self,src,dst,data):
|
|
(src_paths,dst_paths) = data
|
|
- for src_path,isdir in sorted(src_paths.items(),reverse=True):
|
|
+ for src_path,isdir in sorted(list(src_paths.items()),reverse=True):
|
|
path = pathjoin(src,src_path)
|
|
self.notify_watchers(REMOVED,path)
|
|
|
|
@@ -554,7 +554,7 @@ class PollingWatchableFS(WatchableFS):
|
|
else:
|
|
was_accessed = False
|
|
was_modified = False
|
|
- for (k,v) in new_info.iteritems():
|
|
+ for (k,v) in new_info.items():
|
|
if k not in old_info:
|
|
was_modified = True
|
|
break
|
|
@@ -612,7 +612,7 @@ class iter_changes(object):
|
|
|
|
def __init__(self,fs=None,path="/",events=None,**kwds):
|
|
self.closed = False
|
|
- self._queue = Queue.Queue()
|
|
+ self._queue = queue.Queue()
|
|
self._watching = set()
|
|
if fs is not None:
|
|
self.add_watcher(fs,path,events,**kwds)
|
|
@@ -628,7 +628,7 @@ class iter_changes(object):
|
|
raise StopIteration
|
|
try:
|
|
event = self._queue.get(timeout=timeout)
|
|
- except Queue.Empty:
|
|
+ except queue.Empty:
|
|
raise StopIteration
|
|
if event is None:
|
|
raise StopIteration
|
|
--- fs/wrapfs/__init__.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/wrapfs/__init__.py
|
|
@@ -32,12 +32,12 @@ def rewrite_errors(func):
|
|
def wrapper(self,*args,**kwds):
|
|
try:
|
|
return func(self,*args,**kwds)
|
|
- except ResourceError, e:
|
|
+ except ResourceError as e:
|
|
(exc_type,exc_inst,tb) = sys.exc_info()
|
|
try:
|
|
e.path = self._decode(e.path)
|
|
except (AttributeError, ValueError, TypeError):
|
|
- raise e, None, tb
|
|
+ raise e.with_traceback(tb)
|
|
raise
|
|
return wrapper
|
|
|
|
@@ -119,7 +119,7 @@ class WrapFS(FS):
|
|
return (mode, mode)
|
|
|
|
def __unicode__(self):
|
|
- return u"<%s: %s>" % (self.__class__.__name__,self.wrapped_fs,)
|
|
+ return "<%s: %s>" % (self.__class__.__name__,self.wrapped_fs,)
|
|
|
|
#def __str__(self):
|
|
# return unicode(self).encode(sys.getdefaultencoding(),"replace")
|
|
--- fs/wrapfs/debugfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/wrapfs/debugfs.py
|
|
@@ -66,7 +66,7 @@ class DebugFS(object):
|
|
logger.log(level, message)
|
|
|
|
def __parse_param(self, value):
|
|
- if isinstance(value, basestring):
|
|
+ if isinstance(value, str):
|
|
if len(value) > 60:
|
|
value = "%s ... (length %d)" % (repr(value[:60]), len(value))
|
|
else:
|
|
@@ -75,7 +75,7 @@ class DebugFS(object):
|
|
value = "%s (%d items)" % (repr(value[:3]), len(value))
|
|
elif isinstance(value, dict):
|
|
items = {}
|
|
- for k, v in value.items()[:3]:
|
|
+ for k, v in list(value.items())[:3]:
|
|
items[k] = v
|
|
value = "%s (%d items)" % (repr(items), len(value))
|
|
else:
|
|
@@ -84,7 +84,7 @@ class DebugFS(object):
|
|
|
|
def __parse_args(self, *arguments, **kwargs):
|
|
args = [self.__parse_param(a) for a in arguments]
|
|
- for k, v in kwargs.items():
|
|
+ for k, v in list(kwargs.items()):
|
|
args.append("%s=%s" % (k, self.__parse_param(v)))
|
|
|
|
args = ','.join(args)
|
|
@@ -105,10 +105,10 @@ class DebugFS(object):
|
|
|
|
try:
|
|
attr = getattr(self.__wrapped_fs, key)
|
|
- except AttributeError, e:
|
|
+ except AttributeError as e:
|
|
self.__log(DEBUG, "Asking for not implemented method %s" % key)
|
|
raise e
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
self.__log(CRITICAL, "Exception %s: %s" % \
|
|
(e.__class__.__name__, str(e)))
|
|
raise e
|
|
@@ -122,19 +122,19 @@ class DebugFS(object):
|
|
try:
|
|
value = attr(*args, **kwargs)
|
|
self.__report("Call method", key, value, *args, **kwargs)
|
|
- except FSError, e:
|
|
+ except FSError as e:
|
|
self.__log(ERROR, "Call method %s%s -> Exception %s: %s" % \
|
|
(key, self.__parse_args(*args, **kwargs), \
|
|
e.__class__.__name__, str(e)))
|
|
(exc_type,exc_inst,tb) = sys.exc_info()
|
|
- raise e, None, tb
|
|
- except Exception, e:
|
|
+ raise e.with_traceback(tb)
|
|
+ except Exception as e:
|
|
self.__log(CRITICAL,
|
|
"Call method %s%s -> Non-FS exception %s: %s" %\
|
|
(key, self.__parse_args(*args, **kwargs), \
|
|
e.__class__.__name__, str(e)))
|
|
(exc_type,exc_inst,tb) = sys.exc_info()
|
|
- raise e, None, tb
|
|
+ raise e.with_traceback(tb)
|
|
return value
|
|
|
|
if self.__verbose:
|
|
--- fs/wrapfs/hidedotfilesfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/wrapfs/hidedotfilesfs.py
|
|
@@ -87,7 +87,7 @@ class HideDotFilesFS(WrapFS):
|
|
path = normpath(path)
|
|
iter_dir = iter(self.listdir(path,hidden=True))
|
|
try:
|
|
- iter_dir.next()
|
|
+ next(iter_dir)
|
|
except StopIteration:
|
|
return True
|
|
return False
|
|
--- fs/wrapfs/lazyfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/wrapfs/lazyfs.py
|
|
@@ -39,14 +39,14 @@ class LazyFS(WrapFS):
|
|
# It appears that python2.5 has trouble printing out
|
|
# classes that define a __unicode__ method.
|
|
try:
|
|
- return u"<LazyFS: %s>" % (self._fsclass,)
|
|
+ return "<LazyFS: %s>" % (self._fsclass,)
|
|
except TypeError:
|
|
try:
|
|
- return u"<LazyFS: %s>" % (self._fsclass.__name__,)
|
|
+ return "<LazyFS: %s>" % (self._fsclass.__name__,)
|
|
except AttributeError:
|
|
- return u"<LazyFS: <unprintable>>"
|
|
+ return "<LazyFS: <unprintable>>"
|
|
else:
|
|
- return u"<LazyFS: %s>" % (wrapped_fs,)
|
|
+ return "<LazyFS: %s>" % (wrapped_fs,)
|
|
|
|
def __getstate__(self):
|
|
state = super(LazyFS,self).__getstate__()
|
|
--- fs/wrapfs/limitsizefs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/wrapfs/limitsizefs.py
|
|
@@ -9,7 +9,7 @@ total size of files stored in the wrapped FS.
|
|
|
|
"""
|
|
|
|
-from __future__ import with_statement
|
|
+
|
|
|
|
from fs.errors import *
|
|
from fs.path import *
|
|
--- fs/wrapfs/subfs.py.orig 2022-03-04 17:14:43 UTC
|
|
+++ fs/wrapfs/subfs.py
|
|
@@ -34,7 +34,7 @@ class SubFS(WrapFS):
|
|
return '<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
|
|
|
|
def __unicode__(self):
|
|
- return u'<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
|
|
+ return '<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
|
|
|
|
def __repr__(self):
|
|
return "SubFS(%r, %r)" % (self.wrapped_fs, self.sub_dir)
|
|
--- fs/xattrs.py.orig 2015-04-12 17:24:29 UTC
|
|
+++ fs/xattrs.py
|
|
@@ -23,7 +23,7 @@ if it has native xattr support, and return a wrapped v
|
|
|
|
import sys
|
|
try:
|
|
- import cPickle as pickle
|
|
+ import pickle as pickle
|
|
except ImportError:
|
|
import pickle
|
|
|
|
@@ -104,7 +104,7 @@ class SimulateXAttr(WrapFS):
|
|
"""Set an extended attribute on the given path."""
|
|
if not self.exists(path):
|
|
raise ResourceNotFoundError(path)
|
|
- key = unicode(key)
|
|
+ key = str(key)
|
|
attrs = self._get_attr_dict(path)
|
|
attrs[key] = str(value)
|
|
self._set_attr_dict(path, attrs)
|
|
@@ -133,7 +133,7 @@ class SimulateXAttr(WrapFS):
|
|
"""List all the extended attribute keys set on the given path."""
|
|
if not self.exists(path):
|
|
raise ResourceNotFoundError(path)
|
|
- return self._get_attr_dict(path).keys()
|
|
+ return list(self._get_attr_dict(path).keys())
|
|
|
|
def _encode(self,path):
|
|
"""Prevent requests for operations on .xattr files."""
|
|
@@ -189,7 +189,7 @@ class SimulateXAttr(WrapFS):
|
|
d_attr_file = self._get_attr_path(dst)
|
|
try:
|
|
self.wrapped_fs.copy(s_attr_file,d_attr_file,overwrite=True)
|
|
- except ResourceNotFoundError,e:
|
|
+ except ResourceNotFoundError as e:
|
|
pass
|
|
|
|
def move(self,src,dst,**kwds):
|
|
--- fs/zipfs.py.orig 2015-04-12 17:25:37 UTC
|
|
+++ fs/zipfs.py
|
|
@@ -16,9 +16,9 @@ from fs.filelike import StringIO
|
|
from fs import iotools
|
|
|
|
from zipfile import ZipFile, ZIP_DEFLATED, ZIP_STORED, BadZipfile, LargeZipFile
|
|
-from memoryfs import MemoryFS
|
|
+from .memoryfs import MemoryFS
|
|
|
|
-import tempfs
|
|
+from . import tempfs
|
|
|
|
from six import PY3
|
|
|
|
@@ -74,7 +74,7 @@ class _ExceptionProxy(object):
|
|
def __setattr__(self, name, value):
|
|
raise ValueError("Zip file has been closed")
|
|
|
|
- def __nonzero__(self):
|
|
+ def __bool__(self):
|
|
return False
|
|
|
|
|
|
@@ -117,7 +117,7 @@ class ZipFS(FS):
|
|
self.zip_mode = mode
|
|
self.encoding = encoding
|
|
|
|
- if isinstance(zip_file, basestring):
|
|
+ if isinstance(zip_file, str):
|
|
zip_file = os.path.expanduser(os.path.expandvars(zip_file))
|
|
zip_file = os.path.normpath(os.path.abspath(zip_file))
|
|
self._zip_file_string = True
|
|
@@ -126,10 +126,10 @@ class ZipFS(FS):
|
|
|
|
try:
|
|
self.zf = ZipFile(zip_file, mode, compression_type, allow_zip_64)
|
|
- except BadZipfile, bzf:
|
|
+ except BadZipfile as bzf:
|
|
raise ZipOpenError("Not a zip file or corrupt (%s)" % str(zip_file),
|
|
details=bzf)
|
|
- except IOError, ioe:
|
|
+ except IOError as ioe:
|
|
if str(ioe).startswith('[Errno 22] Invalid argument'):
|
|
raise ZipOpenError("Not a zip file or corrupt (%s)" % str(zip_file),
|
|
details=ioe)
|
|
@@ -151,7 +151,7 @@ class ZipFS(FS):
|
|
return "<ZipFS: %s>" % self.zip_path
|
|
|
|
def __unicode__(self):
|
|
- return u"<ZipFS: %s>" % self.zip_path
|
|
+ return "<ZipFS: %s>" % self.zip_path
|
|
|
|
def _decode_path(self, path):
|
|
if PY3:
|
|
@@ -280,7 +280,7 @@ class ZipFS(FS):
|
|
try:
|
|
zi = self.zf.getinfo(self._encode_path(path))
|
|
zinfo = dict((attrib, getattr(zi, attrib)) for attrib in dir(zi) if not attrib.startswith('_'))
|
|
- for k, v in zinfo.iteritems():
|
|
+ for k, v in zinfo.items():
|
|
if callable(v):
|
|
zinfo[k] = v()
|
|
except KeyError:
|
|
--- setup.py.orig 2015-11-14 11:44:01 UTC
|
|
+++ setup.py
|
|
@@ -38,8 +38,6 @@ with open('README.txt', 'r') as f:
|
|
|
|
|
|
extra = {}
|
|
-if PY3:
|
|
- extra["use_2to3"] = True
|
|
|
|
setup(install_requires=['setuptools', 'six'],
|
|
name='fs',
|