--- 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 # . @@ -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 "" % self.root_path def __unicode__(self): - return u"" % self.root_path + return "" % 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 "" % 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 "" % (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"" % (self.fs, self.path) + return "" % (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('') f.write("\nDirectory listing for %s\n" % displaypath) f.write("\n

Directory listing for %s

\n" % displaypath) @@ -106,11 +106,11 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP parent = dirname(path) if path != parent: - f.write('
  • ../
  • ' % urllib.quote(parent.rstrip('/') + '/')) + f.write('
  • ../
  • ' % urllib.parse.quote(parent.rstrip('/') + '/')) for path in paths: f.write('
  • %s\n' - % (urllib.quote(path), cgi.escape(path))) + % (urllib.parse.quote(path), cgi.escape(path))) f.write("\n
    \n\n\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 '' % self.host def __unicode__(self): - return u'' % self.host + return '' % 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 "" % (self.memory_fs, self.path) def __repr__(self): - return u"" % (self.memory_fs, self.path) + return "" % (self.memory_fs, self.path) def __unicode__(self): - return u"" % (self.memory_fs, self.path) + return "" % (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 "" % self.name elif self.isdir(): - return "" % "".join("%s: %s" % (k, v.desc_contents()) for k, v in self.contents.iteritems()) + return "" % "".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 "" % (self.path, self.fs) def __unicode__(self): - return u"" % (self.path, self.fs) + return "" % (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"" % ", ".join(unicode(fs) for fs in self.fs_sequence) + return "" % ", ".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 "" % self.root_path def __unicode__(self): - return u"" % self.root_path + return "" % 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 ["' % self.desc('/') + return '' % 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'' % self._temp_dir + return '' % 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, "", '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"" % (self.__class__.__name__,self.path,hex(id(self))) + return "" % (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"" % (self.__class__.__name__,self.path,self.source,hex(id(self))) + return "" % (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"" % (self.__class__.__name__,self.path,self.destination,hex(id(self))) + return "" % (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"" % (self._fsclass,) + return "" % (self._fsclass,) except TypeError: try: - return u"" % (self._fsclass.__name__,) + return "" % (self._fsclass.__name__,) except AttributeError: - return u">" + return ">" else: - return u"" % (wrapped_fs,) + return "" % (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 '' % (self.wrapped_fs, self.sub_dir.lstrip('/')) def __unicode__(self): - return u'' % (self.wrapped_fs, self.sub_dir.lstrip('/')) + return '' % (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 "" % self.zip_path def __unicode__(self): - return u"" % self.zip_path + return "" % 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',