diff --git a/bin/autojump b/bin/autojump index a44e86b..29e3080 100755 --- a/bin/autojump +++ b/bin/autojump @@ -70,21 +70,21 @@ def set_defaults(): if is_osx(): data_home = os.path.join( - os.path.expanduser('~'), - 'Library', - 'autojump') + os.path.expanduser('~'), + 'Library', + 'autojump') elif is_windows(): data_home = os.path.join( - os.getenv('APPDATA'), - 'autojump') + os.getenv('APPDATA'), + 'autojump') else: data_home = os.getenv( - 'XDG_DATA_HOME', - os.path.join( - os.path.expanduser('~'), - '.local', - 'share', - 'autojump')) + 'XDG_DATA_HOME', + os.path.join( + os.path.expanduser('~'), + '.local', + 'share', + 'autojump')) config['data_path'] = os.path.join(data_home, 'autojump.txt') config['backup_path'] = os.path.join(data_home, 'autojump.txt.bak') @@ -94,35 +94,35 @@ def set_defaults(): def parse_arguments(): parser = ArgumentParser( - description='Automatically jump to directory passed as an \ + description='Automatically jump to directory passed as an \ argument.', - epilog="Please see autojump(1) man pages for full documentation.") + epilog="Please see autojump(1) man pages for full documentation.") parser.add_argument( - 'directory', metavar='DIRECTORY', nargs='*', default='', - help='directory to jump to') + 'directory', metavar='DIRECTORY', nargs='*', default='', + help='directory to jump to') parser.add_argument( - '-a', '--add', metavar='DIRECTORY', - help='add path') + '-a', '--add', metavar='DIRECTORY', + help='add path') parser.add_argument( - '-i', '--increase', metavar='WEIGHT', nargs='?', type=int, - const=10, default=False, - help='increase current directory weight') + '-i', '--increase', metavar='WEIGHT', nargs='?', type=int, + const=10, default=False, + help='increase current directory weight') parser.add_argument( - '-d', '--decrease', metavar='WEIGHT', nargs='?', type=int, - const=15, default=False, - help='decrease current directory weight') + '-d', '--decrease', metavar='WEIGHT', nargs='?', type=int, + const=15, default=False, + help='decrease current directory weight') parser.add_argument( - '--complete', action="store_true", default=False, - help='used for tab completion') + '--complete', action="store_true", default=False, + help='used for tab completion') parser.add_argument( - '--purge', action="store_true", default=False, - help='remove non-existent paths from database') + '--purge', action="store_true", default=False, + help='remove non-existent paths from database') parser.add_argument( - '-s', '--stat', action="store_true", default=False, - help='show database entries and their key weights') + '-s', '--stat', action="store_true", default=False, + help='show database entries and their key weights') parser.add_argument( - '-v', '--version', action="version", version="%(prog)s v" + - VERSION, help='show version information') + '-v', '--version', action="version", version="%(prog)s v" + + VERSION, help='show version information') return parser.parse_args() @@ -180,16 +180,16 @@ def find_matches(entries, needles, check_entries=True): path_exists = lambda _: True data = sorted( - entries, - key=attrgetter('weight'), - reverse=True) + entries, + key=attrgetter('weight'), + reverse=True) return ifilter( - lambda entry: not is_cwd(entry) and path_exists(entry), - chain( - match_consecutive(needles, data, ignore_case), - match_fuzzy(needles, data, ignore_case), - match_anywhere(needles, data, ignore_case))) + lambda entry: not is_cwd(entry) and path_exists(entry), + chain( + match_consecutive(needles, data, ignore_case), + match_fuzzy(needles, data, ignore_case), + match_anywhere(needles, data, ignore_case))) def handle_tab_completion(needle, entries): @@ -205,20 +205,20 @@ def handle_tab_completion(needle, entries): elif tab_needle: # found partial tab completion entry print_tab_menu( - tab_needle, - take(TAB_ENTRIES_COUNT, find_matches( - entries, - [tab_needle], - check_entries=False)), - TAB_SEPARATOR) + tab_needle, + take(TAB_ENTRIES_COUNT, find_matches( + entries, + [tab_needle], + check_entries=False)), + TAB_SEPARATOR) else: print_tab_menu( - needle, - take(TAB_ENTRIES_COUNT, find_matches( - entries, - [needle], - check_entries=False)), - TAB_SEPARATOR) + needle, + take(TAB_ENTRIES_COUNT, find_matches( + entries, + [needle], + check_entries=False)), + TAB_SEPARATOR) def match_anywhere(needles, haystack, ignore_case=False): @@ -241,9 +241,9 @@ def match_anywhere(needles, haystack, ignore_case=False): regex_needle = '.*' + '.*'.join(needles).replace('\\', '\\\\') + '.*' regex_flags = re.IGNORECASE | re.UNICODE if ignore_case else re.UNICODE found = lambda haystack: re.search( - regex_needle, - haystack.path, - flags=regex_flags) + regex_needle, + haystack.path, + flags=regex_flags) return ifilter(found, haystack) @@ -285,9 +285,9 @@ def match_consecutive(needles, haystack, ignore_case=False): regex_needle = regex_one_sep.join(needles).replace('\\', '\\\\') + regex_no_sep_end # noqa regex_flags = re.IGNORECASE | re.UNICODE if ignore_case else re.UNICODE found = lambda entry: re.search( - regex_needle, - entry.path, - flags=regex_flags) + regex_needle, + entry.path, + flags=regex_flags) return ifilter(found, haystack) @@ -317,13 +317,13 @@ def match_fuzzy(needles, haystack, ignore_case=False): if ignore_case: needle = last(needles).lower() match_percent = lambda entry: SequenceMatcher( - a=needle, - b=end_dir(entry.path.lower())).ratio() + a=needle, + b=end_dir(entry.path.lower())).ratio() else: needle = last(needles) match_percent = lambda entry: SequenceMatcher( - a=needle, - b=end_dir(entry.path)).ratio() + a=needle, + b=end_dir(entry.path)).ratio() meets_threshold = lambda entry: match_percent(entry) >= \ FUZZY_MATCH_THRESHOLD return ifilter(meets_threshold, haystack) @@ -345,7 +345,7 @@ def print_stats(data, data_path): try: print_local( - "%.2f:\t current directory weight" % data.get(os.getcwdu(), 0)) + "%.2f:\t current directory weight" % data.get(os.getcwdu(), 0)) except OSError: # current directory no longer exists pass @@ -361,8 +361,8 @@ def main(args): # noqa save(config, first(add_path(load(config), args.add))) elif args.complete: handle_tab_completion( - needle=first(chain(sanitize(args.directory), [''])), - entries=entriefy(load(config))) + needle=first(chain(sanitize(args.directory), [''])), + entries=entriefy(load(config))) elif args.decrease: data, entry = decrease_path(load(config), get_pwd(), args.decrease) save(config, data) @@ -382,9 +382,9 @@ def main(args): # noqa # Return best match. entries = entriefy(load(config)) print_local(first(chain( - imap(attrgetter('path'), find_matches(entries, [''])), - # always return a path to calling shell functions - ['.']))) + imap(attrgetter('path'), find_matches(entries, [''])), + # always return a path to calling shell functions + ['.']))) else: entries = entriefy(load(config)) needles = sanitize(args.directory) @@ -401,14 +401,14 @@ def main(args): # noqa elif tab_index: get_ith_path = lambda i, iterable: last(take(i, iterable)).path print_local( - get_ith_path( - tab_index, - find_matches(entries, [tab_needle]))) + get_ith_path( + tab_index, + find_matches(entries, [tab_needle]))) else: print_local(first(chain( - imap(attrgetter('path'), find_matches(entries, needles)), - # always return a path to calling shell functions - ['.']))) + imap(attrgetter('path'), find_matches(entries, needles)), + # always return a path to calling shell functions + ['.']))) return 0 diff --git a/bin/autojump_argparse.py b/bin/autojump_argparse.py index 2369e73..ea17c6f 100644 --- a/bin/autojump_argparse.py +++ b/bin/autojump_argparse.py @@ -107,8 +107,7 @@ try: except NameError: # for python < 2.4 compatibility: def sorted(iterable, reverse=False): - result = list(iterable) - result.sort() + result = sorted(iterable) if reverse: result.reverse() return result @@ -131,7 +130,9 @@ _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' # Utility functions and classes # ============================= + class _AttributeHolder(object): + """Abstract base class that provides __repr__. The __repr__ method returns a string in the format:: @@ -167,6 +168,7 @@ def _ensure_value(namespace, name, value): # =============== class HelpFormatter(object): + """Formatter for generating usage messages and argument help strings. Only the name of this class is considered a public API. All the methods @@ -640,13 +642,14 @@ class HelpFormatter(object): def _fill_text(self, text, width, indent): text = self._whitespace_matcher.sub(' ', text).strip() return _textwrap.fill(text, width, initial_indent=indent, - subsequent_indent=indent) + subsequent_indent=indent) def _get_help_string(self, action): return action.help class RawDescriptionHelpFormatter(HelpFormatter): + """Help message formatter which retains any formatting in descriptions. Only the name of this class is considered a public API. All the methods @@ -658,6 +661,7 @@ class RawDescriptionHelpFormatter(HelpFormatter): class RawTextHelpFormatter(RawDescriptionHelpFormatter): + """Help message formatter which retains formatting of all help text. Only the name of this class is considered a public API. All the methods @@ -669,6 +673,7 @@ class RawTextHelpFormatter(RawDescriptionHelpFormatter): class ArgumentDefaultsHelpFormatter(HelpFormatter): + """Help message formatter which adds default values to argument help. Only the name of this class is considered a public API. All the methods @@ -693,7 +698,7 @@ def _get_action_name(argument): if argument is None: return None elif argument.option_strings: - return '/'.join(argument.option_strings) + return '/'.join(argument.option_strings) elif argument.metavar not in (None, SUPPRESS): return argument.metavar elif argument.dest not in (None, SUPPRESS): @@ -703,6 +708,7 @@ def _get_action_name(argument): class ArgumentError(Exception): + """An error from creating or using an argument (optional or positional). The string value of this exception is the message, augmented with @@ -723,6 +729,7 @@ class ArgumentError(Exception): class ArgumentTypeError(Exception): + """An error from trying to convert a command line string to a type.""" pass @@ -732,6 +739,7 @@ class ArgumentTypeError(Exception): # ============== class Action(_AttributeHolder): + """Information about how to convert command line strings to Python objects. Action objects are used by an ArgumentParser to represent the information @@ -1109,7 +1117,8 @@ class _SubParsersAction(Action): # parse all the remaining options into the namespace # store any unrecognized options on the object, so that the top # level parser can decide what to do with them - namespace, arg_strings = parser.parse_known_args(arg_strings, namespace) + namespace, arg_strings = parser.parse_known_args( + arg_strings, namespace) if arg_strings: vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) @@ -1120,6 +1129,7 @@ class _SubParsersAction(Action): # ============== class FileType(object): + """Factory for creating file object types Instances of FileType are typically passed as type= arguments to the @@ -1162,7 +1172,9 @@ class FileType(object): # Optional and Positional Parsing # =========================== + class Namespace(_AttributeHolder): + """Simple object for storing attributes. Implements equality by attribute names and values, and provides a simple @@ -1264,7 +1276,6 @@ class _ActionsContainer(object): return action.default return self._defaults.get(dest, None) - # ======================= # Adding argument actions # ======================= @@ -1536,6 +1547,7 @@ class _MutuallyExclusiveGroup(_ArgumentGroup): class ArgumentParser(_AttributeHolder, _ActionsContainer): + """Object for parsing command line strings into Python objects. Keyword Arguments: @@ -1611,12 +1623,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): default_prefix = prefix_chars[0] if self.add_help: self.add_argument( - default_prefix+'h', default_prefix*2+'help', + default_prefix + 'h', default_prefix * 2 + 'help', action='help', default=SUPPRESS, help=_('show this help message and exit')) if self.version: self.add_argument( - default_prefix+'v', default_prefix*2+'version', + default_prefix + 'v', default_prefix * 2 + 'version', action='version', default=SUPPRESS, version=self.version, help=_("show program's version number and exit")) @@ -2075,8 +2087,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # if multiple actions match, the option string was ambiguous if len(option_tuples) > 1: - options = ', '.join([option_string - for action, option_string, explicit_arg in option_tuples]) + options = ', '.join( + [option_string for action, option_string, explicit_arg in option_tuples]) tup = arg_string, options self.error(_('ambiguous option: %s could match %s') % tup) diff --git a/bin/autojump_data.py b/bin/autojump_data.py index da86c90..3ce96c2 100644 --- a/bin/autojump_data.py +++ b/bin/autojump_data.py @@ -51,10 +51,10 @@ def entriefy(data): def load(config): """Returns a dictonary (key=path, value=weight) loaded from data file.""" xdg_aj_home = os.path.join( - os.path.expanduser('~'), - '.local', - 'share', - 'autojump') + os.path.expanduser('~'), + '.local', + 'share', + 'autojump') if is_osx() and os.path.exists(xdg_aj_home): migrate_osx_xdg_data(config) @@ -76,9 +76,9 @@ def load(config): 'r', encoding='utf-8', errors='replace') as f: return dict( - imap( - tupleize, - ifilter(correct_length, imap(parse, f)))) + imap( + tupleize, + ifilter(correct_length, imap(parse, f)))) except (IOError, EOFError): return load_backup(config) diff --git a/bin/autojump_utils.py b/bin/autojump_utils.py index 949b4fd..9b9ece7 100644 --- a/bin/autojump_utils.py +++ b/bin/autojump_utils.py @@ -56,8 +56,8 @@ def get_tab_entry_info(entry, separator): match_needle = re.search(r'(.*?)' + separator, entry) match_index = re.search(separator + r'([0-9]{1})', entry) match_path = re.search( - separator + r'[0-9]{1}' + separator + r'(.*)', - entry) + separator + r'[0-9]{1}' + separator + r'(.*)', + entry) if match_needle: needle = match_needle.group(1) diff --git a/tests/autojump_utils_test.py b/tests/autojump_utils_test.py index 147feb5..4403595 100644 --- a/tests/autojump_utils_test.py +++ b/tests/autojump_utils_test.py @@ -138,7 +138,7 @@ def test_get_index(): def test_get_path(): assert get_tab_entry_info('foo__3__/foo/bar', '__') \ - == ('foo', 3, '/foo/bar') + == ('foo', 3, '/foo/bar') def test_get_none(): diff --git a/uninstall.py b/uninstall.py index ab76317..51b0855 100755 --- a/uninstall.py +++ b/uninstall.py @@ -26,24 +26,24 @@ def parse_arguments(): default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink') parser = ArgumentParser( - description='Uninstalls autojump.') + description='Uninstalls autojump.') parser.add_argument( - '-n', '--dryrun', action="store_true", default=False, - help='simulate installation') + '-n', '--dryrun', action="store_true", default=False, + help='simulate installation') parser.add_argument( - '-u', '--userdata', action="store_true", default=False, - help='delete user data') + '-u', '--userdata', action="store_true", default=False, + help='delete user data') parser.add_argument( - '-d', '--destdir', metavar='DIR', - help='custom destdir') + '-d', '--destdir', metavar='DIR', + help='custom destdir') parser.add_argument( - '-p', '--prefix', metavar='DIR', default='', - help='custom prefix') + '-p', '--prefix', metavar='DIR', default='', + help='custom prefix') parser.add_argument( - '-z', '--zshshare', metavar='DIR', default='functions', - help='custom zshshare') + '-z', '--zshshare', metavar='DIR', default='functions', + help='custom zshshare') parser.add_argument( - '-c', '--clinkdir', metavar='DIR', default=default_clink_dir) + '-c', '--clinkdir', metavar='DIR', default=default_clink_dir) return parser.parse_args() @@ -125,21 +125,21 @@ def remove_system_installation(dryrun=False): def remove_user_data(dryrun=False): if platform.system() == 'Darwin': data_home = os.path.join( - os.path.expanduser('~'), - 'Library', - 'autojump') + os.path.expanduser('~'), + 'Library', + 'autojump') elif platform.system() == 'Windows': data_home = os.path.join( - os.getenv('APPDATA'), - 'autojump') + os.getenv('APPDATA'), + 'autojump') else: data_home = os.getenv( - 'XDG_DATA_HOME', - os.path.join( - os.path.expanduser('~'), - '.local', - 'share', - 'autojump')) + 'XDG_DATA_HOME', + os.path.join( + os.path.expanduser('~'), + '.local', + 'share', + 'autojump')) if os.path.exists(data_home): print("\nFound user data...") @@ -149,7 +149,7 @@ def remove_user_data(dryrun=False): def remove_user_installation(dryrun=False): if platform.system() == 'Windows': default_destdir = os.path.join(os.getenv('LOCALAPPDATA', ''), - 'autojump') + 'autojump') clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink') else: default_destdir = os.path.join(os.path.expanduser("~"), '.autojump')