diff --git a/qutebrowser/__init__.py b/qutebrowser/__init__.py index ea42a673c..e4cb56aaa 100644 --- a/qutebrowser/__init__.py +++ b/qutebrowser/__init__.py @@ -15,21 +15,7 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""A vim like browser based on Qt. - -Files: - __init__.py - This file. - __main__.py - Entry point for qutebrowser, to use - 'python -m qutebrowser'. - app.py - Main qutebrowser application> - simplebrowser.py - Simple browser for testing purposes. - -Subpackages: - commands - Handling of commands and key parsing. - utils - Misc utility code. - widgets - Qt widgets displayed on the screen. - -""" +"""A vim like browser based on Qt.""" import os.path diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 26b7c73bc..e29e7f9f4 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -132,7 +132,12 @@ class QuteBrowser(QApplication): self._timers.append(timer) def _parseopts(self): - """Parse command line options.""" + """Parse command line options. + + Return: + Argument namespace from argparse. + + """ parser = ArgumentParser("usage: %(prog)s [options]") parser.add_argument('-l', '--log', dest='loglevel', help='Set loglevel', default='info') @@ -222,9 +227,11 @@ class QuteBrowser(QApplication): def _recover_pages(self): """Try to recover all open pages. - Return a list of open pages, or an empty list. Called from _exception_hook, so as forgiving as possible. + Return: + A list of open pages, or an empty list. + """ pages = [] if self.mainwindow is None: @@ -308,6 +315,9 @@ class QuteBrowser(QApplication): This only quits if both the CrashDialog was ready to quit AND the shutdown is complete. + Args: + The sender of the quit signal (string) + """ self._quit_status[sender] = True logging.debug("maybe_quit called from {}, quit status {}".format( @@ -323,10 +333,15 @@ class QuteBrowser(QApplication): This gets called as a slot from all commands, and then calls the appropriate command handler. - tpl -- A tuple in the form (count, argv) where argv is [cmd, arg, ...] - All handlers supporting a count should have a keyword argument count. + Args: + tpl: A tuple in the form (count, argv) where argv is + [cmd, arg, ...] + + Return: + The handlers return value. + """ (count, argv) = tpl cmd = argv[0] @@ -371,10 +386,11 @@ class QuteBrowser(QApplication): def pyeval(self, s): """Evaluate a python string and display the results as a webpage. - s -- The string to evaluate. - :pyeval command handler. + Args: + s: The string to evaluate. + """ try: r = eval(s) @@ -389,6 +405,9 @@ class QuteBrowser(QApplication): :crash command handler. + Raises: + Always raises Exception. + """ raise Exception @@ -399,7 +418,8 @@ class QuteBrowser(QApplication): For some reason lastWindowClosing sometimes seem to get emitted twice, so we make sure we only run once here. - quit -- Whether to quit after shutting down. + Args: + do_quit: Whether to quit after shutting down. """ if self._shutting_down: diff --git a/qutebrowser/commands/keys.py b/qutebrowser/commands/keys.py index 0ed29624e..c5796236e 100644 --- a/qutebrowser/commands/keys.py +++ b/qutebrowser/commands/keys.py @@ -67,7 +67,11 @@ class KeyParser(QObject): Return True if the keypress has been handled, and False if not. - e -- the KeyPressEvent from Qt + Args: + e: the KeyPressEvent from Qt. + + Return: + True if event has been handled, False otherwise. """ MODMASK2STR = { @@ -103,7 +107,11 @@ class KeyParser(QObject): any possible command, and either run the command, ignore it, or display an error. - e -- the KeyPressEvent from Qt. + Args: + e: the KeyPressEvent from Qt. + + Emit: + set_cmd_text: If the keystring should be shown in the statusbar. """ # FIXME maybe we can do this in an easier way by using QKeySeqyence @@ -155,7 +163,13 @@ class KeyParser(QObject): def _match_key(self, cmdstr_needle): """Try to match a given keystring with any bound keychain. - cmdstr_needle: The command string to find. + Args: + cmdstr_needle: The command string to find. + + Return: + A tuple (matchtype, hay) where matchtype is MATCH_DEFINITIVE, + MATCH_PARTIAL or MATCH_NONE and hay is the long keystring where the + part was found in. """ try: @@ -177,7 +191,11 @@ class KeyParser(QObject): def _normalize_keystr(self, keystr): """Normalize a keystring like Ctrl-Q to a keystring like Ctrl+Q. - keystr -- The key combination as a string. + Args: + keystr: The key combination as a string. + + Return: + The normalized keystring. """ replacements = [ @@ -196,9 +214,14 @@ class KeyParser(QObject): def _run_or_fill(self, cmdstr, count=None, ignore_exc=True): """Run the command in cmdstr or fill the statusbar if args missing. - cmdstr -- The command string. - count -- Optional command count. - ignore_exc -- Ignore exceptions. + Args: + cmdstr: The command string. + count: Optional command count. + ignore_exc: Ignore exceptions. + + Emit: + set_cmd_text: If a partial command should be printed to the + statusbar. """ try: @@ -217,6 +240,9 @@ class KeyParser(QObject): Config format: key = command, e.g.: gg = scrollstart + Args: + sect: The section to get the keybindings from. + """ for (key, cmd) in sect.items(): if key.startswith('@') and key.endswith('@'): @@ -232,7 +258,11 @@ class KeyParser(QObject): def handle(self, e): """Handle a new keypress and call the respective handlers. - e -- the KeyPressEvent from Qt + Args: + e: the KeyPressEvent from Qt + + Emit: + keystring_updated: If a new keystring should be set. """ handled = self._handle_modifier_key(e) diff --git a/qutebrowser/commands/template.py b/qutebrowser/commands/template.py index 7126fe017..857e6ffe8 100644 --- a/qutebrowser/commands/template.py +++ b/qutebrowser/commands/template.py @@ -63,6 +63,12 @@ class Command(QObject): Raise ArgumentCountError if not. + Args: + args: The supplied arguments + + Raise: + ArgumentCountError if the argument count is wrong. + """ if ((isinstance(self.nargs, int) and len(args) != self.nargs) or (self.nargs == '?' and len(args) > 1) or @@ -73,8 +79,12 @@ class Command(QObject): def run(self, args=None, count=None): """Run the command. - args -- Arguments to the command. - count -- Command repetition count. + Args: + args: Arguments to the command. + count: Command repetition count. + + Emit: + The command's signal. """ dbgout = ["command called:", self.mainname] diff --git a/qutebrowser/commands/utils.py b/qutebrowser/commands/utils.py index f63c3f11d..c0e0afbfb 100644 --- a/qutebrowser/commands/utils.py +++ b/qutebrowser/commands/utils.py @@ -72,8 +72,12 @@ class SearchParser(QObject): def _search(self, text, rev=False): """Search for a text on the current page. - text -- The text to search for. - rev -- Search direction. + Args: + text: The text to search for. + rev: Search direction, True if reverse, else False. + + Emit: + do_search: If a search should be started. """ if self._text is not None and self._text != text: @@ -92,7 +96,8 @@ class SearchParser(QObject): def search(self, text): """Search for a text on a website. - text -- The text to search for. + Args: + text: The text to search for. """ self._search(text) @@ -101,13 +106,22 @@ class SearchParser(QObject): def search_rev(self, text): """Search for a text on a website in reverse direction. - text -- The text to search for. + Args: + text: The text to search for. """ self._search(text, rev=True) def nextsearch(self, count=1): - """Continue the search to the ([count]th) next term.""" + """Continue the search to the ([count]th) next term. + + Args: + count: How many elements to ignore. + + Emit: + do_search: If a search should be started. + + """ if self._text is not None: for i in range(count): # pylint: disable=unused-variable self.do_search.emit(self._text, self._flags) @@ -137,7 +151,11 @@ class CommandParser(QObject): def _parse(self, text): """Split the commandline text into command and arguments. - Raise NoSuchCommandError if a command wasn't found. + Args: + text: Text to parse. + + Raise: + NoSuchCommandError if a command wasn't found. """ parts = text.strip().split(maxsplit=1) @@ -163,7 +181,12 @@ class CommandParser(QObject): self._cmd.check(self._args) def _run(self, count=None): - """Run a command with an optional count.""" + """Run a command with an optional count. + + Args: + count: Count to pass to the command. + + """ if count is not None: self._cmd.run(self._args, count=count) else: @@ -175,13 +198,26 @@ class CommandParser(QObject): If ignore_exc is True, ignore exceptions and return True/False. - Raise NoSuchCommandError if a command wasn't found, and - ArgumentCountError if a command was called with the wrong count of - arguments. + Args: + text: The text to parse. + count: The count to pass to the command. + ignore_exc: Ignore exceptions and return False instead. + + Raise: + NoSuchCommandError: if a command wasn't found. + ArgumentCountError: if a command was called with the wrong count of + arguments. + + Return: + FIXME + + Emit: + error: If there was an error parsing a command. """ if ';;' in text: for sub in text.split(';;'): + # FIXME handle return codes self.run(sub, count, ignore_exc) return try: @@ -201,3 +237,4 @@ class CommandParser(QObject): else: raise self._run(count=count) + # FIXME return val diff --git a/qutebrowser/models/completion.py b/qutebrowser/models/completion.py index 695e980a7..e738954e6 100644 --- a/qutebrowser/models/completion.py +++ b/qutebrowser/models/completion.py @@ -42,8 +42,12 @@ class CompletionModel(QAbstractItemModel): def _node(self, index): """Return the interal data representation for index. - Return the CompletionItem for index, or the root CompletionItem if the - index was invalid. + Args: + index: The QModelIndex to get data for. + + Return: + The CompletionItem for index, or the root CompletionItem if the + index was invalid. """ if index.isValid(): @@ -52,7 +56,16 @@ class CompletionModel(QAbstractItemModel): return self._root def _get_marks(self, needle, haystack): - """Return the marks for needle in haystack.""" + """Return the marks for needle in haystack. + + Args: + needle: The substring which should match. + haystack: The string where the matches should be in. + + Return: + A list of (startidx, endidx) tuples. + + """ pos1 = pos2 = 0 marks = [] if not needle: @@ -68,7 +81,8 @@ class CompletionModel(QAbstractItemModel): def mark_all_items(self, needle): """Mark a string in all items (children of root-children). - needle -- The string to mark. + Args: + needle: The string to mark. """ for i in range(self.rowCount()): @@ -82,7 +96,8 @@ class CompletionModel(QAbstractItemModel): def init_data(self, data): """Initialize the Qt model based on the data given. - data -- dict of data to process. + Args: + data: dict of data to process. """ for (cat, items) in data.items(): @@ -99,6 +114,11 @@ class CompletionModel(QAbstractItemModel): Override QAbstractItemModel::removeRows. + Args: + position: The start row to remove. + count: How many rows to remove. + parent: The parent QModelIndex. + """ node = self._node(parent) self.beginRemoveRows(parent, position, position + count - 1) @@ -110,6 +130,13 @@ class CompletionModel(QAbstractItemModel): Override QAbstractItemModel::columnCount. + Args: + parent: The parent for which to return the column count. Currently + ignored. + + Return: + Column count as an integer. + """ # pylint: disable=unused-argument return self._root.column_count() @@ -120,6 +147,12 @@ class CompletionModel(QAbstractItemModel): Use the root frame if parent is invalid. Override QAbstractItemModel::rowCount. + Args: + parent: The parent for which to return the row count. + + Return: + Row count as an integer. + """ if parent.column() > 0: return 0 @@ -134,9 +167,15 @@ class CompletionModel(QAbstractItemModel): def data(self, index, role=Qt.DisplayRole): """Return the data for role/index as QVariant. - Return an invalid QVariant on error. Override QAbstractItemModel::data. + Args: + index: The QModelIndex for which to get data for. + roel: The role to use for the data. + + Return: + The data as QVariant or an invalid QVariant on error. + """ if not index.isValid(): return QVariant() @@ -152,9 +191,15 @@ class CompletionModel(QAbstractItemModel): def headerData(self, section, orientation, role=Qt.DisplayRole): """Return the header data for role/index as QVariant. - Return an invalid QVariant on error. Override QAbstractItemModel::headerData. + Args: + section: The section (as int) for which to get the header data. + orientation: Qt.Vertical or Qt.Horizontal + + Return: + The data as QVariant or an invalid QVariant on error. + """ if orientation == Qt.Horizontal and role == Qt.DisplayRole: return QVariant(self._root.data(section)) @@ -163,9 +208,19 @@ class CompletionModel(QAbstractItemModel): def setData(self, index, value, role=Qt.EditRole): """Set the data for role/index to value. - Return True on success, False on failure. Override QAbstractItemModel::setData. + Args: + index: The QModelIndex where to set the data. + value: The new data value. + role: The role to set the data for. + + Return: + True on success, False on failure. + + Emit: + dataChanged when the data was changed. + """ if not index.isValid(): return False @@ -180,9 +235,14 @@ class CompletionModel(QAbstractItemModel): def flags(self, index): """Return the item flags for index. - Return Qt.NoItemFlags on error. Override QAbstractItemModel::flags. + Args: + index: The QModelIndex to get item flags for. + + Return: + The item flags, or Qt.NoItemFlags on error. + """ # FIXME categories are not selectable, but moving via arrow keys still # tries to select them @@ -197,9 +257,16 @@ class CompletionModel(QAbstractItemModel): def index(self, row, column, parent=QModelIndex()): """Return the QModelIndex for row/column/parent. - Return an invalid QModelIndex on failure. Override QAbstractItemModel::index. + Args: + row: The row (int) to get an index for. + column: The column (int) to get an index for. + parent: The parent (QModelIndex) to get an index for. + + Return: + A generated QModelIndex or an invalid QModelIndex on failure. + """ if (0 <= row < self.rowCount(parent) and 0 <= column < self.columnCount(parent)): @@ -223,9 +290,14 @@ class CompletionModel(QAbstractItemModel): def parent(self, index): """Return the QModelIndex of the parent of the object behind index. - Return an invalid QModelIndex on failure. Override QAbstractItemModel::parent. + Args: + index: The QModelIndex to get the parent for. + + Return: + The parent's QModelIndex or an invalid QModelIndex on failure. + """ if not index.isValid(): return QModelIndex() @@ -237,9 +309,11 @@ class CompletionModel(QAbstractItemModel): def sort(self, column, order=Qt.AscendingOrder): """Sort the data in column according to order. - Raise NotImplementedError, should be overwritten in a superclass. Override QAbstractItemModel::sort. + Raise: + NotImplementedError, should be overwritten in a superclass. + """ raise NotImplementedError @@ -259,8 +333,9 @@ class CompletionItem(): def __init__(self, data, parent=None): """Constructor for CompletionItem. - data -- The data for the model, as tuple (columns). - parent -- An optional parent item. + Args: + data: The data for the model, as tuple (columns). + parent: An optional parent item. """ self.parent = parent @@ -271,7 +346,15 @@ class CompletionItem(): def data(self, column, role=Qt.DisplayRole): """Get the data for role/column. - Raise ValueError if the role is invalid. + Args: + column: The column (int) to get data for. + role: The role to get data for. + + Return: + The requested data. + + Raise: + ValueError if the role is invalid. """ if role == Qt.DisplayRole: @@ -284,7 +367,13 @@ class CompletionItem(): def setdata(self, column, value, role=Qt.DisplayRole): """Set the data for column/role to value. - Raise ValueError if the role is invalid. + Args: + column: The column (int) to set the data for. + value: The value to set the data to. + role: The role to set the data for. + + Raise: + ValueError if the role is invalid. """ if role == Qt.DisplayRole: @@ -295,11 +384,21 @@ class CompletionItem(): raise ValueError def column_count(self): - """Return the column count in the item.""" + """Get the column count in the item. + + Return: + The column count. + + """ return len(self._data) def row(self): - """Return the row index (int) of the item, or 0 if it's a root item.""" + """Get the row index (int) of the item. + + Return: + The row index of the item, or 0 if we're a root item. + + """ if self.parent: return self.parent.children.index(self) return 0 diff --git a/qutebrowser/models/completionfilter.py b/qutebrowser/models/completionfilter.py index 6052bb045..f4493671c 100644 --- a/qutebrowser/models/completionfilter.py +++ b/qutebrowser/models/completionfilter.py @@ -54,6 +54,9 @@ class CompletionFilterModel(QSortFilterProxyModel): If the current completion model overrides sort(), it is used. If not, the default implementation in QCompletionFilterModel is called. + Args: + val: The value to set. + """ self._pattern = val self.invalidateFilter() @@ -74,7 +77,8 @@ class CompletionFilterModel(QSortFilterProxyModel): def srcmodel(self, model): """Set a new source model and clear the pattern. - model -- The new source model. + Args: + model: The new source model. """ # FIXME change this to a property @@ -97,11 +101,13 @@ class CompletionFilterModel(QSortFilterProxyModel): Override QSortFilterProxyModel::filterAcceptsRow. - row -- The row of the item. - parent -- The parent item QModelIndex. + Args: + row: The row of the item. + parent: The parent item QModelIndex. - Return True if self.pattern is contained in item, or if it's a root - item (category). Else returns False. + Return: + True if self.pattern is contained in item, or if it's a root item + (category). False in all other cases """ if parent == QModelIndex(): @@ -116,12 +122,16 @@ class CompletionFilterModel(QSortFilterProxyModel): def lessThan(self, lindex, rindex): """Custom sorting implementation. - lindex -- The QModelIndex of the left item (*left* < right) - rindex -- The QModelIndex of the right item (left < *right*) - Prefers all items which start with self.pattern. Other than that, uses normal Python string sorting. + Args: + lindex: The QModelIndex of the left item (*left* < right) + rindex: The QModelIndex of the right item (left < *right*) + + Return: + True if left < right, else False + """ left = self.srcmodel.data(lindex).value() right = self.srcmodel.data(rindex).value() diff --git a/qutebrowser/utils/about.py b/qutebrowser/utils/about.py index 7b95e398a..c6f106776 100644 --- a/qutebrowser/utils/about.py +++ b/qutebrowser/utils/about.py @@ -41,7 +41,14 @@ pyeval_output = None def handle(url): """Handle about page with an url. - Return HTML content. + Args: + url: The url (string) to serve the about page for. + + Raise: + ValueError if passed URL is not an about URL + + Return: + HTML content as bytes. """ if not is_about_url(url): @@ -51,15 +58,27 @@ def handle(url): def _transform_url(url): - """Transform a special URL to an AboutHandlers method name.""" + """Transform a special URL to an AboutHandlers method name. + + Args: + url: The URL as string. + + Return: + The method name about_* + + """ return url.replace('http://', '').replace('about:', 'about_') def _get_html(title, snippet): """Add HTML boilerplate to a html snippet. - title -- The title the page should have. - snippet -- The html snippet. + Args: + title: The title the page should have. + snippet: The html snippet. + + Return: + HTML content as bytes. """ return _html_template.format(title=title, body=snippet).encode('UTF-8') @@ -71,10 +90,10 @@ class AboutHandlers: @classmethod def about_pyeval(cls): - """Handler for about:pyeval.""" + """Handler for about:pyeval. Return HTML content as bytes.""" return _get_html('pyeval', '
{}
'.format(pyeval_output)) @classmethod def about_version(cls): - """Handler for about:version.""" + """Handler for about:version. Return HTML content as bytes.""" return _get_html('Version', '
{}
'.format(version())) diff --git a/qutebrowser/utils/config.py b/qutebrowser/utils/config.py index 5c001cb0e..8a2c13aa5 100644 --- a/qutebrowser/utils/config.py +++ b/qutebrowser/utils/config.py @@ -36,7 +36,12 @@ _UNSET = object() def init(confdir): - """Initialize the global objects based on the config in configdir.""" + """Initialize the global objects based on the config in configdir. + + Args: + confdir: The directory where the configs are stored in. + + """ global config, state, colordict, fontdict logging.debug("Config init, confdir {}".format(confdir)) config = Config(confdir, 'qutebrowser.conf', read_file('qutebrowser.conf')) @@ -49,7 +54,15 @@ def init(confdir): def get_stylesheet(template): - """Return a formatted stylesheet based on a template.""" + """Format a stylesheet based on a template. + + Args: + template: The stylesheet template as string. + + Return: + The formatted template as string. + + """ return template.strip().format(color=colordict, font=fontdict) @@ -64,13 +77,17 @@ class ColorDict(dict): def __getitem__(self, key): """Override dict __getitem__. - If a value wasn't found, return an empty string. - (Color not defined, so no output in the stylesheet) + Args: + key: The key to get from the dict. - If the key has a .fg. element in it, return color: X;. - If the key has a .bg. element in it, return background-color: X;. + Return: + If a value wasn't found, return an empty string. + (Color not defined, so no output in the stylesheet) - In all other cases, return the plain value. + If the key has a .fg. element in it, return color: X;. + If the key has a .bg. element in it, return background-color: X;. + + In all other cases, return the plain value. """ try: @@ -87,7 +104,11 @@ class ColorDict(dict): def getraw(self, key): """Get a value without the transformations done in __getitem__. - Return a value, or None if the value wasn't found. + Args: + key: The key to get from the dict. + + Return: + A value, or None if the value wasn't found. """ try: @@ -103,10 +124,14 @@ class FontDict(dict): def __getitem__(self, key): """Override dict __getitem__. - If a value wasn't found, return an empty string. - (Color not defined, so no output in the stylesheet) + Args: + key: The key to get from the dict. - In all other cases, return font: . + Return: + If a value wasn't found, return an empty string. + (Color not defined, so no output in the stylesheet) + + In all other cases, return font: . """ try: @@ -119,7 +144,11 @@ class FontDict(dict): def getraw(self, key): """Get a value without the transformations done in __getitem__. - Return a value, or None if the value wasn't found. + Args: + key: The key to get from the dict. + + Return: + A value, or None if the value wasn't found. """ try: @@ -143,11 +172,12 @@ class Config(ConfigParser): always_save=False): """Config constructor. - configdir -- directory to store the config in. - fname -- Filename of the config file. - default_config -- Default config as string. - always_save -- Whether to always save the config, even when it wasn't - loaded. + Args: + configdir: Directory to store the config in. + fname: Filename of the config file. + default_config: Default config as string. + always_save: Whether to always save the config, even when it wasn't + loaded. """ super().__init__(interpolation=ExtendedInterpolation()) @@ -174,6 +204,12 @@ class Config(ConfigParser): Extend ConfigParser's __getitem__. + Args: + key: The key to get from the dict. + + Return: + The value of the main or fallback ConfigParser. + """ try: return super().__getitem__(key) @@ -191,6 +227,16 @@ class Config(ConfigParser): - If that's not available, try the fallback given as kwarg - If that's not available, we're doomed. + Args: + *args: Passed to the other configparsers. + raw: Passed to the other configparsers (do not interpolate). + var: Passed to the other configparsers. + fallback: Fallback value if value wasn't found in any configparser. + + Raise: + configparser.NoSectionError/configparser.NoOptionError if the + default configparser raised them and there is no fallback. + """ # pylint: disable=redefined-builtin # The arguments returned by the ConfigParsers actually are strings @@ -225,7 +271,12 @@ class Config(ConfigParser): os.fsync(f.fileno()) def dump_userconfig(self): - """Return the part of the config which was changed by the user.""" + """Get the part of the config which was changed by the user. + + Return: + The changed config part as string. + + """ with io.StringIO() as f: self.write(f) return f.getvalue() diff --git a/qutebrowser/utils/misc.py b/qutebrowser/utils/misc.py index 829cd4c11..5e014bbee 100644 --- a/qutebrowser/utils/misc.py +++ b/qutebrowser/utils/misc.py @@ -47,14 +47,27 @@ def set_trace(): def read_file(filename): - """Return the contents of a file contained with qutebrowser.""" + """Get the contents of a file contained with qutebrowser. + + Args: + filename: The filename to open as string. + + Return: + The file contents as string. + + """ fn = os.path.join(qutebrowser.basedir, filename) with open(fn, 'r', encoding='UTF-8') as f: return f.read() def trace_lines(do_trace): - """Turn on/off printing each executed line.""" + """Turn on/off printing each executed line. + + Args: + do_trace: Whether to start tracing (True) or stop it (False). + + """ def trace(frame, event, _): """Trace function passed to sys.settrace.""" print("{}, {}:{}".format(event, frame.f_code.co_filename, diff --git a/qutebrowser/utils/signals.py b/qutebrowser/utils/signals.py index 69ca4ab24..c2977f420 100644 --- a/qutebrowser/utils/signals.py +++ b/qutebrowser/utils/signals.py @@ -25,16 +25,28 @@ from PyQt5.QtCore import QObject def signal_name(sig): - """Return a cleaned up name of a signal.""" + """Get a cleaned up name of a signal. + + Args: + sig: The pyqtSignal + + Return: + The cleaned up signal name. + + """ m = re.match(r'[0-9]+(.*)\(.*\)', sig.signal) return m.group(1) def dbg_signal(sig, args): - """Return a string representation of a signal for debugging. + """Get a string representation of a signal for debugging. - sig -- A pyqtSignal. - args -- The arguments as list of strings. + Args: + sig: A pyqtSignal. + args: The arguments as list of strings. + + Return: + A human-readable string representation of signal/args. """ return '{}({})'.format(signal_name(sig), ', '.join(map(str, args))) @@ -53,8 +65,9 @@ class SignalCache(QObject): def __init__(self, uncached=None): """Create a new SignalCache. - uncached -- A list of signal names (as string) which should never be - cached. + Args: + uncached: A list of signal names (as string) which should never be + cached. """ super().__init__() @@ -65,7 +78,7 @@ class SignalCache(QObject): self._signal_dict = OrderedDict() def _signal_needs_caching(self, signal): - """Return True if a signal should be cached, false otherwise.""" + """Return True if a signal should be cached, False otherwise.""" return not signal_name(signal) in self._uncached def add(self, sig, args): @@ -75,6 +88,13 @@ class SignalCache(QObject): If it's already in the cache, it'll be updated and moved to the front. If not, it will be added. + Args: + sig: The pyqtSignal. + args: A list of arguments. + + Emit: + Cached signals. + """ if not self._signal_needs_caching(sig): return diff --git a/qutebrowser/utils/style.py b/qutebrowser/utils/style.py index 4b7a654b4..a31e737b8 100644 --- a/qutebrowser/utils/style.py +++ b/qutebrowser/utils/style.py @@ -48,6 +48,9 @@ class Style(QCommonStyle): This simply calls the corresponding function in self._style. + Args: + style: The base/"parent" style. + """ self._style = style for method in ['drawComplexControl', 'drawControl', 'drawItemPixmap', @@ -66,6 +69,12 @@ class Style(QCommonStyle): Call the genuine drawPrimitive of self._style, except when a focus rectangle should be drawn. + Args: + element: PrimitiveElement pe + option: const QStyleOption * opt + painter: QPainter * p + widget: const QWidget * widget + """ if element == QStyle.PE_FrameFocusRect: return diff --git a/qutebrowser/utils/url.py b/qutebrowser/utils/url.py index 419096aa2..4691e66df 100644 --- a/qutebrowser/utils/url.py +++ b/qutebrowser/utils/url.py @@ -28,7 +28,18 @@ import qutebrowser.utils.config as config def _get_search_url(txt): - """Return a search engine URL (QUrl) for a text.""" + """Get a search engine URL for a text. + + Args: + txt: Text to search for. + + Return: + The search URL as a QUrl. + + Raise: + ValueError if there is no template or no search term was found. + + """ logging.debug('Finding search engine for "{}"'.format(txt)) r = re.compile(r'(^|\s+)!(\w+)($|\s+)') m = r.search(txt) @@ -49,7 +60,15 @@ def _get_search_url(txt): def _is_url_naive(url): - """Naive check if given url (QUrl) is really an url.""" + """Naive check if given url is really an url. + + Args: + url: The URL to check for. + + Return: + True if the url really is an URL, False otherwise. + + """ PROTOCOLS = ['http://', 'https://'] u = urlstring(url) return (any(u.startswith(proto) for proto in PROTOCOLS) or '.' in u or @@ -57,7 +76,15 @@ def _is_url_naive(url): def _is_url_dns(url): - """Check if an url (QUrl) is really an url via DNS.""" + """Check if an url (QUrl) is really an url via DNS. + + Args: + url: The URL to check for. + + Return: + True if the url really is an URL, False otherwise. + + """ # FIXME we could probably solve this in a nicer way by attempting to open # the page in the webview, and then open the search if that fails. host = url.host() @@ -73,23 +100,39 @@ def _is_url_dns(url): def qurl(url): - """Get a QUrl from an url string.""" + """Get a QUrl from an url string. + + Args: + The URL as string or QUrl. + + Return: + The URL as string. + + """ return url if isinstance(url, QUrl) else QUrl(url) def urlstring(url): - """Return an QUrl as string. + """Get an QUrl as string. - qurl -- URL as string or QUrl. + Args: + qurl: URL as string or QUrl. + + Return: + The URL as string """ return url.toString() if isinstance(url, QUrl) else url def fuzzy_url(url): - """Return a QUrl based on an user input which is URL or search term. + """Get a QUrl based on an user input which is URL or search term. - url -- URL to load as QUrl or string. + Args: + url: URL to load as QUrl or string. + + Return: + A target QUrl to a searchpage or the original URL. """ u = qurl(url) @@ -110,12 +153,23 @@ def fuzzy_url(url): def is_about_url(url): - """Return True if url (QUrl) is an about:... or other special URL.""" + """Return True if url is an about:... or other special URL.""" return urlstring(url).replace('http://', '').startswith('about:') def is_url(url): - """Return True if url (QUrl) seems to be a valid URL.""" + """Check if url seems to be a valid URL. + + Args: + url: The URL as QUrl or string. + + Return: + True if it is a valid url, False otherwise. + + Raise: + ValueError if the autosearch config value is invalid. + + """ urlstr = urlstring(url) try: diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 3b518205d..ae965c1f4 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -29,9 +29,11 @@ import qutebrowser def _git_str(): - """Try to find out git version and return a string if possible. + """Try to find out git version. - Return None if there was an error or we're not in a git repo. + Return: + string containing the git commit ID. + None if there was an error or we're not in a git repo. """ if hasattr(sys, "frozen"): diff --git a/qutebrowser/widgets/browser.py b/qutebrowser/widgets/browser.py index 1f09bf6f2..5caee7a76 100644 --- a/qutebrowser/widgets/browser.py +++ b/qutebrowser/widgets/browser.py @@ -107,7 +107,15 @@ class TabbedBrowser(TabWidget): self._space.activated.connect(lambda: self.cur_scroll_page(0, 1)) def _cb_tab_shutdown(self, tab): - """Called after a tab has been shut down completely.""" + """Called after a tab has been shut down completely. + + Args: + tab: The tab object which has been shut down. + + Emit: + shutdown_complete: When the tab shutdown is done completely. + + """ try: self._tabs.remove(tab) except ValueError: @@ -118,7 +126,14 @@ class TabbedBrowser(TabWidget): self.shutdown_complete.emit() def _cur_scroll_percent(self, perc=None, count=None, orientation=None): - """Inner logic for cur_scroll_percent_(x|y).""" + """Inner logic for cur_scroll_percent_(x|y). + + Args: + perc: How many percent to scroll, or None + count: How many percent to scroll, or None + orientation: Qt.Horizontal or Qt.Vertical + + """ if perc is None and count is None: perc = 100 elif perc is None: @@ -134,7 +149,13 @@ class TabbedBrowser(TabWidget): def _widget(self, count=None): """Return a widget based on a count/idx. - If count is None, return the current widget. + Args: + count: The tab index, or None. + + Return: + The current widget if count is None. + The widget with the given tab ID if count is given. + None if no widget was found. """ if count is None: @@ -149,6 +170,9 @@ class TabbedBrowser(TabWidget): Slot for the titleChanged signal of any tab. + Args: + text: The text to set. + """ logging.debug('title changed to "{}"'.format(text)) if text: @@ -157,7 +181,15 @@ class TabbedBrowser(TabWidget): logging.debug('ignoring title change') def _filter_factory(self, signal): - """Return a partial functon calling _filter_signals with a signal.""" + """Factory for partial _filter_signals functions. + + Args: + signal: The pyqtSignal to filter. + + Return: + A partial functon calling _filter_signals with a signal. + + """ return functools.partial(self._filter_signals, signal) def _filter_signals(self, signal, *args): @@ -172,8 +204,12 @@ class TabbedBrowser(TabWidget): The current value of the signal is also stored in tab.signal_cache so it can be emitted later when the tab changes to the current tab. - signal -- The signal to emit if the sender was the current widget. - *args -- The args to pass to the signal. + Args: + signal: The signal to emit if the sender was the current widget. + *args: The args to pass to the signal. + + Emit: + The target signal if the sender was the current widget. """ # FIXME BUG the signal cache ordering seems to be weird sometimes. @@ -202,7 +238,12 @@ class TabbedBrowser(TabWidget): logging.debug(' ignoring') def shutdown(self): - """Try to shut down all tabs cleanly.""" + """Try to shut down all tabs cleanly. + + Emit: + shutdown_complete if the shutdown completed successfully. + + """ try: self.currentChanged.disconnect() except TypeError: @@ -223,6 +264,9 @@ class TabbedBrowser(TabWidget): Also connect all the signals we need to _filter_signals. + Args: + url: The URL to open. + """ logging.debug("Opening {}".format(url)) url = urlutils.qurl(url) @@ -248,12 +292,22 @@ class TabbedBrowser(TabWidget): tab.openurl(url) def tabopencur(self): - """Set the statusbar to :tabopen and the current URL.""" + """Set the statusbar to :tabopen and the current URL. + + Emit: + set_cmd_text prefilled with :tabopen $URL + + """ url = urlutils.urlstring(self.currentWidget().url()) self.set_cmd_text.emit(':tabopen ' + url) def opencur(self): - """Set the statusbar to :open and the current URL.""" + """Set the statusbar to :open and the current URL. + + Emit: + set_cmd_text prefilled with :open $URL + + """ url = urlutils.urlstring(self.currentWidget().url()) self.set_cmd_text.emit(':open ' + url) @@ -271,6 +325,13 @@ class TabbedBrowser(TabWidget): Command handler for :close. + Args: + count: The tab index to close, or None + + Emit: + quit: If last tab was closed and last_close in config is set to + quit. + """ idx = self.currentIndex() if count is None else count - 1 tab = self._widget(count) @@ -292,7 +353,10 @@ class TabbedBrowser(TabWidget): """Open an url in the current/[count]th tab. Command handler for :open. - url -- The URL to open. + + Args: + url: The URL to open. + count: The tab index to open the URL in, or None. """ tab = self._widget(count) @@ -304,6 +368,9 @@ class TabbedBrowser(TabWidget): Command handler for :reload. + Args: + count: The tab index to reload, or None. + """ tab = self._widget(count) if tab is not None: @@ -314,6 +381,9 @@ class TabbedBrowser(TabWidget): Command handler for :stop. + Args: + count: The tab index to stop, or None. + """ tab = self._widget(count) if tab is not None: @@ -324,6 +394,9 @@ class TabbedBrowser(TabWidget): Command handler for :print. + Args: + count: The tab index to print, or None. + """ # FIXME that does not what I expect tab = self._widget(count) @@ -335,9 +408,11 @@ class TabbedBrowser(TabWidget): def cur_back(self, count=1): """Go back in the history of the current tab. - Go back for 1 page if count is unset, else go back [count] pages. Command handler for :back. + Args: + count: How many pages to go back. + """ # FIXME display warning if beginning of history for i in range(count): # pylint: disable=unused-variable @@ -346,9 +421,11 @@ class TabbedBrowser(TabWidget): def cur_forward(self, count=1): """Go forward in the history of the current tab. - Go forward for 1 page if count is unset, else go forward [count] pages. Command handler for :forward. + Args: + count: How many pages to go forward. + """ # FIXME display warning if end of history for i in range(count): # pylint: disable=unused-variable @@ -358,8 +435,9 @@ class TabbedBrowser(TabWidget): def cur_search(self, text, flags): """Search for text in the current page. - text -- The text to search for. - flags -- The QWebPage::FindFlags. + Args: + text: The text to search for. + flags: The QWebPage::FindFlags. """ self.currentWidget().findText(text, flags) @@ -369,6 +447,11 @@ class TabbedBrowser(TabWidget): Command handler for :scroll. + Args: + dx: How much to scroll in x-direction. + dy: How much to scroll in x-direction. + count: multiplier + """ dx = int(count) * float(dx) dy = int(count) * float(dy) @@ -377,25 +460,36 @@ class TabbedBrowser(TabWidget): def cur_scroll_percent_x(self, perc=None, count=None): """Scroll the current tab to a specific percent of the page. - Accepts percentage either as argument, or as count. - Command handler for :scroll_perc_x. + Args: + perc: Percentage to scroll. + count: Percentage to scroll. + """ self._cur_scroll_percent(perc, count, Qt.Horizontal) def cur_scroll_percent_y(self, perc=None, count=None): """Scroll the current tab to a specific percent of the page. - Accepts percentage either as argument, or as count. - Command handler for :scroll_perc_y + Args: + perc: Percentage to scroll. + count: Percentage to scroll. + """ self._cur_scroll_percent(perc, count, Qt.Vertical) def cur_scroll_page(self, mx, my, count=1): - """Scroll the frame mx pages to the right and my pages down.""" + """Scroll the frame page-wise. + + Args: + mx: How many pages to scroll to the right. + my: How many pages to scroll down. + count: multiplier + + """ # FIXME this might not work with HTML frames page = self.currentWidget().page_ size = page.viewportSize() @@ -407,6 +501,9 @@ class TabbedBrowser(TabWidget): Command handler for :yank. + Args: + sel: True to use primary selection, False to use clipboard + """ clip = QApplication.clipboard() url = urlutils.urlstring(self.currentWidget().url()) @@ -419,6 +516,9 @@ class TabbedBrowser(TabWidget): Command handler for :yanktitle. + Args: + sel: True to use primary selection, False to use clipboard + """ clip = QApplication.clipboard() title = self.tabText(self.currentIndex()) @@ -431,6 +531,9 @@ class TabbedBrowser(TabWidget): Command handler for :tabprev. + Args: + count: How many tabs to switch back. + """ idx = self.currentIndex() if idx - count >= 0: @@ -444,6 +547,9 @@ class TabbedBrowser(TabWidget): Command handler for :tabnext. + Args: + count: How many tabs to switch forward. + """ idx = self.currentIndex() if idx + count < self.count(): @@ -457,6 +563,9 @@ class TabbedBrowser(TabWidget): Command handler for :paste. + Args: + sel: True to use primary selection, False to use clipboard + """ # FIXME what happens for invalid URLs? clip = QApplication.clipboard() @@ -470,6 +579,9 @@ class TabbedBrowser(TabWidget): Command handler for :paste. + Args: + sel: True to use primary selection, False to use clipboard + """ # FIXME what happens for invalid URLs? clip = QApplication.clipboard() @@ -479,14 +591,26 @@ class TabbedBrowser(TabWidget): self.tabopen(url) def keyPressEvent(self, e): - """Extend TabWidget (QWidget)'s keyPressEvent to emit a signal.""" + """Extend TabWidget (QWidget)'s keyPressEvent to emit a signal. + + Args: + e: The QKeyPressEvent + + Emit: + keypress: Always emitted. + + """ self.keypress.emit(e) super().keyPressEvent(e) def resizeEvent(self, e): """Extend resizeEvent of QWidget to emit a resized signal afterwards. - e -- The QResizeEvent. + Args: + e: The QResizeEvent + + Emit: + resize: Always emitted. """ super().resizeEvent(e) @@ -507,6 +631,7 @@ class BrowserTab(QWebView): _open_new_tab: Whether to open a new tab for the next action. _shutdown_callback: The callback to call after shutting down. _destroyed: Dict of all items to be destroyed on shtudown. + Signals: scroll_pos_changed: Scroll percentage of current tab changed. arg 1: x-position in %. @@ -538,7 +663,14 @@ class BrowserTab(QWebView): def openurl(self, url): """Open an URL in the browser. - url -- The URL to load, as string or QUrl. + Args: + url: The URL to load, as string or QUrl. + + Return: + Return status of self.load + + Emit: + titleChanged and urlChanged """ u = urlutils.fuzzy_url(url) @@ -563,7 +695,11 @@ class BrowserTab(QWebView): Called from the linkClicked signal. Checks if it should open it in a tab (middle-click or control) or not, and does so. - url -- The url to handle, as string or QUrl. + Args: + url: The url to handle, as string or QUrl. + + Emit: + open_tab: Emitted if window should be opened in a new tab. """ if self._open_new_tab: @@ -578,6 +714,9 @@ class BrowserTab(QWebView): [1] https://github.com/integricho/path-of-a-pyqter/tree/master/qttut08 + Args: + callback: Function to call after shutting down. + """ self._shutdown_callback = callback try: @@ -606,7 +745,12 @@ class BrowserTab(QWebView): logging.debug("Tab shutdown scheduled") def _on_destroyed(self, sender): - """Called when a subsystem has been destroyed during shutdown.""" + """Called when a subsystem has been destroyed during shutdown. + + Args: + sender: The object which called the callback. + + """ self._destroyed[sender] = True dbgout = '\n'.join(['{}: {}'.format(k.__class__.__name__, v) for (k, v) in self._destroyed.items()]) @@ -624,7 +768,11 @@ class BrowserTab(QWebView): hope a repaint will always be requested when scrolling, and if the scroll position actually changed, we emit a signal. - e -- The QPaintEvent. + Args: + e: The QPaintEvent. + + Emit: + scroll_pos_changed; If the scroll position changed. """ frame = self.page_.mainFrame() @@ -650,7 +798,11 @@ class BrowserTab(QWebView): This also is a bit of a hack, but it seems it's the only possible way. Set the _open_new_tab attribute accordingly. - e -- The arrived event. + Args: + e: The arrived event. + + Return: + The superclass event return value. """ if e.type() in [QEvent.MouseButtonPress, QEvent.MouseButtonDblClick]: @@ -683,6 +835,14 @@ class BrowserPage(QWebPage): Loosly based on Helpviewer/HelpBrowserWV.py from eric5 (line 260 @ 5d937eb378dd) + Args: + opt: The QWebPage.ErrorPageExtensionOption instance. + out: The QWebPage.ErrorPageExtensionReturn instance to write return + values to. + + Return: + False if no error page should be displayed, True otherwise. + """ info = sip.cast(opt, QWebPage.ErrorPageExtensionOption) errpage = sip.cast(out, QWebPage.ErrorPageExtensionReturn) @@ -697,11 +857,29 @@ class BrowserPage(QWebPage): return True def supportsExtension(self, ext): - """Override QWebPage::supportsExtension to provide error pages.""" + """Override QWebPage::supportsExtension to provide error pages. + + Args: + ext: The extension to check for. + + Return: + True if the extension can be handled, False otherwise. + + """ return ext in self._extension_handlers def extension(self, ext, opt, out): - """Override QWebPage::extension to provide error pages.""" + """Override QWebPage::extension to provide error pages. + + Args: + ext: The extension. + opt: Extension options instance. + out: Extension output instance. + + Return: + Handler return value. + + """ try: handler = self._extension_handlers[ext] except KeyError: @@ -733,6 +911,14 @@ class NetworkManager(QNetworkAccessManager): Extend QNetworkAccessManager::createRequest to save requests in self._requests. + Args: + op: Operation op + req: const QNetworkRequest & req + outgoing_data: QIODevice * outgoingData + + Return: + A QNetworkReply. + """ reply = super().createRequest(op, req, outgoing_data) self._requests[id(reply)] = reply diff --git a/qutebrowser/widgets/completion.py b/qutebrowser/widgets/completion.py index 34fe1e783..4066aec83 100644 --- a/qutebrowser/widgets/completion.py +++ b/qutebrowser/widgets/completion.py @@ -133,7 +133,11 @@ class CompletionView(QTreeView): Used by tab_handler. - upwards -- Get previous item, not next. + Args: + upwards: Get previous item, not next. + + Return: + A QModelIndex. """ idx = self.selectionModel().currentIndex() @@ -156,7 +160,8 @@ class CompletionView(QTreeView): Called from cmd_text_changed(). - model -- A QAbstractItemModel with available completions. + Args: + model: A QAbstractItemModel with available completions. """ self.model.srcmodel = self._completion_models[model] @@ -168,7 +173,12 @@ class CompletionView(QTreeView): """Resize the completion area to the statusbar geometry. Slot for the resized signal of the statusbar. - geom -- A QRect containing the statusbar geometry. + + Args: + geom: A QRect containing the statusbar geometry. + + Raises: + AssertionError if new geometry is invalid. """ bottomleft = geom.topLeft() @@ -185,6 +195,9 @@ class CompletionView(QTreeView): Adjust the height of the completion if it was configured as a percentage. + Args: + geom: A QRect containing the browser geometry. + """ if self._height_perc is None: return @@ -197,7 +210,9 @@ class CompletionView(QTreeView): """Move the completion area to the statusbar geometry. Slot for the moved signal of the statusbar. - pos -- A QPoint containing the statusbar position. + + Args: + pos: A QPoint containing the statusbar position. """ self.move(pos - self._height) @@ -207,7 +222,9 @@ class CompletionView(QTreeView): """Check if completions are available and activate them. Slot for the textChanged signal of the statusbar command widget. - text -- The new text + + Args: + text: The new text """ if self._ignore_next: @@ -235,7 +252,11 @@ class CompletionView(QTreeView): Select the previous/next item and write the new text to the statusbar. Called by key_(s)tab_handler in statusbar.command. - shift -- Whether shift is pressed or not. + Args: + shift: Whether shift is pressed or not. + + Emit: + append_cmd_text: When a command text should be set/appended. """ if not self._completing: @@ -300,7 +321,8 @@ class _CompletionItemDelegate(QStyledItemDelegate): This is the main part where we differ from the original implementation in Qt: We use a QTextDocument to draw text. - index of the item of the item -- The QModelIndex of the item to draw. + Args: + index -- The QModelIndex of the item to draw. """ if not self._opt.text: @@ -347,7 +369,8 @@ class _CompletionItemDelegate(QStyledItemDelegate): def _draw_textdoc(self, text_rect): """Draw the QTextDocument of an item. - text_rect -- The QRect to clip the drawing to. + Args: + text_rect: The QRect to clip the drawing to. """ clip = QRectF(0, 0, text_rect.width(), text_rect.height()) @@ -356,7 +379,8 @@ class _CompletionItemDelegate(QStyledItemDelegate): def _get_textdoc(self, index): """Create the QTextDocument of an item. - index -- The QModelIndex of the item to draw. + Args: + index: The QModelIndex of the item to draw. """ # FIXME we probably should do eliding here. See @@ -422,6 +446,13 @@ class _CompletionItemDelegate(QStyledItemDelegate): Return the cell size based on the QTextDocument size, but might not work correctly yet. + Args: + option: const QStyleOptionViewItem & option + index: const QModelIndex & index + + Return: + A QSize with the recommended size. + """ value = index.data(Qt.SizeHintRole) if value is not None: @@ -436,7 +467,14 @@ class _CompletionItemDelegate(QStyledItemDelegate): return size + QSize(10, 1) def paint(self, painter, option, index): - """Override the QStyledItemDelegate paint function.""" + """Override the QStyledItemDelegate paint function. + + Args: + painter: QPainter * painter + option: const QStyleOptionViewItem & option + index: const QModelIndex & index + + """ self._painter = painter self._painter.save() self._opt = QStyleOptionViewItem(option) diff --git a/qutebrowser/widgets/crash.py b/qutebrowser/widgets/crash.py index b5da98dbf..ac7f2f718 100644 --- a/qutebrowser/widgets/crash.py +++ b/qutebrowser/widgets/crash.py @@ -43,6 +43,14 @@ class CrashDialog(QDialog): """ def __init__(self, pages, cmdhist, exc): + """Constructor for CrashDialog. + + Args: + pages: A list of the open pages (URLs as strings) + cmdhist: A list with the command history (as strings) + exc: An exception tuple (type, value, traceback) + + """ super().__init__() self.setFixedSize(500, 350) self.setWindowTitle('Whoops!') @@ -82,7 +90,17 @@ class CrashDialog(QDialog): self._vbox.addLayout(self._hbox) def _crash_info(self, pages, cmdhist, exc): - """Gather crash information to display.""" + """Gather crash information to display. + + Args: + pages: A list of the open pages (URLs as strings) + cmdhist: A list with the command history (as strings) + exc: An exception tuple (type, value, traceback) + + Return: + The string to display. + + """ outputs = [ ('Version info', version()), ('Exception', ''.join(traceback.format_exception(*exc))), diff --git a/qutebrowser/widgets/statusbar.py b/qutebrowser/widgets/statusbar.py index 9929c7074..941e2d97c 100644 --- a/qutebrowser/widgets/statusbar.py +++ b/qutebrowser/widgets/statusbar.py @@ -116,7 +116,7 @@ class StatusBar(QWidget): def error(self, val): """Setter for self.error, so it can be used as Qt property. - Re-sets the stylesheet after setting the value, so everything gets + Re-set the stylesheet after setting the value, so everything gets updated by Qt properly. """ @@ -137,7 +137,11 @@ class StatusBar(QWidget): def resizeEvent(self, e): """Extend resizeEvent of QWidget to emit a resized signal afterwards. - e -- The QResizeEvent. + Args: + e: The QResizeEvent. + + Emit: + resized: Always emitted. """ super().resizeEvent(e) @@ -146,7 +150,11 @@ class StatusBar(QWidget): def moveEvent(self, e): """Extend moveEvent of QWidget to emit a moved signal afterwards. - e -- The QMoveEvent. + Args: + e: The QMoveEvent. + + Emit: + moved: Always emitted. """ super().moveEvent(e) @@ -278,7 +286,14 @@ class _Command(QLineEdit): @pyqtSlot() def _on_return_pressed(self): - """Handle the command in the status bar.""" + """Handle the command in the status bar. + + Emit: + got_cmd: If a new cmd was entered. + got_search: If a new search was entered. + got_search_rev: If a new reverse search was entered. + + """ signals = { ':': self.got_cmd, '/': self.got_search, @@ -294,19 +309,37 @@ class _Command(QLineEdit): @pyqtSlot(str) def set_cmd_text(self, text): - """Preset the statusbar to some text.""" + """Preset the statusbar to some text. + + Args: + text: The text to set (string). + + """ self.setText(text) self.setFocus() @pyqtSlot(str) def on_append_cmd_text(self, text): - """Append text to the commandline.""" + """Append text to the commandline. + + Args: + text: The text to set (string). + + """ # FIXME do the right thing here self.setText(':' + text) self.setFocus() def focusOutEvent(self, e): - """Clear the statusbar text if it's explicitely unfocused.""" + """Clear the statusbar text if it's explicitely unfocused. + + Args: + e: The QFocusEvent. + + Emit: + hide_completion: Always emitted so the completion is hidden. + + """ if e.reason() in [Qt.MouseFocusReason, Qt.TabFocusReason, Qt.BacktabFocusReason, Qt.OtherFocusReason]: self.setText('') @@ -315,7 +348,12 @@ class _Command(QLineEdit): super().focusOutEvent(e) def focusInEvent(self, e): - """Clear error message when the statusbar is focused.""" + """Clear error message when the statusbar is focused. + + Args: + e: The QFocusEvent. + + """ self._statusbar.clear_error() super().focusInEvent(e) @@ -327,10 +365,12 @@ class _CommandValidator(QValidator): def validate(self, string, pos): """Override QValidator::validate. - string -- The string to validate. - pos -- The current curser position. + Args: + string: The string to validate. + pos: The current curser position. - Return a tuple (status, string, pos) as a QValidator should. + Return: + A tuple (status, string, pos) as a QValidator should. """ if any(string.startswith(c) for c in keys.startchars): @@ -400,14 +440,20 @@ class TextBase(QLabel): def _update_elided_text(self, width): """Update the elided text when necessary. - width -- The maximal width the text should take. + Args: + width: The maximal width the text should take. """ self._elided_text = self.fontMetrics().elidedText( self.text(), self._elidemode, width, Qt.TextShowMnemonic) def setText(self, txt): - """Extend QLabel::setText to update the elided text afterwards.""" + """Extend QLabel::setText to update the elided text afterwards. + + Args: + txt: The text to set (string). + + """ super().setText(txt) self._update_elided_text(self.geometry().width()) @@ -441,7 +487,12 @@ class _Text(TextBase): self._old_text = '' def set_error(self, text): - """Display an error message and save current text in old_text.""" + """Display an error message and save current text in old_text. + + Args: + text: The text to set (string). + + """ self._old_text = self.text() self.setText(text) @@ -463,7 +514,13 @@ class _Percentage(TextBase): @pyqtSlot(int, int) def set_perc(self, _, y): - """Setter to be used as a Qt slot.""" + """Setter to be used as a Qt slot. + + Args: + _: The x percentage (int), currently ignored. + y: The y percentage (int) + + """ if y == 0: self.setText('[top]') elif y == 100: @@ -508,7 +565,13 @@ class _Url(TextBase): """ def __init__(self, bar, elidemode=Qt.ElideMiddle): - """Override TextBase::__init__ to elide in the middle by default.""" + """Override TextBase::__init__ to elide in the middle by default. + + Args: + bar: The statusbar (parent) object. + elidemode: How to elide the text. + + """ super().__init__(bar, elidemode) self.setObjectName(self.__class__.__name__) self.setStyleSheet(config.get_stylesheet(self._STYLESHEET)) @@ -530,13 +593,23 @@ class _Url(TextBase): @pyqtSlot(bool) def on_loading_finished(self, ok): - """Slot for cur_loading_finished. Colors the URL according to ok.""" + """Slot for cur_loading_finished. Colors the URL according to ok. + + Args: + ok: Whether loading finished successfully (True) or not (False). + + """ # FIXME: set color to warn if there was an SSL error self.urltype = 'success' if ok else 'error' @pyqtSlot(str) def set_url(self, s): - """Setter to be used as a Qt slot.""" + """Setter to be used as a Qt slot. + + Args: + s: The URL to set. + + """ self.setText(urlstring(s)) self.urltype = 'normal' @@ -548,6 +621,11 @@ class _Url(TextBase): Saves old shown URL in self._old_url and restores it later if a link is "un-hovered" when it gets called with empty parameters. + Args: + link: The link which was hovered (string) + title: The title of the hovered link (string) + text: The text of the hovered link (string) + """ if link: if self._old_url is None: