6
6
import pytest
7
7
8
8
from fawltydeps .settings import ParserChoice , Settings
9
- from fawltydeps .traverse_project import CodeSource , DepsSource , find_sources
10
- from fawltydeps .types import PathOrSpecial , UnparseablePathException
9
+ from fawltydeps .traverse_project import find_sources
10
+ from fawltydeps .types import (
11
+ CodeSource ,
12
+ DepsSource ,
13
+ PathOrSpecial ,
14
+ UnparseablePathException ,
15
+ )
11
16
12
17
from .test_sample_projects import SAMPLE_PROJECTS_DIR
13
18
@@ -21,6 +26,7 @@ class TraverseProjectVector:
21
26
# The following sets contain paths that are all relative to cwd
22
27
code : Set [str ] = dataclasses .field (default_factory = lambda : {"." })
23
28
deps : Set [str ] = dataclasses .field (default_factory = lambda : {"." })
29
+ pyenvs : Set [str ] = dataclasses .field (default_factory = lambda : {"." })
24
30
deps_parser_choice : Optional [ParserChoice ] = None
25
31
expect_imports_src : Set [str ] = dataclasses .field (default_factory = set )
26
32
expect_deps_src : Set [str ] = dataclasses .field (default_factory = set )
@@ -36,6 +42,7 @@ class TraverseProjectVector:
36
42
"blog_post_example" ,
37
43
code = set (),
38
44
deps = set (),
45
+ pyenvs = set (),
39
46
),
40
47
#
41
48
# Testing 'code' alone:
@@ -45,69 +52,79 @@ class TraverseProjectVector:
45
52
"blog_post_example" ,
46
53
code = {"missing.py" },
47
54
deps = set (),
55
+ pyenvs = set (),
48
56
expect_raised = UnparseablePathException ,
49
57
),
50
58
TraverseProjectVector (
51
59
"given_code_as_non_py_file__raises_exception" ,
52
60
"blog_post_example" ,
53
61
code = {"README.md" },
54
62
deps = set (),
63
+ pyenvs = set (),
55
64
expect_raised = UnparseablePathException ,
56
65
),
57
66
TraverseProjectVector (
58
67
"given_code_as_specialpath_stdin__yields_preserved_specialpath_stdin" ,
59
68
"empty" ,
60
69
code = {"<stdin>" },
61
70
deps = set (),
71
+ pyenvs = set (),
62
72
expect_imports_src = {"<stdin>" },
63
73
),
64
74
TraverseProjectVector (
65
75
"given_code_as_py_file__yields_file" ,
66
76
"blog_post_example" ,
67
77
code = {"my_script.py" },
68
78
deps = set (),
79
+ pyenvs = set (),
69
80
expect_imports_src = {"my_script.py" },
70
81
),
71
82
TraverseProjectVector (
72
83
"given_code_as_ipynb_file__yields_file" ,
73
84
"mixed_project" ,
74
85
code = {"subdir1/notebook.ipynb" },
75
86
deps = set (),
87
+ pyenvs = set (),
76
88
expect_imports_src = {"subdir1/notebook.ipynb" },
77
89
),
78
90
TraverseProjectVector (
79
91
"given_code_as_py_and_ipynb_file__yields_both_files" ,
80
92
"mixed_project" ,
81
93
code = {"subdir1/notebook.ipynb" , "subdir2/script.py" },
82
94
deps = set (),
95
+ pyenvs = set (),
83
96
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir2/script.py" },
84
97
),
85
98
TraverseProjectVector (
86
99
"given_code_as_stdin_and_files__yields_all" ,
87
100
"mixed_project" ,
88
101
code = {"<stdin>" , "subdir1/notebook.ipynb" , "subdir2/script.py" },
89
102
deps = set (),
103
+ pyenvs = set (),
90
104
expect_imports_src = {"<stdin>" , "subdir1/notebook.ipynb" , "subdir2/script.py" },
91
105
),
92
106
TraverseProjectVector (
93
107
"given_code_as_dir__yields_only_files_within" ,
94
108
"mixed_project" ,
95
109
code = {"subdir1" },
96
110
deps = set (),
111
+ pyenvs = set (),
97
112
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir1/script.py" },
98
113
),
99
114
TraverseProjectVector (
100
115
"given_code_as_dir_and_stdin__yields_files_within_dir_and_stdin" ,
101
116
"mixed_project" ,
102
117
code = {"subdir1" , "<stdin>" },
103
118
deps = set (),
119
+ pyenvs = set (),
104
120
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir1/script.py" , "<stdin>" },
105
121
),
106
122
TraverseProjectVector (
107
123
"given_code_as_multiple_dirs__yields_files_within_all_dirs" ,
108
124
"mixed_project" ,
109
125
code = {"subdir1" , "subdir2" },
110
126
deps = set (),
127
+ pyenvs = set (),
111
128
expect_imports_src = {
112
129
"subdir1/notebook.ipynb" ,
113
130
"subdir1/script.py" ,
@@ -121,6 +138,7 @@ class TraverseProjectVector:
121
138
"mixed_project" ,
122
139
code = {"." , "subdir2" },
123
140
deps = set (),
141
+ pyenvs = set (),
124
142
expect_imports_src = {
125
143
"main.py" ,
126
144
"subdir1/notebook.ipynb" ,
@@ -135,6 +153,7 @@ class TraverseProjectVector:
135
153
"mixed_project" ,
136
154
code = {"subdir1" , "subdir2/notebook.ipynb" },
137
155
deps = set (),
156
+ pyenvs = set (),
138
157
expect_imports_src = {
139
158
"subdir1/notebook.ipynb" ,
140
159
"subdir1/script.py" ,
@@ -149,62 +168,71 @@ class TraverseProjectVector:
149
168
"blog_post_example" ,
150
169
code = set (),
151
170
deps = {"missing_requirements.txt" },
171
+ pyenvs = set (),
152
172
expect_raised = UnparseablePathException ,
153
173
),
154
174
TraverseProjectVector (
155
175
"given_deps_as_non_deps_file__raises_exception" ,
156
176
"blog_post_example" ,
157
177
code = set (),
158
178
deps = {"README.md" },
179
+ pyenvs = set (),
159
180
expect_raised = UnparseablePathException ,
160
181
),
161
182
TraverseProjectVector (
162
183
"given_deps_as_requirements_txt__yields_file" ,
163
184
"blog_post_example" ,
164
185
code = set (),
165
186
deps = {"requirements.txt" },
187
+ pyenvs = set (),
166
188
expect_deps_src = {"requirements.txt" },
167
189
),
168
190
TraverseProjectVector (
169
191
"given_deps_as_pyproject_toml__yields_file" ,
170
192
"mixed_project" ,
171
193
code = set (),
172
194
deps = {"pyproject.toml" },
195
+ pyenvs = set (),
173
196
expect_deps_src = {"pyproject.toml" },
174
197
),
175
198
TraverseProjectVector (
176
199
"given_deps_as_setup_cfg_and_pyproject_toml__yields_both_files" ,
177
200
"mixed_project" ,
178
201
code = set (),
179
202
deps = {"pyproject.toml" , "subdir1/setup.cfg" },
203
+ pyenvs = set (),
180
204
expect_deps_src = {"pyproject.toml" , "subdir1/setup.cfg" },
181
205
),
182
206
TraverseProjectVector (
183
207
"given_deps_as_dir__yields_only_files_within" ,
184
208
"mixed_project" ,
185
209
code = set (),
186
210
deps = {"subdir1" },
211
+ pyenvs = set (),
187
212
expect_deps_src = {"subdir1/setup.cfg" },
188
213
),
189
214
TraverseProjectVector (
190
215
"given_deps_as_multiple_dirs__yields_files_within_all_dirs" ,
191
216
"mixed_project" ,
192
217
code = set (),
193
218
deps = {"subdir1" , "subdir2" },
219
+ pyenvs = set (),
194
220
expect_deps_src = {"subdir1/setup.cfg" , "subdir2/setup.py" },
195
221
),
196
222
TraverseProjectVector (
197
223
"given_deps_as_parent_and_child_dirs__yields_files_within_all_dirs" ,
198
224
"mixed_project" ,
199
225
code = set (),
200
226
deps = {"." , "subdir2" },
227
+ pyenvs = set (),
201
228
expect_deps_src = {"pyproject.toml" , "subdir1/setup.cfg" , "subdir2/setup.py" },
202
229
),
203
230
TraverseProjectVector (
204
231
"given_deps_as_file_and_dir__yields_file_and_files_within_dir" ,
205
232
"mixed_project" ,
206
233
code = set (),
207
234
deps = {"subdir1" , "subdir2/setup.py" },
235
+ pyenvs = set (),
208
236
expect_deps_src = {"subdir1/setup.cfg" , "subdir2/setup.py" },
209
237
),
210
238
#
@@ -215,6 +243,7 @@ class TraverseProjectVector:
215
243
"mixed_project" ,
216
244
code = set (),
217
245
deps = {"pyproject.toml" , "subdir1/setup.cfg" },
246
+ pyenvs = set (),
218
247
deps_parser_choice = ParserChoice .REQUIREMENTS_TXT ,
219
248
expect_deps_src = {"pyproject.toml" , "subdir1/setup.cfg" },
220
249
),
@@ -223,6 +252,7 @@ class TraverseProjectVector:
223
252
"mixed_project" ,
224
253
code = set (),
225
254
deps = {"." },
255
+ pyenvs = set (),
226
256
deps_parser_choice = ParserChoice .SETUP_CFG ,
227
257
expect_deps_src = {"subdir1/setup.cfg" },
228
258
),
@@ -231,6 +261,7 @@ class TraverseProjectVector:
231
261
"mixed_project" ,
232
262
code = set (),
233
263
deps = {"subdir2" },
264
+ pyenvs = set (),
234
265
deps_parser_choice = ParserChoice .REQUIREMENTS_TXT ,
235
266
expect_deps_src = set (),
236
267
),
@@ -248,6 +279,7 @@ class TraverseProjectVector:
248
279
"blog_post_example" ,
249
280
code = {"my_script.py" },
250
281
deps = {"requirements.txt" , "dev-requirements.txt" },
282
+ pyenvs = set (),
251
283
expect_imports_src = {"my_script.py" },
252
284
expect_deps_src = {"requirements.txt" , "dev-requirements.txt" },
253
285
),
@@ -256,6 +288,7 @@ class TraverseProjectVector:
256
288
"mixed_project" ,
257
289
code = {"subdir1" },
258
290
deps = {"subdir1" },
291
+ pyenvs = set (),
259
292
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir1/script.py" },
260
293
expect_deps_src = {"subdir1/setup.cfg" },
261
294
),
@@ -264,6 +297,7 @@ class TraverseProjectVector:
264
297
"mixed_project" ,
265
298
code = {"subdir2" },
266
299
deps = {"subdir2" },
300
+ pyenvs = set (),
267
301
expect_imports_src = {
268
302
"subdir2/notebook.ipynb" ,
269
303
"subdir2/script.py" ,
@@ -276,6 +310,7 @@ class TraverseProjectVector:
276
310
"mixed_project" ,
277
311
code = {"subdir1" },
278
312
deps = {"subdir2" },
313
+ pyenvs = set (),
279
314
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir1/script.py" },
280
315
expect_deps_src = {"subdir2/setup.py" },
281
316
),
@@ -284,15 +319,17 @@ class TraverseProjectVector:
284
319
"mixed_project" ,
285
320
code = {"subdir1" },
286
321
deps = {"." },
322
+ pyenvs = set (),
287
323
expect_imports_src = {"subdir1/notebook.ipynb" , "subdir1/script.py" },
288
324
expect_deps_src = {"pyproject.toml" , "subdir1/setup.cfg" , "subdir2/setup.py" },
289
325
),
290
326
#
291
- # We should not traverse into dot dirs (e.g. .git or .venv) by default
327
+ # 'code' + 'deps' don't traverse into dot dirs (e.g. .git, .venv) by default
292
328
#
293
329
TraverseProjectVector (
294
330
"default_traversal_in_no_issues__does_not_traverse_into_dot_venv" ,
295
331
"no_issues" ,
332
+ pyenvs = set (),
296
333
expect_imports_src = {"python_file.py" },
297
334
expect_deps_src = {"requirements.txt" , "subdir/requirements.txt" },
298
335
),
@@ -322,6 +359,7 @@ def test_find_sources(vector: TraverseProjectVector):
322
359
},
323
360
deps = {project_dir / path for path in vector .deps },
324
361
deps_parser_choice = vector .deps_parser_choice ,
362
+ pyenvs = {project_dir / path for path in vector .pyenvs },
325
363
)
326
364
expect_imports_src = {
327
365
path if path == "<stdin>" else project_dir / path
0 commit comments