88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
# fixtures: Fixtures with cleanups for testing and convenience.
|
|
#
|
|
# Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
|
|
# license at the users choice. A copy of both licenses are available in the
|
|
# project source as Apache-2.0 and BSD. You may not use this file except in
|
|
# compliance with one of these two licences.
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# license you chose for the specific language governing permissions and
|
|
# limitations under that license.
|
|
|
|
__all__ = [
|
|
'WarningsCapture',
|
|
'WarningsFilter',
|
|
]
|
|
|
|
import warnings
|
|
|
|
import fixtures
|
|
|
|
|
|
class WarningsCapture(fixtures.Fixture):
|
|
"""Capture warnings.
|
|
|
|
While ``WarningsCapture`` is active, warnings will be captured by
|
|
the fixture (so that they can be later analyzed).
|
|
|
|
:attribute captures: A list of warning capture ``WarningMessage`` objects.
|
|
"""
|
|
|
|
def _showwarning(self, *args, **kwargs):
|
|
self.captures.append(warnings.WarningMessage(*args, **kwargs))
|
|
|
|
def _setUp(self):
|
|
patch = fixtures.MonkeyPatch("warnings.showwarning", self._showwarning)
|
|
self.useFixture(patch)
|
|
self.captures = []
|
|
|
|
|
|
class WarningsFilter(fixtures.Fixture):
|
|
"""Configure warnings filters.
|
|
|
|
While ``WarningsFilter`` is active, warnings will be filtered per
|
|
configuration.
|
|
"""
|
|
|
|
def __init__(self, filters=None):
|
|
"""Create a WarningsFilter fixture.
|
|
|
|
:param filters: An optional list of dictionaries with arguments
|
|
corresponding to the arguments to
|
|
:py:func:`warnings.filterwarnings`. For example::
|
|
|
|
[
|
|
{
|
|
'action': 'ignore',
|
|
'message': 'foo',
|
|
'category': DeprecationWarning,
|
|
},
|
|
]
|
|
|
|
Order is important: entries closer to the front of the list
|
|
override entries later in the list, if both match a particular
|
|
warning.
|
|
|
|
Alternatively, you can configure warnings within the context of the
|
|
fixture.
|
|
|
|
See `the Python documentation`__ for more information.
|
|
|
|
__: https://docs.python.org/3/library/warnings.html#the-warnings-filter
|
|
"""
|
|
super().__init__()
|
|
self.filters = filters or []
|
|
|
|
def _setUp(self):
|
|
self._original_warning_filters = warnings.filters[:]
|
|
|
|
for filt in self.filters:
|
|
warnings.filterwarnings(**filt)
|
|
|
|
self.addCleanup(self._reset_warning_filters)
|
|
|
|
def _reset_warning_filters(self):
|
|
warnings.filters[:] = self._original_warning_filters
|