def _get_name(exc): """Get a suitable exception name as a string.""" prefixes = ['glimpsebrowser', 'builtins'] name = utils.qualname(exc.__class__) for prefix in prefixes: if name.startswith(prefix): name = name[len(prefix) + 1:] break return name
def format_call(func, args=None, kwargs=None, full=True): """Get a string representation of a function calls with the given args. Args: func: The callable to print. args: A list of positional arguments. kwargs: A dict of named arguments. full: Whether to print the full name Return: A string with the function call. """ if full: name = utils.qualname(func) else: name = func.__name__ return '{}({})'.format(name, format_args(args, kwargs))
def _handle_keypress(self, event, *, dry_run=False): """Handle filtering of KeyPress events. Args: event: The KeyPress to examine. dry_run: Don't actually handle the key, only filter it. Return: True if event should be filtered, False otherwise. """ curmode = self.mode parser = self._parsers[curmode] if curmode != usertypes.KeyMode.insert: log.modes.debug("got keypress in mode {} - delegating to " "{}".format(curmode, utils.qualname(parser))) match = parser.handle(event, dry_run=dry_run) is_non_alnum = ( event.modifiers() not in [Qt.NoModifier, Qt.ShiftModifier] or not event.text().strip()) forward_unbound_keys = config.val.input.forward_unbound_keys if match: filter_this = True elif (parser.passthrough or forward_unbound_keys == 'all' or (forward_unbound_keys == 'auto' and is_non_alnum)): filter_this = False else: filter_this = True if not filter_this and not dry_run: self._releaseevents_to_pass.add(KeyEvent.from_event(event)) if curmode != usertypes.KeyMode.insert: focus_widget = QApplication.instance().focusWidget() log.modes.debug("match: {}, forward_unbound_keys: {}, " "passthrough: {}, is_non_alnum: {}, dry_run: {} " "--> filter: {} (focused: {!r})".format( match, forward_unbound_keys, parser.passthrough, is_non_alnum, dry_run, filter_this, focus_widget)) return filter_this
def __init__(self, func): """Constructor. Args: func: The function to parse the docstring for. """ self._state = self.State.short self._cur_arg_name = None self._short_desc_parts = [] self._long_desc_parts = [] self.arg_descs = collections.OrderedDict() doc = inspect.getdoc(func) handlers = { self.State.short: self._parse_short, self.State.desc: self._parse_desc, self.State.desc_hidden: self._skip, self.State.arg_start: self._parse_arg_start, self.State.arg_inside: self._parse_arg_inside, self.State.misc: self._skip, } if doc is None: if sys.flags.optimize < 2: log.commands.warning( "Function {}() from {} has no docstring".format( utils.qualname(func), inspect.getsourcefile(func))) self.long_desc = "" self.short_desc = "" return for line in doc.splitlines(): handler = handlers[self._state] stop = handler(line) if stop: break for k, v in self.arg_descs.items(): desc = ' '.join(v) desc = re.sub(r', or None($|\.)', r'\1', desc) desc = re.sub(r', or None', r', or not given', desc) self.arg_descs[k] = desc self.long_desc = ' '.join(self._long_desc_parts) self.short_desc = ' '.join(self._short_desc_parts)
def whitelist_generator(): # noqa """Generator which yields lines to add to a vulture whitelist.""" loader.load_components(skip_hooks=True) # glimpsebrowser commands for cmd in objects.commands.values(): yield utils.qualname(cmd.handler) # pyPEG2 classes for name, member in inspect.getmembers(rfc6266, inspect.isclass): for attr in ['grammar', 'regex']: if hasattr(member, attr): yield 'glimpsebrowser.browser.webkit.rfc6266.{}.{}'.format(name, attr) # PyQt properties yield 'glimpsebrowser.mainwindow.statusbar.bar.StatusBar.color_flags' yield 'glimpsebrowser.mainwindow.statusbar.url.UrlText.urltype' # Not used yet, but soon (or when debugging) yield 'glimpsebrowser.utils.debug.log_events' yield 'glimpsebrowser.utils.debug.log_signals' yield 'glimpsebrowser.utils.debug.qflags_key' yield 'glimpsebrowser.utils.qtutils.QtOSError.qt_errno' yield 'scripts.utils.bg_colors' yield 'glimpsebrowser.misc.sql.SqliteErrorCode.CONSTRAINT' # Qt attributes yield 'PyQt5.QtWebKit.QWebPage.ErrorPageExtensionReturn().baseUrl' yield 'PyQt5.QtWebKit.QWebPage.ErrorPageExtensionReturn().content' yield 'PyQt5.QtWebKit.QWebPage.ErrorPageExtensionReturn().encoding' yield 'PyQt5.QtWebKit.QWebPage.ErrorPageExtensionReturn().fileNames' yield 'PyQt5.QtWidgets.QStyleOptionViewItem.backgroundColor' ## glimpse://... handlers for name in glimpsescheme._HANDLERS: # pylint: disable=protected-access name = name.replace('-', '_') yield 'glimpsebrowser.browser.glimpsescheme.glimpse_' + name # Other false-positives yield 'glimpsebrowser.completion.models.listcategory.ListCategory().lessThan' yield 'glimpsebrowser.utils.jinja.Loader.get_source' yield 'glimpsebrowser.utils.log.QtWarningFilter.filter' yield 'glimpsebrowser.browser.pdfjs.is_available' yield 'glimpsebrowser.misc.guiprocess.spawn_output' yield 'glimpsebrowser.utils.usertypes.ExitStatus.reserved' yield 'QEvent.posted' yield 'log_stack' # from message.py yield 'propagate' # logging.getLogger('...).propagate = False # vulture doesn't notice the hasattr() and thus thinks netrc_used is unused # in NetworkManager.on_authentication_required yield 'PyQt5.QtNetwork.QNetworkReply.netrc_used' yield 'glimpsebrowser.browser.downloads.last_used_directory' yield 'PaintContext.clip' # from completiondelegate.py yield 'logging.LogRecord.log_color' # from logging.py yield 'scripts.utils.use_color' # from asciidoc2html.py for attr in ['pyeval_output', 'log_clipboard', 'fake_clipboard']: yield 'glimpsebrowser.misc.utilcmds.' + attr for attr in ['fileno', 'truncate', 'closed', 'readable']: yield 'glimpsebrowser.utils.qtutils.PyQIODevice.' + attr for attr in ['msgs', 'priority', 'visit_attribute']: yield 'scripts.dev.pylint_checkers.config.' + attr for attr in ['visit_call', 'process_module']: yield 'scripts.dev.pylint_checkers.modeline.' + attr for name, _member in inspect.getmembers(configtypes, inspect.isclass): yield 'glimpsebrowser.config.configtypes.' + name yield 'glimpsebrowser.config.configexc.ConfigErrorDesc.traceback' yield 'glimpsebrowser.config.configfiles.ConfigAPI.load_autoconfig' yield 'types.ModuleType.c' # configfiles:read_config_py for name in ['configdir', 'datadir']: yield 'glimpsebrowser.config.configfiles.ConfigAPI.' + name yield 'include_aliases' for attr in ['_get_default_metavar_for_optional', '_get_default_metavar_for_positional', '_metavar_formatter']: yield 'scripts.dev.src2asciidoc.UsageFormatter.' + attr # attrs yield 'glimpsebrowser.browser.webkit.network.networkmanager.ProxyId.hostname' yield 'glimpsebrowser.command.command.ArgInfo._validate_exclusive' yield 'scripts.get_coredumpctl_traces.Line.uid' yield 'scripts.get_coredumpctl_traces.Line.gid' yield 'scripts.importer.import_moz_places.places.row_factory' # component hooks yield 'glimpsebrowser.components.adblock.on_config_changed'
def new_event(self, e, *args, **kwargs): """Wrapper for event() which logs events.""" log.misc.debug("Event in {}: {}".format(utils.qualname(klass), qenum_key(QEvent, e.type()))) return old_event(self, e, *args, **kwargs)