diff options
author | Calum Lind <calumlind@gmail.com> | 2018-06-01 15:35:19 +0100 |
---|---|---|
committer | Calum Lind <calumlind@gmail.com> | 2018-06-01 23:41:17 +0100 |
commit | d642fa398924913c04eea3c2ddb769a4a6857fc3 (patch) | |
tree | 420c6e4d20b5550d1fc2ac2586968df4bf407ac6 | |
parent | bae1647e99e68244607e50633ca67a8c5b16ebfb (diff) | |
download | deluge-d642fa398924913c04eea3c2ddb769a4a6857fc3.tar.gz deluge-d642fa398924913c04eea3c2ddb769a4a6857fc3.tar.bz2 deluge-d642fa398924913c04eea3c2ddb769a4a6857fc3.zip |
Fix files to pass new Flake8 checkers
Some new flake8 checkers were added so fix these new warnings and
any issues uncovered.
Use add-trailing-comma to fix missing trailing commas. It does not
format it as well as I would like however it was fast to change and
helps with git changes in future.
Removed pylint from tox due to large number of warnings.
166 files changed, 3297 insertions, 1910 deletions
diff --git a/deluge/__rpcapi.py b/deluge/__rpcapi.py index 8e5de1285..5f2934a32 100644 --- a/deluge/__rpcapi.py +++ b/deluge/__rpcapi.py @@ -19,7 +19,7 @@ class RpcApi(object): def scan_for_methods(obj): methods = { - '__doc__': 'Methods available in %s' % obj.__name__.lower() + '__doc__': 'Methods available in %s' % obj.__name__.lower(), } for d in dir(obj): if not hasattr(getattr(obj, d), '_rpcserver_export'): diff --git a/deluge/bencode.py b/deluge/bencode.py index 20abf45a4..e9610a0da 100644 --- a/deluge/bencode.py +++ b/deluge/bencode.py @@ -31,9 +31,9 @@ def decode_int(x, f): f += 1 newf = x.index(END_DELIM, f) n = int(x[f:newf]) - if x[f:f+1] == b'-' and x[f+1:f+2] == b'0': + if x[f:f + 1] == b'-' and x[f + 1:f + 2] == b'0': raise ValueError - elif x[f:f+1] == b'0' and newf != f + 1: + elif x[f:f + 1] == b'0' and newf != f + 1: raise ValueError return (n, newf + 1) @@ -41,7 +41,7 @@ def decode_int(x, f): def decode_string(x, f): colon = x.index(BYTE_SEP, f) n = int(x[f:colon]) - if x[f:f+1] == b'0' and colon != f + 1: + if x[f:f + 1] == b'0' and colon != f + 1: raise ValueError colon += 1 return (x[colon:colon + n], colon + n) @@ -49,17 +49,17 @@ def decode_string(x, f): def decode_list(x, f): r, f = [], f + 1 - while x[f:f+1] != END_DELIM: - v, f = decode_func[x[f:f+1]](x, f) + while x[f:f + 1] != END_DELIM: + v, f = decode_func[x[f:f + 1]](x, f) r.append(v) return (r, f + 1) def decode_dict(x, f): r, f = {}, f + 1 - while x[f:f+1] != END_DELIM: + while x[f:f + 1] != END_DELIM: k, f = decode_string(x, f) - r[k], f = decode_func[x[f:f+1]](x, f) + r[k], f = decode_func[x[f:f + 1]](x, f) return (r, f + 1) diff --git a/deluge/common.py b/deluge/common.py index aef5a3d3c..225d3e797 100644 --- a/deluge/common.py +++ b/deluge/common.py @@ -63,7 +63,7 @@ TORRENT_STATE = [ 'Paused', 'Error', 'Queued', - 'Moving' + 'Moving', ] # The output formatting for json.dump @@ -103,7 +103,8 @@ def get_default_config_dir(filename=None): import _winreg as winreg # For Python 2. hkey = winreg.OpenKey( winreg.HKEY_CURRENT_USER, - 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders') + 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders', + ) app_data_reg = winreg.QueryValueEx(hkey, 'AppData') app_data_path = app_data_reg[0] winreg.CloseKey(hkey) @@ -273,7 +274,7 @@ def resource_filename(module, path): This is a work-around that. """ return pkg_resources.require('Deluge>=%s' % get_version())[0].get_resource_filename( - pkg_resources._manager, os.path.join(*(module.split('.') + [path])) + pkg_resources._manager, os.path.join(*(module.split('.') + [path])), ) @@ -554,18 +555,20 @@ def tokenize(text): return tokenized_input -size_units = (dict(prefix='b', divider=1, singular='byte', plural='bytes'), - dict(prefix='KiB', divider=1024**1), - dict(prefix='MiB', divider=1024**2), - dict(prefix='GiB', divider=1024**3), - dict(prefix='TiB', divider=1024**4), - dict(prefix='PiB', divider=1024**5), - dict(prefix='KB', divider=1000**1), - dict(prefix='MB', divider=1000**2), - dict(prefix='GB', divider=1000**3), - dict(prefix='TB', divider=1000**4), - dict(prefix='PB', divider=1000**5), - dict(prefix='m', divider=1000**2)) +size_units = [ + {'prefix': 'b', 'divider': 1, 'singular': 'byte', 'plural': 'bytes'}, + {'prefix': 'KiB', 'divider': 1024**1}, + {'prefix': 'MiB', 'divider': 1024**2}, + {'prefix': 'GiB', 'divider': 1024**3}, + {'prefix': 'TiB', 'divider': 1024**4}, + {'prefix': 'PiB', 'divider': 1024**5}, + {'prefix': 'KB', 'divider': 1000**1}, + {'prefix': 'MB', 'divider': 1000**2}, + {'prefix': 'GB', 'divider': 1000**3}, + {'prefix': 'TB', 'divider': 1000**4}, + {'prefix': 'PB', 'divider': 1000**5}, + {'prefix': 'm', 'divider': 1000**2}, +] class InvalidSize(Exception): @@ -906,10 +909,12 @@ def decode_bytes(byte_str, encoding='utf8'): elif not isinstance(byte_str, bytes): return byte_str - encodings = [lambda: ('utf8', 'strict'), - lambda: ('iso-8859-1', 'strict'), - lambda: (chardet.detect(byte_str)['encoding'], 'strict'), - lambda: (encoding, 'ignore')] + encodings = [ + lambda: ('utf8', 'strict'), + lambda: ('iso-8859-1', 'strict'), + lambda: (chardet.detect(byte_str)['encoding'], 'strict'), + lambda: (encoding, 'ignore'), + ] if encoding is not 'utf8': encodings.insert(0, lambda: (encoding, 'strict')) @@ -949,7 +954,10 @@ def utf8_encode_structure(data): if isinstance(data, (list, tuple)): return type(data)([utf8_encode_structure(d) for d in data]) elif isinstance(data, dict): - return dict([utf8_encode_structure(d) for d in data.items()]) + return { + utf8_encode_structure(k): utf8_encode_structure(v) + for k, v in data.items() + } elif not isinstance(data, bytes): try: return data.encode('utf8') @@ -968,7 +976,8 @@ class VersionSplit(object): """ def __init__(self, ver): - version_re = re.compile(r""" + version_re = re.compile( + r""" ^ (?P<version>\d+\.\d+) # minimum 'N.N' (?P<extraversion>(?:\.\d+)*) # any number of extra '.N' segments @@ -978,7 +987,8 @@ class VersionSplit(object): (?P<prerelversion>\d+(?:\.\d+)*) )? (?P<postdev>(\.post(?P<post>\d+))?(\.dev(?P<dev>\d+))?)? - $""", re.VERBOSE) + $""", re.VERBOSE, + ) # Check for PEP 386 compliant version match = re.search(version_re, ver) @@ -1061,11 +1071,13 @@ def create_localclient_account(append=False): create_auth_file() with open(auth_file, 'a' if append else 'w') as _file: - _file.write(':'.join([ - 'localclient', - sha(str(random.random()).encode('utf8')).hexdigest(), - str(AUTH_LEVEL_ADMIN) - ]) + '\n') + _file.write( + ':'.join([ + 'localclient', + sha(str(random.random()).encode('utf8')).hexdigest(), + str(AUTH_LEVEL_ADMIN), + ]) + '\n', + ) _file.flush() os.fsync(_file.fileno()) diff --git a/deluge/component.py b/deluge/component.py index de94e021d..8264a5e64 100644 --- a/deluge/component.py +++ b/deluge/component.py @@ -146,10 +146,12 @@ class Component(object): elif self._component_state == 'Started': d = succeed(True) else: - d = fail(ComponentException('Trying to start component "%s" but it is ' - 'not in a stopped state. Current state: %s' % - (self._component_name, self._component_state), - traceback.format_stack(limit=4))) + d = fail(ComponentException( + 'Trying to start component "%s" but it is ' + 'not in a stopped state. Current state: %s' % + (self._component_name, self._component_state), + traceback.format_stack(limit=4), + )) return d def _component_stop(self): @@ -193,10 +195,12 @@ class Component(object): elif self._component_state == 'Paused': d = succeed(None) else: - d = fail(ComponentException('Trying to pause component "%s" but it is ' - 'not in a started state. Current state: %s' % - (self._component_name, self._component_state), - traceback.format_stack(limit=4))) + d = fail(ComponentException( + 'Trying to pause component "%s" but it is ' + 'not in a started state. Current state: %s' % + (self._component_name, self._component_state), + traceback.format_stack(limit=4), + )) return d def _component_resume(self): @@ -207,10 +211,12 @@ class Component(object): d = maybeDeferred(self._component_start_timer) d.addCallback(on_resume) else: - d = fail(ComponentException('Trying to resume component "%s" but it is ' - 'not in a paused state. Current state: %s' % - (self._component_name, self._component_state), - traceback.format_stack(limit=4))) + d = fail(ComponentException( + 'Trying to resume component "%s" but it is ' + 'not in a paused state. Current state: %s' % + (self._component_name, self._component_state), + traceback.format_stack(limit=4), + )) return d def _component_shutdown(self): diff --git a/deluge/config.py b/deluge/config.py index 1bf433683..9e3ee9187 100644 --- a/deluge/config.py +++ b/deluge/config.py @@ -128,7 +128,7 @@ class Config(object): # These hold the version numbers and they will be set when loaded self.__version = { 'format': 1, - 'file': file_version + 'file': file_version, } # This will get set with a reactor.callLater whenever a config option @@ -189,7 +189,8 @@ class Config(object): # Do not allow the type to change unless it is None if value is not None and not isinstance( - self.__config[key], type(None)) and not isinstance(self.__config[key], type(value)): + self.__config[key], type(None), + ) and not isinstance(self.__config[key], type(value)): try: oldtype = type(self.__config[key]) value = oldtype(value) @@ -427,8 +428,10 @@ class Config(object): log.exception(ex) log.warning('Unable to load config file: %s', filename) - log.debug('Config %s version: %s.%s loaded: %s', filename, - self.__version['format'], self.__version['file'], self.__config) + log.debug( + 'Config %s version: %s.%s loaded: %s', filename, + self.__version['format'], self.__version['file'], self.__config, + ) def save(self, filename=None): """Save configuration to disk. @@ -510,16 +513,20 @@ class Config(object): raise ValueError('output_version needs to be greater than input_range') if self.__version['file'] not in input_range: - log.debug('File version %s is not in input_range %s, ignoring converter function..', - self.__version['file'], input_range) + log.debug( + 'File version %s is not in input_range %s, ignoring converter function..', + self.__version['file'], input_range, + ) return try: self.__config = func(self.__config) except Exception as ex: log.exception(ex) - log.error('There was an exception try to convert config file %s %s to %s', - self.__config_file, self.__version['file'], output_version) + log.error( + 'There was an exception try to convert config file %s %s to %s', + self.__config_file, self.__version['file'], output_version, + ) raise ex else: self.__version['file'] = output_version diff --git a/deluge/configmanager.py b/deluge/configmanager.py index b4c09b669..db4de51f6 100644 --- a/deluge/configmanager.py +++ b/deluge/configmanager.py @@ -94,9 +94,11 @@ class _ConfigManager(object): log.debug('Getting config: %s', config_file) # Create the config object if not already created if config_file not in self.config_files: - self.config_files[config_file] = Config(config_file, defaults, - config_dir=self.config_directory, - file_version=file_version) + self.config_files[config_file] = Config( + config_file, defaults, + config_dir=self.config_directory, + file_version=file_version, + ) return self.config_files[config_file] diff --git a/deluge/core/alertmanager.py b/deluge/core/alertmanager.py index ed17341a0..af4fa4287 100644 --- a/deluge/core/alertmanager.py +++ b/deluge/core/alertmanager.py @@ -39,13 +39,15 @@ class AlertManager(component.Component): self.alert_queue_size = 10000 self.set_alert_queue_size(self.alert_queue_size) - alert_mask = (lt.alert.category_t.error_notification | - lt.alert.category_t.port_mapping_notification | - lt.alert.category_t.storage_notification | - lt.alert.category_t.tracker_notification | - lt.alert.category_t.status_notification | - lt.alert.category_t.ip_block_notification | - lt.alert.category_t.performance_warning) + alert_mask = ( + lt.alert.category_t.error_notification | + lt.alert.category_t.port_mapping_notification | + lt.alert.category_t.storage_notification | + lt.alert.category_t.tracker_notification | + lt.alert.category_t.status_notification | + lt.alert.category_t.ip_block_notification | + lt.alert.category_t.performance_warning + ) self.session.apply_settings({'alert_mask': alert_mask}) diff --git a/deluge/core/authmanager.py b/deluge/core/authmanager.py index 60452f828..b241d9a75 100644 --- a/deluge/core/authmanager.py +++ b/deluge/core/authmanager.py @@ -28,7 +28,8 @@ AUTH_LEVELS_MAPPING = { 'READONLY': AUTH_LEVEL_READONLY, 'DEFAULT': AUTH_LEVEL_NORMAL, 'NORMAL': AUTH_LEVEL_DEFAULT, - 'ADMIN': AUTH_LEVEL_ADMIN} + 'ADMIN': AUTH_LEVEL_ADMIN, +} AUTH_LEVELS_MAPPING_REVERSE = {v: k for k, v in AUTH_LEVELS_MAPPING.items()} @@ -45,7 +46,7 @@ class Account(object): 'username': self.username, 'password': self.password, 'authlevel': AUTH_LEVELS_MAPPING_REVERSE[self.authlevel], - 'authlevel_int': self.authlevel + 'authlevel_int': self.authlevel, } def __repr__(self): @@ -98,7 +99,7 @@ class AuthManager(component.Component): """ if not username: raise AuthenticationRequired( - 'Username and Password are required.', username + 'Username and Password are required.', username, ) if username not in self.__auth: @@ -129,8 +130,10 @@ class AuthManager(component.Component): if authlevel not in AUTH_LEVELS_MAPPING: raise AuthManagerError('Invalid auth level: %s' % authlevel) try: - self.__auth[username] = Account(username, password, - AUTH_LEVELS_MAPPING[authlevel]) + self.__auth[username] = Account( + username, password, + AUTH_LEVELS_MAPPING[authlevel], + ) self.write_auth_file() return True except Exception as ex: @@ -157,7 +160,7 @@ class AuthManager(component.Component): raise AuthManagerError('Username not known', username) elif username == component.get('RPCServer').get_session_user(): raise AuthManagerError( - 'You cannot delete your own account while logged in!', username + 'You cannot delete your own account while logged in!', username, ) del self.__auth[username] @@ -232,8 +235,10 @@ class AuthManager(component.Component): lsplit = line.split(':') if len(lsplit) == 2: username, password = lsplit - log.warning('Your auth entry for %s contains no auth level, ' - 'using AUTH_LEVEL_DEFAULT(%s)..', username, AUTH_LEVEL_DEFAULT) + log.warning( + 'Your auth entry for %s contains no auth level, ' + 'using AUTH_LEVEL_DEFAULT(%s)..', username, AUTH_LEVEL_DEFAULT, + ) if username == 'localclient': authlevel = AUTH_LEVEL_ADMIN else: diff --git a/deluge/core/core.py b/deluge/core/core.py index 10861c631..80c14f6a2 100644 --- a/deluge/core/core.py +++ b/deluge/core/core.py @@ -109,7 +109,8 @@ class Core(component.Component): peer_id = self._create_peer_id(DELUGE_VER) log.debug( 'Starting session (peer_id: %s, user_agent: %s)', - peer_id, user_agent) + peer_id, user_agent, + ) settings_pack = { 'peer_fingerprint': peer_id, 'user_agent': user_agent, @@ -390,7 +391,7 @@ class Core(component.Component): try: d = self.torrentmanager.add_async( - filedump=filedump, options=options, filename=filename, save_state=save_state + filedump=filedump, options=options, filename=filename, save_state=save_state, ) except RuntimeError as ex: log.error('There was an error adding the torrent file %s: %s', filename, ex) @@ -418,7 +419,8 @@ class Core(component.Component): try: return self.torrentmanager.add( - filedump=filedump, options=options, filename=filename) + filedump=filedump, options=options, filename=filename, + ) except RuntimeError as ex: log.error('There was an error adding the torrent file %s: %s', filename, ex) raise @@ -441,7 +443,8 @@ class Core(component.Component): for idx, torrent in enumerate(torrent_files): try: yield self.add_torrent_file_async( - torrent[0], torrent[1], torrent[2], save_state=idx == last_index) + torrent[0], torrent[1], torrent[2], save_state=idx == last_index, + ) except AddTorrentError as ex: log.warn('Error when adding torrent: %s', ex) errors.append(ex) @@ -651,8 +654,10 @@ class Core(component.Component): @export def get_torrent_status(self, torrent_id, keys, diff=False): torrent_keys, plugin_keys = self.torrentmanager.separate_keys(keys, [torrent_id]) - return self.create_torrent_status(torrent_id, torrent_keys, plugin_keys, diff=diff, update=True, - all_keys=not keys) + return self.create_torrent_status( + torrent_id, torrent_keys, plugin_keys, diff=diff, update=True, + all_keys=not keys, + ) @export def get_torrents_status(self, filter_dict, keys, diff=False): @@ -699,7 +704,7 @@ class Core(component.Component): @export def get_config_values(self, keys): """Get the config values for the entered keys""" - return dict((key, self.config.get(key)) for key in keys) + return {key: self.config.get(key) for key in keys} @export def set_config(self, config): @@ -740,7 +745,7 @@ class Core(component.Component): 'port': proxy_port, 'proxy_hostnames': settings['proxy_hostnames'], 'proxy_peer_connections': settings['proxy_peer_connections'], - 'proxy_tracker_connections': settings['proxy_tracker_connections'] + 'proxy_tracker_connections': settings['proxy_tracker_connections'], } return proxy_dict @@ -870,25 +875,32 @@ class Core(component.Component): return deluge.common.get_path_size(path) @export - def create_torrent(self, path, tracker, piece_length, comment, target, - webseeds, private, created_by, trackers, add_to_session): + def create_torrent( + self, path, tracker, piece_length, comment, target, + webseeds, private, created_by, trackers, add_to_session, + ): log.debug('creating torrent..') - threading.Thread(target=self._create_torrent_thread, - args=( - path, - tracker, - piece_length, - comment, - target, - webseeds, - private, - created_by, - trackers, - add_to_session)).start() - - def _create_torrent_thread(self, path, tracker, piece_length, comment, target, - webseeds, private, created_by, trackers, add_to_session): + threading.Thread( + target=self._create_torrent_thread, + args=( + path, + tracker, + piece_length, + comment, + target, + webseeds, + private, + created_by, + trackers, + add_to_session, + ), + ).start() + + def _create_torrent_thread( + self, path, tracker, piece_length, comment, target, + webseeds, private, created_by, trackers, add_to_session, + ): from deluge import metafile metafile.make_meta_file( path, @@ -899,7 +911,8 @@ class Core(component.Component): webseeds=webseeds, private=private, created_by=created_by, - trackers=trackers) + trackers=trackers, + ) log.debug('torrent created!') if add_to_session: options = {} @@ -1055,8 +1068,10 @@ class Core(component.Component): :rtype: bool """ - d = getPage(b'http://deluge-torrent.org/test_port.php?port=%s' % - self.get_listen_port(), timeout=30) + d = getPage( + b'http://deluge-torrent.org/test_port.php?port=%s' % + self.get_listen_port(), timeout=30, + ) def on_get_page(result): return bool(int(result)) diff --git a/deluge/core/daemon.py b/deluge/core/daemon.py index 5f4ae4fb1..e92377b21 100644 --- a/deluge/core/daemon.py +++ b/deluge/core/daemon.py @@ -65,8 +65,10 @@ def is_daemon_running(pid_file): class Daemon(object): """The Deluge Daemon class""" - def __init__(self, listen_interface=None, outgoing_interface=None, interface=None, port=None, standalone=False, - read_only_config_keys=None): + def __init__( + self, listen_interface=None, outgoing_interface=None, interface=None, port=None, standalone=False, + read_only_config_keys=None, + ): """ Args: listen_interface (str, optional): The IP address to listen to bittorrent connections on. @@ -98,9 +100,11 @@ class Daemon(object): SetConsoleCtrlHandler(win_handler) # Start the core as a thread and join it until it's done - self.core = Core(listen_interface=listen_interface, - outgoing_interface=outgoing_interface, - read_only_config_keys=read_only_config_keys) + self.core = Core( + listen_interface=listen_interface, + outgoing_interface=outgoing_interface, + read_only_config_keys=read_only_config_keys, + ) if port is None: port = self.core.config['daemon_port'] @@ -114,11 +118,13 @@ class Daemon(object): port=port, allow_remote=self.core.config['allow_remote'], listen=not standalone, - interface=interface + interface=interface, ) - log.debug('Listening to UI on: %s:%s and bittorrent on: %s Making connections out on: %s', - interface, port, listen_interface, outgoing_interface) + log.debug( + 'Listening to UI on: %s:%s and bittorrent on: %s Making connections out on: %s', + interface, port, listen_interface, outgoing_interface, + ) def start(self): # Register the daemon and the core RPCs diff --git a/deluge/core/daemon_entry.py b/deluge/core/daemon_entry.py index d045ca10d..0500986f3 100644 --- a/deluge/core/daemon_entry.py +++ b/deluge/core/daemon_entry.py @@ -23,16 +23,26 @@ from deluge.ui.translations_util import set_dummy_trans def add_daemon_options(parser): group = parser.add_argument_group(_('Daemon Options')) - group.add_argument('-u', '--ui-interface', metavar='<ip-addr>', action='store', - help=_('IP address to listen for UI connections')) - group.add_argument('-p', '--port', metavar='<port>', action='store', type=int, - help=_('Port to listen for UI connections on')) - group.add_argument('-i', '--interface', metavar='<ip-addr>', dest='listen_interface', action='store', - help=_('IP address to listen for BitTorrent connections')) - group.add_argument('-o', '--outinterface', metavar='<ip-addr>', dest='outgoing_interface', - action='store', help=_('The IP address for outgoing BitTorrent connections.')) - group.add_argument('--read-only-config-keys', metavar='<comma-separated-keys>', action='store', - help=_('Config keys to be unmodified by `set_config` RPC'), type=str, default='') + group.add_argument( + '-u', '--ui-interface', metavar='<ip-addr>', action='store', + help=_('IP address to listen for UI connections'), + ) + group.add_argument( + '-p', '--port', metavar='<port>', action='store', type=int, + help=_('Port to listen for UI connections on'), + ) + group.add_argument( + '-i', '--interface', metavar='<ip-addr>', dest='listen_interface', action='store', + help=_('IP address to listen for BitTorrent connections'), + ) + group.add_argument( + '-o', '--outinterface', metavar='<ip-addr>', dest='outgoing_interface', + action='store', help=_('The IP address for outgoing BitTorrent connections.'), + ) + group.add_argument( + '--read-only-config-keys', metavar='<comma-separated-keys>', action='store', + help=_('Config keys to be unmodified by `set_config` RPC'), type=str, default='', + ) parser.add_process_arg_group() @@ -59,8 +69,10 @@ def start_daemon(skip_start=False): from deluge.core.daemon import is_daemon_running pid_file = get_config_dir('deluged.pid') if is_daemon_running(pid_file): - print('Cannot run multiple daemons with same config directory.\n' - 'If you believe this is an error, force starting by deleting: %s' % pid_file) + print( + 'Cannot run multiple daemons with same config directory.\n' + 'If you believe this is an error, force starting by deleting: %s' % pid_file, + ) sys.exit(1) log = getLogger(__name__) @@ -74,19 +86,23 @@ def start_daemon(skip_start=False): def run_daemon(options): try: from deluge.core.daemon import Daemon - daemon = Daemon(listen_interface=options.listen_interface, - outgoing_interface=options.outgoing_interface, - interface=options.ui_interface, - port=options.port, - read_only_config_keys=options.read_only_config_keys.split(',')) + daemon = Daemon( + listen_interface=options.listen_interface, + outgoing_interface=options.outgoing_interface, + interface=options.ui_interface, + port=options.port, + read_only_config_keys=options.read_only_config_keys.split(','), + ) if skip_start: return daemon else: daemon.start() except CannotListenError as ex: - log.error('Cannot start deluged, listen port in use.\n' - ' Check for other running daemons or services using this port: %s:%s', - ex.interface, ex.port) + log.error( + 'Cannot start deluged, listen port in use.\n' + ' Check for other running daemons or services using this port: %s:%s', + ex.interface, ex.port, + ) sys.exit(1) except Exception as ex: log.error('Unable to start deluged: %s', ex) diff --git a/deluge/core/filtermanager.py b/deluge/core/filtermanager.py index afced7c14..09d3e1e2a 100644 --- a/deluge/core/filtermanager.py +++ b/deluge/core/filtermanager.py @@ -194,7 +194,7 @@ class FilterManager(component.Component): tree_keys.remove(cat) torrent_keys, plugin_keys = self.torrents.separate_keys(tree_keys, torrent_ids) - items = dict((field, self.tree_fields[field]()) for field in tree_keys) + items = {field: self.tree_fields[field]() for field in tree_keys} for torrent_id in list(torrent_ids): status = self.core.create_torrent_status(torrent_id, torrent_keys, plugin_keys) # status={key:value} diff --git a/deluge/core/pluginmanager.py b/deluge/core/pluginmanager.py index a67e92b4b..0f5f14ec8 100644 --- a/deluge/core/pluginmanager.py +++ b/deluge/core/pluginmanager.py @@ -33,7 +33,8 @@ class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Compon # Call the PluginManagerBase constructor deluge.pluginmanagerbase.PluginManagerBase.__init__( - self, 'core.conf', 'deluge.plugin.core') + self, 'core.conf', 'deluge.plugin.core', + ) def start(self): # Enable plugins that are enabled in the config diff --git a/deluge/core/preferencesmanager.py b/deluge/core/preferencesmanager.py index 54a94e42a..d4ba358b7 100644 --- a/deluge/core/preferencesmanager.py +++ b/deluge/core/preferencesmanager.py @@ -72,8 +72,10 @@ DEFAULT_PREFS = { 'max_upload_speed': -1.0, 'max_download_speed': -1.0, 'max_upload_slots_global': 4, - 'max_half_open_connections': (lambda: deluge.common.windows_check() and - (lambda: deluge.common.vista_check() and 4 or 8)() or 50)(), + 'max_half_open_connections': ( + lambda: deluge.common.windows_check() and + (lambda: deluge.common.vista_check() and 4 or 8)() or 50 + )(), 'max_connections_per_second': 20, 'ignore_limits_on_local_network': True, 'max_connections_per_torrent': -1, @@ -123,7 +125,7 @@ DEFAULT_PREFS = { 'cache_expiry': 60, 'auto_manage_prefer_seeds': False, 'shared': False, - 'super_seeding': False + 'super_seeding': False, } @@ -207,19 +209,28 @@ class PreferencesManager(component.Component): interface = str(self.config['listen_interface'].strip()) interface = interface if interface else '0.0.0.0' - log.debug('Listen Interface: %s, Ports: %s with use_sys_port: %s', - interface, listen_ports, self.config['listen_use_sys_port']) - interfaces = ['%s:%s' % (interface, port) for port in range(listen_ports[0], listen_ports[1]+1)] + log.debug( + 'Listen Interface: %s, Ports: %s with use_sys_port: %s', + interface, listen_ports, self.config['listen_use_sys_port'], + ) + interfaces = [ + '%s:%s' % (interface, port) + for port in range(listen_ports[0], listen_ports[1] + 1) + ] self.core.apply_session_settings( - {'listen_system_port_fallback': self.config['listen_use_sys_port'], - 'listen_interfaces': ''.join(interfaces)}) + { + 'listen_system_port_fallback': self.config['listen_use_sys_port'], + 'listen_interfaces': ''.join(interfaces), + }, + ) def __set_outgoing_on(self): """ Set the interface address for outgoing BitTorrent connections.""" outinterface = self.config['outgoing_interface'].strip() outinterface = outinterface if outinterface else '0.0.0.0' self.core.apply_session_settings( - {'outgoing_interfaces': outinterface}) + {'outgoing_interfaces': outinterface}, + ) def _on_set_outgoing_ports(self, key, value): self.__set_outgoing_ports() @@ -254,7 +265,8 @@ class PreferencesManager(component.Component): 'router.bitcomet.com:6881', 'dht.transmissionbt.com:6881', 'dht.aelitis.com:6881', - ]) + ], + ) self.core.apply_session_settings({ 'dht_bootstrap_nodes': ','.join(dht_bootstraps), 'enable_dht': value, @@ -286,10 +298,13 @@ class PreferencesManager(component.Component): # Convert Deluge enc_level values to libtorrent enc_level values. pe_enc_level = {0: lt.enc_level.plaintext, 1: lt.enc_level.rc4, 2: lt.enc_level.both} self.core.apply_session_settings( - {'out_enc_policy': lt.enc_policy(self.config['enc_out_policy']), - 'in_enc_policy': lt.enc_policy(self.config['enc_in_policy']), - 'allowed_enc_level': lt.enc_level(pe_enc_level[self.config['enc_level']]), - 'prefer_rc4': True}) + { + 'out_enc_policy': lt.enc_policy(self.config['enc_out_policy']), + 'in_enc_policy': lt.enc_policy(self.config['enc_in_policy']), + 'allowed_enc_level': lt.enc_level(pe_enc_level[self.config['enc_level']]), + 'prefer_rc4': True, + }, + ) def _on_set_max_connections_global(self, key, value): self.core.apply_session_setting('connections_limit', value) @@ -376,7 +391,8 @@ class PreferencesManager(component.Component): self.new_release_timer.stop() # Set a timer to check for a new release every 3 days self.new_release_timer = LoopingCall( - self._on_set_new_release_check, 'new_release_check', True) + self._on_set_new_release_check, 'new_release_check', True, + ) self.new_release_timer.start(72 * 60 * 60, False) else: if self.new_release_timer and self.new_release_timer.running: @@ -392,7 +408,7 @@ class PreferencesManager(component.Component): 'proxy_peer_connections': value['proxy_peer_connections'], 'proxy_tracker_connections': value['proxy_tracker_connections'], 'force_proxy': value['force_proxy'], - 'anonymous_mode': value['anonymous_mode'] + 'anonymous_mode': value['anonymous_mode'], } if value['type'] == lt.proxy_type.i2p_proxy: diff --git a/deluge/core/rpcserver.py b/deluge/core/rpcserver.py index 0d56b2bcf..c8532475a 100644 --- a/deluge/core/rpcserver.py +++ b/deluge/core/rpcserver.py @@ -134,8 +134,10 @@ class DelugeRPCProtocol(DelugeTransferProtocol): for call in request: if len(call) != 4: - log.debug('Received invalid rpc request: number of items ' - 'in request is %s', len(call)) + log.debug( + 'Received invalid rpc request: number of items ' + 'in request is %s', len(call), + ) continue # log.debug('RPCRequest: %s', format_request(call)) reactor.callLater(0, self.dispatch, *call) @@ -161,11 +163,14 @@ class DelugeRPCProtocol(DelugeTransferProtocol): This method is called when a new client connects. """ peer = self.transport.getPeer() - log.info('Deluge Client connection made from: %s:%s', - peer.host, peer.port) + log.info( + 'Deluge Client connection made from: %s:%s', + peer.host, peer.port, + ) # Set the initial auth level of this session to AUTH_LEVEL_NONE self.factory.authorized_sessions[ - self.transport.sessionno] = self.AuthLevel(AUTH_LEVEL_NONE, '') + self.transport.sessionno + ] = self.AuthLevel(AUTH_LEVEL_NONE, '') def connectionLost(self, reason=connectionDone): # NOQA: N802 """ @@ -219,16 +224,19 @@ class DelugeRPCProtocol(DelugeTransferProtocol): exc_type.__name__, exc_value._args, exc_value._kwargs, - formated_tb + formated_tb, )) except AttributeError: # This is not a deluge exception (object has no attribute '_args), let's wrap it - log.warning('An exception occurred while sending RPC_ERROR to ' - 'client. Wrapping it and resending. Error to ' - 'send(causing exception goes next):\n%s', formated_tb) + log.warning( + 'An exception occurred while sending RPC_ERROR to ' + 'client. Wrapping it and resending. Error to ' + 'send(causing exception goes next):\n%s', formated_tb, + ) try: raise WrappedException( - str(exc_value), exc_type.__name__, formated_tb) + str(exc_value), exc_type.__name__, formated_tb, + ) except WrappedException: send_error() except Exception as ex: @@ -249,7 +257,8 @@ class DelugeRPCProtocol(DelugeTransferProtocol): ret = component.get('AuthManager').authorize(*args, **kwargs) if ret: self.factory.authorized_sessions[ - self.transport.sessionno] = self.AuthLevel(ret, args[0]) + self.transport.sessionno + ] = self.AuthLevel(ret, args[0]) self.factory.session_protocols[self.transport.sessionno] = self except Exception as ex: send_error() @@ -294,8 +303,10 @@ class DelugeRPCProtocol(DelugeTransferProtocol): auth_level = self.factory.authorized_sessions[self.transport.sessionno].auth_level if auth_level < method_auth_requirement: # This session is not allowed to call this method - log.debug('Session %s is attempting an unauthorized method call!', - self.transport.sessionno) + log.debug( + 'Session %s is attempting an unauthorized method call!', + self.transport.sessionno, + ) raise NotAuthorizedError(auth_level, method_auth_requirement) # Set the session_id in the factory so that methods can know # which session is calling it. @@ -514,7 +525,7 @@ class RPCServer(component.Component): log.debug('Emit Event: %s %s', event.name, event.args) # This session is interested so send a RPC_EVENT self.factory.session_protocols[session_id].sendData( - (RPC_EVENT, event.name, event.args) + (RPC_EVENT, event.name, event.args), ) def emit_event_for_session_id(self, session_id, event): @@ -530,14 +541,18 @@ class RPCServer(component.Component): log.debug('Session ID %s is not valid. Not sending event "%s".', session_id, event.name) return if session_id not in self.factory.interested_events: - log.debug('Session ID %s is not interested in any events. Not sending event "%s".', - session_id, event.name) + log.debug( + 'Session ID %s is not interested in any events. Not sending event "%s".', + session_id, event.name, + ) return if event.name not in self.factory.interested_events[session_id]: log.debug('Session ID %s is not interested in event "%s". Not sending it.', session_id, event.name) return - log.debug('Sending event "%s" with args "%s" to session id "%s".', - event.name, event.args, session_id) + log.debug( + 'Sending event "%s" with args "%s" to session id "%s".', + event.name, event.args, session_id, + ) self.factory.session_protocols[session_id].sendData((RPC_EVENT, event.name, event.args)) def stop(self): diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index ac37dec36..fcb001b65 100644 --- a/deluge/core/torrent.py +++ b/deluge/core/torrent.py @@ -52,7 +52,7 @@ LT_TORRENT_STATE_MAP = { 'finished': 'Seeding', 'seeding': 'Seeding', 'allocating': 'Allocating', - 'checking_resume_data': 'Checking' + 'checking_resume_data': 'Checking', } @@ -114,7 +114,7 @@ def convert_lt_files(files): 'index': index, 'path': file_path.replace('\\', '/'), 'size': _file.size, - 'offset': _file.offset + 'offset': _file.offset, }) return filelist @@ -172,7 +172,7 @@ class TorrentOptions(dict): 'shared': 'shared', 'stop_at_ratio': 'stop_seed_at_ratio', 'stop_ratio': 'stop_seed_ratio', - 'super_seeding': 'super_seeding' + 'super_seeding': 'super_seeding', } for opt_k, conf_k in options_conf_map.items(): self[opt_k] = config[conf_k] @@ -639,8 +639,10 @@ class Torrent(object): component.get('EventManager').emit(TorrentStateChangedEvent(self.torrent_id, self.state)) if log.isEnabledFor(logging.DEBUG): - log.debug('State from lt was: %s | Session is paused: %s\nTorrent state set from "%s" to "%s" (%s)', - 'error' if status_error else status.state, session_paused, old_state, self.state, self.torrent_id) + log.debug( + 'State from lt was: %s | Session is paused: %s\nTorrent state set from "%s" to "%s" (%s)', + 'error' if status_error else status.state, session_paused, old_state, self.state, self.torrent_id, + ) if self.forced_error: log.debug('Torrent Error state message: %s', self.forced_error.error_message) @@ -699,8 +701,10 @@ class Torrent(object): eta = 0 if self.is_finished and self.options['stop_at_ratio'] and status.upload_payload_rate: # We're a seed, so calculate the time to the 'stop_share_ratio' - eta = ((status.all_time_download * self.options['stop_ratio']) - - status.all_time_upload) // status.upload_payload_rate + eta = ( + (status.all_time_download * self.options['stop_ratio']) - + status.all_time_upload + ) // status.upload_payload_rate elif status.download_payload_rate: left = status.total_wanted - status.total_wanted_done if left > 0: @@ -825,8 +829,10 @@ class Torrent(object): """ if not self.has_metadata: return [] - return [progress / _file.size if _file.size else 0.0 for progress, _file in - zip(self.handle.file_progress(), self.torrent_info.files())] + return [ + progress / _file.size if _file.size else 0.0 for progress, _file in + zip(self.handle.file_progress(), self.torrent_info.files()) + ] def get_tracker_host(self): """Get the hostname of the currently connected tracker. @@ -1019,7 +1025,8 @@ class Torrent(object): 'save_path': lambda: self.options['download_location'], # Deprecated: Use download_location 'download_location': lambda: self.options['download_location'], 'seeds_peers_ratio': lambda: -1.0 if self.status.num_incomplete == 0 else ( # Use -1.0 to signify infinity - self.status.num_complete / self.status.num_incomplete), + self.status.num_complete / self.status.num_incomplete + ), 'seed_rank': lambda: self.status.seed_rank, 'state': lambda: self.state, 'stop_at_ratio': lambda: self.options['stop_at_ratio'], @@ -1061,7 +1068,7 @@ class Torrent(object): 'super_seeding': lambda: self.status.super_seeding, 'time_since_download': lambda: self.status.time_since_download, 'time_since_upload': lambda: self.status.time_since_upload, - 'time_since_transfer': self.get_time_since_transfer + 'time_since_transfer': self.get_time_since_transfer, } def pause(self): @@ -1147,9 +1154,11 @@ class Torrent(object): try: os.makedirs(dest) except OSError as ex: - log.error('Could not move storage for torrent %s since %s does ' - 'not exist and could not create the directory: %s', - self.torrent_id, dest, ex) + log.error( + 'Could not move storage for torrent %s since %s does ' + 'not exist and could not create the directory: %s', + self.torrent_id, dest, ex, + ) return False try: @@ -1183,7 +1192,8 @@ class Torrent(object): # Don't generate fastresume data if torrent is in a Deluge Error state. if self.forced_error: component.get('TorrentManager').waiting_on_resume_data[self.torrent_id].errback( - UserWarning('Skipped creating resume_data while in Error state')) + UserWarning('Skipped creating resume_data while in Error state'), + ) else: self.handle.save_resume_data(flags) @@ -1315,7 +1325,7 @@ class Torrent(object): if _file['path'].startswith(folder): # Keep track of filerenames we're waiting on wait_on_folder[_file['index']] = Deferred().addBoth( - on_file_rename_complete, wait_on_folder, _file['index'] + on_file_rename_complete, wait_on_folder, _file['index'], ) new_path = _file['path'].replace(folder, new_folder, 1) try: diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py index 9739ad556..2004dd5c8 100644 --- a/deluge/core/torrentmanager.py +++ b/deluge/core/torrentmanager.py @@ -38,7 +38,8 @@ LT_DEFAULT_ADD_TORRENT_FLAGS = ( lt.add_torrent_params_flags_t.flag_paused | lt.add_torrent_params_flags_t.flag_auto_managed | lt.add_torrent_params_flags_t.flag_update_subscribe | - lt.add_torrent_params_flags_t.flag_apply_ip_filter) + lt.add_torrent_params_flags_t.flag_apply_ip_filter +) class TorrentState: # pylint: disable=old-style-class @@ -48,33 +49,35 @@ class TorrentState: # pylint: disable=old-style-class This must be old style class to avoid breaking torrent.state file. """ - def __init__(self, - torrent_id=None, - filename=None, - trackers=None, - storage_mode='sparse', - paused=False, - save_path=None, - max_connections=-1, - max_upload_slots=-1, - max_upload_speed=-1.0, - max_download_speed=-1.0, - prioritize_first_last=False, - sequential_download=False, - file_priorities=None, - queue=None, - auto_managed=True, - is_finished=False, - stop_ratio=2.00, - stop_at_ratio=False, - remove_at_ratio=False, - move_completed=False, - move_completed_path=None, - magnet=None, - owner=None, - shared=False, - super_seeding=False, - name=None): + def __init__( + self, + torrent_id=None, + filename=None, + trackers=None, + storage_mode='sparse', + paused=False, + save_path=None, + max_connections=-1, + max_upload_slots=-1, + max_upload_speed=-1.0, + max_download_speed=-1.0, + prioritize_first_last=False, + sequential_download=False, + file_priorities=None, + queue=None, + auto_managed=True, + is_finished=False, + stop_ratio=2.00, + stop_at_ratio=False, + remove_at_ratio=False, + move_completed=False, + move_completed_path=None, + magnet=None, + owner=None, + shared=False, + super_seeding=False, + name=None, + ): # Build the class atrribute list from args for key, value in locals().items(): if key == 'self': @@ -113,8 +116,10 @@ class TorrentManager(component.Component): """ def __init__(self): - component.Component.__init__(self, 'TorrentManager', interval=5, - depend=['CorePluginManager', 'AlertManager']) + component.Component.__init__( + self, 'TorrentManager', interval=5, + depend=['CorePluginManager', 'AlertManager'], + ) log.debug('TorrentManager init...') # Set the libtorrent session self.session = component.get('Core').session @@ -154,8 +159,10 @@ class TorrentManager(component.Component): self.prev_saved_state = None # Register set functions - set_config_keys = ['max_connections_per_torrent', 'max_upload_slots_per_torrent', - 'max_upload_speed_per_torrent', 'max_download_speed_per_torrent'] + set_config_keys = [ + 'max_connections_per_torrent', 'max_upload_slots_per_torrent', + 'max_upload_speed_per_torrent', 'max_download_speed_per_torrent', + ] for config_key in set_config_keys: on_set_func = getattr(self, ''.join(['on_set_', config_key])) @@ -170,7 +177,7 @@ class TorrentManager(component.Component): 'file_renamed_alert', 'file_error_alert', 'file_completed_alert', 'storage_moved_alert', 'storage_moved_failed_alert', 'state_update_alert', 'state_changed_alert', 'save_resume_data_alert', 'save_resume_data_failed_alert', - 'fastresume_rejected_alert' + 'fastresume_rejected_alert', ] for alert_handle in alert_handles: @@ -230,7 +237,8 @@ class TorrentManager(component.Component): for torrent_id, torrent in self.torrents.items(): # XXX: Should the state check be those that _can_ be stopped at ratio if torrent.options['stop_at_ratio'] and torrent.state not in ( - 'Checking', 'Allocating', 'Paused', 'Queued'): + 'Checking', 'Allocating', 'Paused', 'Queued', + ): # If the global setting is set, but the per-torrent isn't... # Just skip to the next torrent. # This is so that a user can turn-off the stop at ratio option on a per-torrent basis @@ -308,7 +316,7 @@ class TorrentManager(component.Component): return options def _build_torrent_params( - self, torrent_info=None, magnet=None, options=None, resume_data=None + self, torrent_info=None, magnet=None, options=None, resume_data=None, ): """Create the add_torrent_params dict for adding torrent to libtorrent.""" add_torrent_params = {} @@ -361,10 +369,14 @@ class TorrentManager(component.Component): add_torrent_params['resume_data'] = resume_data # Set flags: enable duplicate_is_error & override_resume_data, disable auto_managed. - add_torrent_params['flags'] = ((LT_DEFAULT_ADD_TORRENT_FLAGS | - lt.add_torrent_params_flags_t.flag_duplicate_is_error | - lt.add_torrent_params_flags_t.flag_override_resume_data) ^ - lt.add_torrent_params_flags_t.flag_auto_managed) + add_torrent_params['flags'] = ( + ( + LT_DEFAULT_ADD_TORRENT_FLAGS | + lt.add_torrent_params_flags_t.flag_duplicate_is_error | + lt.add_torrent_params_flags_t.flag_override_resume_data + ) ^ + lt.add_torrent_params_flags_t.flag_auto_managed + ) if options['seed_mode']: add_torrent_params['flags'] |= lt.add_torrent_params_flags_t.flag_seed_mode @@ -411,7 +423,8 @@ class TorrentManager(component.Component): options = self._build_torrent_options(options) __, add_torrent_params = self._build_torrent_params( - torrent_info, magnet, options, resume_data) + torrent_info, magnet, options, resume_data, + ) # We need to pause the AlertManager momentarily to prevent alerts # for this torrent being generated before a Torrent object is created. @@ -426,7 +439,8 @@ class TorrentManager(component.Component): raise AddTorrentError('Unable to add torrent to session: %s' % ex) torrent = self._add_torrent_obj( - handle, options, state, filename, magnet, resume_data, filedump, save_state) + handle, options, state, filename, magnet, resume_data, filedump, save_state, + ) return torrent.torrent_id def add_async( @@ -470,7 +484,8 @@ class TorrentManager(component.Component): options = self._build_torrent_options(options) torrent_id, add_torrent_params = self._build_torrent_params( - torrent_info, magnet, options, resume_data) + torrent_info, magnet, options, resume_data, + ) d = Deferred() self.torrents_loading[torrent_id] = (d, options, state, filename, magnet, resume_data, filedump, save_state) @@ -509,10 +524,12 @@ class TorrentManager(component.Component): log.debug('Torrent added: %s', str(handle.info_hash())) if log.isEnabledFor(logging.INFO): name_and_owner = torrent.get_status(['name', 'owner']) - log.info('Torrent %s from user "%s" %s', - name_and_owner['name'], - name_and_owner['owner'], - from_state and 'loaded' or 'added') + log.info( + 'Torrent %s from user "%s" %s', + name_and_owner['name'], + name_and_owner['owner'], + from_state and 'loaded' or 'added', + ) # Write the .torrent file to the state directory. if filedump: @@ -525,10 +542,11 @@ class TorrentManager(component.Component): return torrent def add_async_callback( - self, handle, d, options, state, filename, magnet, resume_data, filedump, save_state + self, handle, d, options, state, filename, magnet, resume_data, filedump, save_state, ): torrent = self._add_torrent_obj( - handle, options, state, filename, magnet, resume_data, filedump, save_state) + handle, options, state, filename, magnet, resume_data, filedump, save_state, + ) d.callback(torrent.torrent_id) @@ -670,7 +688,8 @@ class TorrentManager(component.Component): magnet = t_state.magnet torrent_info = self.get_torrent_info_from_file( - os.path.join(self.state_dir, t_state.torrent_id + '.torrent')) + os.path.join(self.state_dir, t_state.torrent_id + '.torrent'), + ) if torrent_info: magnet = None @@ -740,7 +759,7 @@ class TorrentManager(component.Component): torrent.options['owner'], torrent.options['shared'], torrent.options['super_seeding'], - torrent.options['name'] + torrent.options['name'], ) state.torrents.append(torrent_state) return state @@ -1058,9 +1077,11 @@ class TorrentManager(component.Component): if log.isEnabledFor(logging.DEBUG): log.debug('Finished %s ', torrent_id) - log.debug('Torrent settings: is_finished: %s, total_download: %s, move_completed: %s, move_path: %s', - torrent.is_finished, total_download, torrent.options['move_completed'], - torrent.options['move_completed_path']) + log.debug( + 'Torrent settings: is_finished: %s, total_download: %s, move_completed: %s, move_path: %s', + torrent.is_finished, total_download, torrent.options['move_completed'], + torrent.options['move_completed_path'], + ) torrent.update_state() if not torrent.is_finished and total_download: diff --git a/deluge/decorators.py b/deluge/decorators.py index 856c4e894..bd0ca02d9 100644 --- a/deluge/decorators.py +++ b/deluge/decorators.py @@ -129,8 +129,10 @@ def deprecated(func): @wraps(func) def depr_func(*args, **kwargs): warnings.simplefilter('always', DeprecationWarning) # Turn off filter - warnings.warn('Call to deprecated function {}.'.format(func.__name__), - category=DeprecationWarning, stacklevel=2) + warnings.warn( + 'Call to deprecated function {}.'.format(func.__name__), + category=DeprecationWarning, stacklevel=2, + ) warnings.simplefilter('default', DeprecationWarning) # Reset filter return func(*args, **kwargs) diff --git a/deluge/error.py b/deluge/error.py index bbee4dae2..526168d46 100644 --- a/deluge/error.py +++ b/deluge/error.py @@ -63,17 +63,22 @@ class IncompatibleClient(_ClientSideRecreateError): def __init__(self, daemon_version): self.daemon_version = daemon_version - msg = 'Your deluge client is not compatible with the daemon. '\ - 'Please upgrade your client to %(daemon_version)s' % \ - dict(daemon_version=self.daemon_version) + msg = ( + 'Your deluge client is not compatible with the daemon. ' + 'Please upgrade your client to %(daemon_version)s' + ) % {'daemon_version': self.daemon_version} super(IncompatibleClient, self).__init__(message=msg) class NotAuthorizedError(_ClientSideRecreateError): def __init__(self, current_level, required_level): - msg = 'Auth level too low: %(current_level)s < %(required_level)s' % \ - dict(current_level=current_level, required_level=required_level) + msg = ( + 'Auth level too low: %(current_level)s < %(required_level)s' + ) % { + 'current_level': current_level, + 'required_level': required_level, + } super(NotAuthorizedError, self).__init__(message=msg) self.current_level = current_level self.required_level = required_level diff --git a/deluge/httpdownloader.py b/deluge/httpdownloader.py index d42d27570..312249020 100644 --- a/deluge/httpdownloader.py +++ b/deluge/httpdownloader.py @@ -34,8 +34,10 @@ class HTTPDownloader(client.HTTPDownloader): """ Factory class for downloading files and keeping track of progress. """ - def __init__(self, url, filename, part_callback=None, headers=None, - force_filename=False, allow_compression=True): + def __init__( + self, url, filename, part_callback=None, headers=None, + force_filename=False, allow_compression=True, + ): """ :param url: the url to download from :type url: string @@ -227,8 +229,10 @@ def _download_file(url, filename, callback=None, headers=None, force_filename=Fa return factory.deferred -def download_file(url, filename, callback=None, headers=None, force_filename=False, - allow_compression=True, handle_redirects=True): +def download_file( + url, filename, callback=None, headers=None, force_filename=False, + allow_compression=True, handle_redirects=True, +): """ Downloads a file from a specific URL and returns a Deferred. A callback function can be specified to be called as parts are received. @@ -259,18 +263,24 @@ def download_file(url, filename, callback=None, headers=None, force_filename=Fal def on_download_fail(failure): if failure.check(PageRedirect) and handle_redirects: new_url = urljoin(url, failure.getErrorMessage().split(' to ')[1]) - result = _download_file(new_url, filename, callback=callback, headers=headers, - force_filename=force_filename, - allow_compression=allow_compression) + result = _download_file( + new_url, filename, callback=callback, headers=headers, + force_filename=force_filename, + allow_compression=allow_compression, + ) result.addCallbacks(on_download_success, on_download_fail) else: # Log the failure and pass to the caller - log.warning('Error occurred downloading file from "%s": %s', - url, failure.getErrorMessage()) + log.warning( + 'Error occurred downloading file from "%s": %s', + url, failure.getErrorMessage(), + ) result = failure return result - d = _download_file(url, filename, callback=callback, headers=headers, - force_filename=force_filename, allow_compression=allow_compression) + d = _download_file( + url, filename, callback=callback, headers=headers, + force_filename=force_filename, allow_compression=allow_compression, + ) d.addCallbacks(on_download_success, on_download_fail) return d diff --git a/deluge/log.py b/deluge/log.py index bbf57f73f..fe61ff3da 100644 --- a/deluge/log.py +++ b/deluge/log.py @@ -45,7 +45,7 @@ class Logging(LoggingLoggerClass): for handler in logging.getLogger().handlers: handler.setFormatter(logging.Formatter( DEFAULT_LOGGING_FORMAT % MAX_LOGGER_NAME_LENGTH, - datefmt='%H:%M:%S' + datefmt='%H:%M:%S', )) @defer.inlineCallbacks @@ -88,8 +88,10 @@ class Logging(LoggingLoggerClass): while hasattr(f, 'f_code'): co = f.f_code filename = os.path.normcase(co.co_filename) - if filename in (__file__.replace('.pyc', '.py'), - defer.__file__.replace('.pyc', '.py')): + if filename in ( + __file__.replace('.pyc', '.py'), + defer.__file__.replace('.pyc', '.py'), + ): f = f.f_back continue rv = (filename, f.f_lineno, co.co_name) @@ -105,12 +107,14 @@ levels = { 'none': logging.CRITICAL, 'debug': logging.DEBUG, 'trace': 5, - 'garbage': 1 + 'garbage': 1, } -def setup_logger(level='error', filename=None, filemode='w', logrotate=None, - output_stream=sys.stdout, twisted_observer=True): +def setup_logger( + level='error', filename=None, filemode='w', logrotate=None, + output_stream=sys.stdout, twisted_observer=True, +): """ Sets up the basic logger and if `:param:filename` is set, then it will log to that file instead of stdout. @@ -137,7 +141,7 @@ def setup_logger(level='error', filename=None, filemode='w', logrotate=None, if filename and logrotate: handler = logging.handlers.RotatingFileHandler( filename, maxBytes=logrotate, - backupCount=5, encoding='utf-8' + backupCount=5, encoding='utf-8', ) elif filename and filemode == 'w': handler_cls = logging.FileHandler @@ -151,7 +155,7 @@ def setup_logger(level='error', filename=None, filemode='w', logrotate=None, formatter = logging.Formatter( DEFAULT_LOGGING_FORMAT % MAX_LOGGER_NAME_LENGTH, - datefmt='%H:%M:%S' + datefmt='%H:%M:%S', ) handler.setFormatter(formatter) @@ -214,8 +218,10 @@ def tweak_logging_levels(): if not os.path.isfile(logging_config_file): return log = logging.getLogger(__name__) - log.warn('logging.conf found! tweaking logging levels from %s', - logging_config_file) + log.warn( + 'logging.conf found! tweaking logging levels from %s', + logging_config_file, + ) with open(logging_config_file, 'r') as _file: for line in _file: if line.strip().startswith('#'): @@ -249,9 +255,11 @@ def get_plugin_logger(logger_name): caller_module = inspect.getmodule(module_stack[0]) # In some weird cases caller_module might be None, try to continue caller_module_name = getattr(caller_module, '__name__', '') - warnings.warn_explicit(DEPRECATION_WARNING, DeprecationWarning, - module_stack[1], module_stack[2], - caller_module_name) + warnings.warn_explicit( + DEPRECATION_WARNING, DeprecationWarning, + module_stack[1], module_stack[2], + caller_module_name, + ) if 'deluge.plugins.' in logger_name: return logging.getLogger(logger_name) @@ -291,16 +299,20 @@ class _BackwardsCompatibleLOG(object): caller_module = inspect.getmodule(module_stack[0]) # In some weird cases caller_module might be None, try to continue caller_module_name = getattr(caller_module, '__name__', '') - warnings.warn_explicit(DEPRECATION_WARNING, DeprecationWarning, - module_stack[1], module_stack[2], - caller_module_name) + warnings.warn_explicit( + DEPRECATION_WARNING, DeprecationWarning, + module_stack[1], module_stack[2], + caller_module_name, + ) if caller_module: for member in stack: module = inspect.getmodule(member[0]) if not module: continue - if module.__name__ in ('deluge.plugins.pluginbase', - 'deluge.plugins.init'): + if module.__name__ in ( + 'deluge.plugins.pluginbase', + 'deluge.plugins.init', + ): logger_name += '.plugin.%s' % caller_module_name # Monkey Patch The Plugin Module caller_module.log = logging.getLogger(logger_name) @@ -308,7 +320,7 @@ class _BackwardsCompatibleLOG(object): else: logging.getLogger(logger_name).warning( "Unable to monkey-patch the calling module's `log` attribute! " - 'You should really update and rebuild your plugins...' + 'You should really update and rebuild your plugins...', ) return getattr(logging.getLogger(logger_name), name) diff --git a/deluge/maketorrent.py b/deluge/maketorrent.py index 82599ac0b..2e91ca723 100644 --- a/deluge/maketorrent.py +++ b/deluge/maketorrent.py @@ -68,7 +68,7 @@ class TorrentMetadata(object): raise InvalidPath('Need to set a data_path!') torrent = { - 'info': {} + 'info': {}, } if self.comment: diff --git a/deluge/metafile.py b/deluge/metafile.py index 8784fe357..29c020e9f 100644 --- a/deluge/metafile.py +++ b/deluge/metafile.py @@ -50,13 +50,15 @@ class RemoteFileProgress(object): def __call__(self, piece_count, num_pieces): component.get('RPCServer').emit_event_for_session_id( - self.session_id, CreateTorrentProgressEvent(piece_count, num_pieces) + self.session_id, CreateTorrentProgressEvent(piece_count, num_pieces), ) -def make_meta_file(path, url, piece_length, progress=None, title=None, comment=None, - safe=None, content_type=None, target=None, webseeds=None, name=None, - private=False, created_by=None, trackers=None): +def make_meta_file( + path, url, piece_length, progress=None, title=None, comment=None, + safe=None, content_type=None, target=None, webseeds=None, name=None, + private=False, created_by=None, trackers=None, +): data = {'creation date': int(gmtime())} if url: data['announce'] = url.strip() @@ -147,8 +149,10 @@ def makeinfo(path, piece_length, progress, name=None, content_type=None, private size = os.path.getsize(f) p2 = [n.encode('utf8') for n in p] if content_type: - fs.append({'length': size, 'path': p2, - 'content_type': content_type}) # HEREDAVE. bad for batch! + fs.append({ + 'length': size, 'path': p2, + 'content_type': content_type, + }) # HEREDAVE. bad for batch! else: fs.append({'length': size, 'path': p2}) with open(f, 'rb') as file_: @@ -173,11 +177,13 @@ def makeinfo(path, piece_length, progress, name=None, content_type=None, private if not name: name = os.path.split(path)[1] - return {'pieces': b''.join(pieces), - 'piece length': piece_length, - 'files': fs, - 'name': name.encode('utf8'), - 'private': private} + return { + 'pieces': b''.join(pieces), + 'piece length': piece_length, + 'files': fs, + 'name': name.encode('utf8'), + 'private': private, + } else: size = os.path.getsize(path) if size >= piece_length: @@ -198,15 +204,19 @@ def makeinfo(path, piece_length, progress, name=None, content_type=None, private progress(piece_count, num_pieces) name = os.path.split(path)[1].encode('utf8') if content_type is not None: - return {'pieces': b''.join(pieces), - 'piece length': piece_length, 'length': size, - 'name': name, - 'content_type': content_type, - 'private': private} - return {'pieces': b''.join(pieces), + return { + 'pieces': b''.join(pieces), 'piece length': piece_length, 'length': size, 'name': name, - 'private': private} + 'content_type': content_type, + 'private': private, + } + return { + 'pieces': b''.join(pieces), + 'piece length': piece_length, 'length': size, + 'name': name, + 'private': private, + } def subfiles(d): diff --git a/deluge/pluginmanagerbase.py b/deluge/pluginmanagerbase.py index 8d249100a..439ebf5ed 100644 --- a/deluge/pluginmanagerbase.py +++ b/deluge/pluginmanagerbase.py @@ -108,10 +108,12 @@ class PluginManagerBase(object): self.available_plugins = [] for name in self.pkg_env: - log.debug('Found plugin: %s %s at %s', - self.pkg_env[name][0].project_name, - self.pkg_env[name][0].version, - self.pkg_env[name][0].location) + log.debug( + 'Found plugin: %s %s at %s', + self.pkg_env[name][0].project_name, + self.pkg_env[name][0].version, + self.pkg_env[name][0].location, + ) self.available_plugins.append(self.pkg_env[name][0].project_name) def enable_plugin(self, plugin_name): @@ -162,7 +164,7 @@ class PluginManagerBase(object): warnings.warn_explicit( DEPRECATION_WARNING % name, DeprecationWarning, - instance.__module__, 0 + instance.__module__, 0, ) if self._component_state == 'Started': def on_enabled(result, instance): @@ -179,8 +181,10 @@ class PluginManagerBase(object): return True def on_started_error(result, instance): - log.error('Failed to start plugin: %s\n%s', plugin_name, - result.getTraceback(elideFrameworkCode=1, detail='brief')) + log.error( + 'Failed to start plugin: %s\n%s', plugin_name, + result.getTraceback(elideFrameworkCode=1, detail='brief'), + ) self.plugins[plugin_name.replace('-', ' ')] = instance self.disable_plugin(plugin_name) return False diff --git a/deluge/plugins/AutoAdd/deluge/plugins/autoadd/core.py b/deluge/plugins/AutoAdd/deluge/plugins/autoadd/core.py index 43dc48eeb..81c33de4b 100644 --- a/deluge/plugins/AutoAdd/deluge/plugins/autoadd/core.py +++ b/deluge/plugins/AutoAdd/deluge/plugins/autoadd/core.py @@ -37,7 +37,7 @@ log = logging.getLogger(__name__) DEFAULT_PREFS = { 'watchdirs': {}, - 'next_id': 1 + 'next_id': 1, } @@ -64,7 +64,7 @@ OPTIONS_AVAILABLE = { # option: builtin 'add_paused': True, 'queue_to_top': False, 'owner': True, - 'seed_mode': True + 'seed_mode': True, } MAX_NUM_ATTEMPTS = 10 @@ -91,7 +91,7 @@ class Core(CorePluginBase): self.watchdirs = self.config['watchdirs'] component.get('EventManager').register_event_handler( - 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed + 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed, ) # Dict of Filename:Attempts @@ -109,7 +109,7 @@ class Core(CorePluginBase): def disable(self): # disable all running looping calls component.get('EventManager').deregister_event_handler( - 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed + 'PreTorrentRemovedEvent', self.__on_pre_torrent_removed, ) for loopingcall in self.update_timers.values(): loopingcall.stop() @@ -124,12 +124,12 @@ class Core(CorePluginBase): watchdir_id = str(watchdir_id) options = self._make_unicode(options) check_input( - watchdir_id in self.watchdirs, _('Watch folder does not exist.') + watchdir_id in self.watchdirs, _('Watch folder does not exist.'), ) if 'path' in options: options['abspath'] = os.path.abspath(options['path']) check_input( - os.path.isdir(options['abspath']), _('Path does not exist.') + os.path.isdir(options['abspath']), _('Path does not exist.'), ) for w_id, w in self.watchdirs.items(): if options['abspath'] == w['abspath'] and watchdir_id != w_id: @@ -210,8 +210,10 @@ class Core(CorePluginBase): watchdir = self.watchdirs[watchdir_id] if not watchdir['enabled']: # We shouldn't be updating because this watchdir is not enabled - log.debug('Watchdir id %s is not enabled. Disabling it.', - watchdir_id) + log.debug( + 'Watchdir id %s is not enabled. Disabling it.', + watchdir_id, + ) self.disable_watchdir(watchdir_id) return @@ -271,8 +273,10 @@ class Core(CorePluginBase): if filename in self.invalid_torrents: self.invalid_torrents[filename] += 1 if self.invalid_torrents[filename] >= MAX_NUM_ATTEMPTS: - log.warning('Maximum attempts reached while trying to add the ' - 'torrent file with the path %s', filepath) + log.warning( + 'Maximum attempts reached while trying to add the ' + 'torrent file with the path %s', filepath, + ) os.rename(filepath, filepath + '.invalid') del self.invalid_torrents[filename] else: @@ -305,8 +309,10 @@ class Core(CorePluginBase): elif watchdir.get('copy_torrent_toggle'): copy_torrent_path = watchdir['copy_torrent'] copy_torrent_file = os.path.join(copy_torrent_path, filename) - log.debug('Moving added torrent file "%s" to "%s"', - os.path.basename(filepath), copy_torrent_path) + log.debug( + 'Moving added torrent file "%s" to "%s"', + os.path.basename(filepath), copy_torrent_path, + ) shutil.move(filepath, copy_torrent_file) else: os.remove(filepath) @@ -322,7 +328,8 @@ class Core(CorePluginBase): d = component.get('Core').add_torrent_magnet(filedump.strip(), options) else: d = component.get('Core').add_torrent_file_async( - filename, base64.encodestring(filedump), options) + filename, base64.encodestring(filedump), options, + ) d.addCallback(on_torrent_added, filename, filepath) d.addErrback(fail_torrent_add, filepath, magnet) except AddTorrentError as ex: @@ -331,8 +338,10 @@ class Core(CorePluginBase): def on_update_watchdir_error(self, failure, watchdir_id): """Disables any watch folders with un-handled exceptions.""" self.disable_watchdir(watchdir_id) - log.error('Disabling "%s", error during update: %s', - self.watchdirs[watchdir_id]['path'], failure) + log.error( + 'Disabling "%s", error during update: %s', + self.watchdirs[watchdir_id]['path'], failure, + ) @export def enable_watchdir(self, watchdir_id): @@ -341,7 +350,7 @@ class Core(CorePluginBase): if w_id not in self.update_timers or not self.update_timers[w_id].running: self.update_timers[w_id] = LoopingCall(self.update_watchdir, w_id) self.update_timers[w_id].start(5).addErrback( - self.on_update_watchdir_error, w_id + self.on_update_watchdir_error, w_id, ) # Update the config if not self.watchdirs[w_id]['enabled']: @@ -383,8 +392,10 @@ class Core(CorePluginBase): session_user = rpcserver.get_session_user() session_auth_level = rpcserver.get_session_auth_level() if session_auth_level == AUTH_LEVEL_ADMIN: - log.debug('Current logged in user %s is an ADMIN, send all ' - 'watchdirs', session_user) + log.debug( + 'Current logged in user %s is an ADMIN, send all ' + 'watchdirs', session_user, + ) return self.watchdirs watchdirs = {} @@ -392,8 +403,10 @@ class Core(CorePluginBase): if watchdir.get('owner', 'localclient') == session_user: watchdirs[watchdir_id] = watchdir - log.debug('Current logged in user %s is not an ADMIN, send only ' - 'their watchdirs: %s', session_user, list(watchdirs)) + log.debug( + 'Current logged in user %s is not an ADMIN, send only ' + 'their watchdirs: %s', session_user, list(watchdirs), + ) return watchdirs def _make_unicode(self, options): @@ -414,7 +427,7 @@ class Core(CorePluginBase): check_input(os.path.isdir(abswatchdir), _('Path does not exist.')) check_input( os.access(abswatchdir, os.R_OK | os.W_OK), - 'You must have read and write access to watch folder.' + 'You must have read and write access to watch folder.', ) if abswatchdir in [wd['abspath'] for wd in self.watchdirs.values()]: raise Exception('Path is already being watched.') @@ -449,9 +462,11 @@ class Core(CorePluginBase): try: torrent = component.get('TorrentManager')[torrent_id] except KeyError: - log.warning('Unable to remove torrent file for torrent id %s. It' - 'was already deleted from the TorrentManager', - torrent_id) + log.warning( + 'Unable to remove torrent file for torrent id %s. It' + 'was already deleted from the TorrentManager', + torrent_id, + ) return torrent_fname = torrent.filename for watchdir in self.watchdirs.values(): @@ -466,9 +481,13 @@ class Core(CorePluginBase): if os.path.isfile(torrent_fname_path): try: os.remove(torrent_fname_path) - log.info('Removed torrent file "%s" from "%s"', - torrent_fname, copy_torrent_path) + log.info( + 'Removed torrent file "%s" from "%s"', + torrent_fname, copy_torrent_path, + ) break except OSError as ex: - log.info('Failed to removed torrent file "%s" from "%s": %s', - torrent_fname, copy_torrent_path, ex) + log.info( + 'Failed to removed torrent file "%s" from "%s": %s', + torrent_fname, copy_torrent_path, ex, + ) diff --git a/deluge/plugins/AutoAdd/deluge/plugins/autoadd/gtkui.py b/deluge/plugins/AutoAdd/deluge/plugins/autoadd/gtkui.py index 27e34449b..083a1bcb2 100644 --- a/deluge/plugins/AutoAdd/deluge/plugins/autoadd/gtkui.py +++ b/deluge/plugins/AutoAdd/deluge/plugins/autoadd/gtkui.py @@ -37,8 +37,10 @@ class IncompatibleOption(Exception): class OptionsDialog(object): spin_ids = ['max_download_speed', 'max_upload_speed', 'stop_ratio'] spin_int_ids = ['max_upload_slots', 'max_connections'] - chk_ids = ['stop_at_ratio', 'remove_at_ratio', 'move_completed', - 'add_paused', 'auto_managed', 'queue_to_top'] + chk_ids = [ + 'stop_at_ratio', 'remove_at_ratio', 'move_completed', + 'add_paused', 'auto_managed', 'queue_to_top', + ] def __init__(self): self.accounts = gtk.ListStore(str) @@ -55,7 +57,7 @@ class OptionsDialog(object): 'on_opts_apply': self.on_apply, 'on_opts_cancel': self.on_cancel, 'on_options_dialog_close': self.on_cancel, - 'on_toggle_toggled': self.on_toggle_toggled + 'on_toggle_toggled': self.on_toggle_toggled, }) self.dialog = self.builder.get_object('options_dialog') self.dialog.set_transient_for(component.get('Preferences').pref_dialog) @@ -77,22 +79,22 @@ class OptionsDialog(object): def load_options(self, options): self.builder.get_object('enabled').set_active(options.get('enabled', True)) self.builder.get_object('append_extension_toggle').set_active( - options.get('append_extension_toggle', False) + options.get('append_extension_toggle', False), ) self.builder.get_object('append_extension').set_text( - options.get('append_extension', '.added') + options.get('append_extension', '.added'), ) self.builder.get_object('download_location_toggle').set_active( - options.get('download_location_toggle', False) + options.get('download_location_toggle', False), ) self.builder.get_object('copy_torrent_toggle').set_active( - options.get('copy_torrent_toggle', False) + options.get('copy_torrent_toggle', False), ) self.builder.get_object('delete_copy_torrent_toggle').set_active( - options.get('delete_copy_torrent_toggle', False) + options.get('delete_copy_torrent_toggle', False), ) self.builder.get_object('seed_mode').set_active( - options.get('seed_mode', False) + options.get('seed_mode', False), ) self.accounts.clear() self.labels.clear() @@ -120,17 +122,19 @@ class OptionsDialog(object): self.builder.get_object('isnt_queue_to_top').set_active(True) if not options.get('auto_managed', True): self.builder.get_object('isnt_auto_managed').set_active(True) - for field in ['move_completed_path', 'path', 'download_location', - 'copy_torrent']: + for field in [ + 'move_completed_path', 'path', 'download_location', + 'copy_torrent', + ]: if client.is_localhost(): self.builder.get_object(field + '_chooser').set_current_folder( - options.get(field, os.path.expanduser('~')) + options.get(field, os.path.expanduser('~')), ) self.builder.get_object(field + '_chooser').show() self.builder.get_object(field + '_entry').hide() else: self.builder.get_object(field + '_entry').set_text( - options.get(field, '') + options.get(field, ''), ) self.builder.get_object(field + '_entry').show() self.builder.get_object(field + '_chooser').hide() @@ -139,33 +143,33 @@ class OptionsDialog(object): def on_core_config(config): if client.is_localhost(): self.builder.get_object('download_location_chooser').set_current_folder( - options.get('download_location', config['download_location']) + options.get('download_location', config['download_location']), ) if options.get('move_completed_toggle', config['move_completed']): self.builder.get_object('move_completed_toggle').set_active(True) self.builder.get_object('move_completed_path_chooser').set_current_folder( - options.get('move_completed_path', config['move_completed_path']) + options.get('move_completed_path', config['move_completed_path']), ) if options.get('copy_torrent_toggle', config['copy_torrent_file']): self.builder.get_object('copy_torrent_toggle').set_active(True) self.builder.get_object('copy_torrent_chooser').set_current_folder( - options.get('copy_torrent', config['torrentfiles_location']) + options.get('copy_torrent', config['torrentfiles_location']), ) else: self.builder.get_object('download_location_entry').set_text( - options.get('download_location', config['download_location']) + options.get('download_location', config['download_location']), ) if options.get('move_completed_toggle', config['move_completed']): self.builder.get_object('move_completed_toggle').set_active( - options.get('move_completed_toggle', False) + options.get('move_completed_toggle', False), ) self.builder.get_object('move_completed_path_entry').set_text( - options.get('move_completed_path', config['move_completed_path']) + options.get('move_completed_path', config['move_completed_path']), ) if options.get('copy_torrent_toggle', config['copy_torrent_file']): self.builder.get_object('copy_torrent_toggle').set_active(True) self.builder.get_object('copy_torrent_entry').set_text( - options.get('copy_torrent', config['torrentfiles_location']) + options.get('copy_torrent', config['torrentfiles_location']), ) if options.get('delete_copy_torrent_toggle', config['del_copy_torrent_file']): @@ -180,7 +184,7 @@ class OptionsDialog(object): for account in accounts: acc_iter = self.accounts.append() self.accounts.set_value( - acc_iter, 0, account['username'] + acc_iter, 0, account['username'], ) if account['username'] == owner: selected_iter = acc_iter @@ -215,7 +219,7 @@ class OptionsDialog(object): client.core.get_enabled_plugins().addCallback(on_get_enabled_plugins) if client.get_auth_level() == deluge.common.AUTH_LEVEL_ADMIN: client.core.get_known_accounts().addCallback( - on_accounts, options.get('owner', client.get_auth_user()) + on_accounts, options.get('owner', client.get_auth_user()), ).addErrback(on_accounts_failure) else: acc_iter = self.accounts.append() @@ -224,11 +228,13 @@ class OptionsDialog(object): self.builder.get_object('OwnerCombobox').set_sensitive(False) def set_sensitive(self): - maintoggles = ['download_location', 'append_extension', - 'move_completed', 'label', 'max_download_speed', - 'max_upload_speed', 'max_connections', - 'max_upload_slots', 'add_paused', 'auto_managed', - 'stop_at_ratio', 'queue_to_top', 'copy_torrent'] + maintoggles = [ + 'download_location', 'append_extension', + 'move_completed', 'label', 'max_download_speed', + 'max_upload_speed', 'max_connections', + 'max_upload_slots', 'add_paused', 'auto_managed', + 'stop_at_ratio', 'queue_to_top', 'copy_torrent', + ] for maintoggle in maintoggles: self.on_toggle_toggled(self.builder.get_object(maintoggle + '_toggle')) @@ -278,7 +284,7 @@ class OptionsDialog(object): try: options = self.generate_opts() client.autoadd.set_options( - str(self.watchdir_id), options + str(self.watchdir_id), options, ).addCallbacks(self.on_added, self.on_error_show) except IncompatibleOption as ex: dialogs.ErrorDialog(_('Incompatible Option'), str(ex), self.dialog).run() @@ -308,28 +314,37 @@ class OptionsDialog(object): if client.is_localhost(): options['path'] = self.builder.get_object('path_chooser').get_filename() options['download_location'] = self.builder.get_object( - 'download_location_chooser').get_filename() + 'download_location_chooser', + ).get_filename() options['move_completed_path'] = self.builder.get_object( - 'move_completed_path_chooser').get_filename() + 'move_completed_path_chooser', + ).get_filename() options['copy_torrent'] = self.builder.get_object( - 'copy_torrent_chooser').get_filename() + 'copy_torrent_chooser', + ).get_filename() else: options['path'] = self.builder.get_object('path_entry').get_text() options['download_location'] = self.builder.get_object( - 'download_location_entry').get_text() + 'download_location_entry', + ).get_text() options['move_completed_path'] = self.builder.get_object( - 'move_completed_path_entry').get_text() + 'move_completed_path_entry', + ).get_text() options['copy_torrent'] = self.builder.get_object( - 'copy_torrent_entry').get_text() + 'copy_torrent_entry', + ).get_text() options['label'] = self.builder.get_object('label').child.get_text().lower() options['append_extension'] = self.builder.get_object('append_extension').get_text() options['owner'] = self.accounts[ - self.builder.get_object('OwnerCombobox').get_active()][0] - - for key in ['append_extension_toggle', 'download_location_toggle', - 'label_toggle', 'copy_torrent_toggle', - 'delete_copy_torrent_toggle', 'seed_mode']: + self.builder.get_object('OwnerCombobox').get_active() + ][0] + + for key in [ + 'append_extension_toggle', 'download_location_toggle', + 'label_toggle', 'copy_torrent_toggle', + 'delete_copy_torrent_toggle', 'seed_mode', + ]: options[key] = self.builder.get_object(key).get_active() for spin_id in self.spin_ids: @@ -343,8 +358,10 @@ class OptionsDialog(object): options[chk_id + '_toggle'] = self.builder.get_object(chk_id + '_toggle').get_active() if options['copy_torrent_toggle'] and options['path'] == options['copy_torrent']: - raise IncompatibleOption(_('"Watch Folder" directory and "Copy of .torrent' - ' files to" directory cannot be the same!')) + raise IncompatibleOption(_( + '"Watch Folder" directory and "Copy of .torrent' + ' files to" directory cannot be the same!', + )) return options @@ -357,13 +374,13 @@ class GtkUI(GtkPluginBase): self.opts_dialog = OptionsDialog() component.get('PluginManager').register_hook( - 'on_apply_prefs', self.on_apply_prefs + 'on_apply_prefs', self.on_apply_prefs, ) component.get('PluginManager').register_hook( - 'on_show_prefs', self.on_show_prefs + 'on_show_prefs', self.on_show_prefs, ) client.register_event_handler( - 'AutoaddOptionsChangedEvent', self.on_options_changed_event + 'AutoaddOptionsChangedEvent', self.on_options_changed_event, ) self.watchdirs = {} @@ -386,16 +403,16 @@ class GtkUI(GtkPluginBase): sw.add(self.treeView) sw.show_all() component.get('Preferences').add_page( - _('AutoAdd'), self.builder.get_object('prefs_box') + _('AutoAdd'), self.builder.get_object('prefs_box'), ) def disable(self): component.get('Preferences').remove_page(_('AutoAdd')) component.get('PluginManager').deregister_hook( - 'on_apply_prefs', self.on_apply_prefs + 'on_apply_prefs', self.on_apply_prefs, ) component.get('PluginManager').deregister_hook( - 'on_show_prefs', self.on_show_prefs + 'on_show_prefs', self.on_show_prefs, ) def create_model(self): @@ -403,14 +420,14 @@ class GtkUI(GtkPluginBase): for watchdir_id, watchdir in self.watchdirs.items(): store.append([ watchdir_id, watchdir['enabled'], - watchdir.get('owner', 'localclient'), watchdir['path'] + watchdir.get('owner', 'localclient'), watchdir['path'], ]) return store def create_columns(self, treeview): renderer_toggle = gtk.CellRendererToggle() column = gtk.TreeViewColumn( - _('Active'), renderer_toggle, activatable=1, active=1 + _('Active'), renderer_toggle, activatable=1, active=1, ) column.set_sort_column_id(1) treeview.append_column(column) @@ -490,7 +507,7 @@ class GtkUI(GtkPluginBase): for watchdir_id, watchdir in self.watchdirs.items(): self.store.append([ watchdir_id, watchdir['enabled'], - watchdir.get('owner', 'localclient'), watchdir['path'] + watchdir.get('owner', 'localclient'), watchdir['path'], ]) # Workaround for cached glade signal appearing when re-enabling plugin in same session if self.builder.get_object('edit_button'): diff --git a/deluge/plugins/AutoAdd/setup.py b/deluge/plugins/AutoAdd/setup.py index 079c1bf76..77ca16267 100644 --- a/deluge/plugins/AutoAdd/setup.py +++ b/deluge/plugins/AutoAdd/setup.py @@ -45,5 +45,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/common.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/common.py index f2b976c75..5a9d525a3 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/common.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/common.py @@ -165,5 +165,5 @@ class IP(object): def __repr__(self): return '<%s long=%s address="%s">' % ( - self.__class__.__name__, self.long, self.address + self.__class__.__name__, self.long, self.address, ) diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/core.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/core.py index 73f917a50..18d0d036b 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/core.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/core.py @@ -104,14 +104,14 @@ class Core(CorePluginBase): self.update_timer = LoopingCall(self.check_import) if self.config['check_after_days'] > 0: self.update_timer.start( - self.config['check_after_days'] * 24 * 60 * 60, update_now + self.config['check_after_days'] * 24 * 60 * 60, update_now, ) def disable(self): self.config.save() log.debug('Reset IP filter') self.core.session.get_ip_filter().add_rule( - '0.0.0.0', '255.255.255.255', ALLOW_RANGE + '0.0.0.0', '255.255.255.255', ALLOW_RANGE, ) log.debug('Blocklist: Plugin disabled') @@ -189,7 +189,7 @@ class Core(CorePluginBase): try: ip = IP.parse(ip) self.blocklist.add_rule( - ip.address, ip.address, ALLOW_RANGE + ip.address, ip.address, ALLOW_RANGE, ) saved.add(ip.address) log.debug('Added %s to whitelisted', ip) @@ -223,15 +223,17 @@ class Core(CorePluginBase): self.update_timer.stop() if self.config['check_after_days'] > 0: self.update_timer.start( - self.config['check_after_days'] * 24 * 60 * 60, update_now + self.config['check_after_days'] * 24 * 60 * 60, update_now, ) continue self.config[key] = config[key] if needs_blocklist_import: - log.debug('IP addresses were removed from the whitelist. Since we ' - 'do not know if they were blocked before. Re-import ' - 'current blocklist and re-add whitelisted.') + log.debug( + 'IP addresses were removed from the whitelist. Since we ' + 'do not know if they were blocked before. Re-import ' + 'current blocklist and re-add whitelisted.', + ) self.has_imported = False d = self.import_list(deluge.configmanager.get_config_dir('blocklist.cache')) d.addCallbacks(self.on_import_complete, self.on_import_error) @@ -318,7 +320,7 @@ class Core(CorePluginBase): self.is_downloading = True return download_file( url, deluge.configmanager.get_config_dir('blocklist.download'), - on_retrieve_data, headers + on_retrieve_data, headers, ) def on_download_complete(self, blocklist): @@ -365,8 +367,10 @@ class Core(CorePluginBase): else: log.warning('Blocklist download failed: %s', error_msg) if self.failed_attempts < self.config['try_times']: - log.debug('Try downloading blocklist again... (%s/%s)', - self.failed_attempts, self.config['try_times']) + log.debug( + 'Try downloading blocklist again... (%s/%s)', + self.failed_attempts, self.config['try_times'], + ) self.failed_attempts += 1 d = self.download_list() d.addCallbacks(self.on_download_complete, self.on_download_error) diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/decompressers.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/decompressers.py index 6096d9935..8b9a0f4fb 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/decompressers.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/decompressers.py @@ -17,25 +17,25 @@ import zipfile def Zipped(reader): # NOQA: N802 """Blocklist reader for zipped blocklists""" - def open(self): + def _open(self): z = zipfile.ZipFile(self.file) f = z.open(z.namelist()[0]) return f - reader.open = open + reader.open = _open return reader def GZipped(reader): # NOQA: N802 """Blocklist reader for gzipped blocklists""" - def open(self): + def _open(self): return gzip.open(self.file) - reader.open = open + reader.open = _open return reader def BZipped2(reader): # NOQA: N802 """Blocklist reader for bzipped2 blocklists""" - def open(self): + def _open(self): return bz2.BZ2File(self.file) - reader.open = open + reader.open = _open return reader diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/detect.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/detect.py index 96450278f..1d8b5d864 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/detect.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/detect.py @@ -15,19 +15,19 @@ from .readers import EmuleReader, PeerGuardianReader, SafePeerReader COMPRESSION_TYPES = { 'PK': 'Zip', '\x1f\x8b': 'GZip', - 'BZ': 'BZip2' + 'BZ': 'BZip2', } DECOMPRESSERS = { 'Zip': Zipped, 'GZip': GZipped, - 'BZip2': BZipped2 + 'BZip2': BZipped2, } READERS = { 'Emule': EmuleReader, 'SafePeer': SafePeerReader, - 'PeerGuardian': PeerGuardianReader + 'PeerGuardian': PeerGuardianReader, } diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/gtkui.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/gtkui.py index 390c928a5..3d5df6c41 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/gtkui.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/gtkui.py @@ -35,7 +35,7 @@ class GtkUI(GtkPluginBase): image=common.get_resource('blocklist16.png'), text='', callback=self._on_status_item_clicked, - tooltip=_('Blocked IP Ranges /Whitelisted IP Ranges') + tooltip=_('Blocked IP Ranges /Whitelisted IP Ranges'), ) # Register some hooks @@ -67,7 +67,8 @@ class GtkUI(GtkPluginBase): self.builder.get_object('image_up_to_date').hide() self.status_item.set_text( - 'Downloading %.2f%%' % (status['file_progress'] * 100)) + 'Downloading %.2f%%' % (status['file_progress'] * 100), + ) self.progress_bar.set_text('Downloading %.2f%%' % (status['file_progress'] * 100)) self.progress_bar.set_fraction(status['file_progress']) self.progress_bar.show() @@ -79,7 +80,8 @@ class GtkUI(GtkPluginBase): self.builder.get_object('image_up_to_date').hide() self.status_item.set_text( - 'Importing ' + str(status['num_blocked'])) + 'Importing ' + str(status['num_blocked']), + ) self.progress_bar.set_text('Importing %s' % (status['num_blocked'])) self.progress_bar.pulse() self.progress_bar.show() @@ -97,12 +99,15 @@ class GtkUI(GtkPluginBase): self.status_item.set_text('%(num_blocked)s/%(num_whited)s' % status) self.builder.get_object('label_filesize').set_text( - deluge.common.fsize(status['file_size'])) + deluge.common.fsize(status['file_size']), + ) self.builder.get_object('label_modified').set_text( - datetime.fromtimestamp(status['file_date']).strftime('%c')) + datetime.fromtimestamp(status['file_date']).strftime('%c'), + ) self.builder.get_object('label_type').set_text(status['file_type']) self.builder.get_object('label_url').set_text( - status['file_url']) + status['file_url'], + ) client.blocklist.get_status().addCallback(_on_get_status) @@ -155,18 +160,24 @@ class GtkUI(GtkPluginBase): self.builder.connect_signals({ 'on_button_check_download_clicked': self._on_button_check_download_clicked, 'on_button_force_download_clicked': self._on_button_force_download_clicked, - 'on_whitelist_add_clicked': (self.on_add_button_clicked, - self.whitelist_treeview), - 'on_whitelist_remove_clicked': (self.on_delete_button_clicked, - self.whitelist_treeview), + 'on_whitelist_add_clicked': ( + self.on_add_button_clicked, + self.whitelist_treeview, + ), + 'on_whitelist_remove_clicked': ( + self.on_delete_button_clicked, + self.whitelist_treeview, + ), }) # Set button icons self.builder.get_object('image_download').set_from_file( - common.get_resource('blocklist_download24.png')) + common.get_resource('blocklist_download24.png'), + ) self.builder.get_object('image_import').set_from_file( - common.get_resource('blocklist_import24.png')) + common.get_resource('blocklist_import24.png'), + ) # Update the preferences page with config values from the core self._on_show_prefs() @@ -174,13 +185,14 @@ class GtkUI(GtkPluginBase): # Add the page to the preferences dialog self.plugin.add_preferences_page( _('Blocklist'), - self.builder.get_object('blocklist_prefs_box')) + self.builder.get_object('blocklist_prefs_box'), + ) def build_whitelist_model_treeview(self): self.whitelist_treeview = self.builder.get_object('whitelist_treeview') treeview_selection = self.whitelist_treeview.get_selection() treeview_selection.connect( - 'changed', self.on_whitelist_treeview_selection_changed + 'changed', self.on_whitelist_treeview_selection_changed, ) self.whitelist_model = gtk.ListStore(str, bool) renderer = gtk.CellRendererText() @@ -207,11 +219,15 @@ class GtkUI(GtkPluginBase): def on_whitelist_treeview_selection_changed(self, selection): model, selected_connection_iter = selection.get_selected() if selected_connection_iter: - self.builder.get_object('whitelist_delete').set_property('sensitive', - True) + self.builder.get_object('whitelist_delete').set_property( + 'sensitive', + True, + ) else: - self.builder.get_object('whitelist_delete').set_property('sensitive', - False) + self.builder.get_object('whitelist_delete').set_property( + 'sensitive', + False, + ) def on_add_button_clicked(self, widget, treeview): model = treeview.get_model() @@ -228,5 +244,5 @@ class GtkUI(GtkPluginBase): self.whitelist_model.clear() for ip in whitelist: self.whitelist_model.set( - self.whitelist_model.append(), 0, ip, 1, True + self.whitelist_model.append(), 0, ip, 1, True, ) diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py index 2f743427d..3da43c451 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py @@ -21,7 +21,7 @@ FORMAT_LIST = [ ('gzmule', _('Emule IP list (GZip)')), ('spzip', _('SafePeer Text (Zipped)')), ('pgtext', _('PeerGuardian Text (Uncompressed)')), - ('p2bgz', _('PeerGuardian P2B (GZip)')) + ('p2bgz', _('PeerGuardian P2B (GZip)')), ] diff --git a/deluge/plugins/Blocklist/setup.py b/deluge/plugins/Blocklist/setup.py index c49fb4f1c..03e2e189d 100644 --- a/deluge/plugins/Blocklist/setup.py +++ b/deluge/plugins/Blocklist/setup.py @@ -39,5 +39,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Execute/deluge/plugins/execute/core.py b/deluge/plugins/Execute/deluge/plugins/execute/core.py index 5c5f622db..2dbf1c64d 100644 --- a/deluge/plugins/Execute/deluge/plugins/execute/core.py +++ b/deluge/plugins/Execute/deluge/plugins/execute/core.py @@ -26,7 +26,7 @@ from deluge.plugins.pluginbase import CorePluginBase log = logging.getLogger(__name__) DEFAULT_CONFIG = { - 'commands': [] + 'commands': [], } EXECUTE_ID = 0 @@ -36,7 +36,7 @@ EXECUTE_COMMAND = 2 EVENT_MAP = { 'complete': 'TorrentFinishedEvent', 'added': 'TorrentAddedEvent', - 'removed': 'TorrentRemovedEvent' + 'removed': 'TorrentRemovedEvent', } @@ -118,8 +118,10 @@ class Core(CorePluginBase): command = os.path.expandvars(command[EXECUTE_COMMAND]) command = os.path.expanduser(command) - cmd_args = [torrent_id.encode('utf8'), torrent_name.encode('utf8'), - download_location.encode('utf8')] + cmd_args = [ + torrent_id.encode('utf8'), torrent_name.encode('utf8'), + download_location.encode('utf8'), + ] if windows_check(): # Escape ampersand on windows (see #2784) cmd_args = [cmd_arg.replace('&', '^^^&') for cmd_arg in cmd_args] diff --git a/deluge/plugins/Execute/deluge/plugins/execute/gtkui.py b/deluge/plugins/Execute/deluge/plugins/execute/gtkui.py index a00025042..f74e72007 100644 --- a/deluge/plugins/Execute/deluge/plugins/execute/gtkui.py +++ b/deluge/plugins/Execute/deluge/plugins/execute/gtkui.py @@ -30,7 +30,7 @@ EXECUTE_COMMAND = 2 EVENT_MAP = { 'complete': _('Torrent Complete'), 'added': _('Torrent Added'), - 'removed': _('Torrent Removed') + 'removed': _('Torrent Removed'), } EVENTS = ['complete', 'added', 'removed'] diff --git a/deluge/plugins/Execute/setup.py b/deluge/plugins/Execute/setup.py index 090131d1f..55d0ed56b 100644 --- a/deluge/plugins/Execute/setup.py +++ b/deluge/plugins/Execute/setup.py @@ -40,5 +40,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Extractor/deluge/plugins/extractor/core.py b/deluge/plugins/Extractor/deluge/plugins/extractor/core.py index 27b0d3a2d..dbedb23e8 100644 --- a/deluge/plugins/Extractor/deluge/plugins/extractor/core.py +++ b/deluge/plugins/Extractor/deluge/plugins/extractor/core.py @@ -30,7 +30,7 @@ log = logging.getLogger(__name__) DEFAULT_PREFS = { 'extract_path': '', - 'use_name_folder': True + 'use_name_folder': True, } if windows_check(): diff --git a/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py b/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py index b0192256a..2adea4368 100644 --- a/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py +++ b/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py @@ -51,7 +51,7 @@ class GtkUI(GtkPluginBase): config = { 'extract_path': path, - 'use_name_folder': self.builder.get_object('chk_use_name').get_active() + 'use_name_folder': self.builder.get_object('chk_use_name').get_active(), } client.extractor.set_config(config) diff --git a/deluge/plugins/Extractor/setup.py b/deluge/plugins/Extractor/setup.py index a38f4d76e..9be0652a7 100644 --- a/deluge/plugins/Extractor/setup.py +++ b/deluge/plugins/Extractor/setup.py @@ -53,5 +53,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Label/deluge/plugins/label/core.py b/deluge/plugins/Label/deluge/plugins/label/core.py index 9e3b4987c..4a1976edd 100644 --- a/deluge/plugins/Label/deluge/plugins/label/core.py +++ b/deluge/plugins/Label/deluge/plugins/label/core.py @@ -57,7 +57,7 @@ OPTIONS_DEFAULTS = { 'move_completed': False, 'move_completed_path': '', 'auto_add': False, - 'auto_add_trackers': [] + 'auto_add_trackers': [], } NO_LABEL = 'No Label' @@ -108,7 +108,7 @@ class Core(CorePluginBase): pass def init_filter_dict(self): - filter_dict = dict([(label, 0) for label in self.labels]) + filter_dict = {label: 0 for label in self.labels} filter_dict['All'] = len(self.torrents) return filter_dict @@ -208,8 +208,8 @@ class Core(CorePluginBase): torrent.set_options( { 'move_completed': options['move_completed'], - 'move_completed_path': options['move_completed_path'] - } + 'move_completed_path': options['move_completed_path'], + }, ) def _unset_torrent_options(self, torrent_id, label_id): @@ -233,8 +233,8 @@ class Core(CorePluginBase): torrent.set_options( { 'move_completed': self.core_cfg.config['move_completed'], - 'move_completed_path': self.core_cfg.config['move_completed_path'] - } + 'move_completed_path': self.core_cfg.config['move_completed_path'], + }, ) def _has_auto_match(self, torrent, label_options): @@ -310,7 +310,10 @@ class Core(CorePluginBase): @export def get_config(self): """see : label_set_config""" - return dict((key, self.config[key]) for key in CORE_OPTIONS if key in self.config.config) + return { + key: self.config[key] + for key in CORE_OPTIONS if key in self.config.config + } @export def set_config(self, options): diff --git a/deluge/plugins/Label/deluge/plugins/label/gtkui/sidebar_menu.py b/deluge/plugins/Label/deluge/plugins/label/gtkui/sidebar_menu.py index 834a45836..cdb298ccb 100644 --- a/deluge/plugins/Label/deluge/plugins/label/gtkui/sidebar_menu.py +++ b/deluge/plugins/Label/deluge/plugins/label/gtkui/sidebar_menu.py @@ -126,8 +126,10 @@ class AddDialog(object): class OptionsDialog(object): spin_ids = ['max_download_speed', 'max_upload_speed', 'stop_ratio'] spin_int_ids = ['max_upload_slots', 'max_connections'] - chk_ids = ['apply_max', 'apply_queue', 'stop_at_ratio', 'apply_queue', 'remove_at_ratio', - 'apply_move_completed', 'move_completed', 'is_auto_managed', 'auto_add'] + chk_ids = [ + 'apply_max', 'apply_queue', 'stop_at_ratio', 'apply_queue', 'remove_at_ratio', + 'apply_move_completed', 'move_completed', 'is_auto_managed', 'auto_add', + ] # list of tuples, because order matters when nesting. sensitive_groups = [ @@ -136,7 +138,7 @@ class OptionsDialog(object): ('stop_at_ratio', ['remove_at_ratio', 'stop_ratio']), # nested ('apply_move_completed', ['move_completed']), ('move_completed', ['move_completed_path']), # nested - ('auto_add', ['auto_add_trackers']) + ('auto_add', ['auto_add_trackers']), ] def __init__(self): diff --git a/deluge/plugins/Label/setup.py b/deluge/plugins/Label/setup.py index b69438d0b..a0c048416 100644 --- a/deluge/plugins/Label/setup.py +++ b/deluge/plugins/Label/setup.py @@ -44,5 +44,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Notifications/deluge/plugins/notifications/common.py b/deluge/plugins/Notifications/deluge/plugins/notifications/common.py index 8b4d68e9d..5d6029cc1 100644 --- a/deluge/plugins/Notifications/deluge/plugins/notifications/common.py +++ b/deluge/plugins/Notifications/deluge/plugins/notifications/common.py @@ -37,7 +37,7 @@ class CustomNotifications(object): 'email': {}, 'popup': {}, 'blink': {}, - 'sound': {} + 'sound': {}, } def enable(self): @@ -72,7 +72,7 @@ class CustomNotifications(object): wrapper, handler = self.custom_notifications[kind][eventtype] try: component.get('EventManager').register_event_handler( - eventtype, wrapper + eventtype, wrapper, ) except KeyError: from deluge.ui.client import client @@ -83,7 +83,7 @@ class CustomNotifications(object): wrapper, handler = self.custom_notifications[kind][eventtype] try: component.get('EventManager').deregister_event_handler( - eventtype, wrapper + eventtype, wrapper, ) except KeyError: from deluge.ui.client import client @@ -99,8 +99,10 @@ class CustomNotifications(object): if known_events[eventtype].__module__.startswith('deluge.event'): if handler.__self__ is self: return True - log.error('You cannot register custom notification providers ' - 'for built-in event types.') + log.error( + 'You cannot register custom notification providers ' + 'for built-in event types.', + ) return False return True diff --git a/deluge/plugins/Notifications/deluge/plugins/notifications/core.py b/deluge/plugins/Notifications/deluge/plugins/notifications/core.py index 46c6812d4..66c3ee078 100644 --- a/deluge/plugins/Notifications/deluge/plugins/notifications/core.py +++ b/deluge/plugins/Notifications/deluge/plugins/notifications/core.py @@ -41,8 +41,8 @@ DEFAULT_PREFS = { 'smtp_recipients': [], # Subscriptions 'subscriptions': { - 'email': [] - } + 'email': [], + }, } @@ -53,8 +53,10 @@ class CoreNotifications(CustomNotifications): def enable(self): CustomNotifications.enable(self) - self.register_custom_email_notification('TorrentFinishedEvent', - self._on_torrent_finished_event) + self.register_custom_email_notification( + 'TorrentFinishedEvent', + self._on_torrent_finished_event, + ) def disable(self): self.deregister_custom_email_notification('TorrentFinishedEvent') @@ -77,8 +79,10 @@ class CoreNotifications(CustomNotifications): if not self.config['smtp_enabled']: return defer.succeed('SMTP notification not enabled.') subject, message = result - log.debug('Spawning new thread to send email with subject: %s: %s', - subject, message) + log.debug( + 'Spawning new thread to send email with subject: %s: %s', + subject, message, + ) # Spawn thread because we don't want Deluge to lock up while we send the # email. return threads.deferToThread(self._notify_email, subject, message) @@ -103,7 +107,8 @@ class CoreNotifications(CustomNotifications): 'smtp_from': self.config['smtp_from'], 'subject': subject, 'smtp_recipients': to_addrs_str, - 'date': formatdate()} + 'date': formatdate(), + } headers = """\ From: %(smtp_from)s To: %(smtp_recipients)s @@ -176,7 +181,7 @@ Date: %(date)s 'downloading "%(name)s", which includes %(num_files)i files.' '\nTo stop receiving these alerts, simply turn off email ' "notification in Deluge's preferences.\n\n" - 'Thank you,\nDeluge.' + 'Thank you,\nDeluge.', ) % torrent_status return subject, message @@ -196,7 +201,8 @@ class Core(CorePluginBase, CoreNotifications): def enable(self): CoreNotifications.enable(self) self.config = deluge.configmanager.ConfigManager( - 'notifications-core.conf', DEFAULT_PREFS) + 'notifications-core.conf', DEFAULT_PREFS, + ) log.debug('ENABLING CORE NOTIFICATIONS') def disable(self): diff --git a/deluge/plugins/Notifications/deluge/plugins/notifications/gtkui.py b/deluge/plugins/Notifications/deluge/plugins/notifications/gtkui.py index 51030377c..86a3daf8c 100644 --- a/deluge/plugins/Notifications/deluge/plugins/notifications/gtkui.py +++ b/deluge/plugins/Notifications/deluge/plugins/notifications/gtkui.py @@ -67,8 +67,10 @@ DEFAULT_PREFS = { } RECIPIENT_FIELD, RECIPIENT_EDIT = list(range(2)) -(SUB_EVENT, SUB_EVENT_DOC, SUB_NOT_EMAIL, SUB_NOT_POPUP, SUB_NOT_BLINK, - SUB_NOT_SOUND) = list(range(6)) +( + SUB_EVENT, SUB_EVENT_DOC, SUB_NOT_EMAIL, SUB_NOT_POPUP, SUB_NOT_BLINK, + SUB_NOT_SOUND, +) = list(range(6)) SND_EVENT, SND_EVENT_DOC, SND_NAME, SND_PATH = list(range(4)) @@ -80,13 +82,13 @@ class GtkUiNotifications(CustomNotifications): def enable(self): CustomNotifications.enable(self) self.register_custom_blink_notification( - 'TorrentFinishedEvent', self._on_torrent_finished_event_blink + 'TorrentFinishedEvent', self._on_torrent_finished_event_blink, ) self.register_custom_sound_notification( - 'TorrentFinishedEvent', self._on_torrent_finished_event_sound + 'TorrentFinishedEvent', self._on_torrent_finished_event_sound, ) self.register_custom_popup_notification( - 'TorrentFinishedEvent', self._on_torrent_finished_event_popup + 'TorrentFinishedEvent', self._on_torrent_finished_event_popup, ) def disable(self): @@ -146,17 +148,22 @@ class GtkUiNotifications(CustomNotifications): def handle_custom_blink_notification(self, result, eventtype): if result: return defer.maybeDeferred(self.__blink) - return defer.succeed('Will not blink. The returned value from the custom ' - 'handler was: %s' % result) + return defer.succeed( + 'Will not blink. The returned value from the custom ' + 'handler was: %s' % result, + ) def handle_custom_sound_notification(self, result, eventtype): if isinstance(result, ''.__class__): if not result and eventtype in self.config['custom_sounds']: return defer.maybeDeferred( - self.__play_sound, self.config['custom_sounds'][eventtype]) + self.__play_sound, self.config['custom_sounds'][eventtype], + ) return defer.maybeDeferred(self.__play_sound, result) - return defer.succeed('Will not play sound. The returned value from the ' - 'custom handler was: %s' % result) + return defer.succeed( + 'Will not play sound. The returned value from the ' + 'custom handler was: %s' % result, + ) def __blink(self): self.systray.blink(True) @@ -219,12 +226,16 @@ class GtkUiNotifications(CustomNotifications): log.debug('Failed to get torrent status to be able to show the popup') def _on_torrent_finished_event_got_torrent_status(self, torrent_status): - log.debug('Handler for TorrentFinishedEvent GTKUI called. ' - 'Got Torrent Status') + log.debug( + 'Handler for TorrentFinishedEvent GTKUI called. ' + 'Got Torrent Status', + ) title = _('Finished Torrent') torrent_status['num_files'] = torrent_status['file_progress'].count(1.0) - message = _('The torrent "%(name)s" including %(num_files)i file(s) ' - 'has finished downloading.') % torrent_status + message = _( + 'The torrent "%(name)s" including %(num_files)i file(s) ' + 'has finished downloading.', + ) % torrent_status return title, message @@ -235,7 +246,7 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): def enable(self): self.config = deluge.configmanager.ConfigManager( - 'notifications-gtk.conf', DEFAULT_PREFS + 'notifications-gtk.conf', DEFAULT_PREFS, ) self.builder = gtk.Builder() self.builder.add_from_file(get_resource('config.ui')) @@ -248,73 +259,97 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): self.build_notifications_model_populate_treeview() client.notifications.get_handled_events().addCallback( - self.popuplate_what_needs_handled_events + self.popuplate_what_needs_handled_events, ) self.builder.connect_signals({ - 'on_add_button_clicked': (self.on_add_button_clicked, - self.recipients_treeview), - 'on_delete_button_clicked': (self.on_delete_button_clicked, - self.recipients_treeview), + 'on_add_button_clicked': ( + self.on_add_button_clicked, + self.recipients_treeview, + ), + 'on_delete_button_clicked': ( + self.on_delete_button_clicked, + self.recipients_treeview, + ), 'on_enabled_toggled': self.on_enabled_toggled, 'on_sound_enabled_toggled': self.on_sound_enabled_toggled, 'on_sounds_edit_button_clicked': self.on_sounds_edit_button_clicked, 'on_sounds_revert_button_clicked': self.on_sounds_revert_button_clicked, - 'on_sound_path_update_preview': self.on_sound_path_update_preview + 'on_sound_path_update_preview': self.on_sound_path_update_preview, }) component.get('Preferences').add_page(_('Notifications'), self.prefs) - component.get('PluginManager').register_hook('on_apply_prefs', - self.on_apply_prefs) - component.get('PluginManager').register_hook('on_show_prefs', - self.on_show_prefs) + component.get('PluginManager').register_hook( + 'on_apply_prefs', + self.on_apply_prefs, + ) + component.get('PluginManager').register_hook( + 'on_show_prefs', + self.on_show_prefs, + ) if not POPUP_AVAILABLE: - self.builder.get_object('popup_enabled').set_property('sensitive', - False) + self.builder.get_object('popup_enabled').set_property( + 'sensitive', + False, + ) if not SOUND_AVAILABLE: # for widget_name in ('sound_enabled', 'sound_path', 'sounds_page', 'sounds_page_label'): # self.builder.get_object(widget_name).set_property('sensitive', False) - self.builder.get_object('sound_enabled').set_property('sensitive', - False) + self.builder.get_object('sound_enabled').set_property( + 'sensitive', + False, + ) self.builder.get_object('sound_path').set_property('sensitive', False) - self.builder.get_object('sounds_page').set_property('sensitive', - False) - self.builder.get_object('sounds_page_label').set_property('sensitive', - False) + self.builder.get_object('sounds_page').set_property( + 'sensitive', + False, + ) + self.builder.get_object('sounds_page_label').set_property( + 'sensitive', + False, + ) self.systray = component.get('SystemTray') if not hasattr(self.systray, 'tray'): # Tray is not beeing used - self.builder.get_object('blink_enabled').set_property('sensitive', - False) + self.builder.get_object('blink_enabled').set_property( + 'sensitive', + False, + ) GtkUiNotifications.enable(self) def disable(self): GtkUiNotifications.disable(self) component.get('Preferences').remove_page(_('Notifications')) - component.get('PluginManager').deregister_hook('on_apply_prefs', - self.on_apply_prefs) - component.get('PluginManager').deregister_hook('on_show_prefs', - self.on_show_prefs) + component.get('PluginManager').deregister_hook( + 'on_apply_prefs', + self.on_apply_prefs, + ) + component.get('PluginManager').deregister_hook( + 'on_show_prefs', + self.on_show_prefs, + ) def build_recipients_model_populate_treeview(self): # SMTP Recipients treeview/model self.recipients_treeview = self.builder.get_object('smtp_recipients') treeview_selection = self.recipients_treeview.get_selection() treeview_selection.connect( - 'changed', self.on_recipients_treeview_selection_changed + 'changed', self.on_recipients_treeview_selection_changed, ) self.recipients_model = gtk.ListStore(str, bool) renderer = gtk.CellRendererText() renderer.connect('edited', self.on_cell_edited, self.recipients_model) renderer.set_data('recipient', RECIPIENT_FIELD) - column = gtk.TreeViewColumn('Recipients', renderer, - text=RECIPIENT_FIELD, - editable=RECIPIENT_EDIT) + column = gtk.TreeViewColumn( + 'Recipients', renderer, + text=RECIPIENT_FIELD, + editable=RECIPIENT_EDIT, + ) column.set_expand(True) self.recipients_treeview.append_column(column) self.recipients_treeview.set_model(self.recipients_model) @@ -324,7 +359,7 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): self.sounds_treeview = self.builder.get_object('sounds_treeview') sounds_selection = self.sounds_treeview.get_selection() sounds_selection.connect( - 'changed', self.on_sounds_treeview_selection_changed + 'changed', self.on_sounds_treeview_selection_changed, ) self.sounds_treeview.set_tooltip_column(SND_EVENT_DOC) @@ -360,7 +395,7 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): self.subscriptions_treeview = self.builder.get_object('subscriptions_treeview') subscriptions_selection = self.subscriptions_treeview.get_selection() subscriptions_selection.connect( - 'changed', self.on_subscriptions_treeview_selection_changed + 'changed', self.on_subscriptions_treeview_selection_changed, ) self.subscriptions_treeview.set_tooltip_column(SUB_EVENT_DOC) self.subscriptions_model = gtk.ListStore(str, str, bool, bool, bool, bool) @@ -426,7 +461,7 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): SND_EVENT, event_name, SND_EVENT_DOC, event_doc, SND_NAME, basename(snd_path), - SND_PATH, snd_path + SND_PATH, snd_path, ) def populate_subscriptions(self, handled_events, email_subscriptions=None): @@ -443,7 +478,7 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): SUB_NOT_EMAIL, event_name in email_subscriptions, SUB_NOT_POPUP, event_name in subscriptions_dict['popup'], SUB_NOT_BLINK, event_name in subscriptions_dict['blink'], - SUB_NOT_SOUND, event_name in subscriptions_dict['sound'] + SUB_NOT_SOUND, event_name in subscriptions_dict['sound'], ) def on_apply_prefs(self): @@ -465,8 +500,10 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): old_sound_file = self.config['sound_path'] new_sound_file = self.builder.get_object('sound_path').get_filename() - log.debug('Old Default sound file: %s New one: %s', - old_sound_file, new_sound_file) + log.debug( + 'Old Default sound file: %s New one: %s', + old_sound_file, new_sound_file, + ) custom_sounds = {} for event_name, event_doc, filename, filepath in self.sounds_model: log.debug('Custom sound for event "%s": %s', event_name, filename) @@ -482,9 +519,9 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): 'subscriptions': { 'popup': current_popup_subscriptions, 'blink': current_blink_subscriptions, - 'sound': current_sound_subscriptions + 'sound': current_sound_subscriptions, }, - 'custom_sounds': custom_sounds + 'custom_sounds': custom_sounds, }) self.config.save() @@ -496,9 +533,11 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): 'smtp_pass': self.builder.get_object('smtp_pass').get_text(), 'smtp_from': self.builder.get_object('smtp_from').get_text(), 'smtp_tls': self.builder.get_object('smtp_tls').get_active(), - 'smtp_recipients': [dest[0] for dest in self.recipients_model if - dest[0] != 'USER@HOST'], - 'subscriptions': {'email': current_email_subscriptions} + 'smtp_recipients': [ + dest[0] for dest in self.recipients_model if + dest[0] != 'USER@HOST' + ], + 'subscriptions': {'email': current_email_subscriptions}, } client.notifications.set_config(core_config) @@ -517,20 +556,22 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): self.builder.get_object('smtp_tls').set_active(core_config['smtp_tls']) self.recipients_model.clear() for recipient in core_config['smtp_recipients']: - self.recipients_model.set(self.recipients_model.append(), - RECIPIENT_FIELD, recipient, - RECIPIENT_EDIT, False) + self.recipients_model.set( + self.recipients_model.append(), + RECIPIENT_FIELD, recipient, + RECIPIENT_EDIT, False, + ) self.builder.get_object('smtp_enabled').set_active( - core_config['smtp_enabled'] + core_config['smtp_enabled'], ) self.builder.get_object('sound_enabled').set_active( - self.config['sound_enabled'] + self.config['sound_enabled'], ) self.builder.get_object('popup_enabled').set_active( - self.config['popup_enabled'] + self.config['popup_enabled'], ) self.builder.get_object('blink_enabled').set_active( - self.config['blink_enabled'] + self.config['blink_enabled'], ) if self.config['sound_path']: sound_path = self.config['sound_path'] @@ -543,19 +584,21 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): client.notifications.get_handled_events().addCallback( self.popuplate_what_needs_handled_events, - core_config['subscriptions']['email'] + core_config['subscriptions']['email'], ) def on_sound_path_update_preview(self, filechooser): client.notifications.get_handled_events().addCallback( - self.populate_sounds + self.populate_sounds, ) def on_add_button_clicked(self, widget, treeview): model = treeview.get_model() - model.set(model.append(), - RECIPIENT_FIELD, 'USER@HOST', - RECIPIENT_EDIT, True) + model.set( + model.append(), + RECIPIENT_FIELD, 'USER@HOST', + RECIPIENT_EDIT, True, + ) def on_delete_button_clicked(self, widget, treeview): selection = treeview.get_selection() @@ -570,20 +613,28 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): def on_recipients_treeview_selection_changed(self, selection): model, selected_connection_iter = selection.get_selected() if selected_connection_iter: - self.builder.get_object('delete_button').set_property('sensitive', - True) + self.builder.get_object('delete_button').set_property( + 'sensitive', + True, + ) else: - self.builder.get_object('delete_button').set_property('sensitive', - False) + self.builder.get_object('delete_button').set_property( + 'sensitive', + False, + ) def on_subscriptions_treeview_selection_changed(self, selection): model, selected_connection_iter = selection.get_selected() if selected_connection_iter: - self.builder.get_object('delete_button').set_property('sensitive', - True) + self.builder.get_object('delete_button').set_property( + 'sensitive', + True, + ) else: - self.builder.get_object('delete_button').set_property('sensitive', - False) + self.builder.get_object('delete_button').set_property( + 'sensitive', + False, + ) def on_sounds_treeview_selection_changed(self, selection): model, selected_iter = selection.get_selected() @@ -605,9 +656,11 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): model, selected_iter = selection.get_selected() if selected_iter: log.debug('on_sounds_revert_button_clicked: got iter') - model.set(selected_iter, - SND_PATH, self.config['sound_path'], - SND_NAME, basename(self.config['sound_path'])) + model.set( + selected_iter, + SND_PATH, self.config['sound_path'], + SND_NAME, basename(self.config['sound_path']), + ) def on_sounds_edit_button_clicked(self, widget): log.debug('on_sounds_edit_button_clicked') @@ -617,10 +670,12 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): path = model.get(selected_iter, SND_PATH)[0] dialog = gtk.FileChooserDialog( title=_('Choose Sound File'), - buttons=(gtk.STOCK_CANCEL, - gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, - gtk.RESPONSE_OK) + buttons=( + gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, + gtk.RESPONSE_OK, + ), ) dialog.set_filename(path) @@ -629,34 +684,48 @@ class GtkUI(GtkPluginBase, GtkUiNotifications): new_filename = dialog.get_filename() dialog.destroy() log.debug(new_filename) - model.set(selected_iter, - SND_PATH, new_filename, - SND_NAME, basename(new_filename)) + model.set( + selected_iter, + SND_PATH, new_filename, + SND_NAME, basename(new_filename), + ) d = defer.maybeDeferred(dialog.run) d.addCallback(update_model) log.debug('dialog should have been shown') def on_enabled_toggled(self, widget): - for widget_name in ('smtp_host', 'smtp_port', 'smtp_user', 'smtp_pass', - 'smtp_pass', 'smtp_tls', 'smtp_from', - 'smtp_recipients'): - self.builder.get_object(widget_name).set_property('sensitive', - widget.get_active()) + for widget_name in ( + 'smtp_host', 'smtp_port', 'smtp_user', 'smtp_pass', + 'smtp_pass', 'smtp_tls', 'smtp_from', + 'smtp_recipients', + ): + self.builder.get_object(widget_name).set_property( + 'sensitive', + widget.get_active(), + ) def on_sound_enabled_toggled(self, widget): if widget.get_active(): self.builder.get_object('sound_path').set_property('sensitive', True) - self.builder.get_object('sounds_page').set_property('sensitive', - True) - self.builder.get_object('sounds_page_label').set_property('sensitive', - True) + self.builder.get_object('sounds_page').set_property( + 'sensitive', + True, + ) + self.builder.get_object('sounds_page_label').set_property( + 'sensitive', + True, + ) else: self.builder.get_object('sound_path').set_property('sensitive', False) - self.builder.get_object('sounds_page').set_property('sensitive', - False) - self.builder.get_object('sounds_page_label').set_property('sensitive', - False) + self.builder.get_object('sounds_page').set_property( + 'sensitive', + False, + ) + self.builder.get_object('sounds_page_label').set_property( + 'sensitive', + False, + ) # for widget_name in ('sounds_path', 'sounds_page', 'sounds_page_label'): # self.builder.get_object(widget_name).set_property('sensitive', diff --git a/deluge/plugins/Notifications/deluge/plugins/notifications/test.py b/deluge/plugins/Notifications/deluge/plugins/notifications/test.py index 9d2ea83c6..642442c5e 100644 --- a/deluge/plugins/Notifications/deluge/plugins/notifications/test.py +++ b/deluge/plugins/Notifications/deluge/plugins/notifications/test.py @@ -34,7 +34,7 @@ class TestEmailNotifications(component.Component): self.n = 1 self.events = [ FooEvent(), - CustomEvent() + CustomEvent(), ] self.events_classes = [] @@ -45,21 +45,21 @@ class TestEmailNotifications(component.Component): # component.get('CorePlugin.Notifications').register_custom_email_notification( component.get('Notifications').register_custom_email_notification( event.__class__.__name__, - self.custom_email_message_provider + self.custom_email_message_provider, ) elif self.__imp == 'gtk': notifications_component = component.get('Notifications') notifications_component.register_custom_popup_notification( event.__class__.__name__, - self.custom_popup_message_provider + self.custom_popup_message_provider, ) notifications_component.register_custom_blink_notification( event.__class__.__name__, - self.custom_blink_message_provider + self.custom_blink_message_provider, ) notifications_component.register_custom_sound_notification( event.__class__.__name__, - self.custom_sound_message_provider + self.custom_sound_message_provider, ) self.lc.start(60, False) diff --git a/deluge/plugins/Notifications/setup.py b/deluge/plugins/Notifications/setup.py index 9c94dd34b..84893f53c 100755 --- a/deluge/plugins/Notifications/setup.py +++ b/deluge/plugins/Notifications/setup.py @@ -52,5 +52,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/core.py b/deluge/plugins/Scheduler/deluge/plugins/scheduler/core.py index 37830de6e..c1e9da999 100644 --- a/deluge/plugins/Scheduler/deluge/plugins/scheduler/core.py +++ b/deluge/plugins/Scheduler/deluge/plugins/scheduler/core.py @@ -32,13 +32,13 @@ DEFAULT_PREFS = { 'low_active': -1, 'low_active_down': -1, 'low_active_up': -1, - 'button_state': [[0] * 7 for dummy in range(24)] + 'button_state': [[0] * 7 for dummy in range(24)], } STATES = { 0: 'Green', 1: 'Yellow', - 2: 'Red' + 2: 'Red', } CONTROLLED_SETTINGS = [ @@ -46,7 +46,7 @@ CONTROLLED_SETTINGS = [ 'max_upload_speed', 'max_active_limit', 'max_active_downloading', - 'max_active_seeding' + 'max_active_seeding', ] @@ -127,7 +127,7 @@ class Core(CorePluginBase): 'active_downloads': self.config['low_active_down'], 'active_seeds': self.config['low_active_up'], 'download_rate_limit': int(self.config['low_down'] * 1024), - 'upload_rate_limit': int(self.config['low_up'] * 1024) + 'upload_rate_limit': int(self.config['low_up'] * 1024), } component.get('Core').apply_session_settings(settings) # Resume the session if necessary diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py b/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py index 217525d34..660101f7f 100644 --- a/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py +++ b/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py @@ -31,8 +31,10 @@ DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] class SchedulerSelectWidget(gtk.DrawingArea): def __init__(self, hover): super(SchedulerSelectWidget, self).__init__() - self.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | - gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.LEAVE_NOTIFY_MASK) + self.set_events( + gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | + gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.LEAVE_NOTIFY_MASK, + ) self.connect('expose_event', self.expose) self.connect('button_press_event', self.mouse_down) @@ -40,9 +42,11 @@ class SchedulerSelectWidget(gtk.DrawingArea): self.connect('motion_notify_event', self.mouse_hover) self.connect('leave_notify_event', self.mouse_leave) - self.colors = [[115 / 255, 210 / 255, 22 / 255], - [237 / 255, 212 / 255, 0 / 255], - [204 / 255, 0 / 255, 0 / 255]] + self.colors = [ + [115 / 255, 210 / 255, 22 / 255], + [237 / 255, 212 / 255, 0 / 255], + [204 / 255, 0 / 255, 0 / 255], + ] self.button_state = [[0] * 7 for dummy in range(24)] self.start_point = [0, 0] @@ -69,11 +73,15 @@ class SchedulerSelectWidget(gtk.DrawingArea): for y in range(7): for x in range(24): - context.set_source_rgba(self.colors[self.button_state[x][y]][0], - self.colors[self.button_state[x][y]][1], - self.colors[self.button_state[x][y]][2], 0.7) - context.rectangle(width * (6 * x / 145 + 1 / 145), height * (6 * y / 43 + 1 / 43), - 5 * width / 145, 5 * height / 43) + context.set_source_rgba( + self.colors[self.button_state[x][y]][0], + self.colors[self.button_state[x][y]][1], + self.colors[self.button_state[x][y]][2], 0.7, + ) + context.rectangle( + width * (6 * x / 145 + 1 / 145), height * (6 * y / 43 + 1 / 43), + 5 * width / 145, 5 * height / 43, + ) context.fill_preserve() context.set_source_rgba(0.5, 0.5, 0.5, 0.5) context.stroke() @@ -123,9 +131,11 @@ class SchedulerSelectWidget(gtk.DrawingArea): if self.get_point(event) != self.hover_point: self.hover_point = self.get_point(event) - self.hover_label.set_text(self.hover_days[self.hover_point[1]] + - ' ' + str(self.hover_point[0]) + - ':00 - ' + str(self.hover_point[0]) + ':59') + self.hover_label.set_text( + self.hover_days[self.hover_point[1]] + + ' ' + str(self.hover_point[0]) + + ':00 - ' + str(self.hover_point[0]) + ':59', + ) if self.mouse_press: points = [[self.hover_point[0], self.start_point[0]], [self.hover_point[1], self.start_point[1]]] @@ -153,7 +163,8 @@ class GtkUI(GtkPluginBase): image=get_resource('green.png'), text='', callback=self.on_status_item_clicked, - tooltip='Scheduler') + tooltip='Scheduler', + ) def on_state_deferred(state): self.state = state diff --git a/deluge/plugins/Scheduler/setup.py b/deluge/plugins/Scheduler/setup.py index c5ab60a8a..ea9c6bbcf 100644 --- a/deluge/plugins/Scheduler/setup.py +++ b/deluge/plugins/Scheduler/setup.py @@ -44,5 +44,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Stats/deluge/plugins/stats/core.py b/deluge/plugins/Stats/deluge/plugins/stats/core.py index af2ccd26b..a269516a3 100644 --- a/deluge/plugins/Stats/deluge/plugins/stats/core.py +++ b/deluge/plugins/Stats/deluge/plugins/stats/core.py @@ -32,7 +32,7 @@ DEFAULT_TOTALS = { 'total_download': 0, 'total_payload_upload': 0, 'total_payload_download': 0, - 'stats': {} + 'stats': {}, } log = logging.getLogger(__name__) @@ -85,7 +85,7 @@ class Core(CorePluginBase): 'dht_cache_nodes', 'dht_torrents', 'num_peers', - 'num_connections' + 'num_connections', ) self.update_stats() @@ -121,9 +121,11 @@ class Core(CorePluginBase): pass stats['num_connections'] = stats['num_peers'] + stats['peer.num_peers_half_open'] stats['dht_cache_nodes'] = stats['dht.dht_node_cache'] - stats.update(self.core.get_config_values(['max_download', - 'max_upload', - 'max_num_connections'])) + stats.update(self.core.get_config_values([ + 'max_download', + 'max_upload', + 'max_num_connections', + ])) # status = self.core.session.status() # for stat in dir(status): # if not stat.startswith('_') and stat not in stats: @@ -193,7 +195,8 @@ class Core(CorePluginBase): @export def get_session_totals(self): return self.core.get_session_status( - ['total_upload', 'total_download', 'total_payload_upload', 'total_payload_download']) + ['total_upload', 'total_download', 'total_payload_upload', 'total_payload_download'], + ) @export def set_config(self, config): diff --git a/deluge/plugins/Stats/deluge/plugins/stats/graph.py b/deluge/plugins/Stats/deluge/plugins/stats/graph.py index d58af1fab..e87148e70 100644 --- a/deluge/plugins/Stats/deluge/plugins/stats/graph.py +++ b/deluge/plugins/Stats/deluge/plugins/stats/graph.py @@ -69,7 +69,7 @@ class Graph(object): self.mean_selected = True self.legend_selected = True self.max_selected = True - self.black = (0, 0, 0,) + self.black = (0, 0, 0) self.interval = 2 # 2 secs self.text_bg = (255, 255, 255, 128) # prototyping self.set_left_axis() @@ -83,7 +83,7 @@ class Graph(object): 'label': label, 'line': line, 'fill': fill, - 'color': color + 'color': color, } def set_stats(self, stats): @@ -273,7 +273,8 @@ class Graph(object): self.ctx.line_to( int(right - (len(values) - 1) * step), - bottom) + bottom, + ) self.ctx.close_path() def draw_value_poly(self, values, color, max_value, bounds, fill=False): diff --git a/deluge/plugins/Stats/deluge/plugins/stats/gtkui.py b/deluge/plugins/Stats/deluge/plugins/stats/gtkui.py index 670e3cd82..f1d664f31 100644 --- a/deluge/plugins/Stats/deluge/plugins/stats/gtkui.py +++ b/deluge/plugins/Stats/deluge/plugins/stats/gtkui.py @@ -45,7 +45,9 @@ DEFAULT_CONF = { }, 'seeds_graph': { 'num_peers': str(gtk.gdk.Color('blue')), - }}} + }, + }, +} def neat_time(column, cell, model, data): @@ -126,9 +128,11 @@ class GraphsTab(Tab): # set a clip region context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) context.clip() - self.graph.draw_to_context(context, - self.graph_widget.allocation.width, - self.graph_widget.allocation.height) + self.graph.draw_to_context( + context, + self.graph_widget.allocation.width, + self.graph_widget.allocation.height, + ) # Do not propagate the event return False @@ -153,12 +157,18 @@ class GraphsTab(Tab): self.graph_widget = self.bandwidth_graph self.graph = Graph() colors = self.colors['bandwidth_graph'] - self.graph.add_stat('download_rate', label='Download Rate', - color=gtk_to_graph_color(colors['download_rate'])) - self.graph.add_stat('upload_rate', label='Upload Rate', - color=gtk_to_graph_color(colors['upload_rate'])) - self.graph.set_left_axis(formatter=fspeed_shortform, min=10240, - formatter_scale=size_formatter_scale) + self.graph.add_stat( + 'download_rate', label='Download Rate', + color=gtk_to_graph_color(colors['download_rate']), + ) + self.graph.add_stat( + 'upload_rate', label='Upload Rate', + color=gtk_to_graph_color(colors['upload_rate']), + ) + self.graph.set_left_axis( + formatter=fspeed_shortform, min=10240, + formatter_scale=size_formatter_scale, + ) def select_connections_graph(self): log.debug('Selecting connections graph') @@ -183,9 +193,11 @@ class GraphsTab(Tab): def set_colors(self, colors): self.colors = colors # Fake switch page to update the graph colors (HACKY) - self._on_notebook_switch_page(self.notebook, - None, # This is unused - self.notebook.get_current_page()) + self._on_notebook_switch_page( + self.notebook, + None, # This is unused + self.notebook.get_current_page(), + ) def _on_intervals_changed(self, intervals): liststore = gtk.ListStore(int) diff --git a/deluge/plugins/Stats/deluge/plugins/stats/tests/test_stats.py b/deluge/plugins/Stats/deluge/plugins/stats/tests/test_stats.py index 34c54bf36..ca5f2bdf7 100644 --- a/deluge/plugins/Stats/deluge/plugins/stats/tests/test_stats.py +++ b/deluge/plugins/Stats/deluge/plugins/stats/tests/test_stats.py @@ -46,10 +46,10 @@ class StatsTestCase(BaseTestCase): raise unittest.SkipTest('WebUi plugin not available for testing') totals = yield client.stats.get_totals() - self.assertEquals(totals['total_upload'], 0) - self.assertEquals(totals['total_payload_upload'], 0) - self.assertEquals(totals['total_payload_download'], 0) - self.assertEquals(totals['total_download'], 0) + self.assertEqual(totals['total_upload'], 0) + self.assertEqual(totals['total_payload_upload'], 0) + self.assertEqual(totals['total_payload_download'], 0) + self.assertEqual(totals['total_download'], 0) # print_totals(totals) @defer.inlineCallbacks @@ -59,10 +59,10 @@ class StatsTestCase(BaseTestCase): raise unittest.SkipTest('WebUi plugin not available for testing') totals = yield client.stats.get_session_totals() - self.assertEquals(totals['total_upload'], 0) - self.assertEquals(totals['total_payload_upload'], 0) - self.assertEquals(totals['total_payload_download'], 0) - self.assertEquals(totals['total_download'], 0) + self.assertEqual(totals['total_upload'], 0) + self.assertEqual(totals['total_payload_upload'], 0) + self.assertEqual(totals['total_payload_download'], 0) + self.assertEqual(totals['total_download'], 0) # print_totals(totals) @pytest.mark.gtkui diff --git a/deluge/plugins/Stats/setup.py b/deluge/plugins/Stats/setup.py index 64b12373b..593f68271 100644 --- a/deluge/plugins/Stats/setup.py +++ b/deluge/plugins/Stats/setup.py @@ -48,5 +48,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/Toggle/deluge/plugins/toggle/gtkui.py b/deluge/plugins/Toggle/deluge/plugins/toggle/gtkui.py index dc257d8c7..7fcce70f0 100644 --- a/deluge/plugins/Toggle/deluge/plugins/toggle/gtkui.py +++ b/deluge/plugins/Toggle/deluge/plugins/toggle/gtkui.py @@ -28,8 +28,10 @@ class GtkUI(GtkPluginBase): self.core = client.toggle self.plugin = component.get('PluginManager') self.separator = self.plugin.add_toolbar_separator() - self.button = self.plugin.add_toolbar_button(self._on_button_clicked, label='Pause Session', - stock='gtk-media-pause', tooltip='Pause the session') + self.button = self.plugin.add_toolbar_button( + self._on_button_clicked, label='Pause Session', + stock='gtk-media-pause', tooltip='Pause the session', + ) def disable(self): component.get('PluginManager').remove_toolbar_button(self.button) diff --git a/deluge/plugins/Toggle/setup.py b/deluge/plugins/Toggle/setup.py index 89fe9e35f..d3a754bdc 100644 --- a/deluge/plugins/Toggle/setup.py +++ b/deluge/plugins/Toggle/setup.py @@ -45,5 +45,5 @@ setup( %s = deluge.plugins.%s:GtkUIPlugin [deluge.plugin.web] %s = deluge.plugins.%s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 3) + """ % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/deluge/plugins/WebUi/deluge/plugins/webui/core.py b/deluge/plugins/WebUi/deluge/plugins/webui/core.py index 2e94b7556..55d269cd6 100644 --- a/deluge/plugins/WebUi/deluge/plugins/webui/core.py +++ b/deluge/plugins/WebUi/deluge/plugins/webui/core.py @@ -33,7 +33,7 @@ log = logging.getLogger(__name__) DEFAULT_PREFS = { 'enabled': False, 'ssl': False, - 'port': 8112 + 'port': 8112, } diff --git a/deluge/plugins/WebUi/deluge/plugins/webui/gtkui.py b/deluge/plugins/WebUi/deluge/plugins/webui/gtkui.py index 91d85dfd8..992c9b038 100644 --- a/deluge/plugins/WebUi/deluge/plugins/webui/gtkui.py +++ b/deluge/plugins/WebUi/deluge/plugins/webui/gtkui.py @@ -49,7 +49,7 @@ class GtkUI(GtkPluginBase): config = { 'enabled': self.builder.get_object('enabled_checkbutton').get_active(), 'ssl': self.builder.get_object('ssl_checkbutton').get_active(), - 'port': self.builder.get_object('port_spinbutton').get_value_as_int() + 'port': self.builder.get_object('port_spinbutton').get_value_as_int(), } client.webui.set_config(config) @@ -75,8 +75,10 @@ class GtkUI(GtkPluginBase): icon.set_padding(5, 5) hbox.pack_start(icon, False, False) - label = gtk.Label(_('The Deluge web interface is not installed, ' - 'please install the\ninterface and try again')) + label = gtk.Label(_( + 'The Deluge web interface is not installed, ' + 'please install the\ninterface and try again', + )) label.set_alignment(0, 0.5) label.set_padding(5, 5) hbox.pack_start(label) diff --git a/deluge/plugins/WebUi/setup.py b/deluge/plugins/WebUi/setup.py index 3a7b130f0..7bc61259e 100644 --- a/deluge/plugins/WebUi/setup.py +++ b/deluge/plugins/WebUi/setup.py @@ -42,5 +42,5 @@ setup( %s = deluge.plugins.%s:CorePlugin [deluge.plugin.gtkui] %s = deluge.plugins.%s:GtkUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower()) * 2) + """ % ((__plugin_name__, __plugin_name__.lower()) * 2), ) diff --git a/deluge/rencode.py b/deluge/rencode.py index 4d281942f..7f5378dee 100644 --- a/deluge/rencode.py +++ b/deluge/rencode.py @@ -73,8 +73,8 @@ __all__ = ['dumps', 'loads'] py3 = sys.version_info[0] >= 3 if py3: - long = int # pylint: disable=redefined-builtin - unicode = str # pylint: disable=redefined-builtin + long = int # noqa: A001, pylint: disable=redefined-builtin + unicode = str # noqa: A001, pylint: disable=redefined-builtin def int2byte(c): return bytes([c]) @@ -434,9 +434,13 @@ def test(): f1 = struct.unpack('!f', struct.pack('!f', 25.5))[0] f2 = struct.unpack('!f', struct.pack('!f', 29.3))[0] f3 = struct.unpack('!f', struct.pack('!f', -0.6))[0] - ld = (({b'a': 15, b'bb': f1, b'ccc': f2, b'': (f3, (), False, True, b'')}, (b'a', 10**20), - tuple(range(-100000, 100000)), b'b' * 31, b'b' * 62, b'b' * 64, 2**30, 2**33, 2**62, - 2**64, 2**30, 2**33, 2**62, 2**64, False, False, True, -1, 2, 0),) + ld = ( + ( + {b'a': 15, b'bb': f1, b'ccc': f2, b'': (f3, (), False, True, b'')}, (b'a', 10**20), + tuple(range(-100000, 100000)), b'b' * 31, b'b' * 62, b'b' * 64, 2**30, 2**33, 2**62, + 2**64, 2**30, 2**33, 2**62, 2**64, False, False, True, -1, 2, 0, + ), + ) assert loads(dumps(ld)) == ld d = dict(zip(range(-100000, 100000), range(-100000, 100000))) d.update({b'a': 20, 20: 40, 40: 41, f1: f2, f2: f3, f3: False, False: True, True: False}) @@ -444,15 +448,15 @@ def test(): assert loads(dumps(ld)) == ld ld = (b'', b'a' * 10, b'a' * 100, b'a' * 1000, b'a' * 10000, b'a' * 100000, b'a' * 1000000, b'a' * 10000000) assert loads(dumps(ld)) == ld - ld = tuple([dict(zip(range(n), range(n))) for n in range(100)]) + (b'b',) + ld = tuple(dict(zip(range(n), range(n))) for n in range(100)) + (b'b',) assert loads(dumps(ld)) == ld - ld = tuple([dict(zip(range(n), range(-n, 0))) for n in range(100)]) + (b'b',) + ld = tuple(dict(zip(range(n), range(-n, 0))) for n in range(100)) + (b'b',) assert loads(dumps(ld)) == ld - ld = tuple([tuple(range(n)) for n in range(100)]) + (b'b',) + ld = tuple(tuple(range(n)) for n in range(100)) + (b'b',) assert loads(dumps(ld)) == ld - ld = tuple([b'a' * n for n in range(1000)]) + (b'b',) + ld = tuple(b'a' * n for n in range(1000)) + (b'b',) assert loads(dumps(ld)) == ld - ld = tuple([b'a' * n for n in range(1000)]) + (None, True, None) + ld = tuple(b'a' * n for n in range(1000)) + (None, True, None) assert loads(dumps(ld)) == ld assert loads(dumps(None)) is None assert loads(dumps({None: None})) == {None: None} diff --git a/deluge/scripts/create_plugin.py b/deluge/scripts/create_plugin.py index a1dd356d2..93b6f8d95 100644 --- a/deluge/scripts/create_plugin.py +++ b/deluge/scripts/create_plugin.py @@ -20,10 +20,14 @@ parser = ArgumentParser() parser.add_argument('-n', '--name', metavar='<plugin name>', required=True, help='Plugin name') parser.add_argument('-m', '--module-name', metavar='<module name>', help='Module name') parser.add_argument('-p', '--basepath', metavar='<path>', required=True, help='Base path') -parser.add_argument('-a', '--author-name', metavar='<author name>', required=True, - help='Author name,for the GPL header') -parser.add_argument('-e', '--author-email', metavar='<author email>', required=True, - help='Author email,for the GPL header') +parser.add_argument( + '-a', '--author-name', metavar='<author name>', required=True, + help='Author name,for the GPL header', +) +parser.add_argument( + '-e', '--author-email', metavar='<author email>', required=True, + help='Author email,for the GPL header', +) parser.add_argument('-u', '--url', metavar='<URL>', help='Homepage URL') parser.add_argument('-c', '--config', metavar='<Config dir>', dest='configdir', help='Location of deluge configuration') @@ -71,7 +75,7 @@ def create_plugin(): 'python_path': python_path, 'url': options.url, 'configdir': options.configdir, - 'current_year': datetime.utcnow().year + 'current_year': datetime.utcnow().year, } filename = os.path.join(path, filename) diff --git a/deluge/scripts/deluge_remote.py b/deluge/scripts/deluge_remote.py index d68715d57..c1b5de7b4 100644 --- a/deluge/scripts/deluge_remote.py +++ b/deluge/scripts/deluge_remote.py @@ -33,20 +33,34 @@ def is_float_digit(string): # set up command-line options parser = OptionParser() parser.add_option('--port', help='port for deluge backend host (default: 58846)', default='58846', dest='port') -parser.add_option('--host', help='hostname of deluge backend to connect to (default: localhost)', - default='localhost', dest='host') -parser.add_option('--max_active_limit', dest='max_active_limit', - help='sets the absolute maximum number of active torrents on the deluge backend') -parser.add_option('--max_active_downloading', dest='max_active_downloading', - help='sets the maximum number of active downloading torrents on the deluge backend') -parser.add_option('--max_active_seeding', dest='max_active_seeding', - help='sets the maximum number of active seeding torrents on the deluge backend') -parser.add_option('--max_download_speed', help='sets the maximum global download speed on the deluge backend', - dest='max_download_speed') -parser.add_option('--max_upload_speed', help='sets the maximum global upload speed on the deluge backend', - dest='max_upload_speed') -parser.add_option('--debug', help='outputs debug information to the console', default=False, action='store_true', - dest='debug') +parser.add_option( + '--host', help='hostname of deluge backend to connect to (default: localhost)', + default='localhost', dest='host', +) +parser.add_option( + '--max_active_limit', dest='max_active_limit', + help='sets the absolute maximum number of active torrents on the deluge backend', +) +parser.add_option( + '--max_active_downloading', dest='max_active_downloading', + help='sets the maximum number of active downloading torrents on the deluge backend', +) +parser.add_option( + '--max_active_seeding', dest='max_active_seeding', + help='sets the maximum number of active seeding torrents on the deluge backend', +) +parser.add_option( + '--max_download_speed', help='sets the maximum global download speed on the deluge backend', + dest='max_download_speed', +) +parser.add_option( + '--max_upload_speed', help='sets the maximum global upload speed on the deluge backend', + dest='max_upload_speed', +) +parser.add_option( + '--debug', help='outputs debug information to the console', default=False, action='store_true', + dest='debug', +) # grab command-line options (options, args) = parser.parse_args() @@ -80,7 +94,8 @@ if options.max_active_seeding: if options.max_download_speed: if is_float_digit(options.max_download_speed) and ( - float(options.max_download_speed) >= 0.0 or float(options.max_download_speed) == -1.0): + float(options.max_download_speed) >= 0.0 or float(options.max_download_speed) == -1.0 + ): settings['max_download_speed'] = float(options.max_download_speed) else: sys.stderr.write('ERROR: Invalid max_download_speed parameter!\n') @@ -88,7 +103,8 @@ if options.max_download_speed: if options.max_upload_speed: if is_float_digit(options.max_upload_speed) and ( - float(options.max_upload_speed) >= 0.0 or float(options.max_upload_speed) == -1.0): + float(options.max_upload_speed) >= 0.0 or float(options.max_upload_speed) == -1.0 + ): settings['max_upload_speed'] = float(options.max_upload_speed) else: sys.stderr.write('ERROR: Invalid max_upload_speed parameter!\n') diff --git a/deluge/tests/basetest.py b/deluge/tests/basetest.py index 7070e6d0a..19796dca2 100644 --- a/deluge/tests/basetest.py +++ b/deluge/tests/basetest.py @@ -25,9 +25,11 @@ class BaseTestCase(unittest.TestCase): def setUp(self): # NOQA: N803 if len(component._ComponentRegistry.components) != 0: - warnings.warn('The component._ComponentRegistry.components is not empty on test setup.\n' - 'This is probably caused by another test that did not clean up after finishing!: %s' % - component._ComponentRegistry.components) + warnings.warn( + 'The component._ComponentRegistry.components is not empty on test setup.\n' + 'This is probably caused by another test that did not clean up after finishing!: %s' % + component._ComponentRegistry.components, + ) d = maybeDeferred(self.set_up) def on_setup_error(error): diff --git a/deluge/tests/common.py b/deluge/tests/common.py index 3be51f4a4..b7b38f680 100644 --- a/deluge/tests/common.py +++ b/deluge/tests/common.py @@ -209,8 +209,10 @@ class ProcessOutputHandler(protocol.ProcessProtocol): print('\n%s' % prefixed) -def start_core(listen_port=58846, logfile=None, timeout=10, timeout_msg=None, - custom_script='', print_stdout=True, print_stderr=True, extra_callbacks=None): +def start_core( + listen_port=58846, logfile=None, timeout=10, timeout_msg=None, + custom_script='', print_stdout=True, print_stderr=True, extra_callbacks=None, +): """Start the deluge core as a daemon. Args: @@ -242,7 +244,7 @@ try: daemon = deluge.core.daemon_entry.start_daemon(skip_start=True) %s daemon.start() -except: +except Exception: import traceback sys.stderr.write('Exception raised:\\n %%s' %% traceback.format_exc()) """ % (config_directory, listen_port, custom_script) @@ -254,11 +256,17 @@ except: # Specify the triggers for daemon log output default_core_cb['triggers'] = [ {'expr': 'Finished loading ', 'value': lambda reader, data, data_all: reader}, - {'expr': 'Could not listen on localhost:%d' % (listen_port), 'type': 'errback', # Error from libtorrent - 'value': lambda reader, data, data_all: CannotListenError('localhost', listen_port, - 'Could not start deluge test client!\n%s' % data)}, - {'expr': 'Traceback', 'type': 'errback', - 'value': lambda reader, data, data_all: DelugeError('Traceback found when starting daemon:\n%s' % data)} + { + 'expr': 'Could not listen on localhost:%d' % (listen_port), 'type': 'errback', # Error from libtorrent + 'value': lambda reader, data, data_all: CannotListenError( + 'localhost', listen_port, + 'Could not start deluge test client!\n%s' % data, + ), + }, + { + 'expr': 'Traceback', 'type': 'errback', + 'value': lambda reader, data, data_all: DelugeError('Traceback found when starting daemon:\n%s' % data), + }, ] callbacks.append(default_core_cb) diff --git a/deluge/tests/daemon_base.py b/deluge/tests/daemon_base.py index 7fcaa8910..ed7deea0e 100644 --- a/deluge/tests/daemon_base.py +++ b/deluge/tests/daemon_base.py @@ -36,8 +36,10 @@ class DaemonBase(object): return d @defer.inlineCallbacks - def start_core(self, arg, custom_script='', logfile='', print_stdout=True, print_stderr=True, timeout=5, - port_range=10, extra_callbacks=None): + def start_core( + self, arg, custom_script='', logfile='', print_stdout=True, print_stderr=True, timeout=5, + port_range=10, extra_callbacks=None, + ): if logfile == '': logfile = 'daemon_%s.log' % self.id() @@ -52,12 +54,14 @@ class DaemonBase(object): for dummy in range(port_range): try: - d, self.core = common.start_core(listen_port=self.listen_port, logfile=logfile, - timeout=timeout, timeout_msg='Timeout!', - custom_script=custom_script, - print_stdout=print_stdout, - print_stderr=print_stderr, - extra_callbacks=extra_callbacks) + d, self.core = common.start_core( + listen_port=self.listen_port, logfile=logfile, + timeout=timeout, timeout_msg='Timeout!', + custom_script=custom_script, + print_stdout=print_stdout, + print_stderr=print_stderr, + extra_callbacks=extra_callbacks, + ) yield d except CannotListenError as ex: exception_error = ex diff --git a/deluge/tests/test_authmanager.py b/deluge/tests/test_authmanager.py index e62ce9364..d714a5a82 100644 --- a/deluge/tests/test_authmanager.py +++ b/deluge/tests/test_authmanager.py @@ -26,5 +26,5 @@ class AuthManagerTestCase(BaseTestCase): def test_authorize(self): self.assertEqual( self.auth.authorize(*get_localhost_auth()), - AUTH_LEVEL_ADMIN + AUTH_LEVEL_ADMIN, ) diff --git a/deluge/tests/test_client.py b/deluge/tests/test_client.py index a5a85ff7c..9f622ec92 100644 --- a/deluge/tests/test_client.py +++ b/deluge/tests/test_client.py @@ -36,8 +36,10 @@ class NoVersionSendingDaemonSSLProxy(DaemonSSLProxy): class NoVersionSendingClient(Client): - def connect(self, host='127.0.0.1', port=58846, username='', password='', - skip_authentication=False): + def connect( + self, host='127.0.0.1', port=58846, username='', password='', + skip_authentication=False, + ): self._daemon_proxy = NoVersionSendingDaemonSSLProxy() self._daemon_proxy.set_disconnect_callback(self.__on_disconnect) @@ -116,7 +118,7 @@ class ClientTestCase(BaseTestCase, DaemonBase): def on_failure(failure): self.assertEqual( failure.trap(error.BadLoginError), - error.BadLoginError + error.BadLoginError, ) self.assertEqual(failure.value.message, 'Password does not match') self.addCleanup(client.disconnect) @@ -131,7 +133,7 @@ class ClientTestCase(BaseTestCase, DaemonBase): def on_failure(failure): self.assertEqual( failure.trap(error.BadLoginError), - error.BadLoginError + error.BadLoginError, ) self.assertEqual(failure.value.message, 'Username does not exist') self.addCleanup(client.disconnect) @@ -146,7 +148,7 @@ class ClientTestCase(BaseTestCase, DaemonBase): def on_failure(failure): self.assertEqual( failure.trap(error.AuthenticationRequired), - error.AuthenticationRequired + error.AuthenticationRequired, ) self.assertEqual(failure.value.username, username) self.addCleanup(client.disconnect) @@ -179,13 +181,13 @@ class ClientTestCase(BaseTestCase, DaemonBase): username, password = get_localhost_auth() no_version_sending_client = NoVersionSendingClient() d = no_version_sending_client.connect( - 'localhost', self.listen_port, username=username, password=password + 'localhost', self.listen_port, username=username, password=password, ) def on_failure(failure): self.assertEqual( failure.trap(error.IncompatibleClient), - error.IncompatibleClient + error.IncompatibleClient, ) self.addCleanup(no_version_sending_client.disconnect) diff --git a/deluge/tests/test_common.py b/deluge/tests/test_common.py index 846783166..9a537df79 100644 --- a/deluge/tests/test_common.py +++ b/deluge/tests/test_common.py @@ -116,17 +116,19 @@ class CommonTestCase(unittest.TestCase): def test_parse_human_size(self): from deluge.common import parse_human_size - sizes = [('1', 1), - ('10 bytes', 10), - ('2048 bytes', 2048), - ('1MiB', 2**(10 * 2)), - ('1 MiB', 2**(10 * 2)), - ('1 GiB', 2**(10 * 3)), - ('1 GiB', 2**(10 * 3)), - ('1M', 10**6), - ('1MB', 10**6), - ('1 GB', 10**9), - ('1 TB', 10**12)] + sizes = [ + ('1', 1), + ('10 bytes', 10), + ('2048 bytes', 2048), + ('1MiB', 2**(10 * 2)), + ('1 MiB', 2**(10 * 2)), + ('1 GiB', 2**(10 * 3)), + ('1 GiB', 2**(10 * 3)), + ('1M', 10**6), + ('1MB', 10**6), + ('1 GB', 10**9), + ('1 TB', 10**12), + ] for human_size, byte_size in sizes: parsed = parse_human_size(human_size) @@ -135,7 +137,8 @@ class CommonTestCase(unittest.TestCase): def test_archive_files(self): arc_filelist = [ get_test_data_file('test.torrent'), - get_test_data_file('deluge.png')] + get_test_data_file('deluge.png'), + ] arc_filepath = archive_files('test-arc', arc_filelist) with tarfile.open(arc_filepath, 'r') as tar: diff --git a/deluge/tests/test_component.py b/deluge/tests/test_component.py index de44fc10d..06639b0aa 100644 --- a/deluge/tests/test_component.py +++ b/deluge/tests/test_component.py @@ -137,7 +137,8 @@ class ComponentTestClass(BaseTestCase): self.assertRaises( component.ComponentAlreadyRegistered, ComponentTester, - 'test_register_exception_c1') + 'test_register_exception_c1', + ) def test_stop_component(self): def on_stop(result, c): @@ -230,11 +231,15 @@ class ComponentTestClass(BaseTestCase): result = yield component.start() self.assertEqual( [(result[0][0], result[0][1].value)], - [(defer.FAILURE, + [( + defer.FAILURE, component.ComponentException( 'Trying to start component "%s" but it is ' 'not in a stopped state. Current state: %s' % - ('test_pause_c1', 'Paused'), ''))]) + ('test_pause_c1', 'Paused'), '', + ), + )], + ) def test_shutdown(self): def on_shutdown(result, c1): diff --git a/deluge/tests/test_core.py b/deluge/tests/test_core.py index abf437a80..1d71c645a 100644 --- a/deluge/tests/test_core.py +++ b/deluge/tests/test_core.py @@ -75,8 +75,10 @@ class TopLevelResource(Resource): self.putChild('cookie', CookieResource()) self.putChild('partial', PartialDownload()) self.putChild('redirect', RedirectResource()) - self.putChild('ubuntu-9.04-desktop-i386.iso.torrent', - File(common.get_test_data_file('ubuntu-9.04-desktop-i386.iso.torrent'))) + self.putChild( + 'ubuntu-9.04-desktop-i386.iso.torrent', + File(common.get_test_data_file('ubuntu-9.04-desktop-i386.iso.torrent')), + ) class CoreTestCase(BaseTestCase): @@ -152,7 +154,7 @@ class CoreTestCase(BaseTestCase): from deluge.bencode import bdecode, bencode with open(filename, 'rb') as _file: info_hash = sha(bencode(bdecode(_file.read())[b'info'])).hexdigest() - self.assertEquals(torrent_id, info_hash) + self.assertEqual(torrent_id, info_hash) def test_add_torrent_file_invalid_filedump(self): options = {} diff --git a/deluge/tests/test_error.py b/deluge/tests/test_error.py index 238337f35..24512c3ce 100644 --- a/deluge/tests/test_error.py +++ b/deluge/tests/test_error.py @@ -31,8 +31,10 @@ class ErrorTestCase(unittest.TestCase): def test_incompatible_client(self): version = '1.3.6' e = deluge.error.IncompatibleClient(version) - self.assertEqual(str(e), 'Your deluge client is not compatible with the daemon. \ -Please upgrade your client to %s' % version) + self.assertEqual( + str(e), 'Your deluge client is not compatible with the daemon. \ +Please upgrade your client to %s' % version, + ) def test_not_authorized_error(self): current_level = 5 diff --git a/deluge/tests/test_files_tab.py b/deluge/tests/test_files_tab.py index 044aa8f1e..1942171cd 100644 --- a/deluge/tests/test_files_tab.py +++ b/deluge/tests/test_files_tab.py @@ -85,8 +85,10 @@ class FilesTabTestCase(BaseTestCase): return _verify_treestore(treestore.get_iter_root(), tree) def test_files_tab(self): - self.filestab.files_list[self.t_id] = ({'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, - {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}) + self.filestab.files_list[self.t_id] = ( + {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, + {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}, + ) self.filestab.update_files() self.filestab._on_torrentfilerenamed_event(self.t_id, self.index, '2/test_100.txt') @@ -96,8 +98,10 @@ class FilesTabTestCase(BaseTestCase): self.assertTrue(ret) def test_files_tab2(self): - self.filestab.files_list[self.t_id] = ({'index': 0, 'path': '1/1/test_10.txt', 'offset': 0, 'size': 13}, - {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}) + self.filestab.files_list[self.t_id] = ( + {'index': 0, 'path': '1/1/test_10.txt', 'offset': 0, 'size': 13}, + {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}, + ) self.filestab.update_files() self.filestab._on_torrentfilerenamed_event(self.t_id, self.index, '1/1/test_100.txt') @@ -107,8 +111,10 @@ class FilesTabTestCase(BaseTestCase): self.assertTrue(ret) def test_files_tab3(self): - self.filestab.files_list[self.t_id] = ({'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, - {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}) + self.filestab.files_list[self.t_id] = ( + {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, + {'index': 1, 'path': 'test_100.txt', 'offset': 13, 'size': 14}, + ) self.filestab.update_files() self.filestab._on_torrentfilerenamed_event(self.t_id, self.index, '1/test_100.txt') @@ -118,20 +124,30 @@ class FilesTabTestCase(BaseTestCase): self.assertTrue(ret) def test_files_tab4(self): - self.filestab.files_list[self.t_id] = ({'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, - {'index': 1, 'path': '1/test_100.txt', 'offset': 13, 'size': 14}) + self.filestab.files_list[self.t_id] = ( + {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, + {'index': 1, 'path': '1/test_100.txt', 'offset': 13, 'size': 14}, + ) self.filestab.update_files() self.filestab._on_torrentfilerenamed_event(self.t_id, self.index, '1/2/test_100.txt') - ret = self.verify_treestore(self.filestab.treestore, [['1/', [['2/', [['test_100.txt']]], - ['test_10.txt']]]]) + ret = self.verify_treestore( + self.filestab.treestore, [[ + '1/', [ + ['2/', [['test_100.txt']]], + ['test_10.txt'], + ], + ]], + ) if not ret: self.print_treestore('Treestore not expected:', self.filestab.treestore) self.assertTrue(ret) def test_files_tab5(self): - self.filestab.files_list[self.t_id] = ({'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, - {'index': 1, 'path': '2/test_100.txt', 'offset': 13, 'size': 14}) + self.filestab.files_list[self.t_id] = ( + {'index': 0, 'path': '1/test_10.txt', 'offset': 0, 'size': 13}, + {'index': 1, 'path': '2/test_100.txt', 'offset': 13, 'size': 14}, + ) self.filestab.update_files() self.filestab._on_torrentfilerenamed_event(self.t_id, self.index, '1/test_100.txt') diff --git a/deluge/tests/test_httpdownloader.py b/deluge/tests/test_httpdownloader.py index 6c410ecd2..f06ea5716 100644 --- a/deluge/tests/test_httpdownloader.py +++ b/deluge/tests/test_httpdownloader.py @@ -43,8 +43,10 @@ class RenameResource(Resource): def render(self, request): filename = request.args.get('filename', ['renamed_file'])[0] request.setHeader(b'Content-Type', b'text/plain') - request.setHeader(b'Content-Disposition', b'attachment; filename=' + - filename) + request.setHeader( + b'Content-Disposition', b'attachment; filename=' + + filename, + ) return b'This file should be called ' + filename diff --git a/deluge/tests/test_json_api.py b/deluge/tests/test_json_api.py index d1664f190..68d7b6001 100644 --- a/deluge/tests/test_json_api.py +++ b/deluge/tests/test_json_api.py @@ -38,7 +38,7 @@ class JSONBase(BaseTestCase, DaemonBase): def connect_client(self, *args, **kwargs): return client.connect( 'localhost', self.listen_port, username=kwargs.get('user', ''), - password=kwargs.get('password', '') + password=kwargs.get('password', ''), ) def disconnect_client(self, *args): @@ -219,18 +219,24 @@ class JSONRequestFailedTestCase(JSONBase, WebServerMockBase): daemon.rpcserver.register_object(test) """ from twisted.internet.defer import Deferred - extra_callback = {'deferred': Deferred(), 'types': ['stderr'], - 'timeout': 10, - 'triggers': [{'expr': 'in test_raise_error', - 'value': lambda reader, data, data_all: 'Test'}]} + extra_callback = { + 'deferred': Deferred(), 'types': ['stderr'], + 'timeout': 10, + 'triggers': [{ + 'expr': 'in test_raise_error', + 'value': lambda reader, data, data_all: 'Test', + }], + } def on_test_raise(*args): self.assertTrue('Unhandled error in Deferred:' in self.core.stderr_out) self.assertTrue('in test_raise_error' in self.core.stderr_out) extra_callback['deferred'].addCallback(on_test_raise) - d.addCallback(self.start_core, custom_script=custom_script, print_stdout=False, print_stderr=False, - timeout=5, extra_callbacks=[extra_callback]) + d.addCallback( + self.start_core, custom_script=custom_script, print_stdout=False, print_stderr=False, + timeout=5, extra_callbacks=[extra_callback], + ) d.addCallbacks(self.connect_client, self.terminate_core) return d @@ -257,7 +263,8 @@ class JSONRequestFailedTestCase(JSONBase, WebServerMockBase): self.assertEqual( response['error']['message'], 'Failure: [Failure instance: Traceback (failure with no frames):' - " <class 'deluge.error.DelugeError'>: DelugeERROR\n]") + " <class 'deluge.error.DelugeError'>: DelugeERROR\n]", + ) self.assertEqual(response['error']['code'], 4) request.write = write diff --git a/deluge/tests/test_torrent.py b/deluge/tests/test_torrent.py index ceb1d35e0..a4148d3d5 100644 --- a/deluge/tests/test_torrent.py +++ b/deluge/tests/test_torrent.py @@ -31,8 +31,10 @@ class TorrentTestCase(BaseTestCase): def setup_config(self): config_dir = common.set_tmp_config_dir() - core_config = deluge.config.Config('core.conf', defaults=deluge.core.preferencesmanager.DEFAULT_PREFS, - config_dir=config_dir) + core_config = deluge.config.Config( + 'core.conf', defaults=deluge.core.preferencesmanager.DEFAULT_PREFS, + config_dir=config_dir, + ) core_config.save() def set_up(self): @@ -77,8 +79,10 @@ class TorrentTestCase(BaseTestCase): return atp def test_set_prioritize_first_last_pieces(self): - piece_indexes = [0, 1, 50, 51, 52, 110, 111, 112, 113, 200, 201, 202, 212, - 213, 214, 215, 216, 217, 457, 458, 459, 460, 461, 462] + piece_indexes = [ + 0, 1, 50, 51, 52, 110, 111, 112, 113, 200, 201, 202, 212, + 213, 214, 215, 216, 217, 457, 458, 459, 460, 461, 462, + ] self.run_test_set_prioritize_first_last_pieces('dir_with_6_files.torrent', piece_indexes) def run_test_set_prioritize_first_last_pieces(self, torrent_file, prioritized_piece_indexes): @@ -169,7 +173,7 @@ class TorrentTestCase(BaseTestCase): 'num_seeds': 16777215, 'sequential_download': 0, 'announce_to_trackers': 1, 'peers': '\n\x00\x02\x0f=\xc6SC\x17]\xd8}\x7f\x00\x00\x01=\xc6', 'finished_time': 13399, 'last_upload': 13399, 'trackers': [[]], 'super_seeding': 0, - 'file sizes': [[512000, 1411826586]], 'last_download': 13399 + 'file sizes': [[512000, 1411826586]], 'last_download': 13399, } torrent_state = TorrentState( torrent_id='2dc5d0e71a66fe69649a640d39cb00a259704973', @@ -185,7 +189,8 @@ class TorrentTestCase(BaseTestCase): filedump = _file.read() resume_data = utf8_encode_structure(resume_data) torrent_id = self.core.torrentmanager.add( - state=torrent_state, filedump=filedump, resume_data=lt.bencode(resume_data)) + state=torrent_state, filedump=filedump, resume_data=lt.bencode(resume_data), + ) torrent = self.core.torrentmanager.torrents[torrent_id] def assert_resume_data(): diff --git a/deluge/tests/test_torrentview.py b/deluge/tests/test_torrentview.py index 8024546a7..9cf9ce282 100644 --- a/deluge/tests/test_torrentview.py +++ b/deluge/tests/test_torrentview.py @@ -42,26 +42,30 @@ setup_translations() @pytest.mark.gtkui class TorrentviewTestCase(BaseTestCase): - default_column_index = ['filter', 'torrent_id', 'dirty', '#', - 'Name', - 'Size', 'Downloaded', 'Uploaded', 'Remaining', - 'Progress', - 'Seeds', 'Peers', 'Seeds:Peers', - 'Down Speed', 'Up Speed', 'Down Limit', 'Up Limit', - 'ETA', 'Ratio', 'Avail', - 'Added', 'Completed', 'Complete Seen', - 'Tracker', 'Download Folder', 'Owner', 'Shared'] - default_liststore_columns = [bool, str, bool, int, - str, str, # Name - TYPE_UINT64, TYPE_UINT64, TYPE_UINT64, TYPE_UINT64, - float, str, # Progress - int, int, int, int, float, # Seeds, Peers - int, int, float, float, - int, float, float, # ETA, Ratio, Avail - int, int, int, - str, str, # Tracker - str, str, - bool] # shared + default_column_index = [ + 'filter', 'torrent_id', 'dirty', '#', + 'Name', + 'Size', 'Downloaded', 'Uploaded', 'Remaining', + 'Progress', + 'Seeds', 'Peers', 'Seeds:Peers', + 'Down Speed', 'Up Speed', 'Down Limit', 'Up Limit', + 'ETA', 'Ratio', 'Avail', + 'Added', 'Completed', 'Complete Seen', + 'Tracker', 'Download Folder', 'Owner', 'Shared', + ] + default_liststore_columns = [ + bool, str, bool, int, + str, str, # Name + TYPE_UINT64, TYPE_UINT64, TYPE_UINT64, TYPE_UINT64, + float, str, # Progress + int, int, int, int, float, # Seeds, Peers + int, int, float, float, + int, float, float, # ETA, Ratio, Avail + int, int, int, + str, str, # Tracker + str, str, + bool, + ] # shared def set_up(self): if libs_available is False: @@ -89,10 +93,14 @@ class TorrentviewTestCase(BaseTestCase): # Add a text column test_col = 'Test column' self.torrentview.add_text_column(test_col, status_field=['label']) - self.assertEqual(len(self.torrentview.liststore_columns), - len(TorrentviewTestCase.default_liststore_columns) + 1) - self.assertEqual(len(self.torrentview.column_index), - len(TorrentviewTestCase.default_column_index) + 1) + self.assertEqual( + len(self.torrentview.liststore_columns), + len(TorrentviewTestCase.default_liststore_columns) + 1, + ) + self.assertEqual( + len(self.torrentview.column_index), + len(TorrentviewTestCase.default_column_index) + 1, + ) self.assertEqual(self.torrentview.column_index[-1], test_col) self.assertEqual(self.torrentview.columns[test_col].column_indices, [32]) @@ -106,10 +114,14 @@ class TorrentviewTestCase(BaseTestCase): test_col2 = 'Test column2' self.torrentview.add_text_column(test_col2, status_field=['label2']) - self.assertEqual(len(self.torrentview.liststore_columns), - len(TorrentviewTestCase.default_liststore_columns) + 2) - self.assertEqual(len(self.torrentview.column_index), - len(TorrentviewTestCase.default_column_index) + 2) + self.assertEqual( + len(self.torrentview.liststore_columns), + len(TorrentviewTestCase.default_liststore_columns) + 2, + ) + self.assertEqual( + len(self.torrentview.column_index), + len(TorrentviewTestCase.default_column_index) + 2, + ) # test_col self.assertEqual(self.torrentview.column_index[-2], test_col) self.assertEqual(self.torrentview.columns[test_col].column_indices, [32]) @@ -140,10 +152,14 @@ class TorrentviewTestCase(BaseTestCase): # Remove test_col self.torrentview.remove_column(test_col) - self.assertEqual(len(self.torrentview.liststore_columns), - len(TorrentviewTestCase.default_liststore_columns) + 1) - self.assertEqual(len(self.torrentview.column_index), - len(TorrentviewTestCase.default_column_index) + 1) + self.assertEqual( + len(self.torrentview.liststore_columns), + len(TorrentviewTestCase.default_liststore_columns) + 1, + ) + self.assertEqual( + len(self.torrentview.column_index), + len(TorrentviewTestCase.default_column_index) + 1, + ) self.assertEqual(self.torrentview.column_index[-1], test_col2) self.assertEqual(self.torrentview.columns[test_col2].column_indices, [32]) @@ -159,10 +175,14 @@ class TorrentviewTestCase(BaseTestCase): # Add a column with multiple column types test_col3 = 'Test column3' self.torrentview.add_progress_column(test_col3, status_field=['progress', 'label3'], col_types=[float, str]) - self.assertEqual(len(self.torrentview.liststore_columns), - len(TorrentviewTestCase.default_liststore_columns) + 2) - self.assertEqual(len(self.torrentview.column_index), - len(TorrentviewTestCase.default_column_index) + 1) + self.assertEqual( + len(self.torrentview.liststore_columns), + len(TorrentviewTestCase.default_liststore_columns) + 2, + ) + self.assertEqual( + len(self.torrentview.column_index), + len(TorrentviewTestCase.default_column_index) + 1, + ) self.assertEqual(self.torrentview.column_index[-1], test_col3) self.assertEqual(self.torrentview.columns[test_col3].column_indices, [32, 33]) diff --git a/deluge/tests/test_transfer.py b/deluge/tests/test_transfer.py index 0ac13b303..8940394a1 100644 --- a/deluge/tests/test_transfer.py +++ b/deluge/tests/test_transfer.py @@ -118,10 +118,12 @@ class DelugeTransferProtocolTestCase(unittest.TestCase): """ self.transfer = TransferTestClass() self.msg1 = (0, 1, {'key_int': 1242429423}, {'key_str': b'some string'}, {'key_bool': True}) - self.msg2 = (2, 3, {'key_float': 12424.29423}, - {'key_unicode': 'some string'}, - {'key_dict_with_tuple': {'key_tuple': (1, 2, 3)}}, - {'keylist': [4, '5', 6.7]}) + self.msg2 = ( + 2, 3, {'key_float': 12424.29423}, + {'key_unicode': 'some string'}, + {'key_dict_with_tuple': {'key_tuple': (1, 2, 3)}}, + {'keylist': [4, '5', 6.7]}, + ) self.msg1_expected_compressed_base64 = 'RAAAADF4nDvKwJjenp1aGZ+ZV+Lgxfv9PYRXXFLU'\ 'XZyfm6oAZGTmpad3gAST8vNznAEAJhSQ' diff --git a/deluge/tests/test_ui_common.py b/deluge/tests/test_ui_common.py index 69f6411d0..32ad3037f 100644 --- a/deluge/tests/test_ui_common.py +++ b/deluge/tests/test_ui_common.py @@ -33,11 +33,23 @@ class UICommonTestCase(unittest.TestCase): ti = TorrentInfo(filename) files = ti.files_tree['unicode_filenames'] - self.assertTrue((b'\xe3\x83\x86\xe3\x82\xaf\xe3\x82\xb9\xe3\x83\xbb\xe3\x83' - b'\x86\xe3\x82\xaf\xe3\x82\xb5\xe3\x83\xb3.mkv').decode('utf8') in files) - self.assertTrue((b'\xd0\x9c\xd0\xb8\xd1\x85\xd0\xb0\xd0\xb8\xd0\xbb \xd0\x93' - b'\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0\xd1\x87\xd1\x91\xd0\xb2.mkv').decode('utf8') in files) + self.assertTrue( + ( + b'\xe3\x83\x86\xe3\x82\xaf\xe3\x82\xb9\xe3\x83\xbb\xe3\x83' + b'\x86\xe3\x82\xaf\xe3\x82\xb5\xe3\x83\xb3.mkv' + ).decode('utf8') in files, + ) + self.assertTrue( + ( + b'\xd0\x9c\xd0\xb8\xd1\x85\xd0\xb0\xd0\xb8\xd0\xbb \xd0\x93' + b'\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0\xd1\x87\xd1\x91\xd0\xb2.mkv' + ).decode('utf8') in files, + ) self.assertTrue(b"Alisher ibn G'iyosiddin Navoiy.mkv".decode('utf8') in files) self.assertTrue(b'Ascii title.mkv'.decode('utf8') in files) - self.assertTrue((b'\xe0\xa6\xb8\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x81\xe0\xa6\xae\xe0\xa6\xbe' - b'\xe0\xa6\xb0 \xe0\xa6\xb0\xe0\xa6\xbe\xe0\xa7\x9f.mkv').decode('utf8') in files) + self.assertTrue( + ( + b'\xe0\xa6\xb8\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x81\xe0\xa6\xae\xe0\xa6\xbe' + b'\xe0\xa6\xb0 \xe0\xa6\xb0\xe0\xa6\xbe\xe0\xa7\x9f.mkv' + ).decode('utf8') in files, + ) diff --git a/deluge/tests/test_ui_entry.py b/deluge/tests/test_ui_entry.py index e3d69ddea..130dbe192 100644 --- a/deluge/tests/test_ui_entry.py +++ b/deluge/tests/test_ui_entry.py @@ -60,7 +60,7 @@ class StringFileDescriptor(object): class UIBaseTestCase(object): def __init__(self): - self.var = dict() + self.var = {} def set_up(self): common.set_tmp_config_dir() @@ -339,8 +339,10 @@ class ConsoleUIWithDaemonBaseTestCase(UIWithDaemonBaseTestCase): @defer.inlineCallbacks def test_console_command_status(self): username, password = get_localhost_auth() - self.patch(sys, 'argv', self.var['sys_arg_cmd'] + ['--port'] + ['58900'] + ['--username'] + - [username] + ['--password'] + [password] + ['status']) + self.patch( + sys, 'argv', self.var['sys_arg_cmd'] + ['--port'] + ['58900'] + ['--username'] + + [username] + ['--password'] + [password] + ['status'], + ) fd = StringFileDescriptor(sys.stdout) self.patch(sys, 'stdout', fd) diff --git a/deluge/tests/test_web_api.py b/deluge/tests/test_web_api.py index 7baabc056..9b68b225c 100644 --- a/deluge/tests/test_web_api.py +++ b/deluge/tests/test_web_api.py @@ -72,8 +72,8 @@ class WebAPITestCase(WebServerTestBase): '233f23632af0a74748bc5dd1d8717564748877baa16420e6898e17e8aa365e6e': { 'login': 'skrot', 'expires': 1460030877.0, - 'level': 10 - } + 'level': 10, + }, } self.deluge_web.web_api.set_config(config) web_config = component.get('DelugeWeb').config.config @@ -147,7 +147,10 @@ class WebAPITestCase(WebServerTestBase): ret['contents'], { 'azcvsupdater_2.6.2.jar': { 'priority': 4, 'index': 0, 'offset': 0, 'progress': 0.0, 'path': - 'azcvsupdater_2.6.2.jar', 'type': 'file', 'size': 307949}}) + 'azcvsupdater_2.6.2.jar', 'type': 'file', 'size': 307949, + }, + }, + ) @defer.inlineCallbacks def test_download_torrent_from_url(self): @@ -170,7 +173,10 @@ class WebAPITestCase(WebServerTestBase): d = yield agent.request( b'POST', b'http://127.0.0.1:%s/json' % self.webserver_listen_port, - Headers({b'User-Agent': [b'Twisted Web Client Example'], - b'Content-Type': [b'application/json']}), - FileBodyProducer(BytesIO(bad_body))) + Headers({ + b'User-Agent': [b'Twisted Web Client Example'], + b'Content-Type': [b'application/json'], + }), + FileBodyProducer(BytesIO(bad_body)), + ) yield d diff --git a/deluge/tests/test_webserver.py b/deluge/tests/test_webserver.py index ef2c0a773..a74be89a7 100644 --- a/deluge/tests/test_webserver.py +++ b/deluge/tests/test_webserver.py @@ -42,12 +42,16 @@ class WebServerTestCase(WebServerTestBase, WebServerMockBase): # UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 0: invalid continuation byte filename = get_test_data_file('filehash_field.torrent') input_file = '{"params": ["%s"], "method": "web.get_torrent_info", "id": 22}' % filename - headers = {'User-Agent': ['Twisted Web Client Example'], - 'Content-Type': ['application/json']} + headers = { + 'User-Agent': ['Twisted Web Client Example'], + 'Content-Type': ['application/json'], + } url = 'http://127.0.0.1:%s/json' % self.webserver_listen_port - d = yield agent.request(b'POST', url.encode('utf-8'), Headers(utf8_encode_structure(headers)), - FileBodyProducer(BytesIO(input_file.encode('utf-8')))) + d = yield agent.request( + b'POST', url.encode('utf-8'), Headers(utf8_encode_structure(headers)), + FileBodyProducer(BytesIO(input_file.encode('utf-8'))), + ) try: body = yield twisted.web.client.readBody(d) except AttributeError: diff --git a/deluge/tests/twisted/plugins/delugereporter.py b/deluge/tests/twisted/plugins/delugereporter.py index a1b1d04f9..e0f4fc7d1 100644 --- a/deluge/tests/twisted/plugins/delugereporter.py +++ b/deluge/tests/twisted/plugins/delugereporter.py @@ -28,12 +28,14 @@ class _Reporter(object): self.klass = klass -deluge = _Reporter('Deluge reporter that suppresses Stacktrace from TODO tests', - 'twisted.plugins.delugereporter', - description='Deluge Reporter', - longOpt='deluge-reporter', - shortOpt=None, - klass='DelugeReporter') +deluge = _Reporter( + 'Deluge reporter that suppresses Stacktrace from TODO tests', + 'twisted.plugins.delugereporter', + description='Deluge Reporter', + longOpt='deluge-reporter', + shortOpt=None, + klass='DelugeReporter', +) class DelugeReporter(TreeReporter): diff --git a/deluge/ui/Win32IconImagePlugin.py b/deluge/ui/Win32IconImagePlugin.py index b1a0cf6e1..caa653590 100644 --- a/deluge/ui/Win32IconImagePlugin.py +++ b/deluge/ui/Win32IconImagePlugin.py @@ -100,7 +100,7 @@ class Win32IcoFile(object): def sizes(self): """Get a list of all available icon sizes and color depths.""" - return set((h['width'], h['height']) for h in self.entry) + return {(h['width'], h['height']) for h in self.entry} def get_image(self, size, bpp=False): """Get an image from the icon @@ -171,7 +171,7 @@ class Win32IcoFile(object): im.size, # (w, h) alpha_bytes, # source chars 'raw', # raw decoder - ('L', 0, -1) # 8bpp inverted, unpadded, reversed + ('L', 0, -1), # 8bpp inverted, unpadded, reversed ) # apply mask image as alpha channel @@ -198,7 +198,7 @@ class Win32IcoFile(object): im.size, # (w, h) mask_data, # source chars 'raw', # raw decoder - ('1;I', w // 8, -1) # 1bpp inverted, padded, reversed + ('1;I', w // 8, -1), # 1bpp inverted, padded, reversed ) # now we have two images, im is XOR image and mask is AND image @@ -215,7 +215,8 @@ class Win32IcoFile(object): def __repr__(self): s = 'Microsoft Icon: %d images (max %dx%d %dbpp)' % ( len(self.entry), self.entry[0]['width'], self.entry[0]['height'], - self.entry[0]['bpp']) + self.entry[0]['bpp'], + ) return s # end Win32IcoFile diff --git a/deluge/ui/baseargparser.py b/deluge/ui/baseargparser.py index 3f116c9eb..6bedc8093 100644 --- a/deluge/ui/baseargparser.py +++ b/deluge/ui/baseargparser.py @@ -170,26 +170,48 @@ class BaseArgParser(argparse.ArgumentParser): self.process_arg_group = False self.group = self.add_argument_group(_('Common Options')) if common_help: - self.group.add_argument('-h', '--help', action=HelpAction, - help=_('Print this help message')) - self.group.add_argument('-V', '--version', action='version', version='%(prog)s ' + get_version(), - help=_('Print version information')) - self.group.add_argument('-v', action='version', version='%(prog)s ' + get_version(), - help=argparse.SUPPRESS) # Deprecated arg - self.group.add_argument('-c', '--config', metavar='<config>', - help=_('Set the config directory path')) - self.group.add_argument('-l', '--logfile', metavar='<logfile>', - help=_('Output to specified logfile instead of stdout')) - self.group.add_argument('-L', '--loglevel', choices=[l for k in deluge.log.levels for l in (k, k.upper())], - help=_('Set the log level (none, error, warning, info, debug)'), metavar='<level>') - self.group.add_argument('--logrotate', nargs='?', const='2M', metavar='<max-size>', - help=_('Enable logfile rotation, with optional maximum logfile size, ' - 'default: %(const)s (Logfile rotation count is 5)')) - self.group.add_argument('-q', '--quiet', action='store_true', - help=_('Quieten logging output (Same as `--loglevel none`)')) - self.group.add_argument('--profile', metavar='<profile-file>', nargs='?', default=False, - help=_('Profile %(prog)s with cProfile. Outputs to stdout ' - 'unless a filename is specified')) + self.group.add_argument( + '-h', '--help', action=HelpAction, + help=_('Print this help message'), + ) + self.group.add_argument( + '-V', '--version', action='version', version='%(prog)s ' + get_version(), + help=_('Print version information'), + ) + self.group.add_argument( + '-v', action='version', version='%(prog)s ' + get_version(), + help=argparse.SUPPRESS, + ) # Deprecated arg + self.group.add_argument( + '-c', '--config', metavar='<config>', + help=_('Set the config directory path'), + ) + self.group.add_argument( + '-l', '--logfile', metavar='<logfile>', + help=_('Output to specified logfile instead of stdout'), + ) + self.group.add_argument( + '-L', '--loglevel', choices=[l for k in deluge.log.levels for l in (k, k.upper())], + help=_('Set the log level (none, error, warning, info, debug)'), metavar='<level>', + ) + self.group.add_argument( + '--logrotate', nargs='?', const='2M', metavar='<max-size>', + help=_( + 'Enable logfile rotation, with optional maximum logfile size, ' + 'default: %(const)s (Logfile rotation count is 5)', + ), + ) + self.group.add_argument( + '-q', '--quiet', action='store_true', + help=_('Quieten logging output (Same as `--loglevel none`)'), + ) + self.group.add_argument( + '--profile', metavar='<profile-file>', nargs='?', default=False, + help=_( + 'Profile %(prog)s with cProfile. Outputs to stdout ' + 'unless a filename is specified', + ), + ) def parse_args(self, args=None): """Parse UI arguments and handle common and process group options. @@ -251,8 +273,10 @@ class BaseArgParser(argparse.ArgumentParser): logrotate = common.parse_human_size(options.logrotate) # Setup the logger - deluge.log.setup_logger(level=options.loglevel, filename=options.logfile, filemode=logfile_mode, - logrotate=logrotate, output_stream=self.log_stream) + deluge.log.setup_logger( + level=options.loglevel, filename=options.logfile, filemode=logfile_mode, + logrotate=logrotate, output_stream=self.log_stream, + ) if options.config: if not set_config_dir(options.config): @@ -300,14 +324,24 @@ class BaseArgParser(argparse.ArgumentParser): self.process_arg_group = True self.group = self.add_argument_group(_('Process Control Options')) - self.group.add_argument('-P', '--pidfile', metavar='<pidfile>', action='store', - help=_('Pidfile to store the process id')) + self.group.add_argument( + '-P', '--pidfile', metavar='<pidfile>', action='store', + help=_('Pidfile to store the process id'), + ) if not common.windows_check(): - self.group.add_argument('-d', '--do-not-daemonize', dest='donotdaemonize', action='store_true', - help=_('Do not daemonize (fork) this process')) - self.group.add_argument('-f', '--fork', dest='donotdaemonize', action='store_false', - help=argparse.SUPPRESS) # Deprecated arg - self.group.add_argument('-U', '--user', metavar='<user>', action='store', - help=_('Change to this user on startup (Requires root)')) - self.group.add_argument('-g', '--group', metavar='<group>', action='store', - help=_('Change to this group on startup (Requires root)')) + self.group.add_argument( + '-d', '--do-not-daemonize', dest='donotdaemonize', action='store_true', + help=_('Do not daemonize (fork) this process'), + ) + self.group.add_argument( + '-f', '--fork', dest='donotdaemonize', action='store_false', + help=argparse.SUPPRESS, + ) # Deprecated arg + self.group.add_argument( + '-U', '--user', metavar='<user>', action='store', + help=_('Change to this user on startup (Requires root)'), + ) + self.group.add_argument( + '-g', '--group', metavar='<group>', action='store', + help=_('Change to this group on startup (Requires root)'), + ) diff --git a/deluge/ui/client.py b/deluge/ui/client.py index 172a6d68b..ac9b9f99a 100644 --- a/deluge/ui/client.py +++ b/deluge/ui/client.py @@ -98,8 +98,10 @@ class DelugeRPCProtocol(DelugeTransferProtocol): log.debug('Received invalid message: type is not tuple') return if len(request) < 3: - log.debug('Received invalid message: number of items in ' - 'response is %s', len(request)) + log.debug( + 'Received invalid message: number of items in ' + 'response is %s', len(request), + ) return message_type = request[0] @@ -163,8 +165,10 @@ class DelugeRPCProtocol(DelugeTransferProtocol): log.debug(msg) except Exception: import traceback - log.error('Failed to handle RPC_ERROR (Old daemon?): %s\nLocal error: %s', - request[2], traceback.format_exc()) + log.error( + 'Failed to handle RPC_ERROR (Old daemon?): %s\nLocal error: %s', + request[2], traceback.format_exc(), + ) d.errback(exception) del self.__rpc_requests[request_id] @@ -195,17 +199,23 @@ class DelugeRPCClientFactory(ClientFactory): self.event_handlers = event_handlers def startedConnecting(self, connector): # NOQA: N802 - log.debug('Connecting to daemon at "%s:%s"...', - connector.host, connector.port) + log.debug( + 'Connecting to daemon at "%s:%s"...', + connector.host, connector.port, + ) def clientConnectionFailed(self, connector, reason): # NOQA: N802 - log.debug('Connection to daemon at "%s:%s" failed: %s', - connector.host, connector.port, reason.value) + log.debug( + 'Connection to daemon at "%s:%s" failed: %s', + connector.host, connector.port, reason.value, + ) self.daemon.connect_deferred.errback(reason) def clientConnectionLost(self, connector, reason): # NOQA: N802 - log.debug('Connection lost to daemon at "%s:%s" reason: %s', - connector.host, connector.port, reason.value) + log.debug( + 'Connection lost to daemon at "%s:%s" reason: %s', + connector.host, connector.port, reason.value, + ) self.daemon.host = None self.daemon.port = None self.daemon.username = None @@ -262,9 +272,11 @@ class DaemonSSLProxy(DaemonProxy): log.debug('sslproxy.connect()') self.host = host self.port = port - self.__connector = reactor.connectSSL(self.host, self.port, - self.__factory, - ssl.ClientContextFactory()) + self.__connector = reactor.connectSSL( + self.host, self.port, + self.__factory, + ssl.ClientContextFactory(), + ) self.connect_deferred = defer.Deferred() self.daemon_info_deferred = defer.Deferred() @@ -384,8 +396,10 @@ class DaemonSSLProxy(DaemonProxy): log.debug('%s.authenticate: %s', self.__class__.__name__, username) login_deferred = defer.Deferred() d = self.call('daemon.login', username, password, client_version=get_version()) - d.addCallbacks(self.__on_login, self.__on_login_fail, callbackArgs=[username, login_deferred], - errbackArgs=[login_deferred]) + d.addCallbacks( + self.__on_login, self.__on_login_fail, callbackArgs=[username, login_deferred], + errbackArgs=[login_deferred], + ) return login_deferred def __on_login(self, result, username, login_deferred): @@ -396,7 +410,8 @@ class DaemonSSLProxy(DaemonProxy): if self.__factory.event_handlers: self.call('daemon.set_event_interest', list(self.__factory.event_handlers)) self.call('core.get_auth_levels_mappings').addCallback( - self.__on_auth_levels_mappings) + self.__on_auth_levels_mappings, + ) login_deferred.callback(result) @@ -434,9 +449,11 @@ class DaemonStandaloneProxy(DaemonProxy): self.host = 'localhost' self.port = 58846 # Running in standalone mode, it's safe to import auth level - from deluge.core.authmanager import (AUTH_LEVEL_ADMIN, - AUTH_LEVELS_MAPPING, - AUTH_LEVELS_MAPPING_REVERSE) + from deluge.core.authmanager import ( + AUTH_LEVEL_ADMIN, + AUTH_LEVELS_MAPPING, + AUTH_LEVELS_MAPPING_REVERSE, + ) self.username = 'localclient' self.authentication_level = AUTH_LEVEL_ADMIN self.auth_levels_mapping = AUTH_LEVELS_MAPPING @@ -528,8 +545,10 @@ class Client(object): self.disconnect_callback = None self.__started_standalone = False - def connect(self, host='127.0.0.1', port=58846, username='', password='', - skip_authentication=False): + def connect( + self, host='127.0.0.1', port=58846, username='', password='', + skip_authentication=False, + ): """ Connects to a daemon process. @@ -635,8 +654,11 @@ class Client(object): from errno import ENOENT if ex.errno == ENOENT: log.error( - _('Deluge cannot find the `deluged` executable, check that ' - 'the deluged package is installed, or added to your PATH.')) + _( + 'Deluge cannot find the `deluged` executable, check that ' + 'the deluged package is installed, or added to your PATH.', + ), + ) else: log.exception(ex) except Exception as ex: diff --git a/deluge/ui/common.py b/deluge/ui/common.py index 1767a3a97..71bbd0468 100644 --- a/deluge/ui/common.py +++ b/deluge/ui/common.py @@ -134,14 +134,14 @@ TORRENT_DATA_FIELD = { 'pieces': {'name': _('Pieces'), 'status': ['num_pieces', 'piece_length']}, 'seed_rank': - {'name': _('Seed Rank'), 'status': ['seed_rank']} + {'name': _('Seed Rank'), 'status': ['seed_rank']}, } TRACKER_STATUS_TRANSLATION = [ _('Error'), _('Warning'), _('Announce OK'), - _('Announce Sent') + _('Announce Sent'), ] PREFS_CATOG_TRANS = { @@ -154,7 +154,7 @@ PREFS_CATOG_TRANS = { 'cache': _('Cache'), 'other': _('Other'), 'daemon': _('Daemon'), - 'plugins': _('Plugins') + 'plugins': _('Plugins'), } FILE_PRIORITY = { @@ -178,7 +178,7 @@ del _ DISK_CACHE_KEYS = [ 'disk.num_blocks_read', 'disk.num_blocks_written', 'disk.num_read_ops', 'disk.num_write_ops', 'disk.num_blocks_cache_hits', 'read_hit_ratio', 'write_hit_ratio', 'disk.disk_blocks_in_use', - 'disk.read_cache_blocks' + 'disk.read_cache_blocks', ] @@ -279,13 +279,13 @@ class TorrentInfo(object): 'type': 'file', 'index': 0, 'length': self.__m_metadata['info']['length'], - 'download': True - } - } + 'download': True, + }, + }, } else: self.__m_files_tree = { - self.__m_name: (0, self.__m_metadata['info']['length'], True) + self.__m_name: (0, self.__m_metadata['info']['length'], True), } self.__m_files = [] @@ -298,13 +298,13 @@ class TorrentInfo(object): self.__m_files.append({ 'path': f['path'], 'size': f['length'], - 'download': True + 'download': True, }) else: self.__m_files.append({ 'path': self.__m_name, 'size': self.__m_metadata['info']['length'], - 'download': True + 'download': True, }) def as_dict(self, *keys): @@ -315,7 +315,7 @@ class TorrentInfo(object): :param keys: a number of key strings :type keys: string """ - return dict([(key, getattr(self, key)) for key in keys]) + return {key: getattr(self, key) for key in keys} @property def name(self): @@ -400,7 +400,7 @@ class FileTree2(object): if child is None: parent['contents'][directory] = { 'type': 'dir', - 'contents': {} + 'contents': {}, } parent = parent['contents'][directory] return parent, path @@ -411,12 +411,12 @@ class FileTree2(object): parent, path = get_parent(path) parent['contents'][path] = { 'type': 'dir', - 'contents': {} + 'contents': {}, } else: parent, path = get_parent(path) parent['contents'][path] = { - 'type': 'file' + 'type': 'file', } def get_tree(self): @@ -443,13 +443,13 @@ class FileTree2(object): full_path = os.path.join(parent_path, path).replace('\\', '/') if directory['contents'][path]['type'] == 'dir': directory['contents'][path] = callback( - full_path, directory['contents'][path] - ) or directory['contents'][path] + full_path, directory['contents'][path], + ) or directory['contents'][path] walk(directory['contents'][path], full_path) else: directory['contents'][path] = callback( - full_path, directory['contents'][path] - ) or directory['contents'][path] + full_path, directory['contents'][path], + ) or directory['contents'][path] walk(self.tree, '') def __str__(self): diff --git a/deluge/ui/console/cmdline/commands/__init__.py b/deluge/ui/console/cmdline/commands/__init__.py index 01bb8385e..628fae597 100644 --- a/deluge/ui/console/cmdline/commands/__init__.py +++ b/deluge/ui/console/cmdline/commands/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from __future__ import unicode_literals from deluge.ui.console.cmdline.command import BaseCommand diff --git a/deluge/ui/console/cmdline/commands/add.py b/deluge/ui/console/cmdline/commands/add.py index e6282d9a2..47f9d5689 100644 --- a/deluge/ui/console/cmdline/commands/add.py +++ b/deluge/ui/console/cmdline/commands/add.py @@ -35,8 +35,10 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('-p', '--path', dest='path', help=_('download folder for torrent')) - parser.add_argument('torrents', metavar='<torrent>', nargs='+', - help=_('One or more torrent files, URLs or magnet URIs')) + parser.add_argument( + 'torrents', metavar='<torrent>', nargs='+', + help=_('One or more torrent files, URLs or magnet URIs'), + ) def handle(self, options): self.console = component.get('ConsoleUI') @@ -62,11 +64,13 @@ class Command(BaseCommand): if deluge.common.is_url(torrent): self.console.write('{!info!}Attempting to add torrent from url: %s' % torrent) deferreds.append(client.core.add_torrent_url(torrent, t_options).addCallback(on_success).addErrback( - on_fail)) + on_fail, + )) elif deluge.common.is_magnet(torrent): self.console.write('{!info!}Attempting to add torrent from magnet uri: %s' % torrent) deferreds.append(client.core.add_torrent_magnet(torrent, t_options).addCallback(on_success).addErrback( - on_fail)) + on_fail, + )) else: # Just a file if urlparse(torrent).scheme == 'file': @@ -85,7 +89,7 @@ class Command(BaseCommand): deferreds.append( client.core.add_torrent_file_async( filename, filedump, t_options, - ).addCallback(on_success).addErrback(on_fail) + ).addCallback(on_success).addErrback(on_fail), ) return defer.DeferredList(deferreds) diff --git a/deluge/ui/console/cmdline/commands/info.py b/deluge/ui/console/cmdline/commands/info.py index b2cc69618..44b1e4f27 100644 --- a/deluge/ui/console/cmdline/commands/info.py +++ b/deluge/ui/console/cmdline/commands/info.py @@ -59,7 +59,7 @@ STATUS_KEYS = [ 'total_uploaded', 'total_payload_download', 'total_payload_upload', - 'time_added' + 'time_added', ] # Add filter specific state to torrent states @@ -82,21 +82,33 @@ class Command(BaseCommand): """ def add_arguments(self, parser): - parser.add_argument('-v', '--verbose', action='store_true', default=False, dest='verbose', - help=_('Show more information per torrent.')) - parser.add_argument('-d', '--detailed', action='store_true', default=False, dest='detailed', - help=_('Show more detailed information including files and peers.')) - parser.add_argument('-s', '--state', action='store', dest='state', - help=_('Show torrents with state STATE: %s.' % (', '.join(STATES)))) + parser.add_argument( + '-v', '--verbose', action='store_true', default=False, dest='verbose', + help=_('Show more information per torrent.'), + ) + parser.add_argument( + '-d', '--detailed', action='store_true', default=False, dest='detailed', + help=_('Show more detailed information including files and peers.'), + ) + parser.add_argument( + '-s', '--state', action='store', dest='state', + help=_('Show torrents with state STATE: %s.' % (', '.join(STATES))), + ) parser.add_argument('--sort', action='store', type=str, default='', dest='sort', help=self.sort_help) - parser.add_argument('--sort-reverse', action='store', type=str, default='', dest='sort_rev', - help=_('Same as --sort but items are in reverse order.')) - parser.add_argument('torrent_ids', metavar='<torrent-id>', nargs='*', - help=_('One or more torrent ids. If none is given, list all')) + parser.add_argument( + '--sort-reverse', action='store', type=str, default='', dest='sort_rev', + help=_('Same as --sort but items are in reverse order.'), + ) + parser.add_argument( + 'torrent_ids', metavar='<torrent-id>', nargs='*', + help=_('One or more torrent ids. If none is given, list all'), + ) def add_subparser(self, subparsers): - parser = subparsers.add_parser(self.name, prog=self.name, help=self.__doc__, - description=self.__doc__, epilog=self.epilog) + parser = subparsers.add_parser( + self.name, prog=self.name, help=self.__doc__, + description=self.__doc__, epilog=self.epilog, + ) self.add_arguments(parser) def handle(self, options): @@ -251,7 +263,8 @@ class Command(BaseCommand): colors.state_color['Seeding'], fspeed(peer['up_speed']), colors.state_color['Downloading'], - fspeed(peer['down_speed'])) + fspeed(peer['down_speed']), + ) s += '\n' self.console.write(s[:-1]) @@ -280,10 +293,12 @@ class Command(BaseCommand): if status['state'] != 'Seeding': s += sep s += '{!info!}Down Speed: {!input!}%s' % fspeed( - status['download_payload_rate'], shortform=True) + status['download_payload_rate'], shortform=True, + ) s += sep s += '{!info!}Up Speed: {!input!}%s' % fspeed( - status['upload_payload_rate'], shortform=True) + status['upload_payload_rate'], shortform=True, + ) self.console.write(s) if status['state'] in ('Seeding', 'Downloading', 'Queued'): @@ -294,7 +309,8 @@ class Command(BaseCommand): s += '{!info!}Availability: {!input!}%.2f' % status['distributed_copies'] s += sep s += '{!info!}Seed Rank: {!input!}%s' % f_seedrank_dash( - status['seed_rank'], status['seeding_time']) + status['seed_rank'], status['seeding_time'], + ) self.console.write(s) total_done = fsize(status['total_done'], shortform=True) @@ -321,7 +337,8 @@ class Command(BaseCommand): s = '{!info!}Last Transfer: {!input!}%s' % format_time(status['time_since_transfer']) s += sep s += '{!info!}Complete Seen: {!input!}%s' % format_date_never( - status['last_seen_complete']) + status['last_seen_complete'], + ) self.console.write(s) s = '{!info!}Tracker: {!input!}%s' % status['tracker_host'] @@ -366,14 +383,18 @@ class Command(BaseCommand): dl_info += '%s' % ftotal_sized(status['all_time_download'], status['total_payload_download']) if status['download_payload_rate'] > 0: - dl_info += ' @ %s%s' % (down_color, fspeed( - status['download_payload_rate'], shortform=True)) + dl_info += ' @ %s%s' % ( + down_color, + fspeed(status['download_payload_rate'], shortform=True), + ) ul_info = ' {!info!}UL: {!input!}' ul_info += '%s' % ftotal_sized(status['total_uploaded'], status['total_payload_upload']) if status['upload_payload_rate'] > 0: - ul_info += ' @ %s%s' % (up_color, fspeed( - status['upload_payload_rate'], shortform=True)) + ul_info += ' @ %s%s' % ( + up_color, + fspeed(status['upload_payload_rate'], shortform=True), + ) eta = ' {!info!}ETA: {!magenta!}%s' % format_time(status['eta']) diff --git a/deluge/ui/console/cmdline/commands/manage.py b/deluge/ui/console/cmdline/commands/manage.py index 73be5b938..8f8349679 100644 --- a/deluge/ui/console/cmdline/commands/manage.py +++ b/deluge/ui/console/cmdline/commands/manage.py @@ -33,7 +33,7 @@ torrent_options = { 'stop_ratio': float, 'remove_at_ratio': bool, 'move_completed': bool, - 'move_completed_path': str + 'move_completed_path': str, } @@ -43,8 +43,10 @@ class Command(BaseCommand): usage = _('Usage: manage <torrent-id> [--set <key> <value>] [<key> [<key>...] ]') def add_arguments(self, parser): - parser.add_argument('torrent', metavar='<torrent>', - help=_('an expression matched against torrent ids and torrent names')) + parser.add_argument( + 'torrent', metavar='<torrent>', + help=_('an expression matched against torrent ids and torrent names'), + ) set_group = parser.add_argument_group('setting a value') set_group.add_argument('-s', '--set', action='store', metavar='<key>', help=_('set value for this key')) set_group.add_argument('values', metavar='<value>', nargs='+', help=_('Value to set')) diff --git a/deluge/ui/console/cmdline/commands/pause.py b/deluge/ui/console/cmdline/commands/pause.py index cda220404..fa5ba7d13 100644 --- a/deluge/ui/console/cmdline/commands/pause.py +++ b/deluge/ui/console/cmdline/commands/pause.py @@ -21,8 +21,10 @@ class Command(BaseCommand): usage = 'pause [ * | <torrent-id> [<torrent-id> ...] ]' def add_arguments(self, parser): - parser.add_argument('torrent_ids', metavar='<torrent-id>', nargs='+', - help=_('One or more torrent ids. Use "*" to pause all torrents')) + parser.add_argument( + 'torrent_ids', metavar='<torrent-id>', nargs='+', + help=_('One or more torrent ids. Use "*" to pause all torrents'), + ) def handle(self, options): self.console = component.get('ConsoleUI') diff --git a/deluge/ui/console/cmdline/commands/plugin.py b/deluge/ui/console/cmdline/commands/plugin.py index 72f313b45..dd910d9da 100644 --- a/deluge/ui/console/cmdline/commands/plugin.py +++ b/deluge/ui/console/cmdline/commands/plugin.py @@ -20,14 +20,20 @@ class Command(BaseCommand): """Manage plugins""" def add_arguments(self, parser): - parser.add_argument('-l', '--list', action='store_true', default=False, dest='list', - help=_('Lists available plugins')) - parser.add_argument('-s', '--show', action='store_true', default=False, dest='show', - help=_('Shows enabled plugins')) + parser.add_argument( + '-l', '--list', action='store_true', default=False, dest='list', + help=_('Lists available plugins'), + ) + parser.add_argument( + '-s', '--show', action='store_true', default=False, dest='show', + help=_('Shows enabled plugins'), + ) parser.add_argument('-e', '--enable', dest='enable', nargs='+', help=_('Enables a plugin')) parser.add_argument('-d', '--disable', dest='disable', nargs='+', help=_('Disables a plugin')) - parser.add_argument('-r', '--reload', action='store_true', default=False, dest='reload', - help=_('Reload list of available plugins')) + parser.add_argument( + '-r', '--reload', action='store_true', default=False, dest='reload', + help=_('Reload list of available plugins'), + ) parser.add_argument('-i', '--install', help=_('Install a plugin from an .egg file')) def handle(self, options): diff --git a/deluge/ui/console/cmdline/commands/resume.py b/deluge/ui/console/cmdline/commands/resume.py index cf130edb2..8a2632264 100644 --- a/deluge/ui/console/cmdline/commands/resume.py +++ b/deluge/ui/console/cmdline/commands/resume.py @@ -21,8 +21,10 @@ class Command(BaseCommand): usage = _('Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]') def add_arguments(self, parser): - parser.add_argument('torrent_ids', metavar='<torrent-id>', nargs='+', - help=_('One or more torrent ids. Use "*" to resume all torrents')) + parser.add_argument( + 'torrent_ids', metavar='<torrent-id>', nargs='+', + help=_('One or more torrent ids. Use "*" to resume all torrents'), + ) def handle(self, options): self.console = component.get('ConsoleUI') diff --git a/deluge/ui/console/cmdline/commands/rm.py b/deluge/ui/console/cmdline/commands/rm.py index 3e97178f4..a2d431c4d 100644 --- a/deluge/ui/console/cmdline/commands/rm.py +++ b/deluge/ui/console/cmdline/commands/rm.py @@ -25,10 +25,14 @@ class Command(BaseCommand): aliases = ['del'] def add_arguments(self, parser): - parser.add_argument('--remove_data', action='store_true', default=False, - help=_('Also removes the torrent data')) - parser.add_argument('-c', '--confirm', action='store_true', default=False, - help=_('List the matching torrents without removing.')) + parser.add_argument( + '--remove_data', action='store_true', default=False, + help=_('Also removes the torrent data'), + ) + parser.add_argument( + '-c', '--confirm', action='store_true', default=False, + help=_('List the matching torrents without removing.'), + ) parser.add_argument('torrent_ids', metavar='<torrent-id>', nargs='+', help=_('One or more torrent ids')) def handle(self, options): @@ -36,9 +40,11 @@ class Command(BaseCommand): torrent_ids = self.console.match_torrents(options.torrent_ids) if not options.confirm: - self.console.write('{!info!}%d %s %s{!info!}' % (len(torrent_ids), - _n('torrent', 'torrents', len(torrent_ids)), - _n('match', 'matches', len(torrent_ids)))) + self.console.write('{!info!}%d %s %s{!info!}' % ( + len(torrent_ids), + _n('torrent', 'torrents', len(torrent_ids)), + _n('match', 'matches', len(torrent_ids)), + )) for t_id in torrent_ids: name = self.console.get_torrent_name(t_id) self.console.write('* %-50s (%s)' % (name, t_id)) diff --git a/deluge/ui/console/cmdline/commands/status.py b/deluge/ui/console/cmdline/commands/status.py index e1d5e37fa..5f6c3fe94 100644 --- a/deluge/ui/console/cmdline/commands/status.py +++ b/deluge/ui/console/cmdline/commands/status.py @@ -26,11 +26,17 @@ class Command(BaseCommand): """Shows various status information from the daemon""" def add_arguments(self, parser): - parser.add_argument('-r', '--raw', action='store_true', default=False, dest='raw', - help=_('Raw values for upload/download rates (without KiB/s suffix)' - '(useful for scripts that want to do their own parsing)')) - parser.add_argument('-n', '--no-torrents', action='store_false', default=True, dest='show_torrents', - help=_('Do not show torrent status (Improves command speed)')) + parser.add_argument( + '-r', '--raw', action='store_true', default=False, dest='raw', + help=_( + 'Raw values for upload/download rates (without KiB/s suffix)' + '(useful for scripts that want to do their own parsing)', + ), + ) + parser.add_argument( + '-n', '--no-torrents', action='store_false', default=True, dest='show_torrents', + help=_('Do not show torrent status (Improves command speed)'), + ) def handle(self, options): self.console = component.get('ConsoleUI') diff --git a/deluge/ui/console/cmdline/commands/update_tracker.py b/deluge/ui/console/cmdline/commands/update_tracker.py index 22121151b..f0848bced 100644 --- a/deluge/ui/console/cmdline/commands/update_tracker.py +++ b/deluge/ui/console/cmdline/commands/update_tracker.py @@ -22,8 +22,10 @@ class Command(BaseCommand): aliases = ['reannounce'] def add_arguments(self, parser): - parser.add_argument('torrent_ids', metavar='<torrent-id>', nargs='+', - help='One or more torrent ids. "*" updates all torrents') + parser.add_argument( + 'torrent_ids', metavar='<torrent-id>', nargs='+', + help='One or more torrent ids. "*" updates all torrents', + ) def handle(self, options): self.console = component.get('ConsoleUI') diff --git a/deluge/ui/console/console.py b/deluge/ui/console/console.py index c95d675d0..893caf548 100644 --- a/deluge/ui/console/console.py +++ b/deluge/ui/console/console.py @@ -30,8 +30,12 @@ log = logging.getLogger(__name__) def load_commands(command_dir): def get_command(name): - command = getattr(__import__('deluge.ui.console.cmdline.commands.%s' % name, - {}, {}, ['Command']), 'Command')() + command = getattr( + __import__( + 'deluge.ui.console.cmdline.commands.%s' % name, + {}, {}, ['Command'], + ), 'Command', + )() command._name = name return command @@ -67,29 +71,45 @@ class Console(UI): def __init__(self, *args, **kwargs): super(Console, self).__init__('console', *args, log_stream=LogStream(), **kwargs) - group = self.parser.add_argument_group(_('Console Options'), - _('These daemon connect options will be ' - 'used for commands, or if console ui autoconnect is enabled.')) - group.add_argument('-d', '--daemon', metavar='<ip_addr>', dest='daemon_addr', - help=_('Deluge daemon IP address to connect to (default 127.0.0.1)'), default='127.0.0.1') - group.add_argument('-p', '--port', metavar='<port>', dest='daemon_port', type=int, - help=_('Deluge daemon port to connect to (default 58846)'), default='58846') - group.add_argument('-U', '--username', metavar='<user>', dest='daemon_user', - help=_('Deluge daemon username to use when connecting')) - group.add_argument('-P', '--password', metavar='<pass>', dest='daemon_pass', - help=_('Deluge daemon password to use when connecting')) + group = self.parser.add_argument_group( + _('Console Options'), + _( + 'These daemon connect options will be ' + 'used for commands, or if console ui autoconnect is enabled.', + ), + ) + group.add_argument( + '-d', '--daemon', metavar='<ip_addr>', dest='daemon_addr', + help=_('Deluge daemon IP address to connect to (default 127.0.0.1)'), default='127.0.0.1', + ) + group.add_argument( + '-p', '--port', metavar='<port>', dest='daemon_port', type=int, + help=_('Deluge daemon port to connect to (default 58846)'), default='58846', + ) + group.add_argument( + '-U', '--username', metavar='<user>', dest='daemon_user', + help=_('Deluge daemon username to use when connecting'), + ) + group.add_argument( + '-P', '--password', metavar='<pass>', dest='daemon_pass', + help=_('Deluge daemon password to use when connecting'), + ) # To properly print help message for the console commands ( e.g. deluge-console info -h), # we add a subparser for each command which will trigger the help/usage when given from deluge.ui.console.parser import ConsoleCommandParser # import here because (see top) - self.console_parser = ConsoleCommandParser(parents=[self.parser], add_help=False, prog=self.parser.prog, - description='Starts the Deluge console interface', - formatter_class=lambda prog: - DelugeTextHelpFormatter(prog, max_help_position=33, width=90)) + self.console_parser = ConsoleCommandParser( + parents=[self.parser], add_help=False, prog=self.parser.prog, + description='Starts the Deluge console interface', + formatter_class=lambda prog: + DelugeTextHelpFormatter(prog, max_help_position=33, width=90), + ) self.parser.subparser = self.console_parser self.console_parser.base_parser = self.parser - subparsers = self.console_parser.add_subparsers(title=_('Console Commands'), help=_('Description'), - description=_('The following console commands are available:'), - metavar=_('Command'), dest='command') + subparsers = self.console_parser.add_subparsers( + title=_('Console Commands'), help=_('Description'), + description=_('The following console commands are available:'), + metavar=_('Command'), dest='command', + ) from deluge.ui.console import UI_PATH # Must import here self.console_cmds = load_commands(os.path.join(UI_PATH, 'cmdline', 'commands')) for cmd in sorted(self.console_cmds): @@ -116,5 +136,7 @@ class Console(UI): log.exception(ex) raise - return deluge.common.run_profiled(run, self.options, output_file=self.options.profile, - do_profile=self.options.profile) + return deluge.common.run_profiled( + run, self.options, output_file=self.options.profile, + do_profile=self.options.profile, + ) diff --git a/deluge/ui/console/main.py b/deluge/ui/console/main.py index 01e2ac5e9..c3d6a131a 100644 --- a/deluge/ui/console/main.py +++ b/deluge/ui/console/main.py @@ -49,7 +49,7 @@ DEFAULT_CONSOLE_PREFS = { 'sidebar_width': 25, 'separate_complete': True, 'move_selection': True, - 'columns': {} + 'columns': {}, }, 'addtorrents': { 'show_misc_files': False, # TODO: Showing/hiding this @@ -63,7 +63,7 @@ DEFAULT_CONSOLE_PREFS = { 'third_tab_lists_all': False, 'torrents_per_tab_press': 15, 'save_command_history': True, - } + }, } @@ -207,8 +207,10 @@ Please use commands from the command line, e.g.:\n if not self.interactive and options.parsed_cmds[0].command == 'connect': d = commander.exec_command(options.parsed_cmds.pop(0)) else: - log.info('connect: host=%s, port=%s, username=%s, password=%s', - options.daemon_addr, options.daemon_port, options.daemon_user, options.daemon_pass) + log.info( + 'connect: host=%s, port=%s, username=%s, password=%s', + options.daemon_addr, options.daemon_port, options.daemon_user, options.daemon_pass, + ) d = client.connect(options.daemon_addr, options.daemon_port, options.daemon_user, options.daemon_pass) d.addCallback(on_connect) d.addErrback(on_connect_fail) @@ -279,8 +281,10 @@ Please use commands from the command line, e.g.:\n # which can cause issues as the popup's screen will not be destroyed. # This can lead to the popup border being visible for short periods # while the current modes' screen is repainted. - log.error('Mode "%s" still has popups available after being paused.' - ' Ensure all popups are removed on pause!', mode.popup.title) + log.error( + 'Mode "%s" still has popups available after being paused.' + ' Ensure all popups are removed on pause!', mode.popup.title, + ) d.addCallback(on_mode_paused, self.active_mode) reactor.removeReader(self.active_mode) @@ -418,8 +422,10 @@ Please use commands from the command line, e.g.:\n def tab_complete_path(self, line, path_type='file', ext='', sort='name', dirs_first=True): if self.interactive and isinstance(self.active_mode, deluge.ui.console.modes.cmdline.CmdLine): - return self.active_mode.tab_complete_path(line, path_type=path_type, ext=ext, - sort=sort, dirs_first=dirs_first) + return self.active_mode.tab_complete_path( + line, path_type=path_type, ext=ext, + sort=sort, dirs_first=dirs_first, + ) def on_client_disconnect(self): component.stop() @@ -474,10 +480,12 @@ Please use commands from the command line, e.g.:\n config['language'] = DEFAULT_CONSOLE_PREFS['language'] # Migrate column settings - columns = ['queue', 'size', 'state', 'progress', 'seeds', 'peers', 'downspeed', 'upspeed', - 'eta', 'ratio', 'avail', 'added', 'tracker', 'savepath', 'downloaded', 'uploaded', - 'remaining', 'owner', 'downloading_time', 'seeding_time', 'completed', 'seeds_peers_ratio', - 'complete_seen', 'down_limit', 'up_limit', 'shared', 'name'] + columns = [ + 'queue', 'size', 'state', 'progress', 'seeds', 'peers', 'downspeed', 'upspeed', + 'eta', 'ratio', 'avail', 'added', 'tracker', 'savepath', 'downloaded', 'uploaded', + 'remaining', 'owner', 'downloading_time', 'seeding_time', 'completed', 'seeds_peers_ratio', + 'complete_seen', 'down_limit', 'up_limit', 'shared', 'name', + ] column_name_mapping = { 'downspeed': 'download_speed', 'upspeed': 'upload_speed', @@ -487,7 +495,7 @@ Please use commands from the command line, e.g.:\n 'complete_seen': 'last_seen_complete', 'down_limit': 'max_download_speed', 'up_limit': 'max_upload_speed', - 'downloading_time': 'active_time' + 'downloading_time': 'active_time', } from deluge.ui.console.modes.torrentlist.torrentview import default_columns diff --git a/deluge/ui/console/modes/add_util.py b/deluge/ui/console/modes/add_util.py index 3f5027cee..4fd4702a7 100644 --- a/deluge/ui/console/modes/add_util.py +++ b/deluge/ui/console/modes/add_util.py @@ -81,5 +81,5 @@ def add_torrent(t_file, options, success_cb, fail_cb, ress): filedump = base64.encodestring(_file.read()) client.core.add_torrent_file_async( - filename, filedump, t_options + filename, filedump, t_options, ).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress) diff --git a/deluge/ui/console/modes/basemode.py b/deluge/ui/console/modes/basemode.py index 62b7d6a74..fde6d728b 100644 --- a/deluge/ui/console/modes/basemode.py +++ b/deluge/ui/console/modes/basemode.py @@ -156,8 +156,10 @@ class BaseMode(CursesStdIO, component.Component): return add_string(row, string, screen, self.encoding, **kwargs) - def draw_statusbars(self, top_row=0, bottom_row=-1, topbar=None, bottombar=None, - bottombar_help=True, scr=None): + def draw_statusbars( + self, top_row=0, bottom_row=-1, topbar=None, bottombar=None, + bottombar_help=True, scr=None, + ): self.add_string(top_row, topbar if topbar else self.statusbars.topbar, scr=scr) bottombar = bottombar if bottombar else self.statusbars.bottombar if bottombar_help: @@ -289,10 +291,12 @@ def add_string(row, string, screen, encoding, col=0, pad=True, pad_char=' ', tri screen.addstr(row, col, s, color) except curses.error as ex: import traceback - log.warn('FAILED on call screen.addstr(%s, %s, "%s", %s) - max_y: %s, max_x: %s, ' - 'curses.LINES: %s, curses.COLS: %s, Error: %s, trace:\n%s', - row, col, s, color, max_y, max_x, curses.LINES, curses.COLS, ex, - ''.join(traceback.format_stack(limit=5))) + log.warn( + 'FAILED on call screen.addstr(%s, %s, "%s", %s) - max_y: %s, max_x: %s, ' + 'curses.LINES: %s, curses.COLS: %s, Error: %s, trace:\n%s', + row, col, s, color, max_y, max_x, curses.LINES, curses.COLS, ex, + ''.join(traceback.format_stack(limit=5)), + ) col += len(s) @@ -335,5 +339,7 @@ def move_cursor(screen, row, col): screen.move(row, col) except curses.error as ex: import traceback - log.warn('Error on screen.move(%s, %s): (curses.LINES: %s, curses.COLS: %s) Error: %s\nStack: %s', - row, col, curses.LINES, curses.COLS, ex, ''.join(traceback.format_stack())) + log.warn( + 'Error on screen.move(%s, %s): (curses.LINES: %s, curses.COLS: %s) Error: %s\nStack: %s', + row, col, curses.LINES, curses.COLS, ex, ''.join(traceback.format_stack()), + ) diff --git a/deluge/ui/console/modes/cmdline.py b/deluge/ui/console/modes/cmdline.py index f2fe6e8a4..683f6be17 100644 --- a/deluge/ui/console/modes/cmdline.py +++ b/deluge/ui/console/modes/cmdline.py @@ -130,7 +130,7 @@ class CmdLine(BaseMode, Commander): config_dir = deluge.configmanager.get_config_dir() self.history_file = [ os.path.join(config_dir, 'cmd_line.hist1'), - os.path.join(config_dir, 'cmd_line.hist2') + os.path.join(config_dir, 'cmd_line.hist2'), ] self._hf_lines = [0, 0] if self.console_config['cmdline']['save_command_history']: @@ -645,7 +645,8 @@ class CmdLine(BaseMode, Commander): match = possible_matches[i] self.write(match.replace(r'\ ', ' ')) self.write('{!error!}And %i more (%i/%i). Press <tab> to view more' % ( - left - max_list, hits - 1, pages)) + left - max_list, hits - 1, pages, + )) else: self.tab_count = 0 for match in possible_matches[listed:]: @@ -786,15 +787,18 @@ class CmdLine(BaseMode, Commander): if not empty and torrent_id.startswith(line): # Highlight the matching part text = '{!info!}%s{!input!}%s - "%s"' % ( - torrent_id[:line_len], torrent_id[line_len:], torrent_name) + torrent_id[:line_len], torrent_id[line_len:], torrent_name, + ) possible_matches.append(text) if torrent_name.startswith(line): text = '{!info!}%s{!input!}%s ({!cyan!}%s{!input!})' % ( - escaped_name[:line_len], escaped_name[line_len:], torrent_id) + escaped_name[:line_len], escaped_name[line_len:], torrent_id, + ) possible_matches.append(text) elif torrent_name.lower().startswith(line.lower()): text = '{!info!}%s{!input!}%s ({!cyan!}%s{!input!})' % ( - escaped_name[:line_len], escaped_name[line_len:], torrent_id) + escaped_name[:line_len], escaped_name[line_len:], torrent_id, + ) possible_matches2.append(text) return possible_matches + possible_matches2 diff --git a/deluge/ui/console/modes/connectionmanager.py b/deluge/ui/console/modes/connectionmanager.py index 4157c938f..000360390 100644 --- a/deluge/ui/console/modes/connectionmanager.py +++ b/deluge/ui/console/modes/connectionmanager.py @@ -41,10 +41,12 @@ class ConnectionManager(BaseMode, PopupsHandler): selected_index = self.popup.current_selection() if self.popup else None popup = SelectablePopup( - self, _('Select Host'), self._host_selected, border_off_west=1, active_wrap=True) + self, _('Select Host'), self._host_selected, border_off_west=1, active_wrap=True, + ) popup.add_header( "{!white,black,bold!}'Q'=%s, 'a'=%s, 'D'=%s" % - (_('Quit'), _('Add Host'), _('Delete Host')), space_below=True) + (_('Quit'), _('Add Host'), _('Delete Host')), space_below=True, + ) self.push_popup(popup, clear=True) for host_entry in self.hostlist.get_hosts_info(): @@ -91,8 +93,10 @@ class ConnectionManager(BaseMode, PopupsHandler): if not result or kwargs.get('close', False): self.pop_popup() else: - self.add_host(result['hostname']['value'], result['port']['value'], - result['username']['value'], result['password']['value']) + self.add_host( + result['hostname']['value'], result['port']['value'], + result['username']['value'], result['password']['value'], + ) def add_popup(self): self.inlist = False @@ -101,7 +105,8 @@ class ConnectionManager(BaseMode, PopupsHandler): _('Add Host (Up & Down arrows to navigate, Esc to cancel)'), border_off_north=1, border_off_east=1, - close_cb=self._do_add) + close_cb=self._do_add, + ) popup.add_text_input('hostname', _('Hostname:')) popup.add_text_input('port', _('Port:')) popup.add_text_input('username', _('Username:')) diff --git a/deluge/ui/console/modes/preferences/preference_panes.py b/deluge/ui/console/modes/preferences/preference_panes.py index b1c7894f5..731ac067b 100644 --- a/deluge/ui/console/modes/preferences/preference_panes.py +++ b/deluge/ui/console/modes/preferences/preference_panes.py @@ -158,29 +158,45 @@ class InterfacePane(BasePreferencePane): def create_pane(self, core_conf, console_config): self.add_header(_('General options')) - self.add_checked_input('ring_bell', _('Ring system bell when a download finishes'), - console_config['ring_bell']) + self.add_checked_input( + 'ring_bell', _('Ring system bell when a download finishes'), + console_config['ring_bell'], + ) self.add_header('Console UI', space_above=True) - self.add_checked_input('separate_complete', - _('List complete torrents after incomplete regardless of sorting order'), - console_config['torrentview']['separate_complete']) - self.add_checked_input('move_selection', _('Move selection when moving torrents in the queue'), - console_config['torrentview']['move_selection']) + self.add_checked_input( + 'separate_complete', + _('List complete torrents after incomplete regardless of sorting order'), + console_config['torrentview']['separate_complete'], + ) + self.add_checked_input( + 'move_selection', _('Move selection when moving torrents in the queue'), + console_config['torrentview']['move_selection'], + ) from deluge.ui.translations_util import get_languages langs = get_languages() langs.insert(0, ('', 'System Default')) - self.add_combo_input('language', _('Language'), - langs, default=console_config['language']) + self.add_combo_input( + 'language', _('Language'), + langs, default=console_config['language'], + ) self.add_header(_('Command Line Mode'), space_above=True) - self.add_checked_input('ignore_duplicate_lines', _('Do not store duplicate input in history'), - console_config['cmdline']['ignore_duplicate_lines']) - self.add_checked_input('save_command_history', _('Store and load command line history in command line mode'), - console_config['cmdline']['save_command_history']) + self.add_checked_input( + 'ignore_duplicate_lines', _('Do not store duplicate input in history'), + console_config['cmdline']['ignore_duplicate_lines'], + ) + self.add_checked_input( + 'save_command_history', _('Store and load command line history in command line mode'), + console_config['cmdline']['save_command_history'], + ) self.add_header('') - self.add_checked_input('third_tab_lists_all', _('Third tab lists all remaining torrents in command line mode'), - console_config['cmdline']['third_tab_lists_all']) - self.add_int_spin_input('torrents_per_tab_press', _('Torrents per tab press'), - console_config['cmdline']['torrents_per_tab_press'], min_val=5, max_val=10000) + self.add_checked_input( + 'third_tab_lists_all', _('Third tab lists all remaining torrents in command line mode'), + console_config['cmdline']['third_tab_lists_all'], + ) + self.add_int_spin_input( + 'torrents_per_tab_press', _('Torrents per tab press'), + console_config['cmdline']['torrents_per_tab_press'], min_val=5, max_val=10000, + ) class DownloadsPane(BasePreferencePane): @@ -191,27 +207,45 @@ class DownloadsPane(BasePreferencePane): @overrides(BasePreferencePane) def create_pane(self, core_conf, console_config): self.add_header(_('Folders')) - self.add_text_input('download_location', '%s:' % _('Download To'), core_conf['download_location'], - complete=True, activate_input=True, col='+1') - cmptxt = TextInput(self.preferences, 'move_completed_path', None, self.move, self.pane_width, - core_conf['move_completed_path'], False) - self.add_checkedplus_input('move_completed', '%s:' % _('Move completed to'), - cmptxt, core_conf['move_completed']) - copytxt = TextInput(self.preferences, 'torrentfiles_location', None, self.move, self.pane_width, - core_conf['torrentfiles_location'], False) - self.add_checkedplus_input('copy_torrent_file', '%s:' % _('Copy of .torrent files to'), copytxt, - core_conf['copy_torrent_file']) - self.add_checked_input('del_copy_torrent_file', _('Delete copy of torrent file on remove'), - core_conf['del_copy_torrent_file']) + self.add_text_input( + 'download_location', '%s:' % _('Download To'), core_conf['download_location'], + complete=True, activate_input=True, col='+1', + ) + cmptxt = TextInput( + self.preferences, 'move_completed_path', None, self.move, self.pane_width, + core_conf['move_completed_path'], False, + ) + self.add_checkedplus_input( + 'move_completed', '%s:' % _('Move completed to'), + cmptxt, core_conf['move_completed'], + ) + copytxt = TextInput( + self.preferences, 'torrentfiles_location', None, self.move, self.pane_width, + core_conf['torrentfiles_location'], False, + ) + self.add_checkedplus_input( + 'copy_torrent_file', '%s:' % _('Copy of .torrent files to'), copytxt, + core_conf['copy_torrent_file'], + ) + self.add_checked_input( + 'del_copy_torrent_file', _('Delete copy of torrent file on remove'), + core_conf['del_copy_torrent_file'], + ) self.add_header(_('Options'), space_above=True) - self.add_checked_input('prioritize_first_last_pieces', ('Prioritize first and last pieces of torrent'), - core_conf['prioritize_first_last_pieces']) - self.add_checked_input('sequential_download', _('Sequential download'), - core_conf['sequential_download']) + self.add_checked_input( + 'prioritize_first_last_pieces', ('Prioritize first and last pieces of torrent'), + core_conf['prioritize_first_last_pieces'], + ) + self.add_checked_input( + 'sequential_download', _('Sequential download'), + core_conf['sequential_download'], + ) self.add_checked_input('add_paused', _('Add Paused'), core_conf['add_paused']) - self.add_checked_input('pre_allocate_storage', _('Pre-Allocate disk space'), - core_conf['pre_allocate_storage']) + self.add_checked_input( + 'pre_allocate_storage', _('Pre-Allocate disk space'), + core_conf['pre_allocate_storage'], + ) class NetworkPane(BasePreferencePane): @@ -222,26 +256,38 @@ class NetworkPane(BasePreferencePane): @overrides(BasePreferencePane) def create_pane(self, core_conf, console_config): self.add_header(_('Incomming Ports')) - inrand = self.add_checked_input('random_port', 'Use Random Ports Active Port: %d' - % self.preferences.active_port, - core_conf['random_port']) + inrand = self.add_checked_input( + 'random_port', 'Use Random Ports Active Port: %d' + % self.preferences.active_port, + core_conf['random_port'], + ) listen_ports = core_conf['listen_ports'] - self.infrom = self.add_int_spin_input('listen_ports_from', ' %s:' % _('From'), - value=listen_ports[0], min_val=0, max_val=65535) + self.infrom = self.add_int_spin_input( + 'listen_ports_from', ' %s:' % _('From'), + value=listen_ports[0], min_val=0, max_val=65535, + ) self.infrom.set_depend(inrand, inverse=True) - self.into = self.add_int_spin_input('listen_ports_to', ' %s:' % _('To'), - value=listen_ports[1], min_val=0, max_val=65535) + self.into = self.add_int_spin_input( + 'listen_ports_to', ' %s:' % _('To'), + value=listen_ports[1], min_val=0, max_val=65535, + ) self.into.set_depend(inrand, inverse=True) self.add_header(_('Outgoing Ports'), space_above=True) - outrand = self.add_checked_input('random_outgoing_ports', _('Use Random Ports'), - core_conf['random_outgoing_ports']) + outrand = self.add_checked_input( + 'random_outgoing_ports', _('Use Random Ports'), + core_conf['random_outgoing_ports'], + ) out_ports = core_conf['outgoing_ports'] - self.outfrom = self.add_int_spin_input('out_ports_from', ' %s:' % _('From'), - value=out_ports[0], min_val=0, max_val=65535) + self.outfrom = self.add_int_spin_input( + 'out_ports_from', ' %s:' % _('From'), + value=out_ports[0], min_val=0, max_val=65535, + ) self.outfrom.set_depend(outrand, inverse=True) - self.outto = self.add_int_spin_input('out_ports_to', ' %s:' % _('To'), - value=out_ports[1], min_val=0, max_val=65535) + self.outto = self.add_int_spin_input( + 'out_ports_to', ' %s:' % _('To'), + value=out_ports[1], min_val=0, max_val=65535, + ) self.outto.set_depend(outrand, inverse=True) self.add_header(_('Incoming Interface'), space_above=True) @@ -269,12 +315,18 @@ class NetworkPane(BasePreferencePane): self.add_checked_input('dht', 'DHT', core_conf['dht']) self.add_header(_('Encryption'), space_above=True) - self.add_select_input('enc_in_policy', '%s:' % _('Inbound'), [_('Forced'), _('Enabled'), _('Disabled')], - [0, 1, 2], core_conf['enc_in_policy'], active_default=True, col='+1') - self.add_select_input('enc_out_policy', '%s:' % _('Outbound'), [_('Forced'), _('Enabled'), _('Disabled')], - [0, 1, 2], core_conf['enc_out_policy'], active_default=True) - self.add_select_input('enc_level', '%s:' % _('Level'), [_('Handshake'), _('Full Stream'), _('Either')], - [0, 1, 2], core_conf['enc_level'], active_default=True) + self.add_select_input( + 'enc_in_policy', '%s:' % _('Inbound'), [_('Forced'), _('Enabled'), _('Disabled')], + [0, 1, 2], core_conf['enc_in_policy'], active_default=True, col='+1', + ) + self.add_select_input( + 'enc_out_policy', '%s:' % _('Outbound'), [_('Forced'), _('Enabled'), _('Disabled')], + [0, 1, 2], core_conf['enc_out_policy'], active_default=True, + ) + self.add_select_input( + 'enc_level', '%s:' % _('Level'), [_('Handshake'), _('Full Stream'), _('Either')], + [0, 1, 2], core_conf['enc_level'], active_default=True, + ) class BandwidthPane(BasePreferencePane): @@ -285,31 +337,55 @@ class BandwidthPane(BasePreferencePane): @overrides(BasePreferencePane) def create_pane(self, core_conf, console_config): self.add_header(_('Global Bandwidth Usage')) - self.add_int_spin_input('max_connections_global', '%s:' % _('Maximum Connections'), - core_conf['max_connections_global'], min_val=-1, max_val=9000) - self.add_int_spin_input('max_upload_slots_global', '%s:' % _('Maximum Upload Slots'), - core_conf['max_upload_slots_global'], min_val=-1, max_val=9000) - self.add_float_spin_input('max_download_speed', '%s:' % _('Maximum Download Speed (KiB/s)'), - core_conf['max_download_speed'], min_val=-1.0, max_val=60000.0) - self.add_float_spin_input('max_upload_speed', '%s:' % _('Maximum Upload Speed (KiB/s)'), - core_conf['max_upload_speed'], min_val=-1.0, max_val=60000.0) - self.add_int_spin_input('max_half_open_connections', '%s:' % _('Maximum Half-Open Connections'), - core_conf['max_half_open_connections'], min_val=-1, max_val=9999) - self.add_int_spin_input('max_connections_per_second', '%s:' % _('Maximum Connection Attempts per Second'), - core_conf['max_connections_per_second'], min_val=-1, max_val=9999) - self.add_checked_input('ignore_limits_on_local_network', _('Ignore limits on local network'), - core_conf['ignore_limits_on_local_network']) - self.add_checked_input('rate_limit_ip_overhead', _('Rate Limit IP Overhead'), - core_conf['rate_limit_ip_overhead']) + self.add_int_spin_input( + 'max_connections_global', '%s:' % _('Maximum Connections'), + core_conf['max_connections_global'], min_val=-1, max_val=9000, + ) + self.add_int_spin_input( + 'max_upload_slots_global', '%s:' % _('Maximum Upload Slots'), + core_conf['max_upload_slots_global'], min_val=-1, max_val=9000, + ) + self.add_float_spin_input( + 'max_download_speed', '%s:' % _('Maximum Download Speed (KiB/s)'), + core_conf['max_download_speed'], min_val=-1.0, max_val=60000.0, + ) + self.add_float_spin_input( + 'max_upload_speed', '%s:' % _('Maximum Upload Speed (KiB/s)'), + core_conf['max_upload_speed'], min_val=-1.0, max_val=60000.0, + ) + self.add_int_spin_input( + 'max_half_open_connections', '%s:' % _('Maximum Half-Open Connections'), + core_conf['max_half_open_connections'], min_val=-1, max_val=9999, + ) + self.add_int_spin_input( + 'max_connections_per_second', '%s:' % _('Maximum Connection Attempts per Second'), + core_conf['max_connections_per_second'], min_val=-1, max_val=9999, + ) + self.add_checked_input( + 'ignore_limits_on_local_network', _('Ignore limits on local network'), + core_conf['ignore_limits_on_local_network'], + ) + self.add_checked_input( + 'rate_limit_ip_overhead', _('Rate Limit IP Overhead'), + core_conf['rate_limit_ip_overhead'], + ) self.add_header(_('Per Torrent Bandwidth Usage'), space_above=True) - self.add_int_spin_input('max_connections_per_torrent', '%s:' % _('Maximum Connections'), - core_conf['max_connections_per_torrent'], min_val=-1, max_val=9000) - self.add_int_spin_input('max_upload_slots_per_torrent', '%s:' % _('Maximum Upload Slots'), - core_conf['max_upload_slots_per_torrent'], min_val=-1, max_val=9000) - self.add_float_spin_input('max_download_speed_per_torrent', '%s:' % _('Maximum Download Speed (KiB/s)'), - core_conf['max_download_speed_per_torrent'], min_val=-1.0, max_val=60000.0) - self.add_float_spin_input('max_upload_speed_per_torrent', '%s:' % _('Maximum Upload Speed (KiB/s)'), - core_conf['max_upload_speed_per_torrent'], min_val=-1.0, max_val=60000.0) + self.add_int_spin_input( + 'max_connections_per_torrent', '%s:' % _('Maximum Connections'), + core_conf['max_connections_per_torrent'], min_val=-1, max_val=9000, + ) + self.add_int_spin_input( + 'max_upload_slots_per_torrent', '%s:' % _('Maximum Upload Slots'), + core_conf['max_upload_slots_per_torrent'], min_val=-1, max_val=9000, + ) + self.add_float_spin_input( + 'max_download_speed_per_torrent', '%s:' % _('Maximum Download Speed (KiB/s)'), + core_conf['max_download_speed_per_torrent'], min_val=-1.0, max_val=60000.0, + ) + self.add_float_spin_input( + 'max_upload_speed_per_torrent', '%s:' % _('Maximum Upload Speed (KiB/s)'), + core_conf['max_upload_speed_per_torrent'], min_val=-1.0, max_val=60000.0, + ) class OtherPane(BasePreferencePane): @@ -336,13 +412,17 @@ class DaemonPane(BasePreferencePane): @overrides(BasePreferencePane) def create_pane(self, core_conf, console_config): self.add_header('Port') - self.add_int_spin_input('daemon_port', '%s:' % _('Daemon Port'), core_conf['daemon_port'], - min_val=0, max_val=65535) + self.add_int_spin_input( + 'daemon_port', '%s:' % _('Daemon Port'), core_conf['daemon_port'], + min_val=0, max_val=65535, + ) self.add_header('Connections', space_above=True) self.add_checked_input('allow_remote', _('Allow remote connections'), core_conf['allow_remote']) self.add_header('Other', space_above=True) - self.add_checked_input('new_release_check', _('Periodically check the website for new releases'), - core_conf['new_release_check']) + self.add_checked_input( + 'new_release_check', _('Periodically check the website for new releases'), + core_conf['new_release_check'], + ) class QueuePane(BasePreferencePane): @@ -355,29 +435,51 @@ class QueuePane(BasePreferencePane): self.add_header(_('New Torrents')) self.add_checked_input('queue_new_to_top', _('Queue to top'), core_conf['queue_new_to_top']) self.add_header(_('Active Torrents'), True) - self.add_int_spin_input('max_active_limit', '%s:' % _('Total'), core_conf['max_active_limit'], - min_val=-1, max_val=9999) - self.add_int_spin_input('max_active_downloading', '%s:' % _('Downloading'), - core_conf['max_active_downloading'], min_val=-1, max_val=9999) - self.add_int_spin_input('max_active_seeding', '%s:' % _('Seeding'), - core_conf['max_active_seeding'], min_val=-1, max_val=9999) - self.add_checked_input('dont_count_slow_torrents', 'Ignore slow torrents', - core_conf['dont_count_slow_torrents']) - self.add_checked_input('auto_manage_prefer_seeds', 'Prefer seeding torrents', - core_conf['auto_manage_prefer_seeds']) + self.add_int_spin_input( + 'max_active_limit', '%s:' % _('Total'), core_conf['max_active_limit'], + min_val=-1, max_val=9999, + ) + self.add_int_spin_input( + 'max_active_downloading', '%s:' % _('Downloading'), + core_conf['max_active_downloading'], min_val=-1, max_val=9999, + ) + self.add_int_spin_input( + 'max_active_seeding', '%s:' % _('Seeding'), + core_conf['max_active_seeding'], min_val=-1, max_val=9999, + ) + self.add_checked_input( + 'dont_count_slow_torrents', 'Ignore slow torrents', + core_conf['dont_count_slow_torrents'], + ) + self.add_checked_input( + 'auto_manage_prefer_seeds', 'Prefer seeding torrents', + core_conf['auto_manage_prefer_seeds'], + ) self.add_header(_('Seeding Rotation'), space_above=True) - self.add_float_spin_input('share_ratio_limit', '%s:' % _('Share Ratio'), - core_conf['share_ratio_limit'], precision=2, min_val=-1.0, max_val=100.0) - self.add_float_spin_input('seed_time_ratio_limit', '%s:' % _('Time Ratio'), - core_conf['seed_time_ratio_limit'], precision=2, min_val=-1.0, max_val=100.0) - self.add_int_spin_input('seed_time_limit', '%s:' % _('Time (m)'), core_conf['seed_time_limit'], - min_val=1, max_val=10000) - seedratio = FloatSpinInput(self.mode, 'stop_seed_ratio', '', self.move, core_conf['stop_seed_ratio'], - precision=2, inc_amt=0.1, min_val=0.5, max_val=100.0) - self.add_checkedplus_input('stop_seed_at_ratio', '%s:' % _('Share Ratio Reached'), seedratio, - core_conf['stop_seed_at_ratio']) - self.add_checked_input('remove_seed_at_ratio', _('Remove torrent (Unchecked pauses torrent)'), - core_conf['remove_seed_at_ratio']) + self.add_float_spin_input( + 'share_ratio_limit', '%s:' % _('Share Ratio'), + core_conf['share_ratio_limit'], precision=2, min_val=-1.0, max_val=100.0, + ) + self.add_float_spin_input( + 'seed_time_ratio_limit', '%s:' % _('Time Ratio'), + core_conf['seed_time_ratio_limit'], precision=2, min_val=-1.0, max_val=100.0, + ) + self.add_int_spin_input( + 'seed_time_limit', '%s:' % _('Time (m)'), core_conf['seed_time_limit'], + min_val=1, max_val=10000, + ) + seedratio = FloatSpinInput( + self.mode, 'stop_seed_ratio', '', self.move, core_conf['stop_seed_ratio'], + precision=2, inc_amt=0.1, min_val=0.5, max_val=100.0, + ) + self.add_checkedplus_input( + 'stop_seed_at_ratio', '%s:' % _('Share Ratio Reached'), seedratio, + core_conf['stop_seed_at_ratio'], + ) + self.add_checked_input( + 'remove_seed_at_ratio', _('Remove torrent (Unchecked pauses torrent)'), + core_conf['remove_seed_at_ratio'], + ) class ProxyPane(BasePreferencePane): @@ -408,7 +510,7 @@ class ProxyPane(BasePreferencePane): ' 0: None 1: Socks4\n' ' 2: Socks5 3: Socks5 Auth\n' ' 4: HTTP 5: HTTP Auth\n' - ' 6: I2P' + ' 6: I2P', ) @@ -425,31 +527,49 @@ class CachePane(BasePreferencePane): def build_pane(self, core_conf, status): self.created = True self.add_header(_('Settings'), space_below=True) - self.add_int_spin_input('cache_size', - '%s:' % _('Cache Size (16 KiB blocks)'), core_conf['cache_size'], - min_val=0, max_val=99999) - self.add_int_spin_input('cache_expiry', - '%s:' % _('Cache Expiry (seconds)'), core_conf['cache_expiry'], - min_val=1, max_val=32000) + self.add_int_spin_input( + 'cache_size', + '%s:' % _('Cache Size (16 KiB blocks)'), core_conf['cache_size'], + min_val=0, max_val=99999, + ) + self.add_int_spin_input( + 'cache_expiry', + '%s:' % _('Cache Expiry (seconds)'), core_conf['cache_expiry'], + min_val=1, max_val=32000, + ) self.add_header(' %s' % _('Write'), space_above=True) self.add_info_field('blocks_written', ' %s:' % _('Blocks Written'), status['disk.num_blocks_written']) self.add_info_field('writes', ' %s:' % _('Writes'), status['disk.num_write_ops']) - self.add_info_field('write_hit_ratio', - ' %s:' % _('Write Cache Hit Ratio'), '%.2f' % status['write_hit_ratio']) + self.add_info_field( + 'write_hit_ratio', + ' %s:' % _('Write Cache Hit Ratio'), '%.2f' % status['write_hit_ratio'], + ) self.add_header(' %s' % _('Read')) - self.add_info_field('blocks_read', - ' %s:' % _('Blocks Read'), status['disk.num_blocks_read']) - self.add_info_field('blocks_read_hit', - ' %s:' % _('Blocks Read hit'), status['disk.num_blocks_cache_hits']) - self.add_info_field('reads', - ' %s:' % _('Reads'), status['disk.num_read_ops']) - self.add_info_field('read_hit_ratio', - ' %s:' % _('Read Cache Hit Ratio'), '%.2f' % status['read_hit_ratio']) + self.add_info_field( + 'blocks_read', + ' %s:' % _('Blocks Read'), status['disk.num_blocks_read'], + ) + self.add_info_field( + 'blocks_read_hit', + ' %s:' % _('Blocks Read hit'), status['disk.num_blocks_cache_hits'], + ) + self.add_info_field( + 'reads', + ' %s:' % _('Reads'), status['disk.num_read_ops'], + ) + self.add_info_field( + 'read_hit_ratio', + ' %s:' % _('Read Cache Hit Ratio'), '%.2f' % status['read_hit_ratio'], + ) self.add_header(' %s' % _('Size')) - self.add_info_field('cache_size_info', - ' %s:' % _('Cache Size'), status['disk.disk_blocks_in_use']) - self.add_info_field('read_cache_size', - ' %s:' % _('Read Cache Size'), status['disk.read_cache_blocks']) + self.add_info_field( + 'cache_size_info', + ' %s:' % _('Cache Size'), status['disk.disk_blocks_in_use'], + ) + self.add_info_field( + 'read_cache_size', + ' %s:' % _('Read Cache Size'), status['disk.read_cache_blocks'], + ) @overrides(BasePreferencePane) def update(self, active): diff --git a/deluge/ui/console/modes/preferences/preferences.py b/deluge/ui/console/modes/preferences/preferences.py index c64e5b2d2..cad497b85 100644 --- a/deluge/ui/console/modes/preferences/preferences.py +++ b/deluge/ui/console/modes/preferences/preferences.py @@ -76,11 +76,15 @@ class PreferenceSidebar(Sidebar): def __init__(self, torrentview, width): height = curses.LINES - 2 Sidebar.__init__(self, torrentview, width, height, title=None, border_off_north=1) - self.categories = [_('Interface'), _('Downloads'), _('Network'), _('Bandwidth'), - _('Other'), _('Daemon'), _('Queue'), _('Proxy'), _('Cache')] + self.categories = [ + _('Interface'), _('Downloads'), _('Network'), _('Bandwidth'), + _('Other'), _('Daemon'), _('Queue'), _('Proxy'), _('Cache'), + ] for name in self.categories: - self.add_text_field(name, name, selectable=True, font_unfocused_active='bold', - color_unfocused_active='white,black') + self.add_text_field( + name, name, selectable=True, font_unfocused_active='bold', + color_unfocused_active='white,black', + ) def on_resize(self): self.resize_window(curses.LINES - 2, self.width) @@ -116,7 +120,7 @@ class Preferences(BaseMode, PopupsHandler): DaemonPane(self), QueuePane(self), ProxyPane(self), - CachePane(self) + CachePane(self), ] self.action_input = SelectInput(self, None, None, [_('Cancel'), _('Apply'), _('OK')], [0, 1, 2], 0) @@ -163,8 +167,10 @@ class Preferences(BaseMode, PopupsHandler): def _draw_actions(self): selected = self.active_zone == ZONE.ACTIONS self.stdscr.hline(self.rows - 3, self.sidebar_width, '_', self.cols) - self.action_input.render(self.stdscr, self.rows - 2, width=self.cols, - active=selected, focus=True, col=self.cols - 22) + self.action_input.render( + self.stdscr, self.rows - 2, width=self.cols, + active=selected, focus=True, col=self.cols - 22, + ) @overrides(BaseMode) def on_resize(self, rows, cols): @@ -254,8 +260,10 @@ class Preferences(BaseMode, PopupsHandler): didupdate = update_conf_value(k, new_console_config, self.console_config, didupdate) for k in ['separate_complete', 'move_selection']: didupdate = update_conf_value(k, new_console_config, self.console_config['torrentview'], didupdate) - for k in ['ignore_duplicate_lines', 'save_command_history', - 'third_tab_lists_all', 'torrents_per_tab_press']: + for k in [ + 'ignore_duplicate_lines', 'save_command_history', + 'third_tab_lists_all', 'torrents_per_tab_press', + ]: didupdate = update_conf_value(k, new_console_config, self.console_config['cmdline'], didupdate) if didupdate: diff --git a/deluge/ui/console/modes/torrentdetail.py b/deluge/ui/console/modes/torrentdetail.py index 86f54f8a2..9316585ad 100644 --- a/deluge/ui/console/modes/torrentdetail.py +++ b/deluge/ui/console/modes/torrentdetail.py @@ -73,13 +73,15 @@ class TorrentDetail(BaseMode, PopupsHandler): self.parent_mode = parent_mode self.torrentid = None self.torrent_state = None - self._status_keys = ['files', 'name', 'state', 'download_payload_rate', 'upload_payload_rate', - 'progress', 'eta', 'all_time_download', 'total_uploaded', 'ratio', - 'num_seeds', 'total_seeds', 'num_peers', 'total_peers', 'active_time', - 'seeding_time', 'time_added', 'distributed_copies', 'num_pieces', - 'piece_length', 'download_location', 'file_progress', 'file_priorities', 'message', - 'total_wanted', 'tracker_host', 'owner', 'seed_rank', 'last_seen_complete', - 'completed_time', 'time_since_transfer'] + self._status_keys = [ + 'files', 'name', 'state', 'download_payload_rate', 'upload_payload_rate', + 'progress', 'eta', 'all_time_download', 'total_uploaded', 'ratio', + 'num_seeds', 'total_seeds', 'num_peers', 'total_peers', 'active_time', + 'seeding_time', 'time_added', 'distributed_copies', 'num_pieces', + 'piece_length', 'download_location', 'file_progress', 'file_priorities', 'message', + 'total_wanted', 'tracker_host', 'owner', 'seed_rank', 'last_seen_complete', + 'completed_time', 'time_since_transfer', + ] self.file_list = None self.current_file = None self.current_file_idx = 0 @@ -121,8 +123,10 @@ class TorrentDetail(BaseMode, PopupsHandler): self.set_torrent_id(torrentid) if self.torrentid: - component.get('SessionProxy').get_torrent_status(self.torrentid, - self._status_keys).addCallback(self.set_state) + component.get('SessionProxy').get_torrent_status( + self.torrentid, + self._status_keys, + ).addCallback(self.set_state) @overrides(BaseMode) def pause(self): @@ -141,16 +145,19 @@ class TorrentDetail(BaseMode, PopupsHandler): def set_state(self, state): if state.get('files'): - self.full_names = dict([(x['index'], x['path']) for x in state['files']]) + self.full_names = {x['index']: x['path'] for x in state['files']} need_prio_update = False if not self.file_list: # don't keep getting the files once we've got them once if state.get('files'): self.files_sep = '{!green,black,bold,underline!}%s' % ( - ('Files (torrent has %d files)' % len(state['files'])).center(self.cols)) - self.file_list, self.file_dict = self.build_file_list(state['files'], state['file_progress'], - state['file_priorities']) + ('Files (torrent has %d files)' % len(state['files'])).center(self.cols) + ) + self.file_list, self.file_dict = self.build_file_list( + state['files'], state['file_progress'], + state['file_priorities'], + ) else: self.files_sep = '{!green,black,bold,underline!}%s' % (('Files (File list unknown)').center(self.cols)) need_prio_update = True @@ -193,8 +200,10 @@ class TorrentDetail(BaseMode, PopupsHandler): child_list = [] if path == paths[-1]: file_progress = format_progress(progress[torrent_file['index']] * 100) - entry = [path, torrent_file['index'], torrent_file['size'], child_list, - False, file_progress, priority[torrent_file['index']]] + entry = [ + path, torrent_file['index'], torrent_file['size'], child_list, + False, file_progress, priority[torrent_file['index']], + ] file_dict[torrent_file['index']] = entry else: entry = [path, dir_idx, -1, child_list, False, 0, -1] @@ -249,7 +258,7 @@ class TorrentDetail(BaseMode, PopupsHandler): def __update_columns(self): self.column_widths = [-1, 15, 15, 20] - req = sum([col_width for col_width in self.column_widths if col_width >= 0]) + req = sum(col_width for col_width in self.column_widths if col_width >= 0) if req > self.cols: # can't satisfy requests, just spread out evenly cw = self.cols // len(self.column_names) for i in range(0, len(self.column_widths)): @@ -262,8 +271,12 @@ class TorrentDetail(BaseMode, PopupsHandler): if self.column_widths[i] < 0: self.column_widths[i] = vw - self.column_string = '{!green,black,bold!}%s' % (''.join(['%s%s' % (self.column_names[i], ' ' * ( - self.column_widths[i] - len(self.column_names[i]))) for i in range(0, len(self.column_names))])) + self.column_string = '{!green,black,bold!}%s' % ( + ''.join(['%s%s' % ( + self.column_names[i], ' ' * ( + self.column_widths[i] - len(self.column_names[i]) + ), + ) for i in range(0, len(self.column_names))])) def _on_torrentremoved_event(self, torrent_id): if torrent_id == self.torrentid: @@ -273,7 +286,8 @@ class TorrentDetail(BaseMode, PopupsHandler): if torrent_id == self.torrentid: self.file_dict[index][0] = new_name.split('/')[-1] component.get('SessionProxy').get_torrent_status( - self.torrentid, self._status_keys).addCallback(self.set_state) + self.torrentid, self._status_keys, + ).addCallback(self.set_state) def _on_torrentfolderrenamed_event(self, torrent_id, old_folder, new_folder): if torrent_id == self.torrentid: @@ -289,7 +303,8 @@ class TorrentDetail(BaseMode, PopupsHandler): # self.__get_file_by_name(old_folder, self.file_list)[0] = new_folder.strip('/') component.get('SessionProxy').get_torrent_status( - self.torrentid, self._status_keys).addCallback(self.set_state) + self.torrentid, self._status_keys, + ).addCallback(self.set_state) def draw_files(self, files, depth, off, idx): @@ -318,7 +333,7 @@ class TorrentDetail(BaseMode, PopupsHandler): 4: 'white', # Normal 5: 'green', 6: 'green', - 7: 'green' # High + 7: 'green', # High } fg = priority_fg_color[fl[6]] @@ -359,10 +374,14 @@ class TorrentDetail(BaseMode, PopupsHandler): else: # file xchar = '-' - r = format_row(['%s%s %s' % (' ' * depth, xchar, fl[0]), - fsize(fl[2]), fl[5], - format_priority(fl[6])], - self.column_widths) + r = format_row( + [ + '%s%s %s' % (' ' * depth, xchar, fl[0]), + fsize(fl[2]), fl[5], + format_priority(fl[6]), + ], + self.column_widths, + ) self.add_string(off, '%s%s' % (color_string, r), trim=False) off += 1 @@ -419,8 +438,10 @@ class TorrentDetail(BaseMode, PopupsHandler): download_color = colors.state_color['Downloading'] def add_field(name, row, pre_color='{!info!}', post_color='{!input!}'): - s = '%s%s: %s%s' % (pre_color, torrent_data_fields[name]['name'], - post_color, get_column_value(name, status)) + s = '%s%s: %s%s' % ( + pre_color, torrent_data_fields[name]['name'], + post_color, get_column_value(name, status), + ) if row: row = self.add_string(row, s) return row @@ -449,22 +470,28 @@ class TorrentDetail(BaseMode, PopupsHandler): row = self.add_string(row, s) # Seed/peer info - s = '{!info!}%s:{!green!} %s {!input!}(%s)' % (torrent_data_fields['seeds']['name'], - status['num_seeds'], status['total_seeds']) + s = '{!info!}%s:{!green!} %s {!input!}(%s)' % ( + torrent_data_fields['seeds']['name'], + status['num_seeds'], status['total_seeds'], + ) row = self.add_string(row, s) - s = '{!info!}%s:{!red!} %s {!input!}(%s)' % (torrent_data_fields['peers']['name'], - status['num_peers'], status['total_peers']) + s = '{!info!}%s:{!red!} %s {!input!}(%s)' % ( + torrent_data_fields['peers']['name'], + status['num_peers'], status['total_peers'], + ) row = self.add_string(row, s) # Tracker tracker_color = '{!green!}' if status['message'] == 'OK' else '{!red!}' s = '{!info!}%s: {!magenta!}%s{!input!} says "%s%s{!input!}"' % ( - torrent_data_fields['tracker']['name'], status['tracker_host'], tracker_color, status['message']) + torrent_data_fields['tracker']['name'], status['tracker_host'], tracker_color, status['message'], + ) row = self.add_string(row, s) # Pieces and availability s = '{!info!}%s: {!yellow!}%s {!input!}x {!yellow!}%s' % ( - torrent_data_fields['pieces']['name'], status['num_pieces'], fsize(status['piece_length'])) + torrent_data_fields['pieces']['name'], status['num_pieces'], fsize(status['piece_length']), + ) if status['distributed_copies']: s += '{!info!}%s: {!input!}%s' % (torrent_data_fields['seed_rank']['name'], status['seed_rank']) row = self.add_string(row, s) @@ -588,14 +615,22 @@ class TorrentDetail(BaseMode, PopupsHandler): if self.marked: popup = SelectablePopup(self, 'Set File Priority', popup_func, border_off_north=1) - popup.add_line('ignore_priority', '_Ignore', - cb_arg=FILE_PRIORITY['Ignore'], foreground='red') - popup.add_line('low_priority', '_Low Priority', - cb_arg=FILE_PRIORITY['Low Priority'], foreground='yellow') - popup.add_line('normal_priority', '_Normal Priority', - cb_arg=FILE_PRIORITY['Normal Priority']) - popup.add_line('high_priority', '_High Priority', - cb_arg=FILE_PRIORITY['High Priority'], foreground='green') + popup.add_line( + 'ignore_priority', '_Ignore', + cb_arg=FILE_PRIORITY['Ignore'], foreground='red', + ) + popup.add_line( + 'low_priority', '_Low Priority', + cb_arg=FILE_PRIORITY['Low Priority'], foreground='yellow', + ) + popup.add_line( + 'normal_priority', '_Normal Priority', + cb_arg=FILE_PRIORITY['Normal Priority'], + ) + popup.add_line( + 'high_priority', '_High Priority', + cb_arg=FILE_PRIORITY['High Priority'], foreground='green', + ) popup._selected = 1 self.push_popup(popup) @@ -770,9 +805,11 @@ class TorrentDetail(BaseMode, PopupsHandler): def _show_rename_popup(self): # Perhaps in the future: Renaming multiple files if self.marked: - self.report_message('Error (Enter to close)', - 'Sorry, you cannot rename multiple files, please clear ' - 'selection with {!info!}"c"{!normal!} key') + self.report_message( + 'Error (Enter to close)', + 'Sorry, you cannot rename multiple files, please clear ' + 'selection with {!info!}"c"{!normal!} key', + ) else: _file = self.__get_file_by_num(self.current_file_idx, self.file_list) old_filename = _file[0] diff --git a/deluge/ui/console/modes/torrentlist/add_torrents_popup.py b/deluge/ui/console/modes/torrentlist/add_torrents_popup.py index 44d31f91e..3cc7ee253 100644 --- a/deluge/ui/console/modes/torrentlist/add_torrents_popup.py +++ b/deluge/ui/console/modes/torrentlist/add_torrents_popup.py @@ -61,15 +61,19 @@ def show_torrent_add_popup(torrentlist): torrentlist.report_message('Error', '{!error!}Invalid URL or magnet link: %s' % url) return - log.debug('Adding Torrent(s): %s (dl path: %s) (paused: %d)', - url, data['path']['value'], data['add_paused']['value']) + log.debug( + 'Adding Torrent(s): %s (dl path: %s) (paused: %d)', + url, data['path']['value'], data['add_paused']['value'], + ) def show_add_url_popup(): add_paused = 1 if 'add_paused' in torrentlist.coreconfig else 0 popup = InputPopup(torrentlist, 'Add Torrent (Esc to cancel)', close_cb=do_add_from_url) popup.add_text_input('url', 'Enter torrent URL or Magnet link:') - popup.add_text_input('path', 'Enter save path:', torrentlist.coreconfig.get('download_location', ''), - complete=True) + popup.add_text_input( + 'path', 'Enter save path:', torrentlist.coreconfig.get('download_location', ''), + complete=True, + ) popup.add_select_input('add_paused', 'Add Paused:', ['Yes', 'No'], [True, False], add_paused) torrentlist.push_popup(popup) diff --git a/deluge/ui/console/modes/torrentlist/filtersidebar.py b/deluge/ui/console/modes/torrentlist/filtersidebar.py index 62272bfdd..49e26ed89 100644 --- a/deluge/ui/console/modes/torrentlist/filtersidebar.py +++ b/deluge/ui/console/modes/torrentlist/filtersidebar.py @@ -33,8 +33,10 @@ class FilterSidebar(Sidebar, Component): self.config = config height = curses.LINES - 2 width = self.config['torrentview']['sidebar_width'] - Sidebar.__init__(self, torrentlist, width, height, title=' Filter ', border_off_north=1, - allow_resize=True) + Sidebar.__init__( + self, torrentlist, width, height, title=' Filter ', border_off_north=1, + allow_resize=True, + ) Component.__init__(self, 'FilterSidebar') self.checked_index = 0 kwargs = {'checked_char': '*', 'unchecked_char': '-', 'checkbox_format': ' %s ', 'col': 0} diff --git a/deluge/ui/console/modes/torrentlist/queue_mode.py b/deluge/ui/console/modes/torrentlist/queue_mode.py index 42d138cc7..9a98e86c3 100644 --- a/deluge/ui/console/modes/torrentlist/queue_mode.py +++ b/deluge/ui/console/modes/torrentlist/queue_mode.py @@ -20,10 +20,12 @@ try: except ImportError: pass -key_to_action = {curses.KEY_HOME: ACTION.QUEUE_TOP, - curses.KEY_UP: ACTION.QUEUE_UP, - curses.KEY_DOWN: ACTION.QUEUE_DOWN, - curses.KEY_END: ACTION.QUEUE_BOTTOM} +key_to_action = { + curses.KEY_HOME: ACTION.QUEUE_TOP, + curses.KEY_UP: ACTION.QUEUE_UP, + curses.KEY_DOWN: ACTION.QUEUE_DOWN, + curses.KEY_END: ACTION.QUEUE_BOTTOM, +} QUEUE_MODE_HELP_STR = """ Change queue position of selected torrents diff --git a/deluge/ui/console/modes/torrentlist/search_mode.py b/deluge/ui/console/modes/torrentlist/search_mode.py index 2196b78c7..f28bf75cb 100644 --- a/deluge/ui/console/modes/torrentlist/search_mode.py +++ b/deluge/ui/console/modes/torrentlist/search_mode.py @@ -43,7 +43,7 @@ SEARCH_FORMAT = { SEARCH_FAILING: '{!black,white!}Search torrents: {!black,red!}%s{!black,white!}', SEARCH_START_REACHED: '{!black,white!}Search torrents: {!black,yellow!}%s{!black,white!} (start reached)', - SEARCH_END_REACHED: '{!black,white!}Search torrents: {!black,yellow!}%s{!black,white!} (end reached)' + SEARCH_END_REACHED: '{!black,white!}Search torrents: {!black,yellow!}%s{!black,white!} (end reached)', } diff --git a/deluge/ui/console/modes/torrentlist/torrentactions.py b/deluge/ui/console/modes/torrentlist/torrentactions.py index 52baa56f7..53b12fc91 100644 --- a/deluge/ui/console/modes/torrentlist/torrentactions.py +++ b/deluge/ui/console/modes/torrentlist/torrentactions.py @@ -28,13 +28,17 @@ log = logging.getLogger(__name__) torrent_options = [ 'max_download_speed', 'max_upload_speed', 'max_connections', 'max_upload_slots', 'prioritize_first_last', 'sequential_download', 'is_auto_managed', 'stop_at_ratio', - 'stop_ratio', 'remove_at_ratio', 'move_completed', 'move_completed_path'] + 'stop_ratio', 'remove_at_ratio', 'move_completed', 'move_completed_path', +] def action_error(error, mode): rerr = error.value - mode.report_message('An Error Occurred', '%s got error %s: %s' % ( - rerr.method, rerr.exception_type, rerr.exception_msg)) + mode.report_message( + 'An Error Occurred', '%s got error %s: %s' % ( + rerr.method, rerr.exception_type, rerr.exception_msg, + ), + ) mode.refresh() @@ -85,12 +89,16 @@ def action_remove(mode=None, torrent_ids=None, **kwargs): rem_msg += '\n {!red!}And %i more' % (len(status) - show_max) break - popup = InputPopup(mode, '(Esc to cancel, Enter to remove)', close_cb=do_remove, - border_off_west=1, border_off_north=1) + popup = InputPopup( + mode, '(Esc to cancel, Enter to remove)', close_cb=do_remove, + border_off_west=1, border_off_north=1, + ) popup.add_text(rem_msg) popup.add_spaces(1) - popup.add_select_input('remove_files', '{!info!}Torrent files:', - ['Keep', 'Remove'], [False, True], False) + popup.add_select_input( + 'remove_files', '{!info!}Torrent files:', + ['Keep', 'Remove'], [False, True], False, + ) mode.push_popup(popup) defer.DeferredList(callbacks).addCallback(remove_dialog) @@ -125,9 +133,11 @@ def action_torrent_info(mode=None, torrent_ids=None, **kwargs): if kwargs.get('close', False): mode.pop_popup() return True - option_popup = InputPopup(mode, ' Set Torrent Options ', close_cb=cb, - border_off_west=1, border_off_north=1, - base_popup=kwargs.get('base_popup', None)) + option_popup = InputPopup( + mode, ' Set Torrent Options ', close_cb=cb, + border_off_west=1, border_off_north=1, + base_popup=kwargs.get('base_popup', None), + ) for field in torrent_options: caption = '{!info!}' + TORRENT_DATA_FIELD[field]['name'] value = options[field] @@ -182,8 +192,10 @@ def torrent_action(action, *args, **kwargs): return True if os.path.exists(res['path']['value']) and not os.path.isdir(res['path']['value']): - mode.report_message('Cannot Move Download Folder', - '{!error!}%s exists and is not a directory' % res['path']['value']) + mode.report_message( + 'Cannot Move Download Folder', + '{!error!}%s exists and is not a directory' % res['path']['value'], + ) else: log.debug('Moving %s to: %s', torrent_ids, res['path']['value']) client.core.move_storage(torrent_ids, res['path']['value']).addErrback(action_error, mode) @@ -218,10 +230,12 @@ def torrent_actions_popup(mode, torrent_ids, details=False, action=None, close_c torrent_action(action, mode=mode, torrent_ids=torrent_ids) return - popup = SelectablePopup(mode, 'Torrent Actions', torrent_action, - cb_args={'mode': mode, 'torrent_ids': torrent_ids}, - close_cb=close_cb, border_off_north=1, - border_off_west=1, border_off_east=1) + popup = SelectablePopup( + mode, 'Torrent Actions', torrent_action, + cb_args={'mode': mode, 'torrent_ids': torrent_ids}, + close_cb=close_cb, border_off_north=1, + border_off_west=1, border_off_east=1, + ) popup.add_line(ACTION.PAUSE, '_Pause') popup.add_line(ACTION.RESUME, '_Resume') if details: diff --git a/deluge/ui/console/modes/torrentlist/torrentlist.py b/deluge/ui/console/modes/torrentlist/torrentlist.py index 52239a867..0af01a633 100644 --- a/deluge/ui/console/modes/torrentlist/torrentlist.py +++ b/deluge/ui/console/modes/torrentlist/torrentlist.py @@ -115,8 +115,10 @@ class TorrentList(BaseMode, PopupsHandler): self.coreconfig = self.consoleui.coreconfig self.config = self.consoleui.config self.sidebar = FilterSidebar(self, self.config) - self.torrentview_panel = mkwin(curses.COLOR_GREEN, curses.LINES - 1, - curses.COLS - self.sidebar.width, 0, self.sidebar.width) + self.torrentview_panel = mkwin( + curses.COLOR_GREEN, curses.LINES - 1, + curses.COLS - self.sidebar.width, 0, self.sidebar.width, + ) self.torrentview = torrentview.TorrentView(self, self.config) util.safe_curs_set(util.Curser.INVISIBLE) diff --git a/deluge/ui/console/modes/torrentlist/torrentview.py b/deluge/ui/console/modes/torrentlist/torrentview.py index 967aa26d4..50bb25d31 100644 --- a/deluge/ui/console/modes/torrentlist/torrentview.py +++ b/deluge/ui/console/modes/torrentlist/torrentview.py @@ -28,12 +28,14 @@ except ImportError: log = logging.getLogger(__name__) -state_fg_colors = {'Downloading': 'green', - 'Seeding': 'cyan', - 'Error': 'red', - 'Queued': 'yellow', - 'Checking': 'blue', - 'Moving': 'green'} +state_fg_colors = { + 'Downloading': 'green', + 'Seeding': 'cyan', + 'Error': 'red', + 'Queued': 'yellow', + 'Checking': 'blue', + 'Moving': 'green', +} def _queue_sort(v1, v2): @@ -63,7 +65,7 @@ reverse_sort_fields = [ 'progress', 'ratio', 'seeding_time', - 'active_time' + 'active_time', ] @@ -297,8 +299,12 @@ class TorrentView(InputKeyHandler): def draw_row(index): if index not in self.cached_rows: ts = self.curstate[self.sorted_ids[index]] - self.cached_rows[index] = (format_utils.format_row( - [get_column_value(name, ts) for name in self.cols_to_show], self.column_widths), ts['state']) + self.cached_rows[index] = ( + format_utils.format_row( + [get_column_value(name, ts) for name in self.cols_to_show], + self.column_widths, + ), ts['state'], + ) return self.cached_rows[index] tidx = self.curoff @@ -327,12 +333,16 @@ class TorrentView(InputKeyHandler): else: colorstr = '{!%(fg)s,%(bg)s!}' % colors - self.torrentlist.add_string(currow + self.torrentlist_offset, '%s%s' % (colorstr, row[0]), - trim=False, scr=self.torrentlist.torrentview_panel) + self.torrentlist.add_string( + currow + self.torrentlist_offset, '%s%s' % (colorstr, row[0]), + trim=False, scr=self.torrentlist.torrentview_panel, + ) def update(self, refresh=False): - d = component.get('SessionProxy').get_torrents_status(self.filter_dict, - self.status_fields) + d = component.get('SessionProxy').get_torrents_status( + self.filter_dict, + self.status_fields, + ) d.addCallback(self.update_state, refresh=refresh) def on_config_changed(self): @@ -345,9 +355,12 @@ class TorrentView(InputKeyHandler): if changed: self.config.save() - self.cols_to_show = [col for col in sorted(self.config['torrentview']['columns'], - key=lambda k: self.config['torrentview']['columns'][k]['order']) - if self.config['torrentview']['columns'][col]['visible']] + self.cols_to_show = [ + col for col in sorted( + self.config['torrentview']['columns'], + key=lambda k: self.config['torrentview']['columns'][k]['order'], + ) if self.config['torrentview']['columns'][col]['visible'] + ] self.status_fields = get_required_fields(self.cols_to_show) # we always need these, even if we're not displaying them @@ -365,7 +378,7 @@ class TorrentView(InputKeyHandler): def update_columns(self): self.column_widths = [self.config['torrentview']['columns'][col]['width'] for col in self.cols_to_show] - requested_width = sum([width for width in self.column_widths if width >= 0]) + requested_width = sum(width for width in self.column_widths if width >= 0) cols = self.torrentlist.torrentview_columns() if requested_width > cols: # can't satisfy requests, just spread out evenly @@ -428,8 +441,10 @@ class TorrentView(InputKeyHandler): def on_close(**kwargs): if added: self.marked.pop() - torrent_actions_popup(self.torrentlist, self._selected_torrent_ids(), - action=ACTION.REMOVE, close_cb=on_close) + torrent_actions_popup( + self.torrentlist, self._selected_torrent_ids(), + action=ACTION.REMOVE, close_cb=on_close, + ) elif c in [curses.KEY_ENTER, util.KEY_ENTER2] and self.numtorrents: added = self.update_marked(self.cursel) diff --git a/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py b/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py index 9f2b292cf..96da7ffad 100644 --- a/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py +++ b/deluge/ui/console/modes/torrentlist/torrentviewcolumns.py @@ -25,12 +25,14 @@ Control column visibilty with the following actions: {!info!}'CTRL+down'{!normal!} - {|indent_pos:|} Move column right """ -column_pref_names = ['queue', 'name', 'size', 'downloaded', 'uploaded', 'remaining', 'state', - 'progress', 'seeds', 'peers', 'seeds_peers_ratio', - 'download_speed', 'upload_speed', 'max_download_speed', 'max_upload_speed', - 'eta', 'ratio', 'avail', 'time_added', 'completed_time', 'last_seen_complete', - 'tracker', 'download_location', 'active_time', 'seeding_time', 'finished_time', - 'time_since_transfer', 'shared', 'owner'] +column_pref_names = [ + 'queue', 'name', 'size', 'downloaded', 'uploaded', 'remaining', 'state', + 'progress', 'seeds', 'peers', 'seeds_peers_ratio', + 'download_speed', 'upload_speed', 'max_download_speed', 'max_upload_speed', + 'eta', 'ratio', 'avail', 'time_added', 'completed_time', 'last_seen_complete', + 'tracker', 'download_location', 'active_time', 'seeding_time', 'finished_time', + 'time_since_transfer', 'shared', 'owner', +] class ColumnAndWidth(CheckedPlusInput): @@ -57,28 +59,36 @@ class TorrentViewColumns(InputPopup): self.torrentview = torrentlist.torrentview title = 'Visible columns (Esc to exit)' - InputPopup.__init__(self, torrentlist, title, close_cb=self._do_set_column_visibility, - immediate_action=True, - height_req=len(column_pref_names) - 5, - width_req=max([len(col) for col in column_pref_names + [title]]) + 14, - border_off_west=1, - allow_rearrange=True) + InputPopup.__init__( + self, torrentlist, title, close_cb=self._do_set_column_visibility, + immediate_action=True, + height_req=len(column_pref_names) - 5, + width_req=max( + len(col) for col in column_pref_names + [title] + ) + 14, + border_off_west=1, + allow_rearrange=True, + ) msg_fmt = '%-25s' self.add_header((msg_fmt % _('Columns')) + ' ' + _('Width'), space_below=True) for colpref_name in column_pref_names: col = self.torrentview.config['torrentview']['columns'][colpref_name] - width_spin = IntSpinInput(self, colpref_name + '_ width', '', self.move, col['width'], - min_val=-1, max_val=99, fmt='%2d') + width_spin = IntSpinInput( + self, colpref_name + '_ width', '', self.move, col['width'], + min_val=-1, max_val=99, fmt='%2d', + ) def on_width_func(name, width): self.torrentview.config['torrentview']['columns'][name]['width'] = width - self._add_input(ColumnAndWidth(self, colpref_name, torrent_data_fields[colpref_name]['name'], width_spin, - on_width_func, - checked=col['visible'], checked_char='*', msg_fmt=msg_fmt, - show_usage_hints=False, child_always_visible=True)) + self._add_input(ColumnAndWidth( + self, colpref_name, torrent_data_fields[colpref_name]['name'], width_spin, + on_width_func, + checked=col['visible'], checked_char='*', msg_fmt=msg_fmt, + show_usage_hints=False, child_always_visible=True, + )) def _do_set_column_visibility(self, data=None, state_changed=True, close=True, **kwargs): if close: diff --git a/deluge/ui/console/utils/colors.py b/deluge/ui/console/utils/colors.py index 17119e71a..ac1a50c77 100644 --- a/deluge/ui/console/utils/colors.py +++ b/deluge/ui/console/utils/colors.py @@ -29,12 +29,12 @@ colors = [ 'COLOR_MAGENTA', 'COLOR_RED', 'COLOR_WHITE', - 'COLOR_YELLOW' + 'COLOR_YELLOW', ] # {(fg, bg): pair_number, ...} color_pairs = { - ('white', 'black'): 0 # Special case, can't be changed + ('white', 'black'): 0, # Special case, can't be changed } # Some default color schemes @@ -50,7 +50,7 @@ schemes = { 'marked': ('white', 'blue', 'bold'), 'selectedmarked': ('blue', 'white', 'bold'), 'header': ('green', 'black', 'bold'), - 'filterstatus': ('green', 'blue', 'bold') + 'filterstatus': ('green', 'blue', 'bold'), } # Colors for various torrent states @@ -61,7 +61,7 @@ state_color = { 'Checking': '{!green,black!}', 'Queued': '{!yellow,black!}', 'Error': '{!red,black,bold!}', - 'Moving': '{!green,black,bold!}' + 'Moving': '{!green,black,bold!}', } type_color = { @@ -70,7 +70,7 @@ type_color = { float: '{!green,black,bold!}', str: '{!cyan,black,bold!}', list: '{!magenta,black,bold!}', - dict: '{!white,black,bold!}' + dict: '{!white,black,bold!}', } @@ -297,7 +297,7 @@ class ConsoleColorFormatter(object): '<value>': '{!cyan!}%s{!input!}', 'usage:': '{!info!}%s{!input!}', '<download-folder>': '{!yellow!}%s{!input!}', - '<torrent-file>': '{!green!}%s{!input!}' + '<torrent-file>': '{!green!}%s{!input!}', } diff --git a/deluge/ui/console/utils/format_utils.py b/deluge/ui/console/utils/format_utils.py index 4d2773572..9d609c4fb 100644 --- a/deluge/ui/console/utils/format_utils.py +++ b/deluge/ui/console/utils/format_utils.py @@ -96,8 +96,10 @@ def f_seedrank_dash(seed_rank, seeding_time): def ftotal_sized(first, second): - return '%s (%s)' % (deluge.common.fsize(first, shortform=True), - deluge.common.fsize(second, shortform=True)) + return '%s (%s)' % ( + deluge.common.fsize(first, shortform=True), + deluge.common.fsize(second, shortform=True), + ) def format_pieces(num, size): @@ -297,7 +299,7 @@ def strwidth(string): """ Measure width of a string considering asian double width characters """ - return sum([1 + (east_asian_width(char) in ['W', 'F']) for char in string]) + return sum(1 + (east_asian_width(char) in ['W', 'F']) for char in string) def pad_string(string, length, character=' ', side='right'): diff --git a/deluge/ui/console/widgets/fields.py b/deluge/ui/console/widgets/fields.py index a89b5b483..7cf222151 100644 --- a/deluge/ui/console/widgets/fields.py +++ b/deluge/ui/console/widgets/fields.py @@ -189,12 +189,16 @@ class InfoField(NoInputField): class CheckedInput(InputField): - def __init__(self, parent, name, message, checked=False, checked_char='X', unchecked_char=' ', - checkbox_format='[%s] ', **kwargs): + def __init__( + self, parent, name, message, checked=False, checked_char='X', unchecked_char=' ', + checkbox_format='[%s] ', **kwargs + ): InputField.__init__(self, parent, name, message, **kwargs) self.set_value(checked) - self.fmt_keys.update({'msg': message, 'checkbox_format': checkbox_format, - 'unchecked_char': unchecked_char, 'checked_char': checked_char}) + self.fmt_keys.update({ + 'msg': message, 'checkbox_format': checkbox_format, + 'unchecked_char': unchecked_char, 'checked_char': checked_char, + }) self.set_fmt_key('font_checked', 'font', kwargs) self.set_fmt_key('font_unfocused_checked', 'font_checked', kwargs) self.set_fmt_key('font_active_checked', 'font_active', kwargs) @@ -253,8 +257,10 @@ class CheckedInput(InputField): class CheckedPlusInput(CheckedInput): - def __init__(self, parent, name, message, child, child_always_visible=False, - show_usage_hints=True, msg_fmt='%s ', **kwargs): + def __init__( + self, parent, name, message, child, child_always_visible=False, + show_usage_hints=True, msg_fmt='%s ', **kwargs + ): CheckedInput.__init__(self, parent, name, message, **kwargs) self.child = child self.child_active = False @@ -279,13 +285,17 @@ class CheckedPlusInput(CheckedInput): msglen = len(self.msg_fmt % colors.strip_colors(self.build_msg_string(focused, active))) # show child if self.checked or self.child_always_visible: - crows = self.child.render(screen, row, width=width - msglen, - active=self.child_active and active, - col=col + msglen, cursor_offset=msglen) + crows = self.child.render( + screen, row, width=width - msglen, + active=self.child_active and active, + col=col + msglen, cursor_offset=msglen, + ) rows = max(rows, crows) else: - self.parent.add_string(row, '(enable to view/edit value)', scr=screen, - col=col + msglen, pad=False) + self.parent.add_string( + row, '(enable to view/edit value)', scr=screen, + col=col + msglen, pad=False, + ) return rows @overrides(CheckedInput) @@ -311,8 +321,10 @@ class CheckedPlusInput(CheckedInput): class IntSpinInput(InputField): - def __init__(self, parent, name, message, move_func, value, min_val=None, max_val=None, - inc_amt=1, incr_large=10, strict_validation=False, fmt='%d', **kwargs): + def __init__( + self, parent, name, message, move_func, value, min_val=None, max_val=None, + inc_amt=1, incr_large=10, strict_validation=False, fmt='%d', **kwargs + ): InputField.__init__(self, parent, name, message, **kwargs) self.convert_func = int self.fmt = fmt @@ -355,9 +367,13 @@ class IntSpinInput(InputField): else: value_format += '[ ' + fmt_str + ' ]' - self.parent.add_string(row, value_format % dict({'msg': self.message, 'value': '%s' % self.valstr}, - **self.fmt_keys), - scr=screen, col=col, pad=False) + self.parent.add_string( + row, value_format % dict( + {'msg': self.message, 'value': '%s' % self.valstr}, + **self.fmt_keys + ), + scr=screen, col=col, pad=False, + ) if active: if focused: util.safe_curs_set(util.Curser.NORMAL) @@ -389,27 +405,37 @@ class IntSpinInput(InputField): elif c == curses.KEY_BACKSPACE or c == util.KEY_BACKSPACE2: if self.valstr and self.cursor > 0: new_val = self.valstr[:self.cursor - 1] + self.valstr[self.cursor:] - self.set_value(new_val, validate=False, cursor=self.cursor - 1, cursor_on_fail=True, - value_on_fail=self.valstr if self.strict_validation else None) + self.set_value( + new_val, validate=False, cursor=self.cursor - 1, cursor_on_fail=True, + value_on_fail=self.valstr if self.strict_validation else None, + ) elif c == curses.KEY_DC: # Del if self.valstr and self.cursor <= len(self.valstr): if self.cursor == 0: new_val = self.valstr[1:] else: new_val = self.valstr[:self.cursor] + self.valstr[self.cursor + 1:] - self.set_value(new_val, validate=False, cursor=False, - value_on_fail=self.valstr if self.strict_validation else None, cursor_on_fail=True) + self.set_value( + new_val, validate=False, cursor=False, + value_on_fail=self.valstr if self.strict_validation else None, cursor_on_fail=True, + ) elif c == ord('-'): # minus - self.set_value(self.value - 1, validate=True, cursor=True, cursor_on_fail=True, - value_on_fail=self.value, on_invalid=self.value) + self.set_value( + self.value - 1, validate=True, cursor=True, cursor_on_fail=True, + value_on_fail=self.value, on_invalid=self.value, + ) elif c == ord('+'): # plus - self.set_value(self.value + 1, validate=True, cursor=True, cursor_on_fail=True, - value_on_fail=self.value, on_invalid=self.value) + self.set_value( + self.value + 1, validate=True, cursor=True, cursor_on_fail=True, + value_on_fail=self.value, on_invalid=self.value, + ) elif util.is_int_chr(c): if self.strict_validation: new_val = self.valstr[:self.cursor - 1] + chr(c) + self.valstr[self.cursor - 1:] - self.set_value(new_val, validate=True, cursor=self.cursor + 1, - value_on_fail=self.valstr, on_invalid=self.value) + self.set_value( + new_val, validate=True, cursor=self.cursor + 1, + value_on_fail=self.valstr, on_invalid=self.value, + ) else: minus_place = self.valstr.find('-') if self.cursor > minus_place: @@ -440,8 +466,10 @@ class IntSpinInput(InputField): self.last_valid_value = self.value = value except ValueError: if value_on_fail is not None: - self.set_value(value_on_fail, cursor=cursor, cursor_on_fail=cursor_on_fail, - validate=validate, on_invalid=on_invalid) + self.set_value( + value_on_fail, cursor=cursor, cursor_on_fail=cursor_on_fail, + validate=validate, on_invalid=on_invalid, + ) return self.value = None self.valstr = val @@ -484,8 +512,10 @@ class FloatSpinInput(IntSpinInput): class SelectInput(InputField): - def __init__(self, parent, name, message, opts, vals, active_index, active_default=False, - require_select_action=True, **kwargs): + def __init__( + self, parent, name, message, opts, vals, active_index, active_default=False, + require_select_action=True, **kwargs + ): InputField.__init__(self, parent, name, message, **kwargs) self.opts = opts self.vals = vals @@ -580,8 +610,10 @@ class SelectInput(InputField): class TextInput(InputField): - def __init__(self, parent, name, message, move_func, width, value, complete=False, - activate_input=False, **kwargs): + def __init__( + self, parent, name, message, move_func, width, value, complete=False, + activate_input=False, **kwargs + ): InputField.__init__(self, parent, name, message, **kwargs) self.move_func = move_func self._width = width @@ -690,8 +722,10 @@ class TextInput(InputField): """ if self.activate_input: if not self.input_active: - if c in [curses.KEY_LEFT, curses.KEY_RIGHT, curses.KEY_HOME, - curses.KEY_END, curses.KEY_ENTER, util.KEY_ENTER2]: + if c in [ + curses.KEY_LEFT, curses.KEY_RIGHT, curses.KEY_HOME, + curses.KEY_END, curses.KEY_ENTER, util.KEY_ENTER2, + ]: self.input_active = True return util.ReadState.READ else: @@ -867,13 +901,17 @@ class ComboInput(InputField): select_in_range(0, selected) from deluge.ui.console.widgets.popup import SelectablePopup # Must import here - select_popup = SelectablePopup(self.parent, ' %s ' % _('Select Language'), self._lang_selected, - input_cb=search_handler if self.searchable else None, - border_off_west=1, active_wrap=False, width_req=self.choices_width + 12) + select_popup = SelectablePopup( + self.parent, ' %s ' % _('Select Language'), self._lang_selected, + input_cb=search_handler if self.searchable else None, + border_off_west=1, active_wrap=False, width_req=self.choices_width + 12, + ) for choice in self.choices: args = {'data': choice[0]} - select_popup.add_line(choice[0], choice[1], selectable=True, - selected=choice[0] == self.get_value(), **args) + select_popup.add_line( + choice[0], choice[1], selectable=True, + selected=choice[0] == self.get_value(), **args + ) self.parent.push_popup(select_popup) return util.ReadState.CHANGED return util.ReadState.IGNORED diff --git a/deluge/ui/console/widgets/inputpane.py b/deluge/ui/console/widgets/inputpane.py index cf53b48ea..810b72209 100644 --- a/deluge/ui/console/widgets/inputpane.py +++ b/deluge/ui/console/widgets/inputpane.py @@ -30,9 +30,11 @@ log = logging.getLogger(__name__) class BaseInputPane(InputKeyHandler): - def __init__(self, mode, allow_rearrange=False, immediate_action=False, set_first_input_active=True, - border_off_west=0, border_off_north=0, border_off_east=0, border_off_south=0, - active_wrap=False, **kwargs): + def __init__( + self, mode, allow_rearrange=False, immediate_action=False, set_first_input_active=True, + border_off_west=0, border_off_north=0, border_off_east=0, border_off_south=0, + active_wrap=False, **kwargs + ): InputKeyHandler.__init__(self) self.inputs = [] self.mode = mode @@ -50,8 +52,10 @@ class BaseInputPane(InputKeyHandler): self.last_lineoff_move = 0 if not hasattr(self, 'visible_content_pane_height'): - log.error('The class "%s" does not have the attribute "%s" required by super class "%s"', - self.__class__.__name__, 'visible_content_pane_height', BaseInputPane.__name__) + log.error( + 'The class "%s" does not have the attribute "%s" required by super class "%s"', + self.__class__.__name__, 'visible_content_pane_height', BaseInputPane.__name__, + ) raise AttributeError('visible_content_pane_height') @property @@ -83,8 +87,10 @@ class BaseInputPane(InputKeyHandler): continue if e.name == input_element.name: import traceback - log.warn('Input element with name "%s" already exists in input pane (%s):\n%s', - input_element.name, e, ''.join(traceback.format_stack(limit=5))) + log.warn( + 'Input element with name "%s" already exists in input pane (%s):\n%s', + input_element.name, e, ''.join(traceback.format_stack(limit=5)), + ) return self.inputs.append(input_element) @@ -117,8 +123,10 @@ class BaseInputPane(InputKeyHandler): :param value: initial value of the field :param complete: should completion be run when tab is hit and this field is active """ - return self._add_input(TextInput(self, name, message, self.move, self.visible_content_pane_width, value, - col=col, **kwargs)) + return self._add_input(TextInput( + self, name, message, self.move, self.visible_content_pane_width, value, + col=col, **kwargs + )) def add_select_input(self, name, message, opts, vals, default_index=0, **kwargs): return self._add_input(SelectInput(self, name, message, opts, vals, default_index, **kwargs)) @@ -305,8 +313,10 @@ class BaseInputPane(InputKeyHandler): field_width -= default_col # Increase to col must be reflected here else: col = default_col - crow += ipt.render(self.screen, crow, width=field_width, active=i == self.active_input, - focused=focused, col=col, cursor_offset=cursor_offset) + crow += ipt.render( + self.screen, crow, width=field_width, active=i == self.active_input, + focused=focused, col=col, cursor_offset=cursor_offset, + ) if self._cursor_row >= 0: util.safe_curs_set(util.Curser.VERY_VISIBLE) diff --git a/deluge/ui/console/widgets/popup.py b/deluge/ui/console/widgets/popup.py index dc0fbd599..4553ab257 100644 --- a/deluge/ui/console/widgets/popup.py +++ b/deluge/ui/console/widgets/popup.py @@ -64,8 +64,10 @@ class PopupsHandler(object): class Popup(BaseWindow, InputKeyHandler): - def __init__(self, parent_mode, title, width_req=0, height_req=0, align=ALIGN.DEFAULT, - close_cb=None, encoding=None, base_popup=None, **kwargs): + def __init__( + self, parent_mode, title, width_req=0, height_req=0, align=ALIGN.DEFAULT, + close_cb=None, encoding=None, base_popup=None, **kwargs + ): """ Init a new popup. The default constructor will handle sizing and borders and the like. @@ -196,8 +198,10 @@ class SelectablePopup(BaseInputPane, Popup): """ A popup which will let the user select from some of the lines that are added. """ - def __init__(self, parent_mode, title, selection_cb, close_cb=None, input_cb=None, - allow_rearrange=False, immediate_action=False, **kwargs): + def __init__( + self, parent_mode, title, selection_cb, close_cb=None, input_cb=None, + allow_rearrange=False, immediate_action=False, **kwargs + ): """ Args: parent_mode (basemode subclass): The mode which the popup will be drawn over @@ -235,8 +239,10 @@ class SelectablePopup(BaseInputPane, Popup): """Set a selected index""" self.active_input = index - def add_line(self, name, string, use_underline=True, cb_arg=None, foreground=None, selectable=True, - selected=False, **kwargs): + def add_line( + self, name, string, use_underline=True, cb_arg=None, foreground=None, selectable=True, + selected=False, **kwargs + ): hotkey = None self.cb_arg[name] = cb_arg if use_underline: @@ -293,11 +299,15 @@ class MessagePopup(Popup, BaseInputPane): """ Popup that just displays a message """ - def __init__(self, parent_mode, title, message, align=ALIGN.DEFAULT, - height_req=0.75, width_req=0.5, **kwargs): + def __init__( + self, parent_mode, title, message, align=ALIGN.DEFAULT, + height_req=0.75, width_req=0.5, **kwargs + ): self.message = message - Popup.__init__(self, parent_mode, title, align=align, - height_req=height_req, width_req=width_req) + Popup.__init__( + self, parent_mode, title, align=align, + height_req=height_req, width_req=width_req, + ) BaseInputPane.__init__(self, self, immediate_action=True, **kwargs) lns = format_utils.wrap_string(self.message, self.width - 3, 3, True) diff --git a/deluge/ui/console/widgets/statusbars.py b/deluge/ui/console/widgets/statusbars.py index 81944548d..e1d9c4ccf 100644 --- a/deluge/ui/console/widgets/statusbars.py +++ b/deluge/ui/console/widgets/statusbars.py @@ -114,4 +114,5 @@ class StatusBars(component.Component): self.bottombar += ' ' + _('DHT') + ': {!white,blue!}%s{!status!}' % self.dht self.bottombar += ' ' + _('IP {!white,blue!}%s{!status!}') % ( - self.external_ip if self.external_ip else _('n/a')) + self.external_ip if self.external_ip else _('n/a') + ) diff --git a/deluge/ui/console/widgets/window.py b/deluge/ui/console/widgets/window.py index d868c66fe..175ad8043 100644 --- a/deluge/ui/console/widgets/window.py +++ b/deluge/ui/console/widgets/window.py @@ -122,8 +122,10 @@ class BaseWindow(object): indicator_row = min(indicator_row, self.visible_content_pane_height) indicator_col = self.width + 1 - add_string(indicator_row, '{!red,black,bold!}#', screen, self.encoding, - col=indicator_col, pad=False, trim=False) + add_string( + indicator_row, '{!red,black,bold!}#', screen, self.encoding, + col=indicator_col, pad=False, trim=False, + ) def refresh(self): height, width = self.visible_content_pane_size @@ -150,5 +152,7 @@ class BaseWindow(object): self.screen.noutrefresh(pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) except curses.error as ex: import traceback - log.warn('Error on screen.noutrefresh(%s, %s, %s, %s, %s, %s) Error: %s\nStack: %s', - pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol, ex, ''.join(traceback.format_stack())) + log.warn( + 'Error on screen.noutrefresh(%s, %s, %s, %s, %s, %s) Error: %s\nStack: %s', + pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol, ex, ''.join(traceback.format_stack()), + ) diff --git a/deluge/ui/gtkui/__init__.py b/deluge/ui/gtkui/__init__.py index 180419c6a..4a5f4e040 100644 --- a/deluge/ui/gtkui/__init__.py +++ b/deluge/ui/gtkui/__init__.py @@ -25,9 +25,16 @@ class Gtk(UI): super(Gtk, self).__init__('gtk', *args, description='Starts the Deluge GTK+ interface', **kwargs) group = self.parser.add_argument_group(_('GTK Options')) - group.add_argument('torrents', metavar='<torrent>', nargs='*', default=None, - help=_('Add one or more torrent files, torrent URLs or magnet URIs' - ' to a currently running Deluge GTK instance')) + group.add_argument( + 'torrents', + metavar='<torrent>', + nargs='*', + default=None, + help=_( + 'Add one or more torrent files, torrent URLs or magnet URIs' + ' to a currently running Deluge GTK instance', + ), + ) def start(self): super(Gtk, self).start() @@ -42,8 +49,12 @@ class Gtk(UI): log.exception(ex) raise - deluge.common.run_profiled(run, self.options, output_file=self.options.profile, - do_profile=self.options.profile) + deluge.common.run_profiled( + run, + self.options, + output_file=self.options.profile, + do_profile=self.options.profile, + ) def start(): diff --git a/deluge/ui/gtkui/aboutdialog.py b/deluge/ui/gtkui/aboutdialog.py index c8e44694d..355f8f9d3 100644 --- a/deluge/ui/gtkui/aboutdialog.py +++ b/deluge/ui/gtkui/aboutdialog.py @@ -33,17 +33,19 @@ class AboutDialog(object): version = get_version() self.about.set_copyright( - _('Copyright %(year_start)s-%(year_end)s Deluge Team') % {'year_start': 2007, 'year_end': 2015}) + _('Copyright %(year_start)s-%(year_end)s Deluge Team') % {'year_start': 2007, 'year_end': 2015}, + ) self.about.set_comments( _('A peer-to-peer file sharing program\nutilizing the BitTorrent protocol.') + - '\n\n' + _('Client:') + ' %s\n' % version) + '\n\n' + _('Client:') + ' %s\n' % version, + ) self.about.set_version(version) self.about.set_authors([ _('Current Developers:'), 'Andrew Resch', 'Damien Churchill', 'John Garland', 'Calum Lind', '', 'libtorrent (libtorrent.org):', 'Arvid Norberg', '', _('Past Developers or Contributors:'), 'Zach Tibbitts', 'Alon Zakai', 'Marcos Mobley', 'Alex Dedul', - 'Sadrul Habib Chowdhury', 'Ido Abramovich', 'Martijn Voncken' + 'Sadrul Habib Chowdhury', 'Ido Abramovich', 'Martijn Voncken', ]) self.about.set_artists(['Andrew Wedderburn', 'Andrew Resch']) self.about.set_translator_credits('\n'.join([ @@ -222,7 +224,7 @@ class AboutDialog(object): 'Xiaodong Xu', 'xyb', 'Yaron', 'Yasen Pramatarov', 'YesPoX', 'Yuren Ju', 'Yves MATHIEU', 'zekopeko', 'zhuqin', 'Zissan', 'Γιάννης Κατσαμπίρης', 'Артём Попов', 'Миша', 'Шаймарданов Максим', - '蔡查理' + '蔡查理', ])) self.about.set_wrap_license(True) self.about.set_license(_( @@ -248,7 +250,7 @@ class AboutDialog(object): 'version of the file(s), but you are not obligated to do so. If ' 'you do not wish to do so, delete this exception statement from ' 'your version. If you delete this exception statement from all ' - 'source files in the program, then also delete it here.' + 'source files in the program, then also delete it here.', )) self.about.set_website('http://deluge-torrent.org') self.about.set_website_label('deluge-torrent.org') @@ -259,10 +261,12 @@ class AboutDialog(object): if client.connected(): if not client.is_standalone(): self.about.set_comments( - self.about.get_comments() + _('Server:') + ' %coreversion%\n') + self.about.get_comments() + _('Server:') + ' %coreversion%\n', + ) self.about.set_comments( - self.about.get_comments() + '\n' + _('libtorrent:') + ' %ltversion%\n') + self.about.get_comments() + '\n' + _('libtorrent:') + ' %ltversion%\n', + ) def on_lt_version(result): c = self.about.get_comments() diff --git a/deluge/ui/gtkui/addtorrentdialog.py b/deluge/ui/gtkui/addtorrentdialog.py index 67c9cb644..3ee2868c3 100644 --- a/deluge/ui/gtkui/addtorrentdialog.py +++ b/deluge/ui/gtkui/addtorrentdialog.py @@ -39,15 +39,15 @@ class AddTorrentDialog(component.Component): self.builder = gtk.Builder() # The base dialog self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.ui'), )) # The infohash dialog self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.infohash.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.infohash.ui'), )) # The url dialog self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.url.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'add_torrent_dialog.url.ui'), )) self.dialog = self.builder.get_object('dialog_add_torrent') @@ -58,7 +58,8 @@ class AddTorrentDialog(component.Component): # download?, path, filesize, sequence number, inconsistent? self.files_treestore = gtk.TreeStore( - bool, str, TYPE_UINT64, TYPE_INT64, bool, str) + bool, str, TYPE_UINT64, TYPE_INT64, bool, str, + ) self.files_treestore.set_sort_column_id(1, gtk.SORT_ASCENDING) # Holds the files info @@ -207,7 +208,7 @@ class AddTorrentDialog(component.Component): ErrorDialog( _('Duplicate Torrent(s)'), _('You cannot add the same torrent twice. %d torrents were already added.' % already_added), - self.dialog + self.dialog, ).run() def add_from_magnets(self, uris): @@ -272,7 +273,7 @@ class AddTorrentDialog(component.Component): split_files = {} for i, _file in enumerate(files): self.prepare_file( - _file, _file['path'], i, _file['download'], split_files + _file, _file['path'], i, _file['download'], split_files, ) self.add_files(None, split_files) self.listview_files.expand_row(b'0', False) @@ -285,23 +286,28 @@ class AddTorrentDialog(component.Component): file_name_chunk = file_name[:first_slash_index + 1] if file_name_chunk not in files_storage: files_storage[file_name_chunk] = {} - self.prepare_file(_file, file_name[first_slash_index + 1:], - file_num, download, files_storage[file_name_chunk]) + self.prepare_file( + _file, file_name[first_slash_index + 1:], + file_num, download, files_storage[file_name_chunk], + ) def add_files(self, parent_iter, split_files): ret = 0 for key, value in split_files.items(): if key.endswith(os.path.sep): chunk_iter = self.files_treestore.append( - parent_iter, [True, key, 0, -1, False, gtk.STOCK_DIRECTORY]) + parent_iter, [True, key, 0, -1, False, gtk.STOCK_DIRECTORY], + ) chunk_size = self.add_files(chunk_iter, value) self.files_treestore.set(chunk_iter, 2, chunk_size) ret += chunk_size else: - self.files_treestore.append(parent_iter, [ - value[2], key, value[1]['size'], - value[0], False, gtk.STOCK_FILE - ]) + self.files_treestore.append( + parent_iter, [ + value[2], key, value[1]['size'], + value[0], False, gtk.STOCK_FILE, + ], + ) ret += value[1]['size'] if parent_iter and self.files_treestore.iter_has_child(parent_iter): # Iterate through the children and see what we should label the @@ -326,10 +332,14 @@ class AddTorrentDialog(component.Component): return ret def load_path_choosers_data(self): - self.move_completed_path_chooser.set_text(self.core_config['move_completed_path'], - cursor_end=False, default_text=True) - self.download_location_path_chooser.set_text(self.core_config['download_location'], - cursor_end=False, default_text=True) + self.move_completed_path_chooser.set_text( + self.core_config['move_completed_path'], + cursor_end=False, default_text=True, + ) + self.download_location_path_chooser.set_text( + self.core_config['download_location'], + cursor_end=False, default_text=True, + ) self.builder.get_object('chk_move_completed').set_active(self.core_config['move_completed']) def setup_move_completed_path_chooser(self): @@ -355,23 +365,32 @@ class AddTorrentDialog(component.Component): self.move_completed_path_chooser.set_text(options['move_completed_path'], cursor_end=True) self.builder.get_object('spin_maxdown').set_value( - options['max_download_speed']) + options['max_download_speed'], + ) self.builder.get_object('spin_maxup').set_value( - options['max_upload_speed']) + options['max_upload_speed'], + ) self.builder.get_object('spin_maxconnections').set_value( - options['max_connections']) + options['max_connections'], + ) self.builder.get_object('spin_maxupslots').set_value( - options['max_upload_slots']) + options['max_upload_slots'], + ) self.builder.get_object('chk_paused').set_active( - options['add_paused']) + options['add_paused'], + ) self.builder.get_object('chk_pre_alloc').set_active( - options['pre_allocate_storage']) + options['pre_allocate_storage'], + ) self.builder.get_object('chk_prioritize').set_active( - options['prioritize_first_last_pieces']) + options['prioritize_first_last_pieces'], + ) self.builder.get_object('chk_sequential_download').set_active( - options['sequential_download']) + options['sequential_download'], + ) self.builder.get_object('chk_move_completed').set_active( - options['move_completed']) + options['move_completed'], + ) def save_torrent_options(self, row=None): # Keeps the torrent options dictionary up-to-date with what the user has @@ -401,7 +420,8 @@ class AddTorrentDialog(component.Component): options['add_paused'] = self.builder.get_object('chk_paused').get_active() options['prioritize_first_last_pieces'] = self.builder.get_object('chk_prioritize').get_active() options['sequential_download'] = self.builder.get_object( - 'chk_sequential_download').get_active() or False + 'chk_sequential_download', + ).get_active() or False options['move_completed'] = self.builder.get_object('chk_move_completed').get_active() options['seed_mode'] = self.builder.get_object('chk_seed_mode').get_active() @@ -409,7 +429,7 @@ class AddTorrentDialog(component.Component): # Save the file priorities files_priorities = self.build_priorities( - self.files_treestore.get_iter_first(), {} + self.files_treestore.get_iter_first(), {}, ) if len(files_priorities) > 0: @@ -434,23 +454,32 @@ class AddTorrentDialog(component.Component): self.load_path_choosers_data() self.builder.get_object('chk_pre_alloc').set_active( - self.core_config['pre_allocate_storage']) + self.core_config['pre_allocate_storage'], + ) self.builder.get_object('spin_maxdown').set_value( - self.core_config['max_download_speed_per_torrent']) + self.core_config['max_download_speed_per_torrent'], + ) self.builder.get_object('spin_maxup').set_value( - self.core_config['max_upload_speed_per_torrent']) + self.core_config['max_upload_speed_per_torrent'], + ) self.builder.get_object('spin_maxconnections').set_value( - self.core_config['max_connections_per_torrent']) + self.core_config['max_connections_per_torrent'], + ) self.builder.get_object('spin_maxupslots').set_value( - self.core_config['max_upload_slots_per_torrent']) + self.core_config['max_upload_slots_per_torrent'], + ) self.builder.get_object('chk_paused').set_active( - self.core_config['add_paused']) + self.core_config['add_paused'], + ) self.builder.get_object('chk_prioritize').set_active( - self.core_config['prioritize_first_last_pieces']) + self.core_config['prioritize_first_last_pieces'], + ) self.builder.get_object('chk_sequential_download').set_active( - self.core_config['sequential_download']) + self.core_config['sequential_download'], + ) self.builder.get_object('chk_move_completed').set_active( - self.core_config['move_completed']) + self.core_config['move_completed'], + ) self.builder.get_object('chk_seed_mode').set_active(False) def get_file_priorities(self, torrent_id): @@ -514,8 +543,10 @@ class AddTorrentDialog(component.Component): _('Choose a .torrent file'), None, gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, - gtk.RESPONSE_OK) + buttons=( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, + gtk.RESPONSE_OK, + ), ) chooser.set_transient_for(self.dialog) @@ -587,14 +618,15 @@ class AddTorrentDialog(component.Component): ErrorDialog( _('Invalid URL'), '%s %s' % (url, _('is not a valid URL.')), - self.dialog + self.dialog, ).run() def add_from_url(self, url): dialog = gtk.Dialog( _('Downloading...'), flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, - parent=self.dialog) + parent=self.dialog, + ) dialog.set_transient_for(self.dialog) pb = gtk.ProgressBar() @@ -612,7 +644,8 @@ class AddTorrentDialog(component.Component): pb.set_text('%.2f%% (%s / %s)' % ( percent * 100, deluge.common.fsize(current_length), - deluge.common.fsize(total_length))) + deluge.common.fsize(total_length), + )) else: pb.pulse() pb.set_text('%s' % deluge.common.fsize(current_length)) @@ -626,7 +659,7 @@ class AddTorrentDialog(component.Component): dialog.destroy() ErrorDialog( _('Download Failed'), '%s %s' % (_('Failed to download:'), url), - details=result.getErrorMessage(), parent=self.dialog + details=result.getErrorMessage(), parent=self.dialog, ).run() return result @@ -717,9 +750,11 @@ class AddTorrentDialog(component.Component): del options['file_priorities'] client.core.add_torrent_magnet(filename, options) else: - torrents_to_add.append((os.path.split(filename)[-1], - base64.encodestring(self.infos[torrent_id]), - options)) + torrents_to_add.append(( + os.path.split(filename)[-1], + base64.encodestring(self.infos[torrent_id]), + options, + )) row = self.torrent_liststore.iter_next(row) def on_torrents_added(errors): @@ -832,7 +867,7 @@ class AddTorrentDialog(component.Component): # Get the file path base once, since it will be the same for # all siblings file_path_base = self.get_file_path( - self.files_treestore.iter_parent(row) + self.files_treestore.iter_parent(row), ) # Iterate through all the siblings at this level @@ -866,9 +901,11 @@ class AddTorrentDialog(component.Component): for s in split_text[:-1]: # We don't iterate over the last item because we'll just use # the existing itr and change the text - parent = self.files_treestore.append(parent, [ - True, s + os.path.sep, 0, -1, False, gtk.STOCK_DIRECTORY - ]) + parent = self.files_treestore.append( + parent, [ + True, s + os.path.sep, 0, -1, False, gtk.STOCK_DIRECTORY, + ], + ) self.files_treestore[itr][1] = split_text[-1] + os.path.sep diff --git a/deluge/ui/gtkui/common.py b/deluge/ui/gtkui/common.py index 6bf8c4eae..70d6bcb82 100644 --- a/deluge/ui/gtkui/common.py +++ b/deluge/ui/gtkui/common.py @@ -72,8 +72,10 @@ def get_logo(size): return get_pixbuf_at_size(filename, size) -def build_menu_radio_list(value_list, callback, pref_value=None, suffix=None, show_notset=False, - notset_label='∞', notset_lessthan=0, show_other=False): +def build_menu_radio_list( + value_list, callback, pref_value=None, suffix=None, show_notset=False, + notset_label='∞', notset_lessthan=0, show_other=False, +): """Build a menu with radio menu items from a list and connect them to the callback. Params: diff --git a/deluge/ui/gtkui/connectionmanager.py b/deluge/ui/gtkui/connectionmanager.py index ba791ee15..5b860e699 100644 --- a/deluge/ui/gtkui/connectionmanager.py +++ b/deluge/ui/gtkui/connectionmanager.py @@ -48,7 +48,7 @@ HOSTLIST_PIXBUFS = [ HOSTLIST_STATUS = [ 'Offline', 'Online', - 'Connected' + 'Connected', ] @@ -93,7 +93,8 @@ class ConnectionManager(component.Component): """Show the ConnectionManager dialog.""" self.builder = gtk.Builder() self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'connection_manager.ui'))) + 'deluge.ui.gtkui', os.path.join('glade', 'connection_manager.ui'), + )) self.connection_manager = self.builder.get_object('connection_manager') self.connection_manager.set_transient_for(component.get('MainWindow').window) @@ -101,7 +102,8 @@ class ConnectionManager(component.Component): if not HOSTLIST_PIXBUFS: for stock_id in (gtk.STOCK_NO, gtk.STOCK_YES, gtk.STOCK_CONNECT): HOSTLIST_PIXBUFS.append( - self.connection_manager.render_icon(stock_id, gtk.ICON_SIZE_MENU)) + self.connection_manager.render_icon(stock_id, gtk.ICON_SIZE_MENU), + ) # Setup the hostlist liststore and treeview self.treeview = self.builder.get_object('treeview_hostlist') @@ -165,11 +167,14 @@ class ConnectionManager(component.Component): def _load_widget_config(self): """Set the widgets to show the correct options from the config.""" self.builder.get_object('chk_autoconnect').set_active( - self.gtkui_config['autoconnect']) + self.gtkui_config['autoconnect'], + ) self.builder.get_object('chk_autostart').set_active( - self.gtkui_config['autostart_localhost']) + self.gtkui_config['autostart_localhost'], + ) self.builder.get_object('chk_donotshow').set_active( - not self.gtkui_config['show_connection_manager_on_start']) + not self.gtkui_config['show_connection_manager_on_start'], + ) def _update_host_status(self): """Updates the host status""" @@ -205,7 +210,8 @@ class ConnectionManager(component.Component): self.builder.get_object('button_removehost').set_sensitive(False) self.builder.get_object('button_startdaemon').set_sensitive(False) self.builder.get_object('image_startdaemon').set_from_stock( - gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU, + ) self.builder.get_object('label_startdaemon').set_text_with_mnemonic('_Start Daemon') model, row = self.treeview.get_selection().get_selected() @@ -230,7 +236,8 @@ class ConnectionManager(component.Component): if status == 'Connected' or status == 'Online': self.builder.get_object('button_connect').set_sensitive(True) self.builder.get_object('image_startdaemon').set_from_stock( - gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + gtk.STOCK_STOP, gtk.ICON_SIZE_MENU, + ) self.builder.get_object('label_startdaemon').set_text_with_mnemonic(_('_Stop Daemon')) self.builder.get_object('button_startdaemon').set_sensitive(False) if status == 'Connected': @@ -261,7 +268,8 @@ class ConnectionManager(component.Component): else: ErrorDialog( _('Unable to start daemon!'), - _('Check deluged package is installed and logs for further details')).run() + _('Check deluged package is installed and logs for further details'), + ).run() return False # Signal handlers @@ -318,8 +326,10 @@ class ConnectionManager(component.Component): msg = str(reason.value) if not self.gtkui_config['autostart_localhost']: - msg += '\n' + _('Auto-starting the daemon locally is not enabled. ' - 'See "Options" on the "Connection Manager".') + msg += '\n' + _( + 'Auto-starting the daemon locally is not enabled. ' + 'See "Options" on the "Connection Manager".', + ) ErrorDialog(_('Failed To Connect'), msg).run() def on_button_connect_clicked(self, widget=None): @@ -363,7 +373,8 @@ class ConnectionManager(component.Component): """ self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'connection_manager.addhost.ui'))) + 'deluge.ui.gtkui', os.path.join('glade', 'connection_manager.addhost.ui'), + )) dialog = self.builder.get_object('addhost_dialog') dialog.set_transient_for(self.connection_manager) hostname_entry = self.builder.get_object('entry_hostname') @@ -418,7 +429,8 @@ class ConnectionManager(component.Component): self.liststore[row][HOSTLIST_COL_HOST], self.liststore[row][HOSTLIST_COL_PORT], self.liststore[row][HOSTLIST_COL_USER], - self.liststore[row][HOSTLIST_COL_PASS]] + self.liststore[row][HOSTLIST_COL_PASS], + ] new_host_info = self._run_addhost_dialog(edit_host_info=host_info) if new_host_info: hostname, port, username, password = new_host_info @@ -493,7 +505,8 @@ class ConnectionManager(component.Component): self.gtkui_config['autoconnect'] = self.builder.get_object('chk_autoconnect').get_active() self.gtkui_config['autostart_localhost'] = self.builder.get_object('chk_autostart').get_active() self.gtkui_config['show_connection_manager_on_start'] = not self.builder.get_object( - 'chk_donotshow').get_active() + 'chk_donotshow', + ).get_active() def on_entry_host_paste_clipboard(self, widget): text = get_clipboard_text() diff --git a/deluge/ui/gtkui/createtorrentdialog.py b/deluge/ui/gtkui/createtorrentdialog.py index 4a86a8051..29256fc59 100644 --- a/deluge/ui/gtkui/createtorrentdialog.py +++ b/deluge/ui/gtkui/createtorrentdialog.py @@ -37,19 +37,19 @@ class CreateTorrentDialog(object): # The main dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.ui'), )) # The remote path dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.remote_path.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.remote_path.ui'), )) # The remote save dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.remote_save.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.remote_save.ui'), )) # The progress dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.progress.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'create_torrent_dialog.progress.ui'), )) self.config = ConfigManager('gtkui.conf') @@ -85,9 +85,11 @@ class CreateTorrentDialog(object): self.trackers_liststore = gtk.ListStore(int, str) self.builder.get_object('tracker_treeview').append_column( - gtk.TreeViewColumn(_('Tier'), gtk.CellRendererText(), text=0)) + gtk.TreeViewColumn(_('Tier'), gtk.CellRendererText(), text=0), + ) self.builder.get_object('tracker_treeview').append_column( - gtk.TreeViewColumn(_('Tracker'), gtk.CellRendererText(), text=1)) + gtk.TreeViewColumn(_('Tracker'), gtk.CellRendererText(), text=1), + ) self.builder.get_object('tracker_treeview').set_model(self.trackers_liststore) self.trackers_liststore.set_sort_column_id(0, gtk.SORT_ASCENDING) @@ -125,11 +127,15 @@ class CreateTorrentDialog(object): def on_button_file_clicked(self, widget): log.debug('on_button_file_clicked') # Setup the filechooserdialog - chooser = gtk.FileChooserDialog(_('Choose a file'), - self.dialog, - gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + chooser = gtk.FileChooserDialog( + _('Choose a file'), + self.dialog, + gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK, + ), + ) chooser.set_transient_for(self.dialog) chooser.set_select_multiple(False) @@ -154,11 +160,15 @@ class CreateTorrentDialog(object): def on_button_folder_clicked(self, widget): log.debug('on_button_folder_clicked') # Setup the filechooserdialog - chooser = gtk.FileChooserDialog(_('Choose a folder'), - self.dialog, - gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + chooser = gtk.FileChooserDialog( + _('Choose a folder'), + self.dialog, + gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, + buttons=( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK, + ), + ) chooser.set_transient_for(self.dialog) chooser.set_select_multiple(False) @@ -232,10 +242,14 @@ class CreateTorrentDialog(object): dialog.hide() else: # Setup the filechooserdialog - chooser = gtk.FileChooserDialog(_('Save .torrent file'), self.dialog, - gtk.FILE_CHOOSER_ACTION_SAVE, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK)) + chooser = gtk.FileChooserDialog( + _('Save .torrent file'), self.dialog, + gtk.FILE_CHOOSER_ACTION_SAVE, + buttons=( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_SAVE, gtk.RESPONSE_OK, + ), + ) chooser.set_transient_for(self.dialog) chooser.set_select_multiple(False) @@ -322,25 +336,28 @@ class CreateTorrentDialog(object): private, author, trackers, - add_to_session) + add_to_session, + ) else: def hide_progress(result): self.builder.get_object('progress_dialog').hide_all() - deferToThread(self.create_torrent, - path.decode('utf-8'), - tracker, - piece_length, - self._on_create_torrent_progress, - comment, - result.decode('utf-8'), - webseeds, - private, - author, - trackers, - add_to_session).addCallback(hide_progress) + deferToThread( + self.create_torrent, + path.decode('utf-8'), + tracker, + piece_length, + self._on_create_torrent_progress, + comment, + result.decode('utf-8'), + webseeds, + private, + author, + trackers, + add_to_session, + ).addCallback(hide_progress) # Setup progress dialog self.builder.get_object('progress_dialog').set_transient_for(component.get('MainWindow').window) @@ -348,8 +365,10 @@ class CreateTorrentDialog(object): self.dialog.destroy() - def create_torrent(self, path, tracker, piece_length, progress, comment, target, - webseeds, private, created_by, trackers, add_to_session): + def create_torrent( + self, path, tracker, piece_length, progress, comment, target, + webseeds, private, created_by, trackers, add_to_session, + ): import deluge.metafile deluge.metafile.make_meta_file( path, @@ -361,7 +380,8 @@ class CreateTorrentDialog(object): webseeds=webseeds, private=private, created_by=created_by, - trackers=trackers) + trackers=trackers, + ) if add_to_session: with open(target, 'rb') as _file: @@ -369,7 +389,7 @@ class CreateTorrentDialog(object): client.core.add_torrent_file_async( os.path.split(target)[-1], filedump, - {'download_location': os.path.split(path)[0]} + {'download_location': os.path.split(path)[0]}, ) def _on_create_torrent_progress(self, value, num_pieces): @@ -407,7 +427,7 @@ class CreateTorrentDialog(object): log.debug('on_button_add_clicked') builder = gtk.Builder() builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.add.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.add.ui'), )) dialog = builder.get_object('add_tracker_dialog') dialog.set_transient_for(self.dialog) diff --git a/deluge/ui/gtkui/dialogs.py b/deluge/ui/gtkui/dialogs.py index e020a3fcc..91b299bb3 100644 --- a/deluge/ui/gtkui/dialogs.py +++ b/deluge/ui/gtkui/dialogs.py @@ -36,7 +36,8 @@ class BaseDialog(gtk.Dialog): title=header, parent=parent if parent else component.get('MainWindow').window, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, - buttons=buttons) + buttons=buttons, + ) self.set_icon(get_deluge_icon()) @@ -104,7 +105,8 @@ class YesNoDialog(BaseDialog): text, gtk.STOCK_DIALOG_QUESTION, (gtk.STOCK_NO, gtk.RESPONSE_NO, gtk.STOCK_YES, gtk.RESPONSE_YES), - parent) + parent, + ) class InformationDialog(BaseDialog): @@ -124,7 +126,8 @@ class InformationDialog(BaseDialog): text, gtk.STOCK_DIALOG_INFO, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE), - parent) + parent, + ) class ErrorDialog(BaseDialog): @@ -149,7 +152,8 @@ class ErrorDialog(BaseDialog): text, gtk.STOCK_DIALOG_ERROR, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE), - parent) + parent, + ) if traceback: import traceback @@ -193,7 +197,8 @@ class AuthenticationDialog(BaseDialog): _('Authenticate'), err_msg, gtk.STOCK_DIALOG_AUTHENTICATION, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_CONNECT, gtk.RESPONSE_OK), - parent) + parent, + ) table = gtk.Table(2, 2, False) self.username_label = gtk.Label() @@ -235,24 +240,32 @@ class AuthenticationDialog(BaseDialog): class AccountDialog(BaseDialog): - def __init__(self, username=None, password=None, authlevel=None, - levels_mapping=None, parent=None): + def __init__( + self, username=None, password=None, authlevel=None, + levels_mapping=None, parent=None, + ): if username: super(AccountDialog, self).__init__( _('Edit Account'), _('Edit existing account'), gtk.STOCK_DIALOG_INFO, - (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_APPLY, gtk.RESPONSE_OK), - parent) + ( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_APPLY, gtk.RESPONSE_OK, + ), + parent, + ) else: super(AccountDialog, self).__init__( _('New Account'), _('Create a new account'), gtk.STOCK_DIALOG_INFO, - (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_ADD, gtk.RESPONSE_OK), - parent) + ( + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_ADD, gtk.RESPONSE_OK, + ), + parent, + ) self.levels_mapping = levels_mapping @@ -339,7 +352,8 @@ class OtherDialog(BaseDialog): text, icon, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_APPLY, gtk.RESPONSE_OK), - parent) + parent, + ) hbox = gtk.HBox(spacing=5) alignment_spacer = gtk.Alignment() @@ -394,7 +408,8 @@ class PasswordDialog(BaseDialog): _('Password Protected'), password_msg, gtk.STOCK_DIALOG_AUTHENTICATION, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_CONNECT, gtk.RESPONSE_OK), - parent) + parent, + ) table = gtk.Table(1, 2, False) self.password_label = gtk.Label() diff --git a/deluge/ui/gtkui/edittrackersdialog.py b/deluge/ui/gtkui/edittrackersdialog.py index 5a2842d0d..c3008cf44 100644 --- a/deluge/ui/gtkui/edittrackersdialog.py +++ b/deluge/ui/gtkui/edittrackersdialog.py @@ -84,15 +84,15 @@ class EditTrackersDialog(object): # Main dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.ui'), )) # add tracker dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.add.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.add.ui'), )) # edit tracker dialog self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.edit.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'edit_trackers.edit.ui'), )) self.dialog = self.builder.get_object('edit_trackers_dialog') @@ -116,9 +116,11 @@ class EditTrackersDialog(object): # Create the columns self.treeview.append_column( - gtk.TreeViewColumn(_('Tier'), gtk.CellRendererText(), text=0)) + gtk.TreeViewColumn(_('Tier'), gtk.CellRendererText(), text=0), + ) self.treeview.append_column( - gtk.TreeViewColumn(_('Tracker'), gtk.CellRendererText(), text=1)) + gtk.TreeViewColumn(_('Tracker'), gtk.CellRendererText(), text=1), + ) self.treeview.set_model(self.liststore) self.liststore.set_sort_column_id(0, gtk.SORT_ASCENDING) @@ -134,7 +136,7 @@ class EditTrackersDialog(object): # Get the trackers for this torrent session = component.get('SessionProxy') session.get_torrent_status( - self.torrent_id, ['trackers'] + self.torrent_id, ['trackers'], ).addCallback(self._on_get_torrent_status) client.force_call() diff --git a/deluge/ui/gtkui/files_tab.py b/deluge/ui/gtkui/files_tab.py index ab6bd439e..7cb31e437 100644 --- a/deluge/ui/gtkui/files_tab.py +++ b/deluge/ui/gtkui/files_tab.py @@ -32,7 +32,7 @@ CELL_PRIORITY_ICONS = { 'Ignore': gtk.STOCK_NO, 'Low': gtk.STOCK_GO_DOWN, 'Normal': gtk.STOCK_OK, - 'High': gtk.STOCK_GO_UP + 'High': gtk.STOCK_GO_UP, } @@ -156,13 +156,13 @@ class FilesTab(Tab): self.main_builder.get_object('menuitem_low'), self.main_builder.get_object('menuitem_normal'), self.main_builder.get_object('menuitem_high'), - self.main_builder.get_object('menuitem_priority_sep') + self.main_builder.get_object('menuitem_priority_sep'), ] self.localhost_widgets = [ self.main_builder.get_object('menuitem_open_file'), self.main_builder.get_object('menuitem_show_file'), - self.main_builder.get_object('menuitem3') + self.main_builder.get_object('menuitem3'), ] self.listview.connect('row-activated', self._on_row_activated) @@ -170,7 +170,8 @@ class FilesTab(Tab): self.listview.connect('button-press-event', self._on_button_press_event) self.listview.enable_model_drag_source( - BUTTON1_MASK, [('text/plain', 0, 0)], ACTION_DEFAULT | ACTION_MOVE) + BUTTON1_MASK, [('text/plain', 0, 0)], ACTION_DEFAULT | ACTION_MOVE, + ) self.listview.enable_model_drag_dest([('text/plain', 0, 0)], ACTION_DEFAULT) self.listview.connect('drag_data_get', self._on_drag_data_get_data) @@ -204,13 +205,13 @@ class FilesTab(Tab): state = { 'columns': {}, 'sort_id': int(column_id) if column_id >= 0 else None, - 'sort_order': int(sort_order) if sort_order >= 0 else None + 'sort_order': int(sort_order) if sort_order >= 0 else None, } for index, column in enumerate(self.listview.get_columns()): state['columns'][column.get_title()] = { 'position': index, - 'width': column.get_width() + 'width': column.get_width(), } save_pickled_state_file('files_tab.state', state) @@ -269,7 +270,8 @@ class FilesTab(Tab): status_keys += ['files'] component.get('SessionProxy').get_torrent_status( - self.torrent_id, status_keys).addCallback(self._on_get_torrent_status, self.torrent_id) + self.torrent_id, status_keys, + ).addCallback(self._on_get_torrent_status, self.torrent_id) def clear(self): self.treestore.clear() @@ -326,21 +328,27 @@ class FilesTab(Tab): file_name_chunk = file_name[:first_slash_index + 1] if file_name_chunk not in files_storage: files_storage[file_name_chunk] = {} - self.prepare_file(torrent_file, file_name[first_slash_index + 1:], - file_num, files_storage[file_name_chunk]) + self.prepare_file( + torrent_file, file_name[first_slash_index + 1:], + file_num, files_storage[file_name_chunk], + ) def add_files(self, parent_iter, split_files): chunk_size_total = 0 for key, value in split_files.items(): if key.endswith('/'): - chunk_iter = self.treestore.append(parent_iter, - [key, 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY]) + chunk_iter = self.treestore.append( + parent_iter, + [key, 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY], + ) chunk_size = self.add_files(chunk_iter, value) self.treestore.set(chunk_iter, 1, chunk_size) chunk_size_total += chunk_size else: - self.treestore.append(parent_iter, - [key, value[1]['size'], '', 0, 0, value[0], gtk.STOCK_FILE]) + self.treestore.append( + parent_iter, + [key, value[1]['size'], '', 0, 0, value[0], gtk.STOCK_FILE], + ) chunk_size_total += value[1]['size'] return chunk_size_total @@ -488,12 +496,14 @@ class FilesTab(Tab): def on_menuitem_open_file_activate(self, menuitem): if client.is_localhost: component.get('SessionProxy').get_torrent_status( - self.torrent_id, ['download_location']).addCallback(self._on_open_file) + self.torrent_id, ['download_location'], + ).addCallback(self._on_open_file) def on_menuitem_show_file_activate(self, menuitem): if client.is_localhost: component.get('SessionProxy').get_torrent_status( - self.torrent_id, ['download_location']).addCallback(self._on_show_file) + self.torrent_id, ['download_location'], + ).addCallback(self._on_show_file) def _set_file_priorities_on_user_change(self, selected, priority): """Sets the file priorities in the core. It will change the selected with the 'priority'""" @@ -514,19 +524,23 @@ class FilesTab(Tab): def on_menuitem_ignore_activate(self, menuitem): self._set_file_priorities_on_user_change( - self.get_selected_files(), FILE_PRIORITY['Ignore']) + self.get_selected_files(), FILE_PRIORITY['Ignore'], + ) def on_menuitem_low_activate(self, menuitem): self._set_file_priorities_on_user_change( - self.get_selected_files(), FILE_PRIORITY['Low']) + self.get_selected_files(), FILE_PRIORITY['Low'], + ) def on_menuitem_normal_activate(self, menuitem): self._set_file_priorities_on_user_change( - self.get_selected_files(), FILE_PRIORITY['Normal']) + self.get_selected_files(), FILE_PRIORITY['Normal'], + ) def on_menuitem_high_activate(self, menuitem): self._set_file_priorities_on_user_change( - self.get_selected_files(), FILE_PRIORITY['High']) + self.get_selected_files(), FILE_PRIORITY['High'], + ) def on_menuitem_expand_all_activate(self, menuitem): self.listview.expand_all() @@ -606,11 +620,14 @@ class FilesTab(Tab): if not p_itr: p_itr = self.get_iter_at_path('/'.join(parent_path[:i]) + '/') p_itr = self.treestore.append( - p_itr, [parent_path[i] + '/', 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY]) + p_itr, [parent_path[i] + '/', 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY], + ) p_itr = self.get_iter_at_path('/'.join(parent_path) + '/') old_name_itr = self.get_iter_at_path(old_name) - self.treestore.append(p_itr, - self.treestore.get(old_name_itr, *range(self.treestore.get_n_columns()))) + self.treestore.append( + p_itr, + self.treestore.get(old_name_itr, *range(self.treestore.get_n_columns())), + ) self.treestore.remove(old_name_itr) # Remove old parent path @@ -621,10 +638,13 @@ class FilesTab(Tab): parent_iter = None for f in new_folders: parent_iter = self.treestore.append( - parent_iter, [f + '/', 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY]) + parent_iter, [f + '/', 0, '', 0, 0, -1, gtk.STOCK_DIRECTORY], + ) child = self.get_iter_at_path(old_name) - self.treestore.append(parent_iter, - self.treestore.get(child, *range(self.treestore.get_n_columns()))) + self.treestore.append( + parent_iter, + self.treestore.get(child, *range(self.treestore.get_n_columns())), + ) self.treestore.remove(child) else: @@ -768,8 +788,10 @@ class FilesTab(Tab): while itr: pp = self.treestore[itr][0] + pp itr = self.treestore.iter_parent(itr) - client.core.rename_folder(self.torrent_id, pp + model[selected[0]][0], - parent_path + model[selected[0]][0]) + client.core.rename_folder( + self.torrent_id, pp + model[selected[0]][0], + parent_path + model[selected[0]][0], + ) else: # [(index, filepath), ...] to_rename = [] diff --git a/deluge/ui/gtkui/filtertreeview.py b/deluge/ui/gtkui/filtertreeview.py index a6a87f0e6..6bec3966c 100644 --- a/deluge/ui/gtkui/filtertreeview.py +++ b/deluge/ui/gtkui/filtertreeview.py @@ -37,7 +37,7 @@ STATE_PIX = { 'Error': 'alert', 'Active': 'active', 'Allocating': 'checking', - 'Moving': 'checking' + 'Moving': 'checking', } TRACKER_PIX = { @@ -123,8 +123,12 @@ class FilterTreeView(component.Component): for state in ['All', 'Active'] + TORRENT_STATE: self.update_row('state', state, 0, _(state)) - self.cat_nodes['tracker_host'] = self.treestore.append(None, ['cat', 'tracker_host', - _('Trackers'), 0, None, False]) + self.cat_nodes['tracker_host'] = self.treestore.append( + None, [ + 'cat', 'tracker_host', + _('Trackers'), 0, None, False, + ], + ) self.update_row('tracker_host', 'All', 0, _('All')) self.update_row('tracker_host', 'Error', 0, _('Error')) self.update_row('tracker_host', '', 0, _('None')) @@ -279,8 +283,10 @@ class FilterTreeView(component.Component): hide_cat.append('tracker_host') if not self.config['sidebar_show_owners']: hide_cat.append('owner') - client.core.get_filter_tree(self.config['sidebar_show_zero'], - hide_cat).addCallback(self.cb_update_filter_tree) + client.core.get_filter_tree( + self.config['sidebar_show_zero'], + hide_cat, + ).addCallback(self.cb_update_filter_tree) except Exception as ex: log.debug(ex) diff --git a/deluge/ui/gtkui/gtkui.py b/deluge/ui/gtkui/gtkui.py index 78cf0497d..0468baa86 100644 --- a/deluge/ui/gtkui/gtkui.py +++ b/deluge/ui/gtkui/gtkui.py @@ -299,20 +299,28 @@ class GtkUI(object): try: client.start_standalone() except DaemonRunningError: - err_msg = _('A Deluge daemon (deluged) is already running.\n' - 'To use Standalone mode, stop local daemon and restart Deluge.') + err_msg = _( + 'A Deluge daemon (deluged) is already running.\n' + 'To use Standalone mode, stop local daemon and restart Deluge.', + ) except ImportError as ex: if 'No module named libtorrent' in ex.message: - err_msg = _('Only Thin Client mode is available because libtorrent is not installed.\n' - 'To use Standalone mode, please install libtorrent package.') + err_msg = _( + 'Only Thin Client mode is available because libtorrent is not installed.\n' + 'To use Standalone mode, please install libtorrent package.', + ) else: log.exception(ex) - err_msg = _('Only Thin Client mode is available due to unknown Import Error.\n' - 'To use Standalone mode, please see logs for error details.') + err_msg = _( + 'Only Thin Client mode is available due to unknown Import Error.\n' + 'To use Standalone mode, please see logs for error details.', + ) except Exception as ex: log.exception(ex) - err_msg = _('Only Thin Client mode is available due to unknown Import Error.\n' - 'To use Standalone mode, please see logs for error details.') + err_msg = _( + 'Only Thin Client mode is available due to unknown Import Error.\n' + 'To use Standalone mode, please see logs for error details.', + ) else: component.start() return diff --git a/deluge/ui/gtkui/listview.py b/deluge/ui/gtkui/listview.py index 4aabd9cd9..6b892b156 100644 --- a/deluge/ui/gtkui/listview.py +++ b/deluge/ui/gtkui/listview.py @@ -178,7 +178,8 @@ class ListView(object): """ model_filter = self.liststore.filter_new() model_filter.set_visible_column( - self.columns['filter'].column_indices[0]) + self.columns['filter'].column_indices[0], + ) self.model_filter = gtk.TreeModelSort(model_filter) self.model_filter.connect('sort-column-changed', self.on_model_sort_changed) self.model_filter.connect('row-inserted', self.on_model_row_inserted) @@ -215,7 +216,8 @@ class ListView(object): def on_model_row_inserted(self, model, path, _iter): if self.unique_column_id: self.last_sort_order.setdefault( - model[_iter][self.unique_column_id], len(model) - 1) + model[_iter][self.unique_column_id], len(model) - 1, + ) def stabilize_sort_func(self, sort_func): def stabilized(model, iter1, iter2, data): @@ -224,8 +226,10 @@ class ListView(object): unique1 = model[iter1][self.unique_column_id] unique2 = model[iter2][self.unique_column_id] if unique1 in self.last_sort_order and unique2 in self.last_sort_order: - result = cmp(self.last_sort_order[unique1], - self.last_sort_order[unique2]) + result = cmp( + self.last_sort_order[unique1], + self.last_sort_order[unique2], + ) # If all else fails, fall back to sorting by unique column if result == 0: result = cmp(unique1, unique2) @@ -242,7 +246,8 @@ class ListView(object): self.model_filter.set_sort_func( column.sort_id, self.stabilize_sort_func(sort_func), - column.sort_id) + column.sort_id, + ) def create_column_state(self, column, position=None): if not position: @@ -257,8 +262,10 @@ class ListView(object): if self.get_column_name(sort_id) == column.get_title(): sort = sort_id - return ListViewColumnState(column.get_title(), position, column.get_width(), - column.get_visible(), sort, int(column.get_sort_order())) + return ListViewColumnState( + column.get_title(), position, column.get_width(), + column.get_visible(), sort, int(column.get_sort_order()), + ) def save_state(self, filename): """Saves the listview state (column positions and visibility) to @@ -311,7 +318,8 @@ class ListView(object): for f in self.columns[column].status_field: if field == f: return self.columns[column].column_indices[ - self.columns[column].status_field.index(f)] + self.columns[column].status_field.index(f) + ] def on_menuitem_toggled(self, widget): """Callback for the generated column menuitems.""" @@ -392,8 +400,10 @@ class ListView(object): if column.column_type == 'text': if add: tree_column.pack_start(column.renderer, True) - tree_column.set_col_attributes(column.renderer, add=add, - text=column.column_indices[column.text_index]) + tree_column.set_col_attributes( + column.renderer, add=add, + text=column.column_indices[column.text_index], + ) elif column.column_type == 'bool': if add: tree_column.pack_start(column.renderer, True) @@ -409,22 +419,29 @@ class ListView(object): if add: tree_column.pack_start(column.renderer, True) if column.data_func is None: - tree_column.set_col_attributes(column.renderer, add=add, - text=column.column_indices[column.text_index], - value=column.column_indices[column.value_index]) + tree_column.set_col_attributes( + column.renderer, add=add, + text=column.column_indices[column.text_index], + value=column.column_indices[column.value_index], + ) else: - tree_column.set_cell_data_func(column.renderer, column.data_func, - tuple(column.column_indices)) + tree_column.set_cell_data_func( + column.renderer, column.data_func, + tuple(column.column_indices), + ) elif column.column_type == 'texticon': if add: tree_column.pack_start(column.renderer[column.pixbuf_index], False) tree_column.pack_start(column.renderer[column.text_index], True) - tree_column.set_col_attributes(column.renderer[column.text_index], add=add, - text=column.column_indices[column.text_index]) + tree_column.set_col_attributes( + column.renderer[column.text_index], add=add, + text=column.column_indices[column.text_index], + ) if column.data_func is not None: tree_column.set_cell_data_func( column.renderer[column.pixbuf_index], column.data_func, - column.column_indices[column.pixbuf_index]) + column.column_indices[column.pixbuf_index], + ) return True def remove_column(self, header): @@ -464,10 +481,12 @@ class ListView(object): self.create_checklist_menu() return - def add_column(self, header, render, col_types, hidden, position, - status_field, sortid, text=0, value=0, pixbuf=0, function=None, - column_type=None, sort_func=None, tooltip=None, default=True, - unique=False, default_sort=False): + def add_column( + self, header, render, col_types, hidden, position, + status_field, sortid, text=0, value=0, pixbuf=0, function=None, + column_type=None, sort_func=None, tooltip=None, default=True, + unique=False, default_sort=False, + ): """Adds a column to the ListView""" # Add the column types to liststore_columns column_indices = [] @@ -524,8 +543,10 @@ class ListView(object): column.set_min_width(20) column.set_reorderable(True) column.set_visible(not hidden) - column.connect('button-press-event', - self.on_treeview_header_right_clicked) + column.connect( + 'button-press-event', + self.on_treeview_header_right_clicked, + ) if tooltip: column.get_widget().set_tooltip_markup(tooltip) @@ -563,72 +584,92 @@ class ListView(object): return True - def add_text_column(self, header, col_type=str, hidden=False, position=None, - status_field=None, sortid=0, column_type='text', - sort_func=None, tooltip=None, default=True, unique=False, - default_sort=False): + def add_text_column( + self, header, col_type=str, hidden=False, position=None, + status_field=None, sortid=0, column_type='text', + sort_func=None, tooltip=None, default=True, unique=False, + default_sort=False, + ): """Add a text column to the listview. Only the header name is required. """ render = gtk.CellRendererText() - self.add_column(header, render, col_type, hidden, position, - status_field, sortid, column_type=column_type, - sort_func=sort_func, tooltip=tooltip, default=default, - unique=unique, default_sort=default_sort) + self.add_column( + header, render, col_type, hidden, position, + status_field, sortid, column_type=column_type, + sort_func=sort_func, tooltip=tooltip, default=default, + unique=unique, default_sort=default_sort, + ) return True - def add_bool_column(self, header, col_type=bool, hidden=False, - position=None, status_field=None, sortid=0, - column_type='bool', tooltip=None, default=True): + def add_bool_column( + self, header, col_type=bool, hidden=False, + position=None, status_field=None, sortid=0, + column_type='bool', tooltip=None, default=True, + ): """Add a bool column to the listview""" render = gtk.CellRendererToggle() - self.add_column(header, render, col_type, hidden, position, - status_field, sortid, column_type=column_type, - tooltip=tooltip, default=default) - - def add_func_column(self, header, function, col_types, sortid=0, - hidden=False, position=None, status_field=None, - column_type='func', sort_func=None, tooltip=None, default=True): + self.add_column( + header, render, col_type, hidden, position, + status_field, sortid, column_type=column_type, + tooltip=tooltip, default=default, + ) + + def add_func_column( + self, header, function, col_types, sortid=0, + hidden=False, position=None, status_field=None, + column_type='func', sort_func=None, tooltip=None, default=True, + ): """Add a function column to the listview. Need a header name, the function and the column types.""" render = gtk.CellRendererText() - self.add_column(header, render, col_types, hidden, position, - status_field, sortid, column_type=column_type, - function=function, sort_func=sort_func, tooltip=tooltip, default=default) + self.add_column( + header, render, col_types, hidden, position, + status_field, sortid, column_type=column_type, + function=function, sort_func=sort_func, tooltip=tooltip, default=default, + ) return True - def add_progress_column(self, header, col_types=None, sortid=0, - hidden=False, position=None, status_field=None, - function=None, column_type='progress', - tooltip=None, sort_func=None, default=True): + def add_progress_column( + self, header, col_types=None, sortid=0, + hidden=False, position=None, status_field=None, + function=None, column_type='progress', + tooltip=None, sort_func=None, default=True, + ): """Add a progress column to the listview.""" if col_types is None: col_types = [float, str] render = gtk.CellRendererProgress() - self.add_column(header, render, col_types, hidden, position, - status_field, sortid, function=function, - column_type=column_type, value=0, text=1, - tooltip=tooltip, sort_func=sort_func, default=default) + self.add_column( + header, render, col_types, hidden, position, + status_field, sortid, function=function, + column_type=column_type, value=0, text=1, + tooltip=tooltip, sort_func=sort_func, default=default, + ) return True - def add_texticon_column(self, header, col_types=None, sortid=1, - hidden=False, position=None, status_field=None, - column_type='texticon', function=None, sort_func=None, - tooltip=None, default=True, default_sort=False): + def add_texticon_column( + self, header, col_types=None, sortid=1, + hidden=False, position=None, status_field=None, + column_type='texticon', function=None, sort_func=None, + tooltip=None, default=True, default_sort=False, + ): """Adds a texticon column to the listview.""" if col_types is None: col_types = [str, str] render1 = gtk.CellRendererPixbuf() render2 = gtk.CellRendererText() - self.add_column(header, (render1, render2), col_types, hidden, position, - status_field, sortid, column_type=column_type, - function=function, pixbuf=0, text=1, tooltip=tooltip, - sort_func=sort_func, default=default, default_sort=default_sort) + self.add_column( + header, (render1, render2), col_types, hidden, position, + status_field, sortid, column_type=column_type, + function=function, pixbuf=0, text=1, tooltip=tooltip, + sort_func=sort_func, default=default, default_sort=default_sort, + ) return True diff --git a/deluge/ui/gtkui/mainwindow.py b/deluge/ui/gtkui/mainwindow.py index 8d744b743..c68d0a15e 100644 --- a/deluge/ui/gtkui/mainwindow.py +++ b/deluge/ui/gtkui/mainwindow.py @@ -43,7 +43,7 @@ class _GtkBuilderSignalsHolder(object): if hasattr(self, name): raise RuntimeError( 'A handler for signal %r has already been registered: %s' % - (name, getattr(self, name)) + (name, getattr(self, name)), ) setattr(self, name, handler) else: @@ -72,15 +72,20 @@ class MainWindow(component.Component): self.main_builder.prev_connect_signals = copy.deepcopy(self.main_builder.connect_signals) def patched_connect_signals(*a, **k): - raise RuntimeError('In order to connect signals to this GtkBuilder instance please use ' - '"component.get(\'MainWindow\').connect_signals()"') + raise RuntimeError( + 'In order to connect signals to this GtkBuilder instance please use ' + '"component.get(\'MainWindow\').connect_signals()"', + ) self.main_builder.connect_signals = patched_connect_signals # Get Gtk Builder files Main Window, New release dialog, and Tabs. - for filename in ('main_window.ui', 'main_window.new_release.ui', 'main_window.tabs.ui', - 'main_window.tabs.menu_file.ui', 'main_window.tabs.menu_peer.ui'): + for filename in ( + 'main_window.ui', 'main_window.new_release.ui', 'main_window.tabs.ui', + 'main_window.tabs.menu_file.ui', 'main_window.tabs.menu_peer.ui', + ): self.main_builder.add_from_file( - resource_filename('deluge.ui.gtkui', os.path.join('glade', filename))) + resource_filename('deluge.ui.gtkui', os.path.join('glade', filename)), + ) self.window = self.main_builder.get_object('main_window') self.window.set_icon(deluge.ui.gtkui.common.get_deluge_icon()) @@ -168,7 +173,7 @@ class MainWindow(component.Component): """Returns a reference to the main window GTK builder object.""" return self.main_builder - def quit(self, shutdown=False, restart=False): + def quit(self, shutdown=False, restart=False): # noqa: A003 python builtin """Quits the GtkUI application. Args: @@ -270,8 +275,8 @@ class MainWindow(component.Component): self.window.set_title(_('D: %s U: %s - Deluge' % (download_rate, upload_rate))) if self.config['show_rate_in_title']: client.core.get_session_status( - ['payload_download_rate', 'payload_upload_rate'] - ).addCallback(_on_get_session_status) + ['payload_download_rate', 'payload_upload_rate'], + ).addCallback(_on_get_session_status) def _on_set_show_rate_in_title(self, key, value): if value: diff --git a/deluge/ui/gtkui/menubar.py b/deluge/ui/gtkui/menubar.py index 1bf0cbfe7..a08ce972c 100644 --- a/deluge/ui/gtkui/menubar.py +++ b/deluge/ui/gtkui/menubar.py @@ -38,15 +38,15 @@ class MenuBar(component.Component): self.builder = gtk.Builder() # Get the torrent menu from the gtk builder file self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.ui'), )) # Get the torrent options menu from the gtk builder file self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.options.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.options.ui'), )) # Get the torrent queue menu from the gtk builder file self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.queue.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'torrent_menu.queue.ui'), )) # Attach queue torrent menu @@ -59,8 +59,10 @@ class MenuBar(component.Component): self.builder.get_object('download-limit-image').set_from_file(deluge.common.get_pixmap('downloading16.png')) self.builder.get_object('upload-limit-image').set_from_file(deluge.common.get_pixmap('seeding16.png')) - for menuitem in ('menuitem_down_speed', 'menuitem_up_speed', - 'menuitem_max_connections', 'menuitem_upload_slots'): + for menuitem in ( + 'menuitem_down_speed', 'menuitem_up_speed', + 'menuitem_max_connections', 'menuitem_upload_slots', + ): submenu = gtk.Menu() item = gtk.MenuItem(_('Set Unlimited')) item.set_name(menuitem) @@ -115,7 +117,7 @@ class MenuBar(component.Component): self.builder.connect_signals(self) self.change_sensitivity = [ - 'menuitem_addtorrent' + 'menuitem_addtorrent', ] def start(self): @@ -125,7 +127,7 @@ class MenuBar(component.Component): # Only show open_folder menuitem and separator if connected to a localhost daemon. localhost_items = [ 'menuitem_open_folder', - 'separator4' + 'separator4', ] if client.is_localhost(): for widget in localhost_items: @@ -146,7 +148,8 @@ class MenuBar(component.Component): if client.get_auth_level() == deluge.common.AUTH_LEVEL_ADMIN: # Get known accounts to allow changing ownership client.core.get_known_accounts().addCallback( - self._on_known_accounts).addErrback(self._on_known_accounts_fail) + self._on_known_accounts, + ).addErrback(self._on_known_accounts_fail) client.register_event_handler('TorrentStateChangedEvent', self.on_torrentstatechanged_event) client.register_event_handler('TorrentResumedEvent', self.on_torrentresumed_event) @@ -232,24 +235,28 @@ class MenuBar(component.Component): def on_menuitem_pause_activate(self, data=None): log.debug('on_menuitem_pause_activate') client.core.pause_torrent( - component.get('TorrentView').get_selected_torrents()) + component.get('TorrentView').get_selected_torrents(), + ) def on_menuitem_resume_activate(self, data=None): log.debug('on_menuitem_resume_activate') client.core.resume_torrent( - component.get('TorrentView').get_selected_torrents()) + component.get('TorrentView').get_selected_torrents(), + ) def on_menuitem_updatetracker_activate(self, data=None): log.debug('on_menuitem_updatetracker_activate') client.core.force_reannounce( - component.get('TorrentView').get_selected_torrents()) + component.get('TorrentView').get_selected_torrents(), + ) def on_menuitem_edittrackers_activate(self, data=None): log.debug('on_menuitem_edittrackers_activate') from deluge.ui.gtkui.edittrackersdialog import EditTrackersDialog dialog = EditTrackersDialog( component.get('TorrentView').get_selected_torrent(), - self.mainwindow.window) + self.mainwindow.window, + ) dialog.run() def on_menuitem_remove_activate(self, data=None): @@ -262,7 +269,8 @@ class MenuBar(component.Component): def on_menuitem_recheck_activate(self, data=None): log.debug('on_menuitem_recheck_activate') client.core.force_recheck( - component.get('TorrentView').get_selected_torrents()) + component.get('TorrentView').get_selected_torrents(), + ) def on_menuitem_open_folder_activate(self, data=None): log.debug('on_menuitem_open_folder') @@ -273,19 +281,21 @@ class MenuBar(component.Component): deluge.common.show_file(path, timestamp=timestamp) for torrent_id in component.get('TorrentView').get_selected_torrents(): component.get('SessionProxy').get_torrent_status( - torrent_id, ['download_location', 'files']).addCallback(_on_torrent_status) + torrent_id, ['download_location', 'files'], + ).addCallback(_on_torrent_status) def on_menuitem_move_activate(self, data=None): log.debug('on_menuitem_move_activate') component.get('SessionProxy').get_torrent_status( component.get('TorrentView').get_selected_torrent(), - ['download_location']).addCallback(self.show_move_storage_dialog) + ['download_location'], + ).addCallback(self.show_move_storage_dialog) def show_move_storage_dialog(self, status): log.debug('show_move_storage_dialog') builder = gtk.Builder() builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'move_storage_dialog.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'move_storage_dialog.ui'), )) # Keep it referenced: # https://bugzilla.gnome.org/show_bug.cgi?id=546802 @@ -308,11 +318,13 @@ class MenuBar(component.Component): on_core_result(None) if response_id == gtk.RESPONSE_OK: - log.debug('Moving torrents to %s', - self.move_storage_path_chooser.get_text()) + log.debug( + 'Moving torrents to %s', + self.move_storage_path_chooser.get_text(), + ) path = self.move_storage_path_chooser.get_text() client.core.move_storage( - component.get('TorrentView').get_selected_torrents(), path + component.get('TorrentView').get_selected_torrents(), path, ).addCallback(on_core_result) self.move_storage_dialog.connect('response', on_dialog_response_event) @@ -371,7 +383,7 @@ class MenuBar(component.Component): 'menuitem_down_speed': 'max_download_speed', 'menuitem_up_speed': 'max_upload_speed', 'menuitem_max_connections': 'max_connections', - 'menuitem_upload_slots': 'max_upload_slots' + 'menuitem_upload_slots': 'max_upload_slots', } if widget.get_name() in funcs: torrent_ids = component.get('TorrentView').get_selected_torrents() @@ -384,19 +396,27 @@ class MenuBar(component.Component): 'menuitem_up_speed': ['max_upload_speed', 'max_upload_speed'], 'menuitem_max_connections': ['max_connections', 'max_connections_global'], 'menuitem_upload_slots': ['max_upload_slots', 'max_upload_slots_global'], - 'menuitem_stop_seed_at_ratio': ['stop_ratio', 'stop_seed_ratio'] + 'menuitem_stop_seed_at_ratio': ['stop_ratio', 'stop_seed_ratio'], } other_dialog_info = { - 'menuitem_down_speed': [_('Download Speed Limit'), _('Set the maximum download speed'), - _('KiB/s'), 'downloading.svg'], - 'menuitem_up_speed': [_('Upload Speed Limit'), _('Set the maximum upload speed'), - _('KiB/s'), 'seeding.svg'], - 'menuitem_max_connections': [_('Incoming Connections'), _('Set the maximum incoming connections'), - '', gtk.STOCK_NETWORK], - 'menuitem_upload_slots': [_('Peer Upload Slots'), _('Set the maximum upload slots'), - '', gtk.STOCK_SORT_ASCENDING], - 'menuitem_stop_seed_at_ratio': [_('Stop Seed At Ratio'), 'Stop torrent seeding at ratio', '', None] + 'menuitem_down_speed': [ + _('Download Speed Limit'), _('Set the maximum download speed'), + _('KiB/s'), 'downloading.svg', + ], + 'menuitem_up_speed': [ + _('Upload Speed Limit'), _('Set the maximum upload speed'), + _('KiB/s'), 'seeding.svg', + ], + 'menuitem_max_connections': [ + _('Incoming Connections'), _('Set the maximum incoming connections'), + '', gtk.STOCK_NETWORK, + ], + 'menuitem_upload_slots': [ + _('Peer Upload Slots'), _('Set the maximum upload slots'), + '', gtk.STOCK_SORT_ASCENDING, + ], + 'menuitem_stop_seed_at_ratio': [_('Stop Seed At Ratio'), 'Stop torrent seeding at ratio', '', None], } core_key = status_map[widget.get_name()][0] @@ -429,16 +449,22 @@ class MenuBar(component.Component): d.addCallback(_on_torrent_status) def on_menuitem_set_automanaged_on(self, widget): - client.core.set_torrent_options(component.get('TorrentView').get_selected_torrents(), - {'auto_managed': True}) + client.core.set_torrent_options( + component.get('TorrentView').get_selected_torrents(), + {'auto_managed': True}, + ) def on_menuitem_set_automanaged_off(self, widget): - client.core.set_torrent_options(component.get('TorrentView').get_selected_torrents(), - {'auto_managed': False}) + client.core.set_torrent_options( + component.get('TorrentView').get_selected_torrents(), + {'auto_managed': False}, + ) def on_menuitem_set_stop_seed_at_ratio_disable(self, widget): - client.core.set_torrent_options(component.get('TorrentView').get_selected_torrents(), - {'stop_at_ratio': False}) + client.core.set_torrent_options( + component.get('TorrentView').get_selected_torrents(), + {'stop_at_ratio': False}, + ) def on_menuitem_sidebar_zero_toggled(self, widget): self.config['sidebar_show_zero'] = widget.get_active() @@ -484,7 +510,7 @@ class MenuBar(component.Component): self.change_owner_submenu_items[None].set_active(True) self.change_owner_submenu_items[None].hide() self.builder.get_object('menuitem_change_owner').connect( - 'activate', self._on_change_owner_submenu_active + 'activate', self._on_change_owner_submenu_active, ) self.builder.get_object('menuitem_change_owner').set_submenu(self.change_owner_submenu) @@ -518,7 +544,8 @@ class MenuBar(component.Component): ErrorDialog( _('Ownership Change Error'), _('There was an error while trying changing ownership.'), - self.mainwindow.window, details=failure.value.logable() + self.mainwindow.window, details=failure.value.logable(), ).run() client.core.set_torrent_options( - update_torrents, {'owner': username}).addErrback(failed_change_owner) + update_torrents, {'owner': username}, + ).addErrback(failed_change_owner) diff --git a/deluge/ui/gtkui/new_release_dialog.py b/deluge/ui/gtkui/new_release_dialog.py index 5f2871f2c..c9df8a5bc 100644 --- a/deluge/ui/gtkui/new_release_dialog.py +++ b/deluge/ui/gtkui/new_release_dialog.py @@ -27,17 +27,21 @@ class NewReleaseDialog(object): # Set the version labels if deluge.common.windows_check() or deluge.common.osx_check(): main_builder.get_object('image_new_release').set_from_file( - deluge.common.get_pixmap('deluge16.png')) + deluge.common.get_pixmap('deluge16.png'), + ) else: main_builder.get_object('image_new_release').set_from_icon_name('deluge', 4) main_builder.get_object('label_available_version').set_text(available_version) main_builder.get_object('label_client_version').set_text( - deluge.common.get_version()) + deluge.common.get_version(), + ) self.chk_not_show_dialog = main_builder.get_object('chk_do_not_show_new_release') main_builder.get_object('button_goto_downloads').connect( - 'clicked', self._on_button_goto_downloads) + 'clicked', self._on_button_goto_downloads, + ) main_builder.get_object('button_close_new_release').connect( - 'clicked', self._on_button_close_new_release) + 'clicked', self._on_button_close_new_release, + ) if client.connected(): def on_info(version): diff --git a/deluge/ui/gtkui/options_tab.py b/deluge/ui/gtkui/options_tab.py index 16e323d85..6fdb13d2e 100644 --- a/deluge/ui/gtkui/options_tab.py +++ b/deluge/ui/gtkui/options_tab.py @@ -50,9 +50,11 @@ class OptionsTab(Tab): self.move_completed_path_chooser = PathChooser('move_completed_paths_list') self.move_completed_path_chooser.set_sensitive( - self.tab_widgets['chk_move_completed'].obj.get_active()) + self.tab_widgets['chk_move_completed'].obj.get_active(), + ) self.move_completed_path_chooser.connect( - 'text-changed', self.on_path_chooser_text_changed_event) + 'text-changed', self.on_path_chooser_text_changed_event, + ) self.status_keys.append('move_completed_path') self.move_completed_hbox = self.main_builder.get_object('hbox_move_completed_path_chooser') @@ -83,8 +85,8 @@ class OptionsTab(Tab): self.clear() component.get('SessionProxy').get_torrents_status( - {'id': torrent_ids}, self.status_keys - ).addCallback(self.parse_torrents_statuses) + {'id': torrent_ids}, self.status_keys, + ).addCallback(self.parse_torrents_statuses) self.prev_torrent_ids = torrent_ids @@ -159,7 +161,8 @@ class OptionsTab(Tab): continue # A label so read-only widget_value = getattr(widget.obj, 'get_' + widget.func)() if widget_value != self.prev_status[status_key] or ( - status_key in self.inconsistent_keys and not widget.obj.get_inconsistent()): + status_key in self.inconsistent_keys and not widget.obj.get_inconsistent() + ): options[status_key] = widget_value if options.get('move_completed', False): diff --git a/deluge/ui/gtkui/path_combo_chooser.py b/deluge/ui/gtkui/path_combo_chooser.py index b7d73da19..f45335623 100755 --- a/deluge/ui/gtkui/path_combo_chooser.py +++ b/deluge/ui/gtkui/path_combo_chooser.py @@ -76,8 +76,10 @@ class ValueList(object): values.append(row[0]) return values - def add_values(self, paths, append=True, scroll_to_row=False, - clear=False, emit_signal=False): + def add_values( + self, paths, append=True, scroll_to_row=False, + clear=False, emit_signal=False, + ): """ Add paths to the liststore @@ -193,8 +195,10 @@ class ValueList(object): state = event.get_state() & gtk.accelerator_get_default_mod_mask() if keyval == keysyms.Escape or\ - (key_is_up(keyval) and - state == gdk.MOD1_MASK): # ALT Key + ( + key_is_up(keyval) and + state == gdk.MOD1_MASK + ): # ALT Key self.popdown() return True # Set entry value to the selected row @@ -299,8 +303,10 @@ class ValueList(object): if swap: p1 = self.tree_store[path][0] p2 = self.tree_store[new_path][0] - self.tree_store.swap(self.tree_store.get_iter(path), - self.tree_store.get_iter(new_path)) + self.tree_store.swap( + self.tree_store.get_iter(path), + self.tree_store.get_iter(new_path), + ) self.emit('list-values-reordered', [p1, p2]) self.emit('list-values-changed', self.get_values()) path = new_path @@ -423,8 +429,10 @@ class StoredValuesList(ValueList): elif key_is_up_or_down(keyval): # Swap the row value if event.get_state() & gdk.CONTROL_MASK: - self.handle_list_scroll(_next=key_is_down(keyval), - swap=True) + self.handle_list_scroll( + _next=key_is_down(keyval), + swap=True, + ) else: self.handle_list_scroll(_next=key_is_down(keyval)) elif key_is_pgup_or_pgdown(event.keyval): @@ -628,8 +636,10 @@ class PathChooserPopup(object): # Not enough space downwards on the screen elif y - height >= monitor.y: y -= height - elif (monitor.y + monitor.height - (y + self.path_entry.get_allocation().height) > - y - monitor.y): + elif ( + monitor.y + monitor.height - (y + self.path_entry.get_allocation().height) > + y - monitor.y + ): y += self.path_entry.get_allocation().height height = monitor.y + monitor.height - y else: @@ -640,11 +650,15 @@ class PathChooserPopup(object): def popup_grab_window(self): activate_time = 0 - if gdk.pointer_grab(self.popup_window.get_window(), True, - (gdk.BUTTON_PRESS_MASK | - gdk.BUTTON_RELEASE_MASK | - gdk.POINTER_MOTION_MASK), - None, None, activate_time) == 0: + if gdk.pointer_grab( + self.popup_window.get_window(), True, + ( + gdk.BUTTON_PRESS_MASK | + gdk.BUTTON_RELEASE_MASK | + gdk.POINTER_MOTION_MASK + ), + None, None, activate_time, + ) == 0: if gdk.keyboard_grab(self.popup_window.get_window(), True, activate_time) == 0: return True else: @@ -682,8 +696,11 @@ class PathChooserPopup(object): # Also if the intersection of self and the event is empty, hide # the path_list if (tuple(self.popup_window.get_allocation().intersect( - gdk.Rectangle(x=int(event.x), y=int(event.y), - width=1, height=1))) == (0, 0, 0, 0)): + gdk.Rectangle( + x=int(event.x), y=int(event.y), + width=1, height=1, + ), + )) == (0, 0, 0, 0)): hide = True # Toplevel is the window that received the event, and parent is the # path_list window. If they are not the same, means the popup should @@ -776,8 +793,10 @@ class StoredValuesPopup(StoredValuesList, PathChooserPopup): """ swap = event.get_state() & gdk.CONTROL_MASK scroll_window = event.get_state() & gdk.SHIFT_MASK - self.handle_list_scroll(_next=event.direction == gdk.SCROLL_DOWN, - set_entry=widget != self.treeview, swap=swap, scroll_window=scroll_window) + self.handle_list_scroll( + _next=event.direction == gdk.SCROLL_DOWN, + set_entry=widget != self.treeview, swap=swap, scroll_window=scroll_window, + ) return True def on_buttonbox_key_press_event(self, widget, event): @@ -898,8 +917,10 @@ class PathCompletionPopup(CompletionList, PathChooserPopup): """ x, y, state = event.window.get_pointer() - self.handle_list_scroll(_next=event.direction == gdk.SCROLL_DOWN, - set_entry=widget != self.treeview, scroll_window=True) + self.handle_list_scroll( + _next=event.direction == gdk.SCROLL_DOWN, + set_entry=widget != self.treeview, scroll_window=True, + ) path = self.treeview.get_path_at_pos(int(x), int(y)) if path: self.handle_list_scroll(path=path[0], _next=None) @@ -1031,7 +1052,7 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, GObject): self.builder = gtk.Builder() self.popup_buttonbox = self.builder.get_object('buttonbox') self.builder.add_from_file(resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'path_combo_chooser.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'path_combo_chooser.ui'), )) self.button_toggle = self.builder.get_object('button_toggle_dropdown') self.text_entry = self.builder.get_object('entry_text') @@ -1298,8 +1319,10 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, GObject): # Select new row with arrow up/down is pressed if key_is_up_or_down(keyval): - self.handle_list_scroll(_next=key_is_down(keyval), - set_entry=True) + self.handle_list_scroll( + _next=key_is_down(keyval), + set_entry=True, + ) return True elif self.auto_completer.is_auto_completion_accelerator(keyval, state): if self.auto_completer.auto_complete_enabled: @@ -1520,13 +1543,15 @@ if __name__ == '__main__': '/media/Series/2', '/media/Series/17', '/media/Series/18', - '/media/Series/19' + '/media/Series/19', ] entry1.add_values(test_paths) entry1.set_text('/home/bro/', default_text=True) - entry2.set_text('/home/bro/programmer/deluge/deluge-yarss-plugin/build/lib/yarss2/include/bs4/tests/', - cursor_end=False) + entry2.set_text( + '/home/bro/programmer/deluge/deluge-yarss-plugin/build/lib/yarss2/include/bs4/tests/', + cursor_end=False, + ) entry2.set_filechooser_button_visible(False) # entry2.set_enable_properties(False) diff --git a/deluge/ui/gtkui/peers_tab.py b/deluge/ui/gtkui/peers_tab.py index a989edef3..ca2fd6366 100644 --- a/deluge/ui/gtkui/peers_tab.py +++ b/deluge/ui/gtkui/peers_tab.py @@ -152,13 +152,13 @@ class PeersTab(Tab): state = { 'columns': {}, 'sort_id': column_id, - 'sort_order': int(sort_order) if sort_order else None + 'sort_order': int(sort_order) if sort_order else None, } for index, column in enumerate(self.listview.get_columns()): state['columns'][column.get_title()] = { 'position': index, - 'width': column.get_width() + 'width': column.get_width(), } save_pickled_state_file('peers_tab.state', state) @@ -221,7 +221,9 @@ class PeersTab(Tab): self.cached_flag_pixbufs[country] = pixbuf_new_from_file( deluge.common.resource_filename( 'deluge', - os.path.join('ui', 'data', 'pixmaps', 'flags', country.lower() + '.png'))) + os.path.join('ui', 'data', 'pixmaps', 'flags', country.lower() + '.png'), + ), + ) except Exception as ex: log.debug('Unable to load flag: %s', ex) return None @@ -263,8 +265,10 @@ class PeersTab(Tab): # Create an int IP address for sorting purposes if peer['ip'].count(':') == 1: # This is an IPv4 address - ip_int = sum([int(byte) << shift - for byte, shift in zip(peer['ip'].split(':')[0].split('.'), (24, 16, 8, 0))]) + ip_int = sum( + int(byte) << shift + for byte, shift in zip(peer['ip'].split(':')[0].split('.'), (24, 16, 8, 0)) + ) peer_ip = peer['ip'] else: # This is an IPv6 address @@ -289,7 +293,8 @@ class PeersTab(Tab): peer['country'], float(ip_int), icon, - peer['progress']]) + peer['progress'], + ]) self.peers[peer['ip']] = row @@ -319,8 +324,10 @@ class PeersTab(Tab): if country_code != ' ' and country_code in COUNTRIES: tooltip.set_text(COUNTRIES[country_code]) # widget here is self.listview - widget.set_tooltip_cell(tooltip, path, widget.get_column(0), - None) + widget.set_tooltip_cell( + tooltip, path, widget.get_column(0), + None, + ) return True else: return False @@ -330,7 +337,7 @@ class PeersTab(Tab): log.debug('on_menuitem_add_peer') builder = Builder() builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'connect_peer_dialog.ui') + 'deluge.ui.gtkui', os.path.join('glade', 'connect_peer_dialog.ui'), )) peer_dialog = builder.get_object('connect_peer_dialog') txt_ip = builder.get_object('txt_ip') diff --git a/deluge/ui/gtkui/piecesbar.py b/deluge/ui/gtkui/piecesbar.py index 43c7c7080..2819540a4 100644 --- a/deluge/ui/gtkui/piecesbar.py +++ b/deluge/ui/gtkui/piecesbar.py @@ -117,8 +117,10 @@ class PiecesBar(DrawingArea): pieces = [COLOR_STATES.index('completed')] * self.num_pieces start_pos = 0 piece_width = self.width / len(pieces) - pieces_colors = [[color / 65535 for color in self.gtkui_config['pieces_color_%s' % state]] - for state in COLOR_STATES] + pieces_colors = [ + [color / 65535 for color in self.gtkui_config['pieces_color_%s' % state]] + for state in COLOR_STATES + ] for state in pieces: ctx.set_source_rgb(*pieces_colors[state]) ctx.rectangle(start_pos, 0, piece_width, self.height) diff --git a/deluge/ui/gtkui/pluginmanager.py b/deluge/ui/gtkui/pluginmanager.py index 5cabee010..0e0797877 100644 --- a/deluge/ui/gtkui/pluginmanager.py +++ b/deluge/ui/gtkui/pluginmanager.py @@ -24,11 +24,12 @@ class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Compon component.Component.__init__(self, 'PluginManager') self.config = ConfigManager('gtkui.conf') deluge.pluginmanagerbase.PluginManagerBase.__init__( - self, 'gtkui.conf', 'deluge.plugin.gtkui') + self, 'gtkui.conf', 'deluge.plugin.gtkui', + ) self.hooks = { 'on_apply_prefs': [], - 'on_show_prefs': [] + 'on_show_prefs': [], } client.register_event_handler('PluginEnabledEvent', self._on_plugin_enabled_event) diff --git a/deluge/ui/gtkui/preferences.py b/deluge/ui/gtkui/preferences.py index ba4f80f03..ab7619c83 100644 --- a/deluge/ui/gtkui/preferences.py +++ b/deluge/ui/gtkui/preferences.py @@ -48,7 +48,7 @@ COLOR_STATES = { 'missing': COLOR_MISSING, 'waiting': COLOR_WAITING, 'downloading': COLOR_DOWNLOADING, - 'completed': COLOR_COMPLETED + 'completed': COLOR_COMPLETED, } @@ -57,7 +57,8 @@ class Preferences(component.Component): component.Component.__init__(self, 'Preferences') self.builder = gtk.Builder() self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'preferences_dialog.ui'))) + 'deluge.ui.gtkui', os.path.join('glade', 'preferences_dialog.ui'), + )) self.pref_dialog = self.builder.get_object('pref_dialog') self.pref_dialog.set_transient_for(component.get('MainWindow').window) self.pref_dialog.set_icon(get_deluge_icon()) @@ -69,7 +70,8 @@ class Preferences(component.Component): self.load_pref_dialog_state() self.builder.get_object('image_magnet').set_from_file( - deluge.common.get_pixmap('magnet.png')) + deluge.common.get_pixmap('magnet.png'), + ) # Hide the unused associate magnet button on OSX see: #2420 if deluge.common.osx_check(): @@ -85,7 +87,8 @@ class Preferences(component.Component): # Add the default categories prefs_categories = ( 'interface', 'downloads', 'bandwidth', 'queue', 'network', 'proxy', - 'cache', 'other', 'daemon', 'plugins') + 'cache', 'other', 'daemon', 'plugins', + ) for idx, category in enumerate(prefs_categories): self.liststore.append([idx, category, PREFS_CATOG_TRANS[category]]) @@ -105,9 +108,11 @@ class Preferences(component.Component): self.accounts_liststore.set_sort_column_id(ACCOUNTS_USERNAME, gtk.SORT_ASCENDING) self.accounts_listview = self.builder.get_object('accounts_listview') self.accounts_listview.append_column( - gtk.TreeViewColumn(_('Username'), gtk.CellRendererText(), text=ACCOUNTS_USERNAME)) + gtk.TreeViewColumn(_('Username'), gtk.CellRendererText(), text=ACCOUNTS_USERNAME), + ) self.accounts_listview.append_column( - gtk.TreeViewColumn(_('Level'), gtk.CellRendererText(), text=ACCOUNTS_LEVEL)) + gtk.TreeViewColumn(_('Level'), gtk.CellRendererText(), text=ACCOUNTS_LEVEL), + ) password_column = gtk.TreeViewColumn('password', gtk.CellRendererText(), text=ACCOUNTS_PASSWORD) self.accounts_listview.append_column(password_column) password_column.set_visible(False) @@ -440,7 +445,8 @@ class Preferences(component.Component): self.builder.get_object('radio_thinclient').set_active(not self.gtkui_config['standalone']) self.builder.get_object('chk_show_rate_in_title').set_active(self.gtkui_config['show_rate_in_title']) self.builder.get_object('chk_focus_main_window_on_add').set_active( - self.gtkui_config['focus_main_window_on_add']) + self.gtkui_config['focus_main_window_on_add'], + ) self.builder.get_object('piecesbar_toggle').set_active(self.gtkui_config['show_piecesbar']) self.__set_color('completed', from_config=True) self.__set_color('downloading', from_config=True) @@ -488,25 +494,30 @@ class Preferences(component.Component): for state in ('missing', 'waiting', 'downloading', 'completed'): color = self.builder.get_object('%s_color' % state).get_color() new_gtkui_config['pieces_color_%s' % state] = [ - color.red, color.green, color.blue + color.red, color.green, color.blue, ] new_core_config['copy_torrent_file'] = self.builder.get_object( - 'chk_copy_torrent_file').get_active() + 'chk_copy_torrent_file', + ).get_active() new_core_config['del_copy_torrent_file'] = self.builder.get_object( - 'chk_del_copy_torrent_file').get_active() + 'chk_del_copy_torrent_file', + ).get_active() new_core_config['move_completed'] = self.builder.get_object('chk_move_completed').get_active() new_core_config['download_location'] = self.download_location_path_chooser.get_text() new_core_config['move_completed_path'] = self.move_completed_path_chooser.get_text() new_core_config['torrentfiles_location'] = self.copy_torrent_files_path_chooser.get_text() new_core_config['prioritize_first_last_pieces'] = self.builder.get_object( - 'chk_prioritize_first_last_pieces').get_active() + 'chk_prioritize_first_last_pieces', + ).get_active() new_core_config['sequential_download'] = self.builder.get_object( - 'chk_sequential_download').get_active() + 'chk_sequential_download', + ).get_active() new_core_config['add_paused'] = self.builder.get_object('chk_add_paused').get_active() new_core_config['pre_allocate_storage'] = self.builder.get_object( - 'chk_pre_allocation').get_active() + 'chk_pre_allocation', + ).get_active() # Network tab # listen_ports = [self.builder.get_object('spin_incoming_port').get_value_as_int()] * 2 @@ -514,11 +525,12 @@ class Preferences(component.Component): new_core_config['random_port'] = self.builder.get_object('chk_random_incoming_port').get_active() outgoing_ports = ( self.builder.get_object('spin_outgoing_port_min').get_value_as_int(), - self.builder.get_object('spin_outgoing_port_max').get_value_as_int() + self.builder.get_object('spin_outgoing_port_max').get_value_as_int(), ) new_core_config['outgoing_ports'] = outgoing_ports new_core_config['random_outgoing_ports'] = self.builder.get_object( - 'chk_random_outgoing_ports').get_active() + 'chk_random_outgoing_ports', + ).get_active() incoming_address = self.builder.get_object('entry_interface').get_text().strip() outgoing_address = self.builder.get_object('entry_outgoing_interface').get_text().strip() if deluge.common.is_ip(incoming_address) or not incoming_address: @@ -537,27 +549,37 @@ class Preferences(component.Component): # Bandwidth tab # new_core_config['max_connections_global'] = self.builder.get_object( - 'spin_max_connections_global').get_value_as_int() + 'spin_max_connections_global', + ).get_value_as_int() new_core_config['max_download_speed'] = self.builder.get_object('spin_max_download').get_value() new_core_config['max_upload_speed'] = self.builder.get_object('spin_max_upload').get_value() new_core_config['max_upload_slots_global'] = self.builder.get_object( - 'spin_max_upload_slots_global').get_value_as_int() + 'spin_max_upload_slots_global', + ).get_value_as_int() new_core_config['max_half_open_connections'] = self.builder.get_object( - 'spin_max_half_open_connections').get_value_as_int() + 'spin_max_half_open_connections', + ).get_value_as_int() new_core_config['max_connections_per_second'] = self.builder.get_object( - 'spin_max_connections_per_second').get_value_as_int() + 'spin_max_connections_per_second', + ).get_value_as_int() new_core_config['max_connections_per_torrent'] = self.builder.get_object( - 'spin_max_connections_per_torrent').get_value_as_int() + 'spin_max_connections_per_torrent', + ).get_value_as_int() new_core_config['max_upload_slots_per_torrent'] = self.builder.get_object( - 'spin_max_upload_slots_per_torrent').get_value_as_int() + 'spin_max_upload_slots_per_torrent', + ).get_value_as_int() new_core_config['max_upload_speed_per_torrent'] = self.builder.get_object( - 'spin_max_upload_per_torrent').get_value() + 'spin_max_upload_per_torrent', + ).get_value() new_core_config['max_download_speed_per_torrent'] = self.builder.get_object( - 'spin_max_download_per_torrent').get_value() + 'spin_max_download_per_torrent', + ).get_value() new_core_config['ignore_limits_on_local_network'] = self.builder.get_object( - 'chk_ignore_limits_on_local_network').get_active() + 'chk_ignore_limits_on_local_network', + ).get_active() new_core_config['rate_limit_ip_overhead'] = self.builder.get_object( - 'chk_rate_limit_ip_overhead').get_active() + 'chk_rate_limit_ip_overhead', + ).get_active() # Interface tab # new_gtkui_config['enable_system_tray'] = self.builder.get_object('chk_use_tray').get_active() @@ -574,20 +596,24 @@ class Preferences(component.Component): new_gtkui_config['standalone'] = new_gtkui_standalone new_gtkui_config['show_rate_in_title'] = self.builder.get_object( - 'chk_show_rate_in_title').get_active() + 'chk_show_rate_in_title', + ).get_active() new_gtkui_config['focus_main_window_on_add'] = self.builder.get_object( - 'chk_focus_main_window_on_add').get_active() + 'chk_focus_main_window_on_add', + ).get_active() # Other tab # new_gtkui_config['show_new_releases'] = self.builder.get_object( - 'chk_show_new_releases').get_active() + 'chk_show_new_releases', + ).get_active() new_core_config['send_info'] = self.builder.get_object('chk_send_info').get_active() new_core_config['geoip_db_location'] = self.builder.get_object('entry_geoip').get_text() # Daemon tab # new_core_config['daemon_port'] = self.builder.get_object('spin_daemon_port').get_value_as_int() new_core_config['allow_remote'] = self.builder.get_object( - 'chk_allow_remote_connections').get_active() + 'chk_allow_remote_connections', + ).get_active() new_core_config['new_release_check'] = self.builder.get_object('chk_new_releases').get_active() # Proxy tab # @@ -601,28 +627,35 @@ class Preferences(component.Component): 'proxy_peer_connections': self.builder.get_object('chk_proxy_peer_conn').get_active(), 'proxy_tracker_connections': self.builder.get_object('chk_proxy_tracker_conn').get_active(), 'force_proxy': self.builder.get_object('chk_force_proxy').get_active(), - 'anonymous_mode': self.builder.get_object('chk_anonymous_mode').get_active() + 'anonymous_mode': self.builder.get_object('chk_anonymous_mode').get_active(), } # Queue tab # new_core_config['queue_new_to_top'] = self.builder.get_object('chk_queue_new_top').get_active() new_core_config['max_active_seeding'] = self.builder.get_object( - 'spin_seeding').get_value_as_int() + 'spin_seeding', + ).get_value_as_int() new_core_config['max_active_downloading'] = self.builder.get_object( - 'spin_downloading').get_value_as_int() + 'spin_downloading', + ).get_value_as_int() new_core_config['max_active_limit'] = self.builder.get_object('spin_active').get_value_as_int() new_core_config['dont_count_slow_torrents'] = self.builder.get_object( - 'chk_dont_count_slow_torrents').get_active() + 'chk_dont_count_slow_torrents', + ).get_active() new_core_config['auto_manage_prefer_seeds'] = self.builder.get_object( - 'chk_auto_manage_prefer_seeds').get_active() + 'chk_auto_manage_prefer_seeds', + ).get_active() new_core_config['stop_seed_at_ratio'] = self.builder.get_object('chk_share_ratio').get_active() new_core_config['remove_seed_at_ratio'] = self.builder.get_object( - 'radio_remove_ratio').get_active() + 'radio_remove_ratio', + ).get_active() new_core_config['stop_seed_ratio'] = self.builder.get_object('spin_share_ratio').get_value() new_core_config['share_ratio_limit'] = self.builder.get_object( - 'spin_share_ratio_limit').get_value() + 'spin_share_ratio_limit', + ).get_value() new_core_config['seed_time_ratio_limit'] = self.builder.get_object( - 'spin_seed_time_ratio_limit').get_value() + 'spin_seed_time_ratio_limit', + ).get_value() new_core_config['seed_time_limit'] = self.builder.get_object('spin_seed_time_limit').get_value() # Cache tab # @@ -640,7 +673,7 @@ class Preferences(component.Component): if active == -1: dialog = InformationDialog( _('Attention'), - _('You must choose a language') + _('You must choose a language'), ) dialog.run() return @@ -651,7 +684,7 @@ class Preferences(component.Component): if new_gtkui_config['language'] != self.gtkui_config['language']: dialog = InformationDialog( _('Attention'), - _('You must now restart the deluge UI for the changes to take effect.') + _('You must now restart the deluge UI for the changes to take effect.'), ) dialog.run() @@ -693,13 +726,15 @@ class Preferences(component.Component): else: self.gtkui_config['standalone'] = not new_gtkui_standalone self.builder.get_object('radio_standalone').set_active( - self.gtkui_config['standalone']) + self.gtkui_config['standalone'], + ) self.builder.get_object('radio_thinclient').set_active( - not self.gtkui_config['standalone']) + not self.gtkui_config['standalone'], + ) mode = 'Thinclient' if was_standalone else 'Standalone' dialog = YesNoDialog( _('Switching Deluge Client Mode...'), - _('Do you want to restart to use %s mode?' % mode) + _('Do you want to restart to use %s mode?' % mode), ) dialog.run().addCallback(on_response) @@ -710,11 +745,13 @@ class Preferences(component.Component): def __update_cache_status(self): # Updates the cache status labels with the info in the dict - cache_labels = ('label_cache_read_ops', 'label_cache_write_ops', - 'label_cache_num_blocks_read', 'label_cache_num_blocks_written', - 'label_cache_read_hit_ratio', 'label_cache_write_hit_ratio', - 'label_cache_num_blocks_cache_hits', 'label_cache_disk_blocks_in_use', - 'label_cache_read_cache_blocks') + cache_labels = ( + 'label_cache_read_ops', 'label_cache_write_ops', + 'label_cache_num_blocks_read', 'label_cache_num_blocks_written', + 'label_cache_read_hit_ratio', 'label_cache_write_hit_ratio', + 'label_cache_num_blocks_cache_hits', 'label_cache_disk_blocks_in_use', + 'label_cache_read_cache_blocks', + ) for widget_name in cache_labels: widget = self.builder.get_object(widget_name) @@ -760,30 +797,42 @@ class Preferences(component.Component): path_choosers = { 'download_location_path_chooser': self.download_location_path_chooser, 'move_completed_path_chooser': self.move_completed_path_chooser, - 'torrentfiles_location_path_chooser': self.copy_torrent_files_path_chooser + 'torrentfiles_location_path_chooser': self.copy_torrent_files_path_chooser, } dependents = { 'chk_show_dialog': {'chk_focus_dialog': True}, 'chk_random_incoming_port': {'spin_incoming_port': False}, - 'chk_random_outgoing_ports': {'spin_outgoing_port_min': False, - 'spin_outgoing_port_max': False}, - 'chk_use_tray': {'radio_appind': True, - 'radio_systray': True, - 'chk_min_on_close': True, - 'chk_start_in_tray': True, - 'alignment_tray_type': True, - 'chk_lock_tray': True}, - 'chk_lock_tray': {'txt_tray_password': True, - 'password_label': True}, - 'radio_open_folder_custom': {'combo_file_manager': False, - 'txt_open_folder_location': True}, + 'chk_random_outgoing_ports': { + 'spin_outgoing_port_min': False, + 'spin_outgoing_port_max': False, + }, + 'chk_use_tray': { + 'radio_appind': True, + 'radio_systray': True, + 'chk_min_on_close': True, + 'chk_start_in_tray': True, + 'alignment_tray_type': True, + 'chk_lock_tray': True, + }, + 'chk_lock_tray': { + 'txt_tray_password': True, + 'password_label': True, + }, + 'radio_open_folder_custom': { + 'combo_file_manager': False, + 'txt_open_folder_location': True, + }, 'chk_move_completed': {'move_completed_path_chooser': True}, - 'chk_copy_torrent_file': {'torrentfiles_location_path_chooser': True, - 'chk_del_copy_torrent_file': True}, - 'chk_share_ratio': {'spin_share_ratio': True, - 'radio_pause_ratio': True, - 'radio_remove_ratio': True} + 'chk_copy_torrent_file': { + 'torrentfiles_location_path_chooser': True, + 'chk_del_copy_torrent_file': True, + }, + 'chk_share_ratio': { + 'spin_share_ratio': True, + 'radio_pause_ratio': True, + 'radio_remove_ratio': True, + }, } def update_dependent_widgets(name, value): @@ -883,7 +932,7 @@ class Preferences(component.Component): _('Select the Plugin'), self.pref_dialog, gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) + buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK), ) chooser.set_transient_for(self.pref_dialog) @@ -909,7 +958,8 @@ class Preferences(component.Component): filename = os.path.split(filepath)[1] shutil.copyfile( filepath, - os.path.join(get_config_dir(), 'plugins', filename)) + os.path.join(get_config_dir(), 'plugins', filename), + ) component.get('PluginManager').scan_for_plugins() @@ -949,17 +999,20 @@ class Preferences(component.Component): proxy_entries = [ 'label_proxy_host', 'entry_proxy_host', 'label_proxy_port', 'spin_proxy_port', 'label_proxy_pass', 'entry_proxy_pass', 'label_proxy_user', 'entry_proxy_user', - 'chk_proxy_host_resolve', 'chk_proxy_peer_conn', 'chk_proxy_tracker_conn'] + 'chk_proxy_host_resolve', 'chk_proxy_peer_conn', 'chk_proxy_tracker_conn', + ] # 0: None, 1: Socks4, 2: Socks5, 3: Socks5 Auth, 4: HTTP, 5: HTTP Auth, 6: I2P show_entries = [] if proxy_type > 0: show_entries.extend([ 'label_proxy_host', 'entry_proxy_host', 'label_proxy_port', 'spin_proxy_port', - 'chk_proxy_peer_conn', 'chk_proxy_tracker_conn']) + 'chk_proxy_peer_conn', 'chk_proxy_tracker_conn', + ]) if proxy_type in (3, 5): show_entries.extend([ - 'label_proxy_pass', 'entry_proxy_pass', 'label_proxy_user', 'entry_proxy_user']) + 'label_proxy_pass', 'entry_proxy_pass', 'label_proxy_user', 'entry_proxy_user', + ]) if proxy_type in (2, 3, 4, 5): show_entries.extend(['chk_proxy_host_resolve']) @@ -999,7 +1052,7 @@ class Preferences(component.Component): ErrorDialog( _('Server Side Error'), _('An error occurred on the server'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() client.core.get_known_accounts().addCallback(on_ok).addErrback(on_fail) @@ -1054,18 +1107,18 @@ class Preferences(component.Component): ErrorDialog( _('Error Adding Account'), _('Authentication failed'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() else: ErrorDialog( _('Error Adding Account'), _('An error occurred while adding account'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() if response_id == gtk.RESPONSE_OK: client.core.create_account( - username, password, authlevel + username, password, authlevel, ).addCallback(add_ok).addErrback(add_fail) dialog.run().addCallback(dialog_finished) @@ -1080,7 +1133,7 @@ class Preferences(component.Component): model[itr][ACCOUNTS_PASSWORD], model[itr][ACCOUNTS_LEVEL], levels_mapping=client.auth_levels_mapping, - parent=self.pref_dialog + parent=self.pref_dialog, ) def dialog_finished(response_id): @@ -1093,14 +1146,14 @@ class Preferences(component.Component): ErrorDialog( _('Error Updating Account'), _('An error occurred while updating account'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() if response_id == gtk.RESPONSE_OK: client.core.update_account( dialog.get_username(), dialog.get_password(), - dialog.get_authlevel() + dialog.get_authlevel(), ).addCallback(update_ok).addErrback(update_fail) dialog.run().addCallback(dialog_finished) @@ -1113,7 +1166,7 @@ class Preferences(component.Component): username = model[itr][0] header = _('Remove Account') text = _('Are you sure you want to remove the account with the ' - 'username "%(username)s"?' % dict(username=username)) + 'username "%(username)s"?' % {'username': username}) dialog = YesNoDialog(header, text, parent=self.pref_dialog) def dialog_finished(response_id): @@ -1125,17 +1178,17 @@ class Preferences(component.Component): ErrorDialog( _('Error Removing Account'), _('Auhentication failed'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() else: ErrorDialog( _('Error Removing Account'), _('An error occurred while removing account'), - parent=self.pref_dialog, details=failure.getErrorMessage() + parent=self.pref_dialog, details=failure.getErrorMessage(), ).run() if response_id == gtk.RESPONSE_YES: client.core.remove_account( - username + username, ).addCallback(remove_ok).addErrback(remove_fail) dialog.run().addCallback(dialog_finished) @@ -1184,7 +1237,8 @@ class Preferences(component.Component): self.gtkui_config.apply_set_functions('pieces_colors') self.builder.get_object('revert_color_%s' % state).set_sensitive( - [color.red, color.green, color.blue] != self.COLOR_DEFAULTS[state]) + [color.red, color.green, color.blue] != self.COLOR_DEFAULTS[state], + ) def __revert_color(self, state, from_config=False): log.debug('Reverting %r color state', state) diff --git a/deluge/ui/gtkui/queuedtorrents.py b/deluge/ui/gtkui/queuedtorrents.py index 64cf4baad..9312d1da1 100644 --- a/deluge/ui/gtkui/queuedtorrents.py +++ b/deluge/ui/gtkui/queuedtorrents.py @@ -33,7 +33,8 @@ class QueuedTorrents(component.Component): self.config = ConfigManager('gtkui.conf') self.builder = Builder() self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'queuedtorrents.ui'))) + 'deluge.ui.gtkui', os.path.join('glade', 'queuedtorrents.ui'), + )) self.builder.get_object('chk_autoadd').set_active(self.config['autoadd_queued']) self.dialog = self.builder.get_object('queued_torrents_dialog') self.dialog.set_icon(get_logo(32)) @@ -117,7 +118,8 @@ class QueuedTorrents(component.Component): self.status_item = component.get('StatusBar').add_item( stock=STOCK_SORT_DESCENDING, text=label, - callback=self.on_statusbar_click) + callback=self.on_statusbar_click, + ) else: self.status_item.set_text(label) diff --git a/deluge/ui/gtkui/removetorrentdialog.py b/deluge/ui/gtkui/removetorrentdialog.py index 4d2893278..27faad359 100644 --- a/deluge/ui/gtkui/removetorrentdialog.py +++ b/deluge/ui/gtkui/removetorrentdialog.py @@ -43,7 +43,8 @@ class RemoveTorrentDialog(object): self.builder = gtk.Builder() self.builder.add_from_file(deluge.common.resource_filename( - 'deluge.ui.gtkui', os.path.join('glade', 'remove_torrent_dialog.ui'))) + 'deluge.ui.gtkui', os.path.join('glade', 'remove_torrent_dialog.ui'), + )) self.__dialog = self.builder.get_object('remove_torrent_dialog') self.__dialog.set_transient_for(component.get('MainWindow').window) diff --git a/deluge/ui/gtkui/status_tab.py b/deluge/ui/gtkui/status_tab.py index 38dbbf6fb..740a7b0d0 100644 --- a/deluge/ui/gtkui/status_tab.py +++ b/deluge/ui/gtkui/status_tab.py @@ -32,14 +32,22 @@ class StatusTab(Tab): self.piecesbar = None self.add_tab_widget('summary_availability', fratio, ('distributed_copies',)) - self.add_tab_widget('summary_total_downloaded', ftotal_sized, - ('all_time_download', 'total_payload_download')) - self.add_tab_widget('summary_total_uploaded', ftotal_sized, - ('total_uploaded', 'total_payload_upload')) - self.add_tab_widget('summary_download_speed', fspeed_max, - ('download_payload_rate', 'max_download_speed')) - self.add_tab_widget('summary_upload_speed', fspeed_max, - ('upload_payload_rate', 'max_upload_speed')) + self.add_tab_widget( + 'summary_total_downloaded', ftotal_sized, + ('all_time_download', 'total_payload_download'), + ) + self.add_tab_widget( + 'summary_total_uploaded', ftotal_sized, + ('total_uploaded', 'total_payload_upload'), + ) + self.add_tab_widget( + 'summary_download_speed', fspeed_max, + ('download_payload_rate', 'max_download_speed'), + ) + self.add_tab_widget( + 'summary_upload_speed', fspeed_max, + ('upload_payload_rate', 'max_upload_speed'), + ) self.add_tab_widget('summary_seeds', fpeer, ('num_seeds', 'total_seeds')) self.add_tab_widget('summary_peers', fpeer, ('num_peers', 'total_peers')) self.add_tab_widget('summary_eta', ftime_or_dash, ('eta',)) @@ -68,7 +76,8 @@ class StatusTab(Tab): status_keys.extend(['pieces', 'num_pieces']) component.get('SessionProxy').get_torrent_status( - selected, status_keys).addCallback(self._on_get_torrent_status) + selected, status_keys, + ).addCallback(self._on_get_torrent_status) def _on_get_torrent_status(self, status): # Check to see if we got valid data from the core @@ -105,7 +114,8 @@ class StatusTab(Tab): if self.piecesbar is None: self.piecesbar = PiecesBar() self.main_builder.get_object( - 'status_progress_vbox').pack_start(self.piecesbar, False, False, 0) + 'status_progress_vbox', + ).pack_start(self.piecesbar, False, False, 0) self.tab_widgets['piecesbar'] = TabWidget(self.piecesbar, fpcnt, ('progress', 'state', 'message')) self.piecesbar.show() self.progressbar.hide() diff --git a/deluge/ui/gtkui/statusbar.py b/deluge/ui/gtkui/statusbar.py index 27ade3dbb..d9edc9d81 100644 --- a/deluge/ui/gtkui/statusbar.py +++ b/deluge/ui/gtkui/statusbar.py @@ -122,7 +122,7 @@ class StatusBar(component.Component): 'max_connections_global': self._on_max_connections_global, 'max_download_speed': self._on_max_download_speed, 'max_upload_speed': self._on_max_upload_speed, - 'dht': self._on_dht + 'dht': self._on_dht, } self.current_warnings = [] # Add a HBox to the statusbar after removing the initial label widget @@ -138,7 +138,8 @@ class StatusBar(component.Component): # Create the not connected item self.not_connected_item = StatusBarItem( stock=gtk.STOCK_STOP, text=_('Not Connected'), - callback=self._on_notconnected_item_clicked) + callback=self._on_notconnected_item_clicked, + ) # Show the not connected status bar self.show_not_connected() @@ -154,40 +155,48 @@ class StatusBar(component.Component): self.connections_item = self.add_item( stock=gtk.STOCK_NETWORK, callback=self._on_connection_item_clicked, - tooltip=_('Connections (Limit)'), pack_start=True) + tooltip=_('Connections (Limit)'), pack_start=True, + ) self.download_item = self.add_item( image=get_pixmap('downloading16.png'), callback=self._on_download_item_clicked, - tooltip=_('Download Speed (Limit)'), pack_start=True) + tooltip=_('Download Speed (Limit)'), pack_start=True, + ) self.upload_item = self.add_item( image=get_pixmap('seeding16.png'), callback=self._on_upload_item_clicked, - tooltip=_('Upload Speed (Limit)'), pack_start=True) + tooltip=_('Upload Speed (Limit)'), pack_start=True, + ) self.traffic_item = self.add_item( image=get_pixmap('traffic16.png'), callback=self._on_traffic_item_clicked, - tooltip=_('Protocol Traffic (Down:Up)'), pack_start=True) + tooltip=_('Protocol Traffic (Down:Up)'), pack_start=True, + ) self.dht_item = StatusBarItem( - image=get_pixmap('dht16.png'), tooltip=_('DHT Nodes')) + image=get_pixmap('dht16.png'), tooltip=_('DHT Nodes'), + ) self.diskspace_item = self.add_item( stock=gtk.STOCK_HARDDISK, callback=self._on_diskspace_item_clicked, - tooltip=_('Free Disk Space'), pack_start=True) + tooltip=_('Free Disk Space'), pack_start=True, + ) self.health_item = self.add_item( stock=gtk.STOCK_DIALOG_ERROR, text=_('<b><small>Port Issue</small></b>'), markup=True, tooltip=_('No incoming connections, check port forwarding'), - callback=self._on_health_icon_clicked) + callback=self._on_health_icon_clicked, + ) self.external_ip_item = self.add_item( - tooltip=_('External IP Address'), pack_start=True) + tooltip=_('External IP Address'), pack_start=True, + ) self.health = False @@ -197,8 +206,10 @@ class StatusBar(component.Component): self._on_max_upload_speed(configs['max_upload_speed']) self._on_dht(configs['dht']) # Get some config values - client.core.get_config_values(['max_connections_global', 'max_download_speed', - 'max_upload_speed', 'dht']).addCallback(update_config_values) + client.core.get_config_values([ + 'max_connections_global', 'max_download_speed', + 'max_upload_speed', 'dht', + ]).addCallback(update_config_values) def stop(self): # When stopped, we just show the not connected thingy @@ -255,7 +266,8 @@ class StatusBar(component.Component): """Displays a warning to the user in the status bar""" if text not in self.current_warnings: item = self.add_item( - stock=gtk.STOCK_DIALOG_WARNING, text=text, callback=callback) + stock=gtk.STOCK_DIALOG_WARNING, text=text, callback=callback, + ) self.current_warnings.append(text) timeout_add(3000, self.remove_warning, item) @@ -359,7 +371,8 @@ class StatusBar(component.Component): label_string = self.download_rate else: label_string = '%s <small>(%i %s)</small>' % ( - self.download_rate, self.max_download_speed, _('K/s')) + self.download_rate, self.max_download_speed, _('K/s'), + ) self.download_item.set_markup(label_string) @@ -369,7 +382,8 @@ class StatusBar(component.Component): label_string = self.upload_rate else: label_string = '%s <small>(%i %s)</small>' % ( - self.upload_rate, self.max_upload_speed, _('K/s')) + self.upload_rate, self.max_upload_speed, _('K/s'), + ) self.upload_item.set_markup(label_string) @@ -383,12 +397,18 @@ class StatusBar(component.Component): def set_limit_value(self, widget, core_key): log.debug('_on_set_unlimit_other %s', core_key) other_dialog_info = { - 'max_download_speed': (_('Download Speed Limit'), _('Set the maximum download speed'), - _('K/s'), 'downloading.svg', self.max_download_speed), - 'max_upload_speed': (_('Upload Speed Limit'), _('Set the maximum upload speed'), - _('K/s'), 'seeding.svg', self.max_upload_speed), - 'max_connections_global': (_('Incoming Connections'), _('Set the maximum incoming connections'), - '', gtk.STOCK_NETWORK, self.max_connections_global) + 'max_download_speed': ( + _('Download Speed Limit'), _('Set the maximum download speed'), + _('K/s'), 'downloading.svg', self.max_download_speed, + ), + 'max_upload_speed': ( + _('Upload Speed Limit'), _('Set the maximum upload speed'), + _('K/s'), 'seeding.svg', self.max_upload_speed, + ), + 'max_connections_global': ( + _('Incoming Connections'), _('Set the maximum incoming connections'), + '', gtk.STOCK_NETWORK, self.max_connections_global, + ), } def set_value(value): @@ -418,7 +438,8 @@ class StatusBar(component.Component): self.config['tray_download_speed_list'], self._on_set_download_speed, self.max_download_speed, - _('K/s'), show_notset=True, show_other=True) + _('K/s'), show_notset=True, show_other=True, + ) menu.show_all() menu.popup(None, None, None, event.button, event.time) @@ -431,7 +452,8 @@ class StatusBar(component.Component): self.config['tray_upload_speed_list'], self._on_set_upload_speed, self.max_upload_speed, - _('K/s'), show_notset=True, show_other=True) + _('K/s'), show_notset=True, show_other=True, + ) menu.show_all() menu.popup(None, None, None, event.button, event.time) @@ -443,7 +465,8 @@ class StatusBar(component.Component): menu = common.build_menu_radio_list( self.config['connection_limit_list'], self._on_set_connection_limit, - self.max_connections_global, show_notset=True, show_other=True) + self.max_connections_global, show_notset=True, show_other=True, + ) menu.show_all() menu.popup(None, None, None, event.button, event.time) diff --git a/deluge/ui/gtkui/systemtray.py b/deluge/ui/gtkui/systemtray.py index d2ed55a35..c59280077 100644 --- a/deluge/ui/gtkui/systemtray.py +++ b/deluge/ui/gtkui/systemtray.py @@ -46,7 +46,7 @@ class SystemTray(component.Component): 'separatormenuitem1', 'separatormenuitem2', 'separatormenuitem3', - 'separatormenuitem4' + 'separatormenuitem4', ] self.config.register_set_function('enable_system_tray', self.on_enable_system_tray_set) # bit of a hack to prevent function from doing something on startup @@ -60,14 +60,16 @@ class SystemTray(component.Component): self.config_value_changed_dict = { 'max_download_speed': self._on_max_download_speed, - 'max_upload_speed': self._on_max_upload_speed + 'max_upload_speed': self._on_max_upload_speed, } def enable(self): """Enables the system tray icon.""" self.builder = Builder() - self.builder.add_from_file(resource_filename('deluge.ui.gtkui', os.path.join( - 'glade', 'tray_menu.ui'))) + self.builder.add_from_file(resource_filename( + 'deluge.ui.gtkui', + os.path.join('glade', 'tray_menu.ui'), + )) self.builder.connect_signals(self) @@ -75,8 +77,11 @@ class SystemTray(component.Component): if appindicator and self.config['enable_appindicator']: log.debug('Enabling the Application Indicator...') - self.indicator = appindicator.Indicator('deluge', 'deluge', - appindicator.CATEGORY_APPLICATION_STATUS) + self.indicator = appindicator.Indicator( + 'deluge', + 'deluge', + appindicator.CATEGORY_APPLICATION_STATUS, + ) try: self.indicator.set_property('title', _('Deluge')) except TypeError: @@ -167,7 +172,8 @@ class SystemTray(component.Component): def send_status_request(self): client.core.get_session_status([ 'payload_upload_rate', - 'payload_download_rate']).addCallback(self._on_get_session_status) + 'payload_download_rate', + ]).addCallback(self._on_get_session_status) def config_value_changed(self, key, value): """This is called when we received a config_value_changed signal from @@ -216,7 +222,7 @@ class SystemTray(component.Component): msg = '%s\n%s: %s (%s)\n%s: %s (%s)' % ( _('Deluge'), _('Down'), self.download_rate, - max_download_speed, _('Up'), self.upload_rate, max_upload_speed + max_download_speed, _('Up'), self.upload_rate, max_upload_speed, ) # Set the tooltip @@ -229,20 +235,22 @@ class SystemTray(component.Component): submenu_bwdownset = build_menu_radio_list( self.config['tray_download_speed_list'], self.on_tray_setbwdown, self.max_download_speed, - _('K/s'), show_notset=True, show_other=True + _('K/s'), show_notset=True, show_other=True, ) # Create the Upload speed list sub-menu submenu_bwupset = build_menu_radio_list( self.config['tray_upload_speed_list'], self.on_tray_setbwup, self.max_upload_speed, - _('K/s'), show_notset=True, show_other=True + _('K/s'), show_notset=True, show_other=True, ) # Add the sub-menus to the tray menu self.builder.get_object('menuitem_download_limit').set_submenu( - submenu_bwdownset) + submenu_bwdownset, + ) self.builder.get_object('menuitem_upload_limit').set_submenu( - submenu_bwupset) + submenu_bwupset, + ) # Show the sub-menus for all to see submenu_bwdownset.show_all() @@ -350,18 +358,22 @@ class SystemTray(component.Component): # ignore previous radiomenuitem value if not widget.get_active(): return - self.setbwlimit(widget, _('Download Speed Limit'), _('Set the maximum download speed'), - 'max_download_speed', 'tray_download_speed_list', self.max_download_speed, - 'downloading.svg') + self.setbwlimit( + widget, _('Download Speed Limit'), _('Set the maximum download speed'), + 'max_download_speed', 'tray_download_speed_list', self.max_download_speed, + 'downloading.svg', + ) def on_tray_setbwup(self, widget, data=None): if isinstance(widget, RadioMenuItem): # ignore previous radiomenuitem value if not widget.get_active(): return - self.setbwlimit(widget, _('Upload Speed Limit'), _('Set the maximum upload speed'), - 'max_upload_speed', 'tray_upload_speed_list', self.max_upload_speed, - 'seeding.svg') + self.setbwlimit( + widget, _('Upload Speed Limit'), _('Set the maximum upload speed'), + 'max_upload_speed', 'tray_upload_speed_list', self.max_upload_speed, + 'seeding.svg', + ) def _on_window_hide(self, widget, data=None): """_on_window_hide - update the menuitem's status""" diff --git a/deluge/ui/gtkui/toolbar.py b/deluge/ui/gtkui/toolbar.py index 75512568d..c266806c4 100644 --- a/deluge/ui/gtkui/toolbar.py +++ b/deluge/ui/gtkui/toolbar.py @@ -37,7 +37,7 @@ class ToolBar(component.Component): 'toolbutton_queue_up', 'toolbutton_queue_down', 'toolbutton_filter', - 'find_menuitem' + 'find_menuitem', ] # Hide if necessary @@ -45,7 +45,8 @@ class ToolBar(component.Component): def start(self): self.main_builder.get_object('toolbutton_connectionmanager').set_visible( - not self.config['standalone']) + not self.config['standalone'], + ) for widget in self.change_sensitivity: self.main_builder.get_object(widget).set_sensitive(True) diff --git a/deluge/ui/gtkui/torrentdetails.py b/deluge/ui/gtkui/torrentdetails.py index 1f09ee9b3..6be19dffb 100644 --- a/deluge/ui/gtkui/torrentdetails.py +++ b/deluge/ui/gtkui/torrentdetails.py @@ -122,7 +122,7 @@ class TorrentDetails(component.Component): 'Files': FilesTab, 'Peers': PeersTab, 'Options': OptionsTab, - 'Trackers': TrackersTab + 'Trackers': TrackersTab, } # tab_name, visible @@ -132,7 +132,7 @@ class TorrentDetails(component.Component): ('Options', True), ('Files', True), ('Peers', True), - ('Trackers', True) + ('Trackers', True), ] self.translate_tabs = { @@ -142,7 +142,7 @@ class TorrentDetails(component.Component): 'Files': _('Fi_les'), 'Peers': _('_Peers'), 'Options': _('_Options'), - 'Trackers': _('_Trackers') + 'Trackers': _('_Trackers'), } # Get the state from saved file @@ -174,7 +174,10 @@ class TorrentDetails(component.Component): # Determine insert position based on weight # weights is a list of visible tab names in weight order - weights = sorted([(tab.weight, name) for name, tab in self.tabs.items() if tab.is_visible]) + weights = sorted( + (tab.weight, name) + for name, tab in self.tabs.items() if tab.is_visible + ) log.debug('weights: %s', weights) log.debug('weight of tab: %s', weight) @@ -215,7 +218,8 @@ class TorrentDetails(component.Component): pos = self.notebook.insert_page( tab.get_child_widget(), tab.get_tab_label(), - insert_pos) + insert_pos, + ) log.debug('Tab inserted at %d', pos) tab.position = pos if not self.notebook.get_property('visible'): @@ -283,8 +287,10 @@ class TorrentDetails(component.Component): self.visible(show) def show_tab(self, tab_name, generate_menu=True): - log.debug('%s\n%s\n%s', self.tabs[tab_name].get_child_widget(), - self.tabs[tab_name].get_tab_label(), self.tabs[tab_name].position) + log.debug( + '%s\n%s\n%s', self.tabs[tab_name].get_child_widget(), + self.tabs[tab_name].get_tab_label(), self.tabs[tab_name].position, + ) position = self.tab_insert_position(self.tabs[tab_name].weight) @@ -292,7 +298,8 @@ class TorrentDetails(component.Component): self.notebook.insert_page( self.tabs[tab_name].get_child_widget(), self.tabs[tab_name].get_tab_label(), - position) + position, + ) self.tabs[tab_name].is_visible = True self.regenerate_positions() if generate_menu: diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 814a5ce1d..c87c197d1 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -256,63 +256,107 @@ class TorrentView(ListView, component.Component): # Add the columns to the listview self.add_text_column('torrent_id', hidden=True, unique=True) self.add_bool_column('dirty', hidden=True) - self.add_func_column('#', funcs.cell_data_queue, [int], - status_field=['queue'], - sort_func=queue_column_sort) - self.add_texticon_column(_('Name'), - status_field=['state', 'name'], - function=funcs.cell_data_statusicon, - default_sort=True) - self.add_func_column(_('Size'), funcs.cell_data_size, - [TYPE_UINT64], - status_field=['total_wanted']) - self.add_func_column(_('Downloaded'), funcs.cell_data_size, - [TYPE_UINT64], - status_field=['all_time_download'], default=False) - self.add_func_column(_('Uploaded'), funcs.cell_data_size, - [TYPE_UINT64], - status_field=['total_uploaded'], default=False) - self.add_func_column(_('Remaining'), funcs.cell_data_size, [TYPE_UINT64], - status_field=['total_remaining'], default=False) - self.add_progress_column(_('Progress'), - status_field=['progress', 'state'], - col_types=[float, str], - function=funcs.cell_data_progress, - sort_func=progress_sort) - self.add_func_column(_('Seeds'), funcs.cell_data_peer, [int, int], - status_field=['num_seeds', 'total_seeds'], - sort_func=seed_peer_column_sort, default=False) - self.add_func_column(_('Peers'), funcs.cell_data_peer, [int, int], - status_field=['num_peers', 'total_peers'], - sort_func=seed_peer_column_sort, default=False) - self.add_func_column(_('Seeds:Peers'), funcs.cell_data_ratio_seeds_peers, [float], - status_field=['seeds_peers_ratio'], default=False) - self.add_func_column(_('Down Speed'), funcs.cell_data_speed_down, [int], - status_field=['download_payload_rate']) - self.add_func_column(_('Up Speed'), funcs.cell_data_speed_up, [int], - status_field=['upload_payload_rate']) - self.add_func_column(_('Down Limit'), funcs.cell_data_speed_limit_down, [float], - status_field=['max_download_speed'], default=False) - self.add_func_column(_('Up Limit'), funcs.cell_data_speed_limit_up, [float], - status_field=['max_upload_speed'], default=False) - self.add_func_column(_('ETA'), funcs.cell_data_time, [int], - status_field=['eta'], sort_func=eta_column_sort) - self.add_func_column(_('Ratio'), funcs.cell_data_ratio_ratio, [float], - status_field=['ratio'], default=False) - self.add_func_column(_('Avail'), funcs.cell_data_ratio_avail, [float], - status_field=['distributed_copies'], default=False) - self.add_func_column(_('Added'), funcs.cell_data_date_added, [int], - status_field=['time_added'], default=False) - self.add_func_column(_('Completed'), funcs.cell_data_date_completed, [int], - status_field=['completed_time'], default=False) - self.add_func_column(_('Complete Seen'), funcs.cell_data_date_or_never, [int], - status_field=['last_seen_complete'], default=False) - self.add_texticon_column(_('Tracker'), function=funcs.cell_data_trackericon, - status_field=['tracker_host', 'tracker_host'], default=False) + self.add_func_column( + '#', funcs.cell_data_queue, [int], + status_field=['queue'], + sort_func=queue_column_sort, + ) + self.add_texticon_column( + _('Name'), + status_field=['state', 'name'], + function=funcs.cell_data_statusicon, + default_sort=True, + ) + self.add_func_column( + _('Size'), funcs.cell_data_size, + [TYPE_UINT64], + status_field=['total_wanted'], + ) + self.add_func_column( + _('Downloaded'), funcs.cell_data_size, + [TYPE_UINT64], + status_field=['all_time_download'], default=False, + ) + self.add_func_column( + _('Uploaded'), funcs.cell_data_size, + [TYPE_UINT64], + status_field=['total_uploaded'], default=False, + ) + self.add_func_column( + _('Remaining'), funcs.cell_data_size, [TYPE_UINT64], + status_field=['total_remaining'], default=False, + ) + self.add_progress_column( + _('Progress'), + status_field=['progress', 'state'], + col_types=[float, str], + function=funcs.cell_data_progress, + sort_func=progress_sort, + ) + self.add_func_column( + _('Seeds'), funcs.cell_data_peer, [int, int], + status_field=['num_seeds', 'total_seeds'], + sort_func=seed_peer_column_sort, default=False, + ) + self.add_func_column( + _('Peers'), funcs.cell_data_peer, [int, int], + status_field=['num_peers', 'total_peers'], + sort_func=seed_peer_column_sort, default=False, + ) + self.add_func_column( + _('Seeds:Peers'), funcs.cell_data_ratio_seeds_peers, [float], + status_field=['seeds_peers_ratio'], default=False, + ) + self.add_func_column( + _('Down Speed'), funcs.cell_data_speed_down, [int], + status_field=['download_payload_rate'], + ) + self.add_func_column( + _('Up Speed'), funcs.cell_data_speed_up, [int], + status_field=['upload_payload_rate'], + ) + self.add_func_column( + _('Down Limit'), funcs.cell_data_speed_limit_down, [float], + status_field=['max_download_speed'], default=False, + ) + self.add_func_column( + _('Up Limit'), funcs.cell_data_speed_limit_up, [float], + status_field=['max_upload_speed'], default=False, + ) + self.add_func_column( + _('ETA'), funcs.cell_data_time, [int], + status_field=['eta'], sort_func=eta_column_sort, + ) + self.add_func_column( + _('Ratio'), funcs.cell_data_ratio_ratio, [float], + status_field=['ratio'], default=False, + ) + self.add_func_column( + _('Avail'), funcs.cell_data_ratio_avail, [float], + status_field=['distributed_copies'], default=False, + ) + self.add_func_column( + _('Added'), funcs.cell_data_date_added, [int], + status_field=['time_added'], default=False, + ) + self.add_func_column( + _('Completed'), funcs.cell_data_date_completed, [int], + status_field=['completed_time'], default=False, + ) + self.add_func_column( + _('Complete Seen'), funcs.cell_data_date_or_never, [int], + status_field=['last_seen_complete'], default=False, + ) + self.add_texticon_column( + _('Tracker'), function=funcs.cell_data_trackericon, + status_field=['tracker_host', 'tracker_host'], default=False, + ) self.add_text_column(_('Download Folder'), status_field=['download_location'], default=False) self.add_text_column(_('Owner'), status_field=['owner'], default=False) - self.add_bool_column(_('Shared'), status_field=['shared'], default=False, - tooltip=_('Torrent is shared between other Deluge users or not.')) + self.add_bool_column( + _('Shared'), status_field=['shared'], default=False, + tooltip=_('Torrent is shared between other Deluge users or not.'), + ) self.restore_columns_order_from_state() # Set filter to None for now @@ -350,7 +394,8 @@ class TorrentView(ListView, component.Component): continue status_fields.extend(listview_column.status_field) component.get('SessionProxy').get_torrents_status( - {}, status_fields).addCallback(self._on_session_state) + {}, status_fields, + ).addCallback(self._on_session_state) client.register_event_handler('TorrentStateChangedEvent', self.on_torrentstatechanged_event) client.register_event_handler('TorrentAddedEvent', self.on_torrentadded_event) @@ -428,9 +473,11 @@ class TorrentView(ListView, component.Component): for column in columns: # Make sure column is visible and has 'status_field' set. # If not, we can ignore it. - if (self.columns[column].column.get_visible() is True - and self.columns[column].hidden is False - and self.columns[column].status_field is not None): + if ( + self.columns[column].column.get_visible() is True + and self.columns[column].hidden is False + and self.columns[column].status_field is not None + ): for field in self.columns[column].status_field: status_keys.append(field) self.columns_to_update.append(column) @@ -454,7 +501,8 @@ class TorrentView(ListView, component.Component): # Request the statuses for all these torrent_ids, this is async so we # will deal with the return in a signal callback. d = component.get('SessionProxy').get_torrents_status( - self.filter, status_keys).addCallback(self._on_get_torrents_status) + self.filter, status_keys, + ).addCallback(self._on_get_torrents_status) if select_row: d.addCallback(self.select_first_row) diff --git a/deluge/ui/gtkui/torrentview_data_funcs.py b/deluge/ui/gtkui/torrentview_data_funcs.py index c591513b6..4e3260c0d 100644 --- a/deluge/ui/gtkui/torrentview_data_funcs.py +++ b/deluge/ui/gtkui/torrentview_data_funcs.py @@ -26,7 +26,7 @@ ICON_STATE = { 'Paused': icon_inactive, 'Error': icon_alert, 'Queued': icon_queued, - 'Moving': icon_checking + 'Moving': icon_checking, } # Cache the key used to calculate the current value set for the specific cell @@ -48,7 +48,7 @@ func_last_value = { 'cell_data_statusicon': None, 'cell_data_queue': None, 'cell_data_progress': [None, None], - 'cell_data_peer_progress': None + 'cell_data_peer_progress': None, } diff --git a/deluge/ui/sessionproxy.py b/deluge/ui/sessionproxy.py index 912d58625..8c363b478 100644 --- a/deluge/ui/sessionproxy.py +++ b/deluge/ui/sessionproxy.py @@ -132,7 +132,7 @@ class SessionProxy(component.Component): keys_to_get.append(key) if not keys_to_get: return succeed( - self.create_status_dict([torrent_id], keys)[torrent_id] + self.create_status_dict([torrent_id], keys)[torrent_id], ) else: d = client.core.get_torrent_status(torrent_id, keys_to_get, True) diff --git a/deluge/ui/tracker_icons.py b/deluge/ui/tracker_icons.py index dd367ec3b..492d96d23 100644 --- a/deluge/ui/tracker_icons.py +++ b/deluge/ui/tracker_icons.py @@ -208,14 +208,20 @@ class TrackerIcons(Component): self.pending[host] = [] # Start callback chain d = self.download_page(host) - d.addCallbacks(self.on_download_page_complete, self.on_download_page_fail, - errbackArgs=(host,)) + d.addCallbacks( + self.on_download_page_complete, self.on_download_page_fail, + errbackArgs=(host,), + ) d.addCallback(self.parse_html_page) - d.addCallbacks(self.on_parse_complete, self.on_parse_fail, - callbackArgs=(host,)) + d.addCallbacks( + self.on_parse_complete, self.on_parse_fail, + callbackArgs=(host,), + ) d.addCallback(self.download_icon, host) - d.addCallbacks(self.on_download_icon_complete, self.on_download_icon_fail, - callbackArgs=(host,), errbackArgs=(host,)) + d.addCallbacks( + self.on_download_icon_complete, self.on_download_icon_fail, + callbackArgs=(host,), errbackArgs=(host,), + ) if PIL_INSTALLED: d.addCallback(self.resize_icon) d.addCallback(self.store_icon, host) @@ -272,8 +278,10 @@ class TrackerIcons(Component): location = urljoin(self.host_to_url(host), error_msg.split(' to ')[1]) self.redirects[host] = url_to_host(location) d = self.download_page(host, url=location) - d.addCallbacks(self.on_download_page_complete, self.on_download_page_fail, - errbackArgs=(host,)) + d.addCallbacks( + self.on_download_page_complete, self.on_download_page_fail, + errbackArgs=(host,), + ) return d @@ -345,8 +353,10 @@ class TrackerIcons(Component): if len(icons) == 0: raise NoIconsError('empty icons list') (url, mimetype) = icons.pop(0) - d = download_file(url, os.path.join(self.dir, host_to_icon_name(host, mimetype)), - force_filename=True) + d = download_file( + url, os.path.join(self.dir, host_to_icon_name(host, mimetype)), + force_filename=True, + ) d.addCallback(self.check_icon_is_valid) if icons: d.addErrback(self.on_download_icon_fail, host, icons) @@ -413,16 +423,24 @@ class TrackerIcons(Component): location = urljoin(self.host_to_url(host), error_msg.split(' to ')[1]) d = self.download_icon([(location, extension_to_mimetype(location.rpartition('.')[2]))] + icons, host) if not icons: - d.addCallbacks(self.on_download_icon_complete, self.on_download_icon_fail, - callbackArgs=(host,), errbackArgs=(host,)) + d.addCallbacks( + self.on_download_icon_complete, self.on_download_icon_fail, + callbackArgs=(host,), errbackArgs=(host,), + ) elif f.check(NoResource, ForbiddenResource) and icons: d = self.download_icon(icons, host) elif f.check(NoIconsError): # No icons, try favicon.ico as an act of desperation - d = self.download_icon([(urljoin(self.host_to_url(host), 'favicon.ico'), - extension_to_mimetype('ico'))], host) - d.addCallbacks(self.on_download_icon_complete, self.on_download_icon_fail, - callbackArgs=(host,), errbackArgs=(host,)) + d = self.download_icon( + [( + urljoin(self.host_to_url(host), 'favicon.ico'), + extension_to_mimetype('ico'), + )], host, + ) + d.addCallbacks( + self.on_download_icon_complete, self.on_download_icon_fail, + callbackArgs=(host,), errbackArgs=(host,), + ) else: # No icons :( # Return the None Icon diff --git a/deluge/ui/ui_entry.py b/deluge/ui/ui_entry.py index 4e4ae2b65..c4f2f3b26 100644 --- a/deluge/ui/ui_entry.py +++ b/deluge/ui/ui_entry.py @@ -27,7 +27,7 @@ from deluge.ui.baseargparser import BaseArgParser from deluge.ui.translations_util import setup_translations DEFAULT_PREFS = { - 'default_ui': 'gtk' + 'default_ui': 'gtk', } AMBIGUOUS_CMD_ARGS = ('-h', '--help', '-v', '-V', '--version') @@ -51,8 +51,10 @@ def start_ui(): def add_ui_options_group(_parser): """Function to enable reuse of UI Options group""" group = _parser.add_argument_group(_('UI Options')) - group.add_argument('-s', '--set-default-ui', dest='default_ui', choices=ui_titles, - help=_('Set the default UI to be run, when no UI is specified')) + group.add_argument( + '-s', '--set-default-ui', dest='default_ui', choices=ui_titles, + help=_('Set the default UI to be run, when no UI is specified'), + ) return _parser # Setup parser with Common Options and add UI Options group. @@ -81,11 +83,15 @@ def start_ui(): parser = add_ui_options_group(BaseArgParser(common_help=True)) # Create subparser for each registered UI. Empty title is used to remove unwanted positional text. - subparsers = parser.add_subparsers(dest='selected_ui', metavar='{%s} [UI args]' % ','.join(ui_titles), title=None, - help=_('Alternative UI to launch, with optional ui args \n (default UI: *)')) + subparsers = parser.add_subparsers( + dest='selected_ui', metavar='{%s} [UI args]' % ','.join(ui_titles), title=None, + help=_('Alternative UI to launch, with optional ui args \n (default UI: *)'), + ) for ui in ui_titles: - parser_ui = subparsers.add_parser(ui, common_help=False, - help=getattr(ui_entrypoints[ui], 'cmd_description', '')) + parser_ui = subparsers.add_parser( + ui, common_help=False, + help=getattr(ui_entrypoints[ui], 'cmd_description', ''), + ) parser_ui.add_argument('ui_args', nargs=argparse.REMAINDER) # If the UI is set as default, indicate this in help by prefixing with a star. subactions = subparsers._get_subactions() @@ -106,16 +112,20 @@ def start_ui(): try: ui = ui_entrypoints[selected_ui](prog='%s %s' % (os.path.basename(sys.argv[0]), selected_ui), ui_args=ui_args) except KeyError as ex: - log.error('Unable to find chosen UI: "%s". Please choose a different UI ' - 'or use "--set-default-ui" to change default UI.', selected_ui) + log.error( + 'Unable to find chosen UI: "%s". Please choose a different UI ' + 'or use "--set-default-ui" to change default UI.', selected_ui, + ) except ImportError as ex: import traceback error_type, error_value, tb = sys.exc_info() stack = traceback.extract_tb(tb) last_frame = stack[-1] if last_frame[0] == __file__: - log.error('Unable to find chosen UI: "%s". Please choose a different UI ' - 'or use "--set-default-ui" to change default UI.', selected_ui) + log.error( + 'Unable to find chosen UI: "%s". Please choose a different UI ' + 'or use "--set-default-ui" to change default UI.', selected_ui, + ) else: log.exception(ex) log.error('Encountered an error launching the request UI: %s', selected_ui) diff --git a/deluge/ui/web/auth.py b/deluge/ui/web/auth.py index 5416b677d..3ab8ccf9f 100644 --- a/deluge/ui/web/auth.py +++ b/deluge/ui/web/auth.py @@ -102,8 +102,10 @@ class Auth(JSONComponent): expires, expires_str = make_expires(self.config['session_timeout']) checksum = str(make_checksum(session_id)) - request.addCookie(b'_session_id', session_id + checksum, - path=request.base + b'json', expires=expires_str) + request.addCookie( + b'_session_id', session_id + checksum, + path=request.base + b'json', expires=expires_str, + ) log.debug('Creating session for %s', login) @@ -113,7 +115,7 @@ class Auth(JSONComponent): self.config['sessions'][session_id] = { 'login': login, 'level': AUTH_LEVEL_ADMIN, - 'expires': expires + 'expires': expires, } return True @@ -197,8 +199,10 @@ class Auth(JSONComponent): session['expires'] = expires _session_id = request.getCookie('_session_id') - request.addCookie(b'_session_id', _session_id, - path=request.base + b'json', expires=expires_str) + request.addCookie( + b'_session_id', _session_id, + path=request.base + b'json', expires=expires_str, + ) if method: if not hasattr(method, '_json_export'): diff --git a/deluge/ui/web/common.py b/deluge/ui/web/common.py index 688e9361e..8e41feb7a 100644 --- a/deluge/ui/web/common.py +++ b/deluge/ui/web/common.py @@ -52,7 +52,7 @@ try: builtins = { '_': _, 'escape': escape, - 'version': common.get_version() + 'version': common.get_version(), } def render(self, *args, **data): @@ -61,11 +61,13 @@ try: return rendered.encode('utf-8', 'replace') except ImportError: import warnings - warnings.warn('The Mako library is required to run deluge.ui.web', - RuntimeWarning) + warnings.warn( + 'The Mako library is required to run deluge.ui.web', + RuntimeWarning, + ) class Template(object): def __new__(cls, *args, **kwargs): raise RuntimeError( - 'The Mako library is required to run deluge.ui.web' + 'The Mako library is required to run deluge.ui.web', ) diff --git a/deluge/ui/web/json_api.py b/deluge/ui/web/json_api.py index f2b03e171..1cc78610c 100644 --- a/deluge/ui/web/json_api.py +++ b/deluge/ui/web/json_api.py @@ -206,9 +206,13 @@ class JSON(resource.Resource, component.Component): Returns the error in json response. """ log.error(reason) - response = {'result': None, 'id': None, - 'error': {'code': 5, - 'message': '%s: %s' % (reason.__class__.__name__, str(reason))}} + response = { + 'result': None, 'id': None, + 'error': { + 'code': 5, + 'message': '%s: %s' % (reason.__class__.__name__, str(reason)), + }, + } return self._send_response(request, response) def _send_response(self, request, response): @@ -355,7 +359,7 @@ class WebApi(JSONComponent): 'message', 'comment', 'tracker_status', - 'peers' + 'peers', ] def __init__(self): @@ -470,8 +474,8 @@ class WebApi(JSONComponent): 'stats': { 'max_download': self.core_config.get('max_download_speed'), 'max_upload': self.core_config.get('max_upload_speed'), - 'max_num_connections': self.core_config.get('max_connections_global') - } + 'max_num_connections': self.core_config.get('max_connections_global'), + }, } if not client.connected(): @@ -515,7 +519,7 @@ class WebApi(JSONComponent): 'download_rate', 'upload_rate', 'dht_nodes', - 'has_incoming_connections' + 'has_incoming_connections', ]) d3.addCallback(got_stats) @@ -690,16 +694,20 @@ class WebApi(JSONComponent): for torrent in torrents: if is_magnet(torrent['path']): - log.info('Adding torrent from magnet uri `%s` with options `%r`', - torrent['path'], torrent['options']) + log.info( + 'Adding torrent from magnet uri `%s` with options `%r`', + torrent['path'], torrent['options'], + ) d = client.core.add_torrent_magnet(torrent['path'], torrent['options']) deferreds.append(d) else: filename = os.path.basename(torrent['path']) with open(torrent['path'], 'rb') as _file: fdump = base64.encodestring(_file.read()) - log.info('Adding torrent from file `%s` with options `%r`', - filename, torrent['options']) + log.info( + 'Adding torrent from file `%s` with options `%r`', + filename, torrent['options'], + ) d = client.core.add_torrent_file_async(filename, fdump, torrent['options']) deferreds.append(d) return DeferredList(deferreds, consumeErrors=False) @@ -873,7 +881,7 @@ class WebApi(JSONComponent): return { 'enabled_plugins': list(component.get('Web.PluginManager').plugins), - 'available_plugins': component.get('Web.PluginManager').available_plugins + 'available_plugins': component.get('Web.PluginManager').available_plugins, } @export diff --git a/deluge/ui/web/pluginmanager.py b/deluge/ui/web/pluginmanager.py index 278b0c04b..fe5f0bf25 100644 --- a/deluge/ui/web/pluginmanager.py +++ b/deluge/ui/web/pluginmanager.py @@ -33,7 +33,7 @@ def gather_info(plugin): return { 'scripts': scripts, 'debug_scripts': debug_scripts, - 'script_directories': directories + 'script_directories': directories, } diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py index 92e63dedd..7516ff43e 100644 --- a/deluge/ui/web/server.py +++ b/deluge/ui/web/server.py @@ -60,12 +60,12 @@ CONFIG_DEFAULTS = { 'port': 8112, 'https': False, 'pkey': 'ssl/daemon.pkey', - 'cert': 'ssl/daemon.cert' + 'cert': 'ssl/daemon.cert', } UI_CONFIG_KEYS = ( 'theme', 'sidebar_show_zero', 'sidebar_multiple_filters', - 'show_session_speed', 'base', 'first_login' + 'show_session_speed', 'base', 'first_login', ) @@ -103,7 +103,7 @@ class Upload(resource.Resource): request.setResponseCode(http.OK) return json.dumps({ 'success': True, - 'files': [] + 'files': [], }) tempdir = tempfile.mkdtemp(prefix='delugeweb-') @@ -119,10 +119,12 @@ class Upload(resource.Resource): request.setHeader(b'content-type', b'text/html') request.setResponseCode(http.OK) - return compress(json.dumps({ - 'success': True, - 'files': filenames - }), request) + return compress( + json.dumps({ + 'success': True, + 'files': filenames, + }), request, + ) class Render(resource.Resource): @@ -167,8 +169,10 @@ class Tracker(resource.Resource): def on_got_icon(self, icon, request): if icon: - request.setHeader(b'cache-control', - b'public, must-revalidate, max-age=86400') + request.setHeader( + b'cache-control', + b'public, must-revalidate, max-age=86400', + ) request.setHeader(b'content-type', icon.get_mimetype().encode('utf8')) request.setResponseCode(http.OK) request.write(icon.get_data()) @@ -192,8 +196,10 @@ class Flag(resource.Resource): path = ('ui', 'data', 'pixmaps', 'flags', request.country.lower() + '.png') filename = common.resource_filename('deluge', os.path.join(*path)) if os.path.exists(filename): - request.setHeader('cache-control', - 'public, must-revalidate, max-age=86400') + request.setHeader( + 'cache-control', + 'public, must-revalidate, max-age=86400', + ) request.setHeader('content-type', 'image/png') with open(filename, 'rb') as _file: data = _file.read() @@ -420,7 +426,7 @@ class TopLevel(resource.Resource): __stylesheets = [ 'css/ext-all-notheme.css', 'css/ext-extensions.css', - 'css/deluge.css' + 'css/deluge.css', ] def __init__(self): @@ -547,11 +553,13 @@ class TopLevel(resource.Resource): web_config = component.get('Web').get_config() web_config['base'] = request.base - config = dict([(key, web_config[key]) for key in UI_CONFIG_KEYS]) + config = {key: web_config[key] for key in UI_CONFIG_KEYS} js_config = json.dumps(config) # Insert the values into 'index.html' and return. - return template.render(scripts=scripts, stylesheets=self.stylesheets, - debug=debug_arg, base=request.base, js_config=js_config) + return template.render( + scripts=scripts, stylesheets=self.stylesheets, + debug=debug_arg, base=request.base, js_config=js_config, + ) class DelugeWeb(component.Component): diff --git a/deluge/ui/web/web.py b/deluge/ui/web/web.py index 2e8327b27..8d1e12794 100644 --- a/deluge/ui/web/web.py +++ b/deluge/ui/web/web.py @@ -28,12 +28,18 @@ class Web(UI): self.__server = None group = self.parser.add_argument_group(_('Web Server Options')) - group.add_argument('-i', '--interface', metavar='<ip_address>', action='store', - help=_('IP address for web server to listen on')) - group.add_argument('-p', '--port', metavar='<port>', type=int, action='store', - help=_('Port for web server to listen on')) - group.add_argument('-b', '--base', metavar='<path>', action='store', - help=_('Set the base path that the ui is running on')) + group.add_argument( + '-i', '--interface', metavar='<ip_address>', action='store', + help=_('IP address for web server to listen on'), + ) + group.add_argument( + '-p', '--port', metavar='<port>', type=int, action='store', + help=_('Port for web server to listen on'), + ) + group.add_argument( + '-b', '--base', metavar='<path>', action='store', + help=_('Set the base path that the ui is running on'), + ) group.add_argument('--ssl', action='store_true', help=_('Force the web server to use SSL')) group.add_argument('--no-ssl', action='store_true', help=_('Force the web server to disable SSL')) self.parser.add_process_arg_group() diff --git a/docs/source/conf.py b/docs/source/conf.py index 18e7c3f96..4b6300fa0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -83,7 +83,7 @@ master_doc = 'index' # General substitutions. project = 'Deluge' current_year = date.today().year -copyright = '2008-%s, Deluge Team' % current_year +copyright = '2008-%s, Deluge Team' % current_year # noqa: A001 # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. diff --git a/gen_web_gettext.py b/gen_web_gettext.py index aea337cef..a769ae3aa 100755 --- a/gen_web_gettext.py +++ b/gen_web_gettext.py @@ -46,7 +46,7 @@ def check_missing_markup(js_dir): # Create a list of the matching strings to search for with the except_chars appended to each one. string_re = re.compile( - '(' + ')|('.join(['%s[^' + except_chars + "].*'"]*len(attr_list)) % tuple(attr_list) + ')' + '(' + ')|('.join(['%s[^' + except_chars + "].*'"] * len(attr_list)) % tuple(attr_list) + ')', ) strings = {} diff --git a/packaging/win32/deluge-bbfreeze.py b/packaging/win32/deluge-bbfreeze.py index 0ee03e371..54aefb49f 100644 --- a/packaging/win32/deluge-bbfreeze.py +++ b/packaging/win32/deluge-bbfreeze.py @@ -161,7 +161,7 @@ theme_include_list = [ [gtk_root, 'share/themes/MS-Windows'], ['DelugeStart Theme', 'lib/gtk-2.0/2.10.0/engines/libmurrine.dll'], ['DelugeStart Theme', 'share/themes/DelugeStart'], - ['DelugeStart Theme', 'etc/gtk-2.0/gtkrc'] + ['DelugeStart Theme', 'etc/gtk-2.0/gtkrc'], ] for path_root, path in theme_include_list: full_path = os.path.join(path_root, path) @@ -171,7 +171,7 @@ class BuildTranslations(cmd.Command): user_options = [ ('build-lib', None, 'lib build folder'), - ('develop', 'D', 'Compile translations in develop mode (deluge/i18n)') + ('develop', 'D', 'Compile translations in develop mode (deluge/i18n)'), ] boolean_options = ['develop'] @@ -258,7 +258,7 @@ class BuildPlugins(cmd.Command): user_options = [ ('install-dir=', None, 'develop install folder'), - ('develop', 'D', 'Compile plugins in develop mode') + ('develop', 'D', 'Compile plugins in develop mode'), ] boolean_options = ['develop'] @@ -353,7 +353,7 @@ class Build(_build): sub_commands = [ ('build_webui', None), ('build_trans', None), - ('build_plugins', None) + ('build_plugins', None), ] + _build.sub_commands def run(self): @@ -372,7 +372,7 @@ class InstallData(_install_data): def finalize_options(self): self.install_dir = None self.set_undefined_options('install', ('install_data', 'install_dir'), - ('root', 'root'), ('force', 'force'),) + ('root', 'root'), ('force', 'force')) def run(self): _install_data.run(self) @@ -548,5 +548,5 @@ setup( exclude_package_data=_exclude_package_data, packages=find_packages(exclude=['deluge.plugins.*', 'deluge.tests']), namespace_packages=['deluge', 'deluge.plugins'], - entry_points=_entry_points + entry_points=_entry_points, ) @@ -7,12 +7,19 @@ max-line-length = 120 builtins = _,_n,__request__ exclude = .git,.tox,dist,build +ignore = +# A003 Class attribute is a python builtin. + A003, +# C813, C815, C816: PY3 missing trailing commas. + C813,C815,C816, +# W503 line break before binary operator. + W503, [pycodestyle] max-line-length = 120 [tox] -envlist = py27, flake8, docs, pylint +envlist = py27, flake8, docs minversion=1.8 [testenv] |