test_doc_samples.py 4.31 KB
Newer Older
Lysandre's avatar
Lysandre committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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.
15
16
import doctest
import logging
Lysandre's avatar
Lysandre committed
17
import os
18
import unittest
19
from pathlib import Path
20
21
from typing import List, Union

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

Lysandre's avatar
Lysandre committed
25

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


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

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

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

58
59
60
61
62
63
64
        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]

65
        ignore_files = ignore_files or []
66
67
        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
            print("Testing", file)

            if only_modules:
74
                module_identifier = file.split(".")[0]
75
76
77
78
79
80
81
82
83
84
                try:
                    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

    def test_modeling_examples(self):
87
        transformers_directory = Path("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)