Files
@ 4791487dbec1
Branch filter:
Location: kallithea/conftest.py - annotation
4791487dbec1
2.0 KiB
text/x-python
api: stop using 'Optional', 'OAttr'/'OptionalAttr' classes
There does not seem to be a good reason to use the 'Optional' and
'OptionalAttr' classes.
It makes the code harder to understand. And worse, the 'default value'
specified is not always used, which can thus give false information to
users.
The way Optional was used in the API calls is twofold:
1.either by effectively extracting a value, via Optional.extract(param).
If 'param' was indeed specified by the user, then this would yield that
user-specified value. Otherwise, it would yield the value declared in the
parameter declaration, e.g. param=Optional(defaultvalue).
2.or by checking if a variable is an instance of the Optional class. In case
a user effectively passed a value, this value will not be of the
Optional class. So if a parameter is an object of class Optional, we know
the user did not pass a value, and we can apply some default.
In the declaration of the parameter, the specified default value will only
be used if the 'extract' method is used, i.e. method 1 above.
A simpler way to address this problem of default values is just with Python
default values, using 'None' as magic value if the default will be
calculated inside the method.
The docstrings still specify something like:
type: Optional(bool)
which is humanly readable and does not necessarily refer to a class called
'Optional', so such strings are kept.
There does not seem to be a good reason to use the 'Optional' and
'OptionalAttr' classes.
It makes the code harder to understand. And worse, the 'default value'
specified is not always used, which can thus give false information to
users.
The way Optional was used in the API calls is twofold:
1.either by effectively extracting a value, via Optional.extract(param).
If 'param' was indeed specified by the user, then this would yield that
user-specified value. Otherwise, it would yield the value declared in the
parameter declaration, e.g. param=Optional(defaultvalue).
2.or by checking if a variable is an instance of the Optional class. In case
a user effectively passed a value, this value will not be of the
Optional class. So if a parameter is an object of class Optional, we know
the user did not pass a value, and we can apply some default.
In the declaration of the parameter, the specified default value will only
be used if the 'extract' method is used, i.e. method 1 above.
A simpler way to address this problem of default values is just with Python
default values, using 'None' as magic value if the default will be
calculated inside the method.
The docstrings still specify something like:
type: Optional(bool)
which is humanly readable and does not necessarily refer to a class called
'Optional', so such strings are kept.
0a277465fddf 0a277465fddf afa5e0bdb76f afa5e0bdb76f 9948ed9916c4 0a277465fddf afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f 9948ed9916c4 9948ed9916c4 9948ed9916c4 9948ed9916c4 9948ed9916c4 9948ed9916c4 9948ed9916c4 9948ed9916c4 afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f afa5e0bdb76f 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 3929ff3f21c6 56de50d57ff0 56de50d57ff0 56de50d57ff0 56de50d57ff0 56de50d57ff0 56de50d57ff0 56de50d57ff0 | import os
import mock
import pytest
import tg
here = os.path.dirname(__file__)
# HACK:
def pytest_configure():
# Register global dummy tg.context to avoid "TypeError: No object (name: context) has been registered for this thread"
tg.request_local.context._push_object(tg.util.bunch.Bunch())
# could be removed again after use with
# tg.request_local.context._pop_object ... but we keep it around forever as
# a reasonable sentinel
def pytest_ignore_collect(path):
# ignore all files outside the 'kallithea' directory
if not str(path).startswith(os.path.join(here, 'kallithea')):
return True
# during doctest verification, normally all python files will be imported.
# Thus, files that cannot be imported normally should be ignored.
# Files that generate ImportErrors are ignored via
# '--doctest-ignore-import-errors' (pytest.ini)
kallithea_ignore_paths = (
# AttributeError: 'module' object has no attribute 'config'
'/kallithea/alembic/env.py',
# collection of the following file messes up the rest of test execution
'/kallithea/tests/scripts/manual_test_concurrency.py',
)
if str(path).endswith(kallithea_ignore_paths):
return True
@pytest.fixture()
def doctest_mock_ugettext(request):
"""Mock ugettext ('_') in the module using this fixture.
Intended to be used for doctests.
In a doctest, enable this fixture using:
>>> getfixture('doctest_mock_ugettext')
"""
m = __import__(request.module.__name__, globals(), locals(), [None], 0)
with mock.patch.object(m, '_', lambda s: s):
yield
if getattr(pytest, 'register_assert_rewrite', None):
# make sure that all asserts under kallithea/tests benefit from advanced
# assert reporting with pytest-3.0.0+, including api/api_base.py,
# models/common.py etc.
# See also: https://docs.pytest.org/en/latest/assert.html#advanced-assertion-introspection
pytest.register_assert_rewrite('kallithea.tests')
|