test_doc_samples.py 4.28 KB
Newer Older
Lysandre's avatar
Lysandre committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# coding=utf-8
# Copyright 2019-present, the HuggingFace Inc. team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

16
17
import doctest
import logging
Lysandre's avatar
Lysandre committed
18
import os
19
import unittest
20
from pathlib import Path
21
22
from typing import List, Union

23
import transformers
24
from transformers.testing_utils import require_tf, require_torch, slow
Lysandre's avatar
Lysandre committed
25

Lysandre's avatar
Lysandre committed
26

27
logger = logging.getLogger()
Lysandre's avatar
Lysandre committed
28
29


Lysandre Debut's avatar
Lysandre Debut committed
30
@unittest.skip("Temporarily disable the doc tests.")
Lysandre's avatar
Lysandre committed
31
@require_torch
Lysandre's avatar
Lysandre committed
32
33
@require_tf
@slow
Lysandre's avatar
Lysandre committed
34
class TestCodeExamples(unittest.TestCase):
35
    def analyze_directory(
36
37
38
39
40
41
        self,
        directory: Path,
        identifier: Union[str, None] = None,
        ignore_files: Union[List[str], None] = [],
        n_identifier: Union[str, None] = None,
        only_modules: bool = True,
42
    ):
43
44
45
46
47
48
49
50
51
52
53
        """
        Runs through the specific directory, looking for the files identified with `identifier`. Executes
        the doctests in those files

        Args:
            directory (:obj:`str`): Directory containing the files
            identifier (:obj:`str`): Will parse files containing this
            ignore_files (:obj:`List[str]`): List of files to skip
            n_identifier (:obj:`str` or :obj:`List[str]`): Will not parse files containing this/these identifiers.
            only_modules (:obj:`bool`): Whether to only analyze modules
        """
54
        files = [file for file in os.listdir(directory) if os.path.isfile(os.path.join(directory, file))]
Lysandre's avatar
Lysandre committed
55

56
57
58
        if identifier is not None:
            files = [file for file in files if identifier in file]

59
60
61
62
63
64
65
66
67
        if n_identifier is not None:
            if isinstance(n_identifier, List):
                for n_ in n_identifier:
                    files = [file for file in files if n_ not in file]
            else:
                files = [file for file in files if n_identifier not in file]

        ignore_files.append("__init__.py")
        files = [file for file in files if file not in ignore_files]
68
69
70

        for file in files:
            # Open all files
71
72
73
74
75
76
77
78
79
80
81
82
83
84
            print("Testing", file)

            if only_modules:
                try:
                    module_identifier = file.split(".")[0]
                    module_identifier = getattr(transformers, module_identifier)
                    suite = doctest.DocTestSuite(module_identifier)
                    result = unittest.TextTestRunner().run(suite)
                    self.assertIs(len(result.failures), 0)
                except AttributeError:
                    logger.info(f"{module_identifier} is not a module.")
            else:
                result = doctest.testfile(str(".." / directory / file), optionflags=doctest.ELLIPSIS)
                self.assertIs(result.failed, 0)
Lysandre's avatar
Lysandre committed
85
86
87

    def test_modeling_examples(self):
        transformers_directory = "src/transformers"
88
        files = "modeling"
Lysandre's avatar
Lysandre committed
89
        ignore_files = [
90
91
            "modeling_ctrl.py",
            "modeling_tf_ctrl.py",
Lysandre's avatar
Lysandre committed
92
        ]
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
        self.analyze_directory(transformers_directory, identifier=files, ignore_files=ignore_files)

    def test_tokenization_examples(self):
        transformers_directory = Path("src/transformers")
        files = "tokenization"
        self.analyze_directory(transformers_directory, identifier=files)

    def test_configuration_examples(self):
        transformers_directory = Path("src/transformers")
        files = "configuration"
        self.analyze_directory(transformers_directory, identifier=files)

    def test_remaining_examples(self):
        transformers_directory = Path("src/transformers")
        n_identifiers = ["configuration", "modeling", "tokenization"]
        self.analyze_directory(transformers_directory, n_identifier=n_identifiers)

    def test_doc_sources(self):
        doc_source_directory = Path("docs/source")
        ignore_files = ["favicon.ico"]
        self.analyze_directory(doc_source_directory, ignore_files=ignore_files, only_modules=False)