Source code for gammapy.utils.testing

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""Utilities for testing"""
from __future__ import absolute_import, division, print_function, unicode_literals
import os
from astropy.coordinates import Angle
from astropy.tests.helper import pytest
from numpy.testing import assert_array_less, assert_allclose
from ..data import DataManager
from ..datasets import gammapy_extra

__all__ = [
    'requires_dependency',
    'requires_data',
    'assert_wcs_allclose',
    'assert_skycoord_allclose',
]

# Cache for `requires_dependency`
_requires_dependency_cache = dict()


[docs]def requires_dependency(name): """Decorator to declare required dependencies for tests. Examples -------- :: from gammapy.utils.testing import requires_dependency @requires_dependency('scipy') def test_using_scipy(): import scipy ... """ if name in _requires_dependency_cache: skip_it = _requires_dependency_cache[name] else: try: __import__(name) skip_it = False except ImportError: skip_it = True _requires_dependency_cache[name] = skip_it reason = 'Missing dependency: {}'.format(name) return pytest.mark.skipif(skip_it, reason=reason)
def has_hess_test_data(): """Check if the user has HESS data for testing. """ if not DataManager.DEFAULT_CONFIG_FILE.is_file(): return False try: dm = DataManager() # TODO: add checks on availability of datasets used in the tests ... return True except: return False def has_data(name): """Is a certain set of data available? """ if name == 'gammapy-extra': from ..datasets import gammapy_extra return gammapy_extra.is_available elif name == 'hess': return has_hess_test_data() elif name == 'hgps': return ('HGPS_DATA' in os.environ) and ('HGPS_ANALYSIS' in os.environ) elif name == 'gamma-cat': return ('GAMMA_CAT' in os.environ) elif name == 'fermi-lat': return ('GAMMAPY_FERMI_LAT_DATA' in os.environ) else: raise ValueError('Invalid name: {}'.format(name))
[docs]def requires_data(name): """Decorator to declare required data for tests. Examples -------- :: from gammapy.utils.testing import requires_data from gammapy.datasets import gammapy_extra @requires_data('gammapy-extra') def test_using_data_files(): filename = gammapy_extra.filename('...') ... """ skip_it = not has_data(name) reason = 'Missing data: {}'.format(name) return pytest.mark.skipif(skip_it, reason=reason)
def run_cli(cli, args, assert_ok=True): """Helper function to run command line tools. """ with pytest.raises(SystemExit) as exc: cli(args) if assert_ok: assert exc.value.args[0] == 0 return exc # https://pytest.org/latest/tmpdir.html#the-tmpdir-factory-fixture @pytest.fixture def data_manager(): test_register = gammapy_extra.filename('datasets/data-register.yaml') dm = DataManager.from_yaml(test_register) return dm
[docs]def assert_wcs_allclose(wcs1, wcs2): """Assert all-close for `~astropy.wcs.WCS` """ # TODO: implement properly assert_allclose(wcs1.wcs.cdelt, wcs2.wcs.cdelt)
[docs]def assert_skycoord_allclose(skycoord1, skycoord2, atol='1 arcsec'): """Assert all-close for `~astropy.coordinates.SkyCoord`. - Checks if separation on the sky is within ``atol``. - Frames can be different, aren't checked at the moment. """ atol = Angle(atol) sep = skycoord1.separation(skycoord2).deg assert_array_less(sep.deg, atol.deg)