From f96788976538c699c1d29cebbe0978ecb4ad88b7 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 18:37:15 +0200 Subject: [PATCH 01/14] [msm] use Ipython's ShimModule approach to warn upon access of a moved module. This adresses #550. Remove those packages again in version 2.3 --- pyemma/msm/__init__.py | 13 +- pyemma/msm/analysis/__init__.py | 11 ++ pyemma/msm/dtraj/__init__.py | 12 ++ pyemma/msm/estimation/__init__.py | 11 ++ pyemma/msm/flux/__init__.py | 11 ++ pyemma/msm/generation/__init__.py | 11 ++ .../tests/test_msm_lowlevel_deprecation.py | 96 +++++++++++++ pyemma/util/_ext/__init__.py | 0 pyemma/util/_ext/shimmodule.py | 132 ++++++++++++++++++ 9 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 pyemma/msm/analysis/__init__.py create mode 100644 pyemma/msm/dtraj/__init__.py create mode 100644 pyemma/msm/estimation/__init__.py create mode 100644 pyemma/msm/flux/__init__.py create mode 100644 pyemma/msm/generation/__init__.py create mode 100644 pyemma/msm/tests/test_msm_lowlevel_deprecation.py create mode 100644 pyemma/util/_ext/__init__.py create mode 100644 pyemma/util/_ext/shimmodule.py diff --git a/pyemma/msm/__init__.py b/pyemma/msm/__init__.py index e5d357e11..20a9bafc6 100644 --- a/pyemma/msm/__init__.py +++ b/pyemma/msm/__init__.py @@ -84,14 +84,21 @@ msm.flux """ -from __future__ import absolute_import, print_function +from __future__ import absolute_import as _ ##################################################### # Low-level MSM functions (imported from msmtools) # backward compatibility to PyEMMA 1.2.x -from msmtools import analysis, estimation, generation, dtraj, flux -from msmtools.analysis.dense.pcca import PCCA +# TODO: finally remove this stuff... +import warnings as _warnings +from pyemma.util._ext.shimmodule import ShimWarning as _ShimWarning +with _warnings.catch_warnings(): + _warnings.filterwarnings('ignore', category=_ShimWarning) + from . import analysis, estimation, generation, dtraj, flux io = dtraj +del _warnings, _ShimWarning +###################################################### +from msmtools.analysis.dense.pcca import PCCA ##################################################### # Estimators and models diff --git a/pyemma/msm/analysis/__init__.py b/pyemma/msm/analysis/__init__.py new file mode 100644 index 000000000..54f5f8d65 --- /dev/null +++ b/pyemma/msm/analysis/__init__.py @@ -0,0 +1,11 @@ +import sys +import warnings + +from pyemma.util._ext.shimmodule import ShimModule, ShimWarning + +warnings.warn("The pyemma.msm.analysis module has been deprecated. " + "You should import msmtools.analysis now.", ShimWarning) + +sys.modules['pyemma.msm.analysis'] = ShimModule(src='pyemma.msm.analysis', mirror='msmtools.analysis') + +from msmtools.analysis import * diff --git a/pyemma/msm/dtraj/__init__.py b/pyemma/msm/dtraj/__init__.py new file mode 100644 index 000000000..4404db1f9 --- /dev/null +++ b/pyemma/msm/dtraj/__init__.py @@ -0,0 +1,12 @@ +import sys +import warnings + +from pyemma.util._ext.shimmodule import ShimModule, ShimWarning + +warnings.warn("The pyemma.msm.dtraj module has been deprecated. " + "You should import msmtools.dtraj now.", ShimWarning) + +sys.modules['pyemma.msm.dtraj'] = ShimModule(src='pyemma.msm.dtraj', mirror='msmtools.dtraj') +sys.modules['pyemma.msm.io'] = sys.modules['pyemma.msm.dtraj'] + +from msmtools.dtraj import * diff --git a/pyemma/msm/estimation/__init__.py b/pyemma/msm/estimation/__init__.py new file mode 100644 index 000000000..86f3d98d3 --- /dev/null +++ b/pyemma/msm/estimation/__init__.py @@ -0,0 +1,11 @@ +import sys +import warnings + +from pyemma.util._ext.shimmodule import ShimModule, ShimWarning + +warnings.warn("The pyemma.msm.estimation module has been deprecated. " + "You should import msmtools.estimation now.", ShimWarning) + +sys.modules['pyemma.msm.estimation'] = ShimModule(src='pyemma.msm.estimation', mirror='msmtools.estimation') + +from msmtools.estimation import * diff --git a/pyemma/msm/flux/__init__.py b/pyemma/msm/flux/__init__.py new file mode 100644 index 000000000..c6e1220b3 --- /dev/null +++ b/pyemma/msm/flux/__init__.py @@ -0,0 +1,11 @@ +import sys +import warnings + +from pyemma.util._ext.shimmodule import ShimModule, ShimWarning + +warnings.warn("The pyemma.msm.flux module has been deprecated. " + "You should import msmtools.flux now.", ShimWarning) + +sys.modules['pyemma.msm.flux'] = ShimModule(src='pyemma.msm.flux', mirror='msmtools.flux') + +from msmtools.flux import * diff --git a/pyemma/msm/generation/__init__.py b/pyemma/msm/generation/__init__.py new file mode 100644 index 000000000..d158633a7 --- /dev/null +++ b/pyemma/msm/generation/__init__.py @@ -0,0 +1,11 @@ +import sys +import warnings + +from pyemma.util._ext.shimmodule import ShimModule, ShimWarning + +warnings.warn("The pyemma.msm.generation module has been deprecated. " + "You should import msmtools.generation now.", ShimWarning) + +sys.modules['pyemma.msm.generation'] = ShimModule(src='pyemma.msm.generation', mirror='msmtools.generation') + +from msmtools.generation import * diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py new file mode 100644 index 000000000..98b50c3fa --- /dev/null +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -0,0 +1,96 @@ +import unittest +import warnings +import pyemma + + +class TestMSMSimple(unittest.TestCase): + + def test_analysis(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import analysis + analysis.is_transition_matrix + + self.assertEqual(len(cm), 1) + self.assertIn('analysis', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.analysis.is_transition_matrix + self.assertEqual(len(cm), 1) + self.assertIn('analysis', cm[0].message.args[0]) + + def test_estimation(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import estimation + estimation.count_matrix + + self.assertEqual(len(cm), 1) + self.assertIn('estimation', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.estimation.count_matrix + self.assertEqual(len(cm), 1) + self.assertIn('estimation', cm[0].message.args[0]) + + def test_generation(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import generation + generation.generate_traj + + self.assertEqual(len(cm), 1) + self.assertIn('generation', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.generation.generate_traj + self.assertEqual(len(cm), 1) + self.assertIn('generation', cm[0].message.args[0]) + + def test_dtraj(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import dtraj + dtraj.load_discrete_trajectory + + self.assertEqual(len(cm), 1) + self.assertIn('dtraj', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.dtraj.load_discrete_trajectory + self.assertEqual(len(cm), 1) + self.assertIn('dtraj', cm[0].message.args[0]) + + def test_io(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import io as dtraj + dtraj.load_discrete_trajectory + + self.assertEqual(len(cm), 1) + self.assertIn('dtraj', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.dtraj.load_discrete_trajectory + self.assertEqual(len(cm), 1) + self.assertIn('dtraj', cm[0].message.args[0]) + + def test_flux(self): + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + from pyemma.msm import flux + flux.total_flux + + self.assertEqual(len(cm), 1) + self.assertIn('flux', cm[0].message.args[0]) + + with warnings.catch_warnings(record=True) as cm: + warnings.simplefilter("always") + pyemma.msm.flux.total_flux + self.assertEqual(len(cm), 1) + self.assertIn('flux', cm[0].message.args[0]) diff --git a/pyemma/util/_ext/__init__.py b/pyemma/util/_ext/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pyemma/util/_ext/shimmodule.py b/pyemma/util/_ext/shimmodule.py new file mode 100644 index 000000000..8c2c8b33a --- /dev/null +++ b/pyemma/util/_ext/shimmodule.py @@ -0,0 +1,132 @@ +"""A shim module for deprecated imports +""" +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import sys +import types +import warnings + + +def import_item(name): + """Import and return ``bar`` given the string ``foo.bar``. + Calling ``bar = import_item("foo.bar")`` is the functional equivalent of + executing the code ``from foo import bar``. + Parameters + ---------- + name : string + The fully qualified name of the module/package being imported. + Returns + ------- + mod : module object + The module that was imported. + """ + + parts = name.rsplit('.', 1) + if len(parts) == 2: + # called with 'foo.bar....' + package, obj = parts + module = __import__(package, fromlist=[obj]) + try: + pak = getattr(module, obj) + except AttributeError: + raise ImportError('No module named %s' % obj) + return pak + else: + # called with un-dotted string + return __import__(parts[0]) + + +class ShimWarning(Warning): + """A warning to show when a module has moved, and a shim is in its place.""" + + +class ShimImporter(object): + """Import hook for a shim. + + This ensures that submodule imports return the real target module, + not a clone that will confuse `is` and `isinstance` checks. + """ + + def __init__(self, src, mirror): + self.src = src + self.mirror = mirror + + def _mirror_name(self, fullname): + """get the name of the mirrored module""" + + return self.mirror + fullname[len(self.src):] + + def find_module(self, fullname, path=None): + """Return self if we should be used to import the module.""" + if fullname.startswith(self.src + '.'): + mirror_name = self._mirror_name(fullname) + try: + mod = import_item(mirror_name) + except ImportError: + return + else: + if not isinstance(mod, types.ModuleType): + # not a module + return None + return self + + def load_module(self, fullname): + """Import the mirrored module, and insert it into sys.modules""" + mirror_name = self._mirror_name(fullname) + mod = import_item(mirror_name) + sys.modules[fullname] = mod + return mod + + +class ShimModule(types.ModuleType): + def __init__(self, *args, **kwargs): + self._mirror = kwargs.pop("mirror") + src = kwargs.pop("src", None) + if src: + kwargs['name'] = src.rsplit('.', 1)[-1] + super(ShimModule, self).__init__(*args, **kwargs) + # add import hook for descendent modules + if src: + sys.meta_path.append( + ShimImporter(src=src, mirror=self._mirror) + ) + self.msg = kwargs.pop("msg", None) + self.default_msg = "Access to a moved module '%s' detected!" \ + " Please use '%s' in the future." % (src, self._mirror) + + @property + def __path__(self): + return [] + + @property + def __spec__(self): + """Don't produce __spec__ until requested""" + return __import__(self._mirror).__spec__ + + def __dir__(self): + self._warn() + return dir(__import__(self._mirror)) + + @property + def __all__(self): + """Ensure __all__ is always defined""" + mod = __import__(self._mirror) + #self._warn() + try: + return mod.__all__ + except AttributeError: + return [name for name in dir(mod) if not name.startswith('_')] + + def __getattr__(self, key): + # Use the equivalent of import_item(name), see below + name = "%s.%s" % (self._mirror, key) + try: + item = import_item(name) + self._warn() + return item + except ImportError: + raise AttributeError(key) + + def _warn(self): + warnings.warn(self.msg if self.msg else self.default_msg, ShimWarning) From 7f3ee841bea54466aae2a88dfab3c9d179d77d2f Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 19:17:28 +0200 Subject: [PATCH 02/14] remove io->dtraj alias (has already been deprecated ages ago) --- pyemma/msm/dtraj/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyemma/msm/dtraj/__init__.py b/pyemma/msm/dtraj/__init__.py index 4404db1f9..f6b368221 100644 --- a/pyemma/msm/dtraj/__init__.py +++ b/pyemma/msm/dtraj/__init__.py @@ -7,6 +7,6 @@ "You should import msmtools.dtraj now.", ShimWarning) sys.modules['pyemma.msm.dtraj'] = ShimModule(src='pyemma.msm.dtraj', mirror='msmtools.dtraj') -sys.modules['pyemma.msm.io'] = sys.modules['pyemma.msm.dtraj'] +#sys.modules['pyemma.msm.io'] = sys.modules['pyemma.msm.dtraj'] from msmtools.dtraj import * From ce234b92803875d7c7ba70b89d30005d48220eb5 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 19:33:19 +0200 Subject: [PATCH 03/14] assert warn method has been called --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index 98b50c3fa..8f960f002 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -1,5 +1,9 @@ import unittest import warnings + +import mock +import sys + import pyemma @@ -20,6 +24,14 @@ def test_analysis(self): self.assertEqual(len(cm), 1) self.assertIn('analysis', cm[0].message.args[0]) + def test_warn_was_called(self): + shim_mod = sys.modules['pyemma.msm.analysis'] + with mock.patch.object(shim_mod, '_warn') as m: + from pyemma.msm import analysis + analysis.is_transition_matrix + + m.assert_called_once() + def test_estimation(self): with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") From d443e17febc22bbbfa08ad8473fcdec99bc309bb Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 19:35:04 +0200 Subject: [PATCH 04/14] log filters --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index 8f960f002..123168f1e 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -8,6 +8,9 @@ class TestMSMSimple(unittest.TestCase): + def setUpClass(cls): + import logging + logging.getLogger('pyemma').info("warning filters: %s" % warnings.filters) def test_analysis(self): with warnings.catch_warnings(record=True) as cm: From 84a3038928d5eca8e932559d0b7a183d5bea785d Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 20:10:42 +0200 Subject: [PATCH 05/14] f --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index 123168f1e..bdf334c60 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -8,6 +8,8 @@ class TestMSMSimple(unittest.TestCase): + + @classmethod def setUpClass(cls): import logging logging.getLogger('pyemma').info("warning filters: %s" % warnings.filters) From 62ffcebb178f82bed3f49f0ecef1d0a6b5831a4f Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 20:36:12 +0200 Subject: [PATCH 06/14] reset filters completely for test... --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index bdf334c60..68cbe7272 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -11,8 +11,11 @@ class TestMSMSimple(unittest.TestCase): @classmethod def setUpClass(cls): - import logging - logging.getLogger('pyemma').info("warning filters: %s" % warnings.filters) + cls.old_filters = warnings.filters[:] + + @classmethod + def tearDownClass(cls): + warnings.filters = cls.old_filters def test_analysis(self): with warnings.catch_warnings(record=True) as cm: From 6ba81d14e2acf0c1cb76e15efe965ba1550deb78 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 20:48:33 +0200 Subject: [PATCH 07/14] reset filters on py2 --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index 68cbe7272..ee72f088f 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -12,6 +12,8 @@ class TestMSMSimple(unittest.TestCase): @classmethod def setUpClass(cls): cls.old_filters = warnings.filters[:] + if sys.version_info.major == 2: + warnings.filters = [] @classmethod def tearDownClass(cls): From e4b0d3f308800102fec3ceee2f0fc88e95ea695c Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 21:16:24 +0200 Subject: [PATCH 08/14] fix #806 --- pyemma/util/_ext/shimmodule.py | 6 ++++-- pyemma/util/annotators.py | 4 +++- pyemma/util/exceptions.py | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pyemma/util/_ext/shimmodule.py b/pyemma/util/_ext/shimmodule.py index 8c2c8b33a..293b149c7 100644 --- a/pyemma/util/_ext/shimmodule.py +++ b/pyemma/util/_ext/shimmodule.py @@ -102,6 +102,7 @@ def __path__(self): @property def __spec__(self): """Don't produce __spec__ until requested""" + self._warn() return __import__(self._mirror).__spec__ def __dir__(self): @@ -111,8 +112,8 @@ def __dir__(self): @property def __all__(self): """Ensure __all__ is always defined""" + self._warn() mod = __import__(self._mirror) - #self._warn() try: return mod.__all__ except AttributeError: @@ -129,4 +130,5 @@ def __getattr__(self, key): raise AttributeError(key) def _warn(self): - warnings.warn(self.msg if self.msg else self.default_msg, ShimWarning) + from pyemma.util.exceptions import PyEMMA_DeprecationWarning + warnings.warn(self.msg if self.msg else self.default_msg, PyEMMA_DeprecationWarning) diff --git a/pyemma/util/annotators.py b/pyemma/util/annotators.py index c61abacc6..7a1731871 100644 --- a/pyemma/util/annotators.py +++ b/pyemma/util/annotators.py @@ -39,6 +39,8 @@ def foo(self): from decorator import decorator, decorate from inspect import stack +from pyemma.util.exceptions import PyEMMA_DeprecationWarning + __all__ = ['alias', 'aliased', 'deprecated', @@ -213,7 +215,7 @@ def _deprecated(func, *args, **kw): warnings.warn_explicit( user_msg, - category=DeprecationWarning, + category=PyEMMA_DeprecationWarning, filename=filename, lineno=lineno ) diff --git a/pyemma/util/exceptions.py b/pyemma/util/exceptions.py index 7003d46f3..827a178bd 100644 --- a/pyemma/util/exceptions.py +++ b/pyemma/util/exceptions.py @@ -65,3 +65,8 @@ class ParserWarning(UserWarning): class ConfigDirectoryException(Exception): """ Some operation with PyEMMAs configuration directory went wrong. """ pass + + +class PyEMMA_DeprecationWarning(UserWarning): + """You are using a feature, which will be removed in a future release. You have been warned!""" + pass \ No newline at end of file From 0066abcce5ca8bbcd0a3ad5f264eceac1b1218a4 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 22:06:29 +0200 Subject: [PATCH 09/14] handle category correctly --- pyemma/msm/__init__.py | 6 +++--- pyemma/util/_ext/shimmodule.py | 7 ++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/pyemma/msm/__init__.py b/pyemma/msm/__init__.py index 20a9bafc6..c4029e1e1 100644 --- a/pyemma/msm/__init__.py +++ b/pyemma/msm/__init__.py @@ -91,12 +91,12 @@ # backward compatibility to PyEMMA 1.2.x # TODO: finally remove this stuff... import warnings as _warnings -from pyemma.util._ext.shimmodule import ShimWarning as _ShimWarning +from pyemma.util.exceptions import PyEMMA_DeprecationWarning as _dep_warning with _warnings.catch_warnings(): - _warnings.filterwarnings('ignore', category=_ShimWarning) + _warnings.filterwarnings('ignore', category=_dep_warning) from . import analysis, estimation, generation, dtraj, flux io = dtraj -del _warnings, _ShimWarning +del _warnings, _dep_warning ###################################################### from msmtools.analysis.dense.pcca import PCCA diff --git a/pyemma/util/_ext/shimmodule.py b/pyemma/util/_ext/shimmodule.py index 293b149c7..cfbcd7807 100644 --- a/pyemma/util/_ext/shimmodule.py +++ b/pyemma/util/_ext/shimmodule.py @@ -37,10 +37,6 @@ def import_item(name): return __import__(parts[0]) -class ShimWarning(Warning): - """A warning to show when a module has moved, and a shim is in its place.""" - - class ShimImporter(object): """Import hook for a shim. @@ -131,4 +127,5 @@ def __getattr__(self, key): def _warn(self): from pyemma.util.exceptions import PyEMMA_DeprecationWarning - warnings.warn(self.msg if self.msg else self.default_msg, PyEMMA_DeprecationWarning) + warnings.warn(self.msg if self.msg else self.default_msg, + category=PyEMMA_DeprecationWarning) From cdfb8f828880baa892349c01b283ffffb4f29c23 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 22:09:21 +0200 Subject: [PATCH 10/14] test type of warning --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index ee72f088f..92dd58741 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -5,6 +5,7 @@ import sys import pyemma +from pyemma.util.exceptions import PyEMMA_DeprecationWarning class TestMSMSimple(unittest.TestCase): @@ -26,12 +27,15 @@ def test_analysis(self): analysis.is_transition_matrix self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('analysis', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.analysis.is_transition_matrix self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assert self.assertIn('analysis', cm[0].message.args[0]) def test_warn_was_called(self): @@ -49,12 +53,14 @@ def test_estimation(self): estimation.count_matrix self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('estimation', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.estimation.count_matrix self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('estimation', cm[0].message.args[0]) def test_generation(self): @@ -64,12 +70,14 @@ def test_generation(self): generation.generate_traj self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('generation', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.generation.generate_traj self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('generation', cm[0].message.args[0]) def test_dtraj(self): @@ -79,12 +87,14 @@ def test_dtraj(self): dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('dtraj', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('dtraj', cm[0].message.args[0]) def test_io(self): @@ -94,12 +104,14 @@ def test_io(self): dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('dtraj', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('dtraj', cm[0].message.args[0]) def test_flux(self): @@ -109,10 +121,12 @@ def test_flux(self): flux.total_flux self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('flux', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.flux.total_flux self.assertEqual(len(cm), 1) + self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('flux', cm[0].message.args[0]) From 0629fede2dd919175b611ff212905c6e1d5e7e49 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 22:12:12 +0200 Subject: [PATCH 11/14] fix imp --- pyemma/msm/analysis/__init__.py | 5 +++-- pyemma/msm/dtraj/__init__.py | 6 +++--- pyemma/msm/estimation/__init__.py | 6 +++--- pyemma/msm/flux/__init__.py | 6 +++--- pyemma/msm/generation/__init__.py | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/pyemma/msm/analysis/__init__.py b/pyemma/msm/analysis/__init__.py index 54f5f8d65..beb9a67e2 100644 --- a/pyemma/msm/analysis/__init__.py +++ b/pyemma/msm/analysis/__init__.py @@ -1,10 +1,11 @@ import sys import warnings -from pyemma.util._ext.shimmodule import ShimModule, ShimWarning +from pyemma.util._ext.shimmodule import ShimModule +from pyemma.util.exceptions import PyEMMA_DeprecationWarning warnings.warn("The pyemma.msm.analysis module has been deprecated. " - "You should import msmtools.analysis now.", ShimWarning) + "You should import msmtools.analysis now.", PyEMMA_DeprecationWarning) sys.modules['pyemma.msm.analysis'] = ShimModule(src='pyemma.msm.analysis', mirror='msmtools.analysis') diff --git a/pyemma/msm/dtraj/__init__.py b/pyemma/msm/dtraj/__init__.py index f6b368221..e0749b29d 100644 --- a/pyemma/msm/dtraj/__init__.py +++ b/pyemma/msm/dtraj/__init__.py @@ -1,12 +1,12 @@ import sys import warnings -from pyemma.util._ext.shimmodule import ShimModule, ShimWarning +from pyemma.util._ext.shimmodule import ShimModule +from pyemma.util.exceptions import PyEMMA_DeprecationWarning warnings.warn("The pyemma.msm.dtraj module has been deprecated. " - "You should import msmtools.dtraj now.", ShimWarning) + "You should import msmtools.dtraj now.", PyEMMA_DeprecationWarning) sys.modules['pyemma.msm.dtraj'] = ShimModule(src='pyemma.msm.dtraj', mirror='msmtools.dtraj') #sys.modules['pyemma.msm.io'] = sys.modules['pyemma.msm.dtraj'] -from msmtools.dtraj import * diff --git a/pyemma/msm/estimation/__init__.py b/pyemma/msm/estimation/__init__.py index 86f3d98d3..5678c6c8a 100644 --- a/pyemma/msm/estimation/__init__.py +++ b/pyemma/msm/estimation/__init__.py @@ -1,11 +1,11 @@ import sys import warnings -from pyemma.util._ext.shimmodule import ShimModule, ShimWarning +from pyemma.util._ext.shimmodule import ShimModule +from pyemma.util.exceptions import PyEMMA_DeprecationWarning warnings.warn("The pyemma.msm.estimation module has been deprecated. " - "You should import msmtools.estimation now.", ShimWarning) + "You should import msmtools.estimation now.", PyEMMA_DeprecationWarning) sys.modules['pyemma.msm.estimation'] = ShimModule(src='pyemma.msm.estimation', mirror='msmtools.estimation') -from msmtools.estimation import * diff --git a/pyemma/msm/flux/__init__.py b/pyemma/msm/flux/__init__.py index c6e1220b3..55242a054 100644 --- a/pyemma/msm/flux/__init__.py +++ b/pyemma/msm/flux/__init__.py @@ -1,11 +1,11 @@ import sys import warnings -from pyemma.util._ext.shimmodule import ShimModule, ShimWarning +from pyemma.util._ext.shimmodule import ShimModule +from pyemma.util.exceptions import PyEMMA_DeprecationWarning warnings.warn("The pyemma.msm.flux module has been deprecated. " - "You should import msmtools.flux now.", ShimWarning) + "You should import msmtools.flux now.", PyEMMA_DeprecationWarning) sys.modules['pyemma.msm.flux'] = ShimModule(src='pyemma.msm.flux', mirror='msmtools.flux') -from msmtools.flux import * diff --git a/pyemma/msm/generation/__init__.py b/pyemma/msm/generation/__init__.py index d158633a7..f8554be10 100644 --- a/pyemma/msm/generation/__init__.py +++ b/pyemma/msm/generation/__init__.py @@ -1,11 +1,11 @@ import sys import warnings -from pyemma.util._ext.shimmodule import ShimModule, ShimWarning +from pyemma.util._ext.shimmodule import ShimModule +from pyemma.util.exceptions import PyEMMA_DeprecationWarning warnings.warn("The pyemma.msm.generation module has been deprecated. " - "You should import msmtools.generation now.", ShimWarning) + "You should import msmtools.generation now.", PyEMMA_DeprecationWarning) sys.modules['pyemma.msm.generation'] = ShimModule(src='pyemma.msm.generation', mirror='msmtools.generation') -from msmtools.generation import * From 8627e5b424eb7c15ebf6cd850767b185866234c3 Mon Sep 17 00:00:00 2001 From: marscher Date: Tue, 17 May 2016 22:42:56 +0200 Subject: [PATCH 12/14] f --- .../tests/test_msm_lowlevel_deprecation.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index 92dd58741..cae09afb1 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -27,17 +27,16 @@ def test_analysis(self): analysis.is_transition_matrix self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) self.assertIn('analysis', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.analysis.is_transition_matrix self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) - self.assert + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) self.assertIn('analysis', cm[0].message.args[0]) + @unittest.skipIf(sys.version_info.major == 2, "not on py2") def test_warn_was_called(self): shim_mod = sys.modules['pyemma.msm.analysis'] with mock.patch.object(shim_mod, '_warn') as m: @@ -53,14 +52,16 @@ def test_estimation(self): estimation.count_matrix self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('estimation', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.estimation.count_matrix self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('estimation', cm[0].message.args[0]) def test_generation(self): @@ -70,14 +71,16 @@ def test_generation(self): generation.generate_traj self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('generation', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.generation.generate_traj self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('generation', cm[0].message.args[0]) def test_dtraj(self): @@ -87,14 +90,16 @@ def test_dtraj(self): dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('dtraj', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('dtraj', cm[0].message.args[0]) def test_io(self): @@ -104,14 +109,16 @@ def test_io(self): dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('dtraj', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.dtraj.load_discrete_trajectory self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('dtraj', cm[0].message.args[0]) def test_flux(self): @@ -121,12 +128,14 @@ def test_flux(self): flux.total_flux self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('flux', cm[0].message.args[0]) with warnings.catch_warnings(record=True) as cm: warnings.simplefilter("always") pyemma.msm.flux.total_flux self.assertEqual(len(cm), 1) - self.assertTrue(isinstance(cm[0], PyEMMA_DeprecationWarning)) + self.assertIsInstance(cm[0].message, PyEMMA_DeprecationWarning) + self.assertIn('flux', cm[0].message.args[0]) From 005532ea73524c0c1489b80a1bb2c5faf1072f13 Mon Sep 17 00:00:00 2001 From: marscher Date: Wed, 18 May 2016 02:33:09 +0200 Subject: [PATCH 13/14] disable tests for py2 --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index cae09afb1..d9819d0f4 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -1,14 +1,15 @@ +import sys import unittest import warnings import mock -import sys import pyemma from pyemma.util.exceptions import PyEMMA_DeprecationWarning -class TestMSMSimple(unittest.TestCase): + +class TestShowDeprecationWarningOnLowLevelAPIUsage(unittest.TestCase): @classmethod def setUpClass(cls): From 98b47bc89214f61d822daa93591bbe752e90054d Mon Sep 17 00:00:00 2001 From: Martin Scherer Date: Wed, 18 May 2016 04:23:58 +0200 Subject: [PATCH 14/14] f --- pyemma/msm/tests/test_msm_lowlevel_deprecation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py index d9819d0f4..e674a7b77 100644 --- a/pyemma/msm/tests/test_msm_lowlevel_deprecation.py +++ b/pyemma/msm/tests/test_msm_lowlevel_deprecation.py @@ -8,7 +8,7 @@ from pyemma.util.exceptions import PyEMMA_DeprecationWarning - +@unittest.skipIf(sys.version_info.major == 2, "disabled on py2 for nosetest stupidness") class TestShowDeprecationWarningOnLowLevelAPIUsage(unittest.TestCase): @classmethod