Skip to content

Commit ea41a78

Browse files
lestevejnothman
authored andcommitted
CI Make it possible to run doctests in .rst files with pytest (#9697)
* doc/datasets/conftest.py to implement the equivalent of nose fixtures * add conftest.py in root folder to ensure that sklearn local folder is used rather than the package in site-packages * test doc with pytest in Travis * move custom_data_home definition from nose fixture to .rst file
1 parent 8b64844 commit ea41a78

File tree

5 files changed

+92
-19
lines changed

5 files changed

+92
-19
lines changed

build_tools/travis/test_script.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@ run_tests() {
4343
fi
4444
$TEST_CMD sklearn
4545

46-
# Test doc (only with nose until we switch completely to pytest)
47-
if [[ "$USE_PYTEST" != "true" ]]; then
48-
# Going back to git checkout folder needed for make test-doc
49-
cd $OLDPWD
46+
# Going back to git checkout folder needed to test documentation
47+
cd $OLDPWD
48+
49+
if [[ "$USE_PYTEST" == "true" ]]; then
50+
pytest $(find doc -name '*.rst' | sort)
51+
else
52+
# Makefile is using nose
5053
make test-doc
5154
fi
5255
}

conftest.py

Whitespace-only changes.

doc/datasets/conftest.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from os.path import exists
2+
from os.path import join
3+
4+
import numpy as np
5+
6+
from sklearn.utils.testing import SkipTest
7+
from sklearn.utils.testing import check_skip_network
8+
from sklearn.datasets import get_data_home
9+
from sklearn.utils.testing import install_mldata_mock
10+
from sklearn.utils.testing import uninstall_mldata_mock
11+
12+
13+
def setup_labeled_faces():
14+
data_home = get_data_home()
15+
if not exists(join(data_home, 'lfw_home')):
16+
raise SkipTest("Skipping dataset loading doctests")
17+
18+
19+
def setup_mldata():
20+
# setup mock urllib2 module to avoid downloading from mldata.org
21+
install_mldata_mock({
22+
'mnist-original': {
23+
'data': np.empty((70000, 784)),
24+
'label': np.repeat(np.arange(10, dtype='d'), 7000),
25+
},
26+
'iris': {
27+
'data': np.empty((150, 4)),
28+
},
29+
'datasets-uci-iris': {
30+
'double0': np.empty((150, 4)),
31+
'class': np.empty((150,)),
32+
},
33+
})
34+
35+
36+
def teardown_mldata():
37+
uninstall_mldata_mock()
38+
39+
40+
def setup_rcv1():
41+
check_skip_network()
42+
# skip the test in rcv1.rst if the dataset is not already loaded
43+
rcv1_dir = join(get_data_home(), "RCV1")
44+
if not exists(rcv1_dir):
45+
raise SkipTest("Download RCV1 dataset to run this test.")
46+
47+
48+
def setup_twenty_newsgroups():
49+
data_home = get_data_home()
50+
if not exists(join(data_home, '20news_home')):
51+
raise SkipTest("Skipping dataset loading doctests")
52+
53+
54+
def setup_working_with_text_data():
55+
check_skip_network()
56+
57+
58+
def pytest_runtest_setup(item):
59+
fname = item.fspath.strpath
60+
if fname.endswith('datasets/labeled_faces.rst'):
61+
setup_labeled_faces()
62+
elif fname.endswith('datasets/mldata.rst'):
63+
setup_mldata()
64+
elif fname.endswith('datasets/rcv1.rst'):
65+
setup_rcv1()
66+
elif fname.endswith('datasets/twenty_newsgroups.rst'):
67+
setup_twenty_newsgroups()
68+
elif fname.endswith('datasets/working_with_text_data.rst'):
69+
setup_working_with_text_data()
70+
71+
72+
def pytest_runtest_teardown(item):
73+
fname = item.fspath.strpath
74+
if fname.endswith('datasets/mldata.rst'):
75+
teardown_mldata()

doc/datasets/mldata.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
44
>>> import numpy as np
55
>>> import os
6+
>>> import tempfile
7+
>>> # Create a temporary folder for the data fetcher
8+
>>> custom_data_home = tempfile.mkdtemp()
9+
>>> os.makedirs(os.path.join(custom_data_home, 'mldata'))
10+
611

712
.. _mldata:
813

@@ -70,3 +75,8 @@ defaults to individual datasets:
7075
... data_home=custom_data_home)
7176
>>> iris3 = fetch_mldata('datasets-UCI iris', target_name='class',
7277
... data_name='double0', data_home=custom_data_home)
78+
79+
80+
..
81+
>>> import shutil
82+
>>> shutil.rmtree(custom_data_home)

doc/datasets/mldata_fixture.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,12 @@
33
Mock urllib2 access to mldata.org and create a temporary data folder.
44
"""
55

6-
from os import makedirs
7-
from os.path import join
86
import numpy as np
9-
import tempfile
10-
import shutil
117

12-
from sklearn import datasets
138
from sklearn.utils.testing import install_mldata_mock
149
from sklearn.utils.testing import uninstall_mldata_mock
1510

1611

17-
def globs(globs):
18-
# Create a temporary folder for the data fetcher
19-
global custom_data_home
20-
custom_data_home = tempfile.mkdtemp()
21-
makedirs(join(custom_data_home, 'mldata'))
22-
globs['custom_data_home'] = custom_data_home
23-
return globs
24-
25-
2612
def setup_module():
2713
# setup mock urllib2 module to avoid downloading from mldata.org
2814
install_mldata_mock({
@@ -42,4 +28,3 @@ def setup_module():
4228

4329
def teardown_module():
4430
uninstall_mldata_mock()
45-
shutil.rmtree(custom_data_home)

0 commit comments

Comments
 (0)