From 3a33bc42a66beab28210884da546decb6c70e072 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 11 May 2016 07:08:31 +0200 Subject: [PATCH] Add initial support for the typing module --- qutebrowser/utils/typing.py | 37 ++++++++++++++++++++++++++++++++ qutebrowser/utils/version.py | 1 + tests/unit/utils/test_version.py | 10 +++++---- 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 qutebrowser/utils/typing.py diff --git a/qutebrowser/utils/typing.py b/qutebrowser/utils/typing.py new file mode 100644 index 000000000..04df10059 --- /dev/null +++ b/qutebrowser/utils/typing.py @@ -0,0 +1,37 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2016 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Wrapper for Python 3.5's typing module. + +This wrapper is needed as both Python 3.5 and typing for PyPI isn't commonly +packaged yet. As we don't actually need anything from the typing module at +runtime, we instead mock the typing classes (using objects to make things +easier) so the typing module isn't a hard dependency. +""" + +try: + from typing import Union +except ImportError: + + class TypingFake: + + def __getitem__(self, _item): + pass + + Union = TypingFake() diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 0e67d19c3..f3338894b 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -135,6 +135,7 @@ def _module_versions(): ('pygments', ['__version__']), ('yaml', ['__version__']), ('cssutils', ['__version__']), + ('typing', []), ]) for name, attributes in modules.items(): try: diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 68ab81a48..6d08a8727 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -325,6 +325,7 @@ class ImportFake: 'pygments': True, 'yaml': True, 'cssutils': True, + 'typing': True, } self.version_attribute = '__version__' self.version = '1.2.3' @@ -384,12 +385,13 @@ class TestModuleVersions: """Test with all modules present in version 1.2.3.""" expected = ['sip: yes', 'colorama: 1.2.3', 'pypeg2: 1.2.3', 'jinja2: 1.2.3', 'pygments: 1.2.3', 'yaml: 1.2.3', - 'cssutils: 1.2.3'] + 'cssutils: 1.2.3', 'typing: yes'] assert version._module_versions() == expected @pytest.mark.parametrize('module, idx, expected', [ ('colorama', 1, 'colorama: no'), ('cssutils', 6, 'cssutils: no'), + ('typing', 7, 'typing: no'), ]) def test_missing_module(self, module, idx, expected, import_fake): """Test with a module missing. @@ -405,12 +407,12 @@ class TestModuleVersions: @pytest.mark.parametrize('value, expected', [ ('VERSION', ['sip: yes', 'colorama: 1.2.3', 'pypeg2: yes', 'jinja2: yes', 'pygments: yes', 'yaml: yes', - 'cssutils: yes']), + 'cssutils: yes', 'typing: yes']), ('SIP_VERSION_STR', ['sip: 1.2.3', 'colorama: yes', 'pypeg2: yes', 'jinja2: yes', 'pygments: yes', 'yaml: yes', - 'cssutils: yes']), + 'cssutils: yes', 'typing: yes']), (None, ['sip: yes', 'colorama: yes', 'pypeg2: yes', 'jinja2: yes', - 'pygments: yes', 'yaml: yes', 'cssutils: yes']), + 'pygments: yes', 'yaml: yes', 'cssutils: yes', 'typing: yes']), ]) def test_version_attribute(self, value, expected, import_fake): """Test with a different version attribute.