Source code for narrenschiff.autocomplete

# Copyright 2021 The Narrenschiff Authors

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at


# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# See the License for the specific language governing permissions and
# limitations under the License.

import os

[docs]class ShellAutocomplete: """Set autocompletion.""" AUTOCOMPLETION_START_TAG = '### narrenschiff-autocompletion-start ###\n' AUTOCOMPLETION_END_TAG = '### narrenschiff-autocompletion-end ###\n'
[docs] def autocompletion_script(self): """ Return autocompletion script. :return: Autocompletion script :rtype: ``list`` of ``str`` """ return ''.join([ '\n\n', ShellAutocomplete.AUTOCOMPLETION_START_TAG, 'eval "$(_NARRENSCHIFF_COMPLETE=source_bash narrenschiff)"\n', ShellAutocomplete.AUTOCOMPLETION_END_TAG ])
[docs] def get_config_file(self): """ Get type of the config file. :return: Name of the config file :rtype: ``str`` This method returns either ``.bashrc`` (which will later be edited for the current user), or ``activate`` which symbolises activate script of your virtualenv. """ if os.getenv('VIRTUAL_ENV'): return os.getenv('VIRTUAL_ENV'), 'bin/activate' return '~', '.bashrc'
[docs] def get_abs_path(self, *args): """ Join arguments, and return absolute path. :param args: Paths to be joined :type args: ``list`` of ``str`` :return: Absolute path :rtype: ``str`` If the first argument is tilde (~) then the method will expand user. """ if args[0] == '~': return os.path.join(os.path.expanduser('~'), *args[1:]) return os.path.join(*args)
[docs] def read_file(self, path): """ Read configuration file. :param path: Path to the file to read :type path: ``str`` :return: File as a list :rtype: ``list`` of ``str`` """ with open(path, 'r') as f: return f.readlines()
[docs] def autocompletion_enabled(self, config): """ Check if the file contains the autocompletion tag. :param config: Configuration file :type config: ``list`` of ``str`` :return: Confirmation whether file contains autocompletion tag :rtype: ``bool`` """ if ShellAutocomplete.AUTOCOMPLETION_START_TAG in config: return True return False
[docs] def add_autocompletion(self, path): """ Add autocompletion to the config file. :param path: Path to configuration file :type path: ``str`` :return: Void :rtype: ``None`` """ config = self.read_file(path) if not self.autocompletion_enabled(config): with open(path, 'a') as f: f.write(self.autocompletion_script())
[docs] def add(self): """ Add narrenschiff autocomplete to shell config. :return: Void :rtype: ``None`` """ path, cnftype = self.get_config_file() config_path = self.get_abs_path(path, cnftype) self.add_autocompletion(config_path)