From c04adb94b21f476c2d3b708e0f543bf08670204d Mon Sep 17 00:00:00 2001 From: Moez Bouhlel Date: Thu, 4 Aug 2016 20:53:13 +0100 Subject: [PATCH 1/4] DocstringParser - support python with optimizations on --- qutebrowser/misc/earlyinit.py | 6 ++++++ qutebrowser/utils/docutils.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index 284478866..256d80f1c 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -300,6 +300,11 @@ def init_log(args): log.init_log(args) log.init.debug("Log initialized.") +def check_optimize_flag(): + from qutebrowser.utils import log + if sys.flags.optimize >= 2: + log.init.warning("Running on optimize level higher than 1, " + "unexpected behaviors may occur.") def earlyinit(args): """Do all needed early initialization. @@ -327,3 +332,4 @@ def earlyinit(args): remove_inputhook() check_libraries(args) check_ssl_support() + check_optimize_flag() diff --git a/qutebrowser/utils/docutils.py b/qutebrowser/utils/docutils.py index d93e7564d..40cb0cb70 100644 --- a/qutebrowser/utils/docutils.py +++ b/qutebrowser/utils/docutils.py @@ -26,7 +26,7 @@ import os.path import collections import qutebrowser -from qutebrowser.utils import usertypes +from qutebrowser.utils import usertypes, log, utils def is_git_repo(): @@ -98,6 +98,15 @@ class DocstringParser: 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) From 26af2b3089416317160e844a3d29d073b7b6d4e6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 10 Aug 2016 08:48:04 +0200 Subject: [PATCH 2/4] Fix grammar mistake --- qutebrowser/misc/earlyinit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index ee502b2ec..3ec1f8e34 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -304,7 +304,7 @@ def check_optimize_flag(): from qutebrowser.utils import log if sys.flags.optimize >= 2: log.init.warning("Running on optimize level higher than 1, " - "unexpected behaviors may occur.") + "unexpected behavior may occur.") def earlyinit(args): """Do all needed early initialization. From f0133624bf6953b896c2db47770dde86812b8283 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 10 Aug 2016 09:05:04 +0200 Subject: [PATCH 3/4] Add some tests for -OO logging --- tests/end2end/test_invocations.py | 13 +++++++++++++ tests/unit/commands/test_cmdutils.py | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py index d34859410..840465704 100644 --- a/tests/end2end/test_invocations.py +++ b/tests/end2end/test_invocations.py @@ -110,3 +110,16 @@ def test_no_loglines(quteproc_new): quteproc_new.start(args=['--temp-basedir', '--loglines=0'] + BASE_ARGS) quteproc_new.open_path('qute:log') assert quteproc_new.get_content() == 'Log output was disabled.' + + +@pytest.mark.parametrize('level', ['1', '2']) +def test_optimize(quteproc_new, capfd, level): + quteproc_new.start(args=['--temp-basedir'] + BASE_ARGS, + env={'PYTHONOPTIMIZE': level}) + if level == '2': + msg = ("Running on optimize level higher than 1, unexpected behavior " + "may occur.") + line = quteproc_new.wait_for(message=msg) + line.expected = True + quteproc_new.send_cmd(':quit') + quteproc_new.wait_for_quit() diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/commands/test_cmdutils.py index 1ecdbaf3a..cd074cbcd 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/commands/test_cmdutils.py @@ -21,6 +21,10 @@ """Tests for qutebrowser.commands.cmdutils.""" +import sys +import logging +import types + import pytest from qutebrowser.commands import cmdutils, cmdexc, argparser, command @@ -354,6 +358,24 @@ class TestArgument: assert str(excinfo.value) == "Argument marked as both count/win_id!" + def test_no_docstring(self, caplog): + with caplog.at_level(logging.WARNING): + @cmdutils.register() + def fun(): + # no docstring + pass + assert len(caplog.records) == 1 + msg = caplog.records[0].message + assert msg.endswith('test_cmdutils.py has no docstring') + + def test_no_docstring_with_optimize(self, monkeypatch): + """With -OO we'd get a warning on start, but no warning afterwards.""" + monkeypatch.setattr(sys, 'flags', types.SimpleNamespace(optimize=2)) + @cmdutils.register() + def fun(): + # no docstring + pass + class TestRun: From f0b3d03072514e30f52ddb28a6beaafd05877c98 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 10 Aug 2016 09:05:30 +0200 Subject: [PATCH 4/4] Regenerate authors --- README.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/README.asciidoc b/README.asciidoc index 9dab267f1..f8bbc1404 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -235,6 +235,7 @@ Contributors, sorted by the number of commits in descending order: * Thiago Barroso Perrotta * Sorokin Alexei * Noah Huesser +* Moez Bouhlel * Matthias Lisin * Marcel Schilling * Julie Engel