test_versions_utils.py 3.74 KB
Newer Older
Sylvain Gugger's avatar
Sylvain Gugger committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Copyright 2020 The HuggingFace Team. All rights reserved.
#
# 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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import sys

import numpy

import pkg_resources
from transformers.testing_utils import TestCasePlus
from transformers.utils.versions import require_version, require_version_core, require_version_examples


numpy_ver = numpy.__version__
python_ver = ".".join([str(x) for x in sys.version_info[:3]])


class DependencyVersionCheckTest(TestCasePlus):
    def test_core(self):
        # lt + different version strings
        require_version_core("numpy<1000.4.5")
        require_version_core("numpy<1000.4")
        require_version_core("numpy<1000")

        # le
        require_version_core("numpy<=1000.4.5")
        require_version_core(f"numpy<={numpy_ver}")

        # eq
        require_version_core(f"numpy=={numpy_ver}")

        # ne
        require_version_core("numpy!=1000.4.5")

        # ge
        require_version_core("numpy>=1.0")
        require_version_core("numpy>=1.0.0")
        require_version_core(f"numpy>={numpy_ver}")

        # gt
        require_version_core("numpy>1.0.0")

        # requirement w/o version
        require_version_core("numpy")

        # unmet requirements due to version conflict
        for req in ["numpy==1.0.0", "numpy>=1000.0.0", f"numpy<{numpy_ver}"]:
            try:
                require_version_core(req)
            except pkg_resources.VersionConflict as e:
                self.assertIn(f"{req} is required", str(e))
                self.assertIn("but found", str(e))

        # unmet requirements due to missing module
        for req in ["numpipypie>1", "numpipypie2"]:
            try:
                require_version_core(req)
            except pkg_resources.DistributionNotFound as e:
                self.assertIn(f"The '{req}' distribution was not found and is required by this application", str(e))
                self.assertIn("Try: pip install transformers -U", str(e))

        # bogus requirements formats:
        # 1. whole thing
        for req in ["numpy??1.0.0", "numpy1.0.0"]:
            try:
                require_version_core(req)
            except ValueError as e:
                self.assertIn("requirement needs to be in the pip package format", str(e))
        # 2. only operators
        for req in ["numpy=1.0.0", "numpy == 1.00", "numpy<>1.0.0", "numpy><1.00", "numpy>>1.0.0"]:
            try:
                require_version_core(req)
            except ValueError as e:
                self.assertIn("need one of ", str(e))

    def test_examples(self):
        # the main functionality is tested in `test_core`, this is just the hint check
        try:
            require_version_examples("numpy>1000.4.5")
        except pkg_resources.VersionConflict as e:
            self.assertIn("is required", str(e))
            self.assertIn("pip install -r examples/requirements.txt", str(e))

    def test_python(self):

        # matching requirement
        require_version("python>=3.6.0")

        # not matching requirements
        for req in ["python>9.9.9", "python<3.0.0"]:
            try:
                require_version_core(req)
            except pkg_resources.VersionConflict as e:
                self.assertIn(f"{req} is required", str(e))
                self.assertIn(f"but found python=={python_ver}", str(e))