* Added `from __future__ import unicode_literals` to every file so
now all strings in code are forced to be unicode strings unless
marked as byte string `b'str'` or encoded to byte string `'str'.encode('utf-8')`.
This is a large change but we have been working towards the goal of unicode
strings passed in the code so decoding external input and encoding
output as byte strings (where applicable).
Note that in Python 2 the `str` type still refers to byte strings.
* Replaced the use of `str` for `basestring` in isinstance comparison as
this was the original intention but breaks code when encoutering unicode strings.
* Marked byte strings in gtkui as the conversion to utf8 is not always handled, mostly
related to gobject signal names.
85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2013 Bro <bro.development@gmail.com>
|
|
#
|
|
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
|
# the additional special exception to link portions of this program with the OpenSSL library.
|
|
# See LICENSE for more details.
|
|
#
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
import os
|
|
|
|
|
|
def is_hidden(filepath):
|
|
def has_hidden_attribute(filepath):
|
|
import win32api
|
|
import win32con
|
|
try:
|
|
attribute = win32api.GetFileAttributes(filepath)
|
|
return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
|
|
except (AttributeError, AssertionError):
|
|
return False
|
|
|
|
name = os.path.basename(os.path.abspath(filepath))
|
|
# Windows
|
|
if os.name == 'nt':
|
|
return has_hidden_attribute(filepath)
|
|
return name.startswith('.')
|
|
|
|
|
|
def get_completion_paths(args):
|
|
"""
|
|
Takes a path value and returns the available completions.
|
|
If the path_value is a valid path, return all sub-directories.
|
|
If the path_value is not a valid path, remove the basename from the
|
|
path and return all sub-directories of path that start with basename.
|
|
|
|
:param args: options
|
|
:type args: dict
|
|
:returns: the args argument containing the available completions for the completion_text
|
|
:rtype: list
|
|
|
|
"""
|
|
args['paths'] = []
|
|
path_value = args['completion_text']
|
|
hidden_files = args['show_hidden_files']
|
|
|
|
def get_subdirs(dirname):
|
|
try:
|
|
return os.walk(dirname).next()[1]
|
|
except StopIteration:
|
|
# Invalid dirname
|
|
return []
|
|
|
|
dirname = os.path.dirname(path_value)
|
|
basename = os.path.basename(path_value)
|
|
|
|
dirs = get_subdirs(dirname)
|
|
# No completions available
|
|
if not dirs:
|
|
return args
|
|
|
|
# path_value ends with path separator so
|
|
# we only want all the subdirectories
|
|
if not basename:
|
|
# Lets remove hidden files
|
|
if not hidden_files:
|
|
old_dirs = dirs
|
|
dirs = []
|
|
for d in old_dirs:
|
|
if not is_hidden(os.path.join(dirname, d)):
|
|
dirs.append(d)
|
|
matching_dirs = []
|
|
for s in dirs:
|
|
if s.startswith(basename):
|
|
p = os.path.join(dirname, s)
|
|
if not p.endswith(os.path.sep):
|
|
p += os.path.sep
|
|
matching_dirs.append(p)
|
|
|
|
args['paths'] = sorted(matching_dirs)
|
|
return args
|