Completed
Push — master ( 5965ae...991a22 )
by Klaus
01:16
created

test_gather_sources_and_dependencies()   F

Complexity

Conditions 12

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 12
c 1
b 0
f 1
dl 0
loc 24
rs 2.8641

How to fix   Complexity   

Complexity

Complex classes like test_gather_sources_and_dependencies() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
#!/usr/bin/env python
2
# coding=utf-8
3
from __future__ import division, print_function, unicode_literals
4
5
import os.path
6
7
import mock
8
import pytest
9
from sacred.dependencies import (PEP440_VERSION_PATTERN, PackageDependency,
10
                                 Source, gather_sources_and_dependencies,
11
                                 get_digest, get_py_file_if_possible,
12
                                 is_local_source)
13
import sacred.optional as opt
14
15
EXAMPLE_SOURCE = 'tests/__init__.py'
16
EXAMPLE_DIGEST = 'e3e5102d21897ad2bfa1140e359075e1'
17
18
19
@pytest.mark.parametrize('version', [
20
    '0.9.11', '2012.04', '1!1.1', '17.10a104', '43.0rc1', '0.9.post3',
21
    '12.4a22.post8', '13.3rc2.dev1515', '1.0.dev456', '1.0a1', '1.0a2.dev456',
22
    '1.0a12.dev456', '1.0a12', '1.0b1.dev456', '1.0b2', '1.0b2.post345.dev456',
23
    '1.0b2.post345', '1.0rc1.dev456', '1.0rc1', '1.0', '1.0.post456.dev34',
24
    '1.0.post456', '1.1.dev1'
25
])
26
def test_pep440_version_pattern(version):
27
    assert PEP440_VERSION_PATTERN.match(version)
28
29
30
def test_pep440_version_pattern_invalid():
31
    assert PEP440_VERSION_PATTERN.match('foo') is None
32
    assert PEP440_VERSION_PATTERN.match('_12_') is None
33
    assert PEP440_VERSION_PATTERN.match('version 4') is None
34
35
36
def test_source_get_digest():
37
    assert get_digest(EXAMPLE_SOURCE) == EXAMPLE_DIGEST
38
39
40
def test_source_create_empty():
41
    with pytest.raises(ValueError):
42
        Source.create('')
43
44
45
def test_source_create_non_existing():
46
    with pytest.raises(ValueError):
47
        Source.create('doesnotexist.py')
48
49
50
def test_source_create_py():
51
    s = Source.create(EXAMPLE_SOURCE)
52
    assert s.filename == os.path.abspath(EXAMPLE_SOURCE)
53
    assert s.digest == EXAMPLE_DIGEST
54
55
56
def test_source_to_json():
57
    s = Source.create(EXAMPLE_SOURCE)
58
    assert s.to_json() == (os.path.abspath(EXAMPLE_SOURCE), EXAMPLE_DIGEST)
59
60
61
def test_get_py_file_if_possible_with_py_file():
62
    assert get_py_file_if_possible(EXAMPLE_SOURCE) == EXAMPLE_SOURCE
63
64
65
def test_get_py_file_if_possible_with_pyc_file():
66
    assert get_py_file_if_possible(EXAMPLE_SOURCE + 'c') == EXAMPLE_SOURCE
67
68
69
def test_source_repr():
70
    s = Source.create(EXAMPLE_SOURCE)
71
    assert repr(s) == "<Source: {}>".format(os.path.abspath(EXAMPLE_SOURCE))
72
73
74
def test_get_py_file_if_possible_with_pyc_but_nonexistent_py_file():
75
    assert get_py_file_if_possible('doesnotexist.pyc') == 'doesnotexist.pyc'
76
77
78
versions = [
79
    ('0.7.2', '0.7.2'),
80
    ('1.0', '1.0'),
81
    ('foobar', None),
82
    (10, None),
83
    ((2, 6), '2.6'),
84
    ((1, 4, 8), '1.4.8')
85
]
86
87
88
@pytest.mark.parametrize('version,expected', versions)
89
def test_package_dependency_get_version_heuristic_version__(version, expected):
90
    mod = mock.Mock(spec=[], __version__=version)
91
    assert PackageDependency.get_version_heuristic(mod) == expected
92
93
94
@pytest.mark.parametrize('version,expected', versions)
95
def test_package_dependency_get_version_heuristic_version(version, expected):
96
    mod = mock.Mock(spec=[], version=version)
97
    assert PackageDependency.get_version_heuristic(mod) == expected
98
99
100
@pytest.mark.parametrize('version,expected', versions)
101
def test_package_dependency_get_version_heuristic_VERSION(version, expected):
102
    mod = mock.Mock(spec=[], VERSION=version)
103
    assert PackageDependency.get_version_heuristic(mod) == expected
104
105
106
def test_package_dependency_create():
107
    mod = mock.Mock(spec=[], __version__='0.1.2', __name__='testmod')
108
    pd = PackageDependency.create(mod)
109
    assert pd.name == 'testmod'
110
    assert pd.version == '0.1.2'
111
112
113
def test_package_dependency_create_no_version():
114
    mod = mock.Mock(spec=[], __name__='testmod')
115
    pd = PackageDependency.create(mod)
116
    assert pd.name == 'testmod'
117
    assert pd.version is None
118
119
120
def test_package_dependency_to_json():
121
    mod = mock.Mock(spec=[], __version__='3.2.1', __name__='testmod')
122
    pd = PackageDependency.create(mod)
123
    assert pd.to_json() == 'testmod==3.2.1'
124
125
126
def test_package_dependency_fill_non_missing_version():
127
    pd = PackageDependency('mymod', '1.2.3rc4')
128
    pd.fill_missing_version()
129
    assert pd.version == '1.2.3rc4'
130
131
132
def test_package_dependency_fill_missing_version_unknown():
133
    pd = PackageDependency('mymod', None)
134
    pd.fill_missing_version()
135
    assert pd.version == '<unknown>'
136
137
138
def test_package_dependency_fill_missing_version():
139
    pd = PackageDependency('pytest', None)
140
    pd.fill_missing_version()
141
    assert pd.version == pytest.__version__
142
143
144
def test_package_dependency_repr():
145
    pd = PackageDependency('pytest', '12.4')
146
    assert repr(pd) == '<PackageDependency: pytest=12.4>'
147
148
149
def test_gather_sources_and_dependencies():
150
    from tests.dependency_example import some_func
151
    main, sources, deps = gather_sources_and_dependencies(some_func.__globals__)
152
    assert isinstance(main, Source)
153
    assert isinstance(sources, set)
154
    assert isinstance(deps, set)
155
    assert main == Source.create('tests/dependency_example.py')
156
    expected_sources = {
157
        Source.create('tests/__init__.py'),
158
        Source.create('tests/dependency_example.py'),
159
        Source.create('tests/foo/__init__.py'),
160
        Source.create('tests/foo/bar.py')
161
    }
162
    assert sources == expected_sources
163
164
    assert PackageDependency.create(pytest) in deps
165
    assert PackageDependency.create(mock) in deps
166
    # If numpy is installed on the test system it will automatically be added
167
    # as an additional dependency, so test for that:
168
    if opt.has_numpy:
169
        assert PackageDependency.create(opt.np) in deps
170
        assert len(deps) == 3
171
    else:
172
        assert len(deps) == 2
173
174
175
@pytest.mark.parametrize('f_name, mod_name, ex_path, is_local', [
176
    ('./foo.py', 'bar', '.', False),
177
    ('./foo.pyc', 'bar', '.', False),
178
    ('./bar.py', 'bar', '.', True),
179
    ('./bar.pyc', 'bar', '.', True),
180
    ('./venv/py/bar.py', 'bar', '.', False),
181
    ('./venv/py/bar.py', 'venv.py.bar', '.', True),
182
    ('./venv/py/bar.pyc', 'venv.py.bar', '.', True),
183
    ('foo.py', 'bar', '.', False),
184
    ('bar.py', 'bar', '.', True),
185
    ('bar.pyc', 'bar', '.', True),
186
    ('bar.pyc', 'some.bar', '.', False),
187
    ('/home/user/bar.py', 'user.bar', '/home/user/', True),
188
    ('bar/__init__.py', 'bar', '.', True),
189
    ('bar/__init__.py', 'foo', '.', False),
190
    ('/home/user/bar/__init__.py', 'home.user.bar', '/home/user/', True),
191
    ('/home/user/bar/__init__.py', 'home.user.foo', '/home/user/', False),
192
])
193
def test_is_local_source(f_name, mod_name, ex_path, is_local):
194
    assert is_local_source(f_name, mod_name, ex_path) == is_local
195