Skip to content

Commit f801805

Browse files
thomasjpfanNicolasHug
authored andcommitted
MNT Simplify module deprecation procedures with automatic tests (scikit-learn#15294)
1 parent 5e7e631 commit f801805

File tree

3 files changed

+61
-72
lines changed

3 files changed

+61
-72
lines changed

conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,4 @@ def pytest_runtest_teardown(item, nextitem):
104104
# Configures pytest to ignore deprecated modules.
105105
collect_ignore_glob = [
106106
os.path.join(*deprecated_path.split(".")) + ".py"
107-
for _, deprecated_path, _ in _DEPRECATED_MODULES]
107+
for _, deprecated_path, _, _ in _DEPRECATED_MODULES]

sklearn/_build_utils/deprecated_modules.py

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,63 @@
55

66
# TODO: Remove the whole file in 0.24
77

8-
# This is a set of 3-tuples consisting of
9-
# (new_module_name, deprecated_path, correct_import_path)
10-
_DEPRECATED_MODULES = {
11-
('_mocking', 'sklearn.utils.mocking', 'sklearn.utils'),
12-
13-
('_bagging', 'sklearn.ensemble.bagging', 'sklearn.ensemble'),
14-
('_base', 'sklearn.ensemble.base', 'sklearn.ensemble'),
15-
('_forest', 'sklearn.ensemble.forest', 'sklearn.ensemble'),
16-
('_gb', 'sklearn.ensemble.gradient_boosting', 'sklearn.ensemble'),
17-
('_iforest', 'sklearn.ensemble.iforest', 'sklearn.ensemble'),
18-
('_voting', 'sklearn.ensemble.voting', 'sklearn.ensemble'),
19-
('_weight_boosting', 'sklearn.ensemble.weight_boosting', 'sklearn.ensemble'),
20-
('_classes', 'sklearn.tree.tree', 'sklearn.tree'),
21-
('_export', 'sklearn.tree.export', 'sklearn.tree'),
22-
23-
('_rbm', 'sklearn.neural_network.rbm', 'sklearn.neural_network'),
24-
('_multilayer_perceptron',
25-
'sklearn.neural_network.multilayer_perceptron', 'sklearn.neural_network'),
26-
27-
('_weight_vector', 'sklearn.utils.weight_vector', 'sklearn.utils'),
28-
('_seq_dataset', 'sklearn.utils.seq_dataset', 'sklearn.utils'),
29-
('_fast_dict', 'sklearn.utils.fast_dict', 'sklearn.utils'),
8+
# This is a set of 4-tuples consisting of
9+
# (new_module_name, deprecated_path, correct_import_path, importee)
10+
# importee is used by test_import_deprecations to check for DeprecationWarnings
11+
_DEPRECATED_MODULES = [
12+
('_mocking', 'sklearn.utils.mocking', 'sklearn.utils',
13+
'MockDataFrame'),
14+
15+
('_bagging', 'sklearn.ensemble.bagging', 'sklearn.ensemble',
16+
'BaggingClassifier'),
17+
('_base', 'sklearn.ensemble.base', 'sklearn.ensemble',
18+
'BaseEnsemble'),
19+
('_forest', 'sklearn.ensemble.forest', 'sklearn.ensemble',
20+
'RandomForestClassifier'),
21+
('_gb', 'sklearn.ensemble.gradient_boosting', 'sklearn.ensemble',
22+
'GradientBoostingClassifier'),
23+
('_iforest', 'sklearn.ensemble.iforest', 'sklearn.ensemble',
24+
'IsolationForest'),
25+
('_voting', 'sklearn.ensemble.voting', 'sklearn.ensemble',
26+
'VotingClassifier'),
27+
('_weight_boosting', 'sklearn.ensemble.weight_boosting',
28+
'sklearn.ensemble', 'AdaBoostClassifier'),
29+
('_classes', 'sklearn.tree.tree', 'sklearn.tree',
30+
'DecisionTreeClassifier'),
31+
('_export', 'sklearn.tree.export', 'sklearn.tree', 'export_graphviz'),
32+
33+
('_rbm', 'sklearn.neural_network.rbm', 'sklearn.neural_network',
34+
'BernoulliRBM'),
35+
('_multilayer_perceptron', 'sklearn.neural_network.multilayer_perceptron',
36+
'sklearn.neural_network', 'MLPClassifier'),
37+
38+
('_weight_vector', 'sklearn.utils.weight_vector', 'sklearn.utils',
39+
'WeightVector'),
40+
('_seq_dataset', 'sklearn.utils.seq_dataset', 'sklearn.utils',
41+
'ArrayDataset32'),
42+
('_fast_dict', 'sklearn.utils.fast_dict', 'sklearn.utils', 'IntFloatDict'),
3043

3144
('_affinity_propagation', 'sklearn.cluster.affinity_propagation_',
32-
'sklearn.cluster'),
33-
('_bicluster', 'sklearn.cluster.bicluster', 'sklearn.cluster'),
34-
('_birch', 'sklearn.cluster.birch', 'sklearn.cluster'),
35-
('_dbscan', 'sklearn.cluster.dbscan_', 'sklearn.cluster'),
36-
('_hierarchical', 'sklearn.cluster.hierarchical', 'sklearn.cluster'),
37-
('_k_means', 'sklearn.cluster.k_means_', 'sklearn.cluster'),
38-
('_mean_shift', 'sklearn.cluster.mean_shift_', 'sklearn.cluster'),
39-
('_optics', 'sklearn.cluster.optics_', 'sklearn.cluster'),
40-
('_spectral', 'sklearn.cluster.spectral', 'sklearn.cluster'),
41-
42-
('_base', 'sklearn.mixture.base', 'sklearn.mixture'),
45+
'sklearn.cluster', 'AffinityPropagation'),
46+
('_bicluster', 'sklearn.cluster.bicluster', 'sklearn.cluster',
47+
'SpectralBiclustering'),
48+
('_birch', 'sklearn.cluster.birch', 'sklearn.cluster', 'Birch'),
49+
('_dbscan', 'sklearn.cluster.dbscan_', 'sklearn.cluster', 'DBSCAN'),
50+
('_hierarchical', 'sklearn.cluster.hierarchical', 'sklearn.cluster',
51+
'FeatureAgglomeration'),
52+
('_k_means', 'sklearn.cluster.k_means_', 'sklearn.cluster', 'KMeans'),
53+
('_mean_shift', 'sklearn.cluster.mean_shift_', 'sklearn.cluster',
54+
'MeanShift'),
55+
('_optics', 'sklearn.cluster.optics_', 'sklearn.cluster', 'OPTICS'),
56+
('_spectral', 'sklearn.cluster.spectral', 'sklearn.cluster',
57+
'SpectralClustering'),
58+
59+
('_base', 'sklearn.mixture.base', 'sklearn.mixture', 'BaseMixture'),
4360
('_gaussian_mixture', 'sklearn.mixture.gaussian_mixture',
44-
'sklearn.mixture'),
61+
'sklearn.mixture', 'GaussianMixture'),
4562
('_bayesian_mixture', 'sklearn.mixture.bayesian_mixture',
46-
'sklearn.mixture'),
47-
}
63+
'sklearn.mixture', 'BayesianGaussianMixture'),
64+
]
4865

4966
_FILE_CONTENT_TEMPLATE = """
5067
# THIS FILE WAS AUTOMATICALLY GENERATED BY deprecated_modules.py
@@ -71,7 +88,7 @@ def _create_deprecated_modules_files():
7188
deprecation warning will be raised.
7289
"""
7390
for (new_module_name, deprecated_path,
74-
correct_import_path) in _DEPRECATED_MODULES:
91+
correct_import_path, _) in _DEPRECATED_MODULES:
7592
relative_dots = deprecated_path.count(".") * "."
7693
deprecated_content = _FILE_CONTENT_TEMPLATE.format(
7794
new_module_name=new_module_name,
@@ -85,7 +102,7 @@ def _create_deprecated_modules_files():
85102

86103
def _clean_deprecated_modules_files():
87104
"""Removes submodules created by _create_deprecated_modules_files."""
88-
for (_, deprecated_path, _) in _DEPRECATED_MODULES:
105+
for _, deprecated_path, _, _ in _DEPRECATED_MODULES:
89106
with suppress(FileNotFoundError):
90107
_get_deprecated_path(deprecated_path).unlink()
91108

sklearn/tests/test_import_deprecations.py

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,19 @@
33
import pytest
44

55
from sklearn.utils.testing import assert_run_python_script
6+
from sklearn._build_utils.deprecated_modules import _DEPRECATED_MODULES
67

78

89
# We are deprecating importing anything that isn't in an __init__ file and
910
# remaming most file.py into _file.py.
1011
# This test makes sure imports are still possible but deprecated, with the
1112
# appropriate error message.
1213

13-
@pytest.mark.parametrize('deprecated_path, importee', (
14-
('sklearn.tree.tree', 'DecisionTreeClassifier'),
15-
('sklearn.tree.export', 'export_graphviz'),
1614

17-
('sklearn.ensemble.base', 'BaseEnsemble'),
18-
('sklearn.ensemble.forest', 'RandomForestClassifier'),
19-
('sklearn.ensemble.bagging', 'BaggingClassifier'),
20-
('sklearn.ensemble.iforest', 'IsolationForest'),
21-
('sklearn.ensemble.weight_boosting', 'AdaBoostClassifier'),
22-
('sklearn.ensemble.gradient_boosting', 'GradientBoostingClassifier'),
23-
('sklearn.ensemble.voting', 'VotingClassifier'),
24-
25-
('sklearn.neural_network.rbm', 'BernoulliRBM'),
26-
('sklearn.neural_network.multilayer_perceptron', 'MLPClassifier'),
27-
28-
('sklearn.utils.mocking', 'MockDataFrame'),
29-
('sklearn.utils.weight_vector', 'WeightVector'),
30-
('sklearn.utils.seq_dataset', 'ArrayDataset32'),
31-
('sklearn.utils.fast_dict', 'IntFloatDict'),
32-
33-
('sklearn.cluster.affinity_propagation_', 'AffinityPropagation'),
34-
('sklearn.cluster.bicluster', 'SpectralBiclustering'),
35-
('sklearn.cluster.birch', 'Birch'),
36-
('sklearn.cluster.dbscan_', 'DBSCAN'),
37-
('sklearn.cluster.hierarchical', 'FeatureAgglomeration'),
38-
('sklearn.cluster.k_means_', 'KMeans'),
39-
('sklearn.cluster.mean_shift_', 'MeanShift'),
40-
('sklearn.cluster.optics_', 'OPTICS'),
41-
('sklearn.cluster.spectral', 'SpectralClustering'),
42-
43-
('sklearn.mixture.base', 'BaseMixture'),
44-
('sklearn.mixture.bayesian_mixture', 'BayesianGaussianMixture'),
45-
('sklearn.mixture.gaussian_mixture', 'GaussianMixture'),
46-
))
15+
@pytest.mark.parametrize('deprecated_path, importee', [
16+
(deprecated_path, importee)
17+
for _, deprecated_path, _, importee in _DEPRECATED_MODULES
18+
])
4719
def test_import_is_deprecated(deprecated_path, importee):
4820
# Make sure that "from deprecated_path import importee" is still possible
4921
# but raises a warning

0 commit comments

Comments
 (0)