Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit 5a36952

Browse files
feat: include user specified files even if excluded (#383)
* feat: include user specified files even if excluded * fix: remove unnecessary changes to file finder * fix: add back unnecessarily removed test Signed-off-by: joseph-sentry <[email protected]>
1 parent 2272547 commit 5a36952

File tree

2 files changed

+185
-98
lines changed

2 files changed

+185
-98
lines changed

codecov_cli/services/upload/file_finder.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def get_user_specified_files(self, regex_patterns_to_exclude):
232232
files_excluded_but_user_includes.append(str(file))
233233
if files_excluded_but_user_includes:
234234
logger.warning(
235-
"Some files being explicitly added are found in the list of excluded files for upload.",
235+
"Some files being explicitly added are found in the list of excluded files for upload. We are still going to search for the explicitly added files.",
236236
extra=dict(
237237
extra_log_attributes=dict(files=files_excluded_but_user_includes)
238238
),
@@ -246,7 +246,6 @@ def get_user_specified_files(self, regex_patterns_to_exclude):
246246
self.search_root,
247247
self.folders_to_ignore,
248248
filename_include_regex=regex_patterns_to_include,
249-
filename_exclude_regex=regex_patterns_to_exclude,
250249
multipart_include_regex=multipart_include_regex,
251250
)
252251
)

tests/services/upload/test_coverage_file_finder.py

Lines changed: 184 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import tempfile
2-
import unittest
32
from pathlib import Path
43

4+
import pytest
5+
56
from codecov_cli.services.upload.file_finder import FileFinder
67
from codecov_cli.types import UploadCollectionResultFile
78

@@ -153,179 +154,266 @@ def test_find_coverage_files_test_results(self, tmp_path):
153154
assert actual - expected == {UploadCollectionResultFile(extra)}
154155

155156

156-
class TestCoverageFileFinderUserInput(unittest.TestCase):
157-
def setUp(self):
158-
self.temp_dir = tempfile.TemporaryDirectory() # Create a temporary directory
159-
self.project_root = Path(self.temp_dir.name)
160-
self.folders_to_ignore = []
161-
self.explicitly_listed_files = [
162-
self.project_root / "test_file.abc",
163-
self.project_root / "subdirectory" / "another_file.abc",
164-
]
165-
self.disable_search = False
166-
self.coverage_file_finder = FileFinder(
167-
self.project_root,
168-
self.folders_to_ignore,
169-
self.explicitly_listed_files,
170-
self.disable_search,
171-
)
172-
173-
def tearDown(self):
174-
self.temp_dir.cleanup() # Clean up the temporary directory
175-
176-
def test_find_coverage_files_with_existing_files(self):
177-
# Create some sample coverage files
157+
@pytest.fixture()
158+
def coverage_file_finder_fixture():
159+
temp_dir = tempfile.TemporaryDirectory() # Create a temporary directory
160+
project_root = Path(temp_dir.name)
161+
folders_to_ignore = []
162+
explicitly_listed_files = [
163+
project_root / "test_file.abc",
164+
project_root / "subdirectory" / "another_file.abc",
165+
]
166+
disable_search = False
167+
coverage_file_finder = FileFinder(
168+
project_root,
169+
folders_to_ignore,
170+
explicitly_listed_files,
171+
disable_search,
172+
)
173+
yield project_root, coverage_file_finder
174+
temp_dir.cleanup()
175+
176+
177+
class TestCoverageFileFinderUserInput:
178+
def test_find_coverage_files_with_existing_files(
179+
self, coverage_file_finder_fixture
180+
):
181+
# Create some sample coverage coverage_file_finder_fixture
182+
(
183+
project_root,
184+
coverage_file_finder,
185+
) = coverage_file_finder_fixture
178186
coverage_files = [
179-
self.project_root / "coverage.xml",
180-
self.project_root / "subdirectory" / "test_coverage.xml",
181-
self.project_root / "other_file.txt",
182-
self.project_root / ".tox" / "another_file.abc",
187+
project_root / "coverage.xml",
188+
project_root / "subdirectory" / "test_coverage.xml",
189+
project_root / "other_file.txt",
190+
project_root / ".tox" / "another_file.abc",
183191
]
184-
(self.project_root / "subdirectory").mkdir()
185-
(self.project_root / ".tox").mkdir()
192+
(project_root / "subdirectory").mkdir()
193+
(project_root / ".tox").mkdir()
186194
for file in coverage_files:
187195
file.touch()
188196

189197
result = sorted(
190-
[file.get_filename() for file in self.coverage_file_finder.find_files()]
198+
[file.get_filename() for file in coverage_file_finder.find_files()]
191199
)
192200
expected = [
193-
UploadCollectionResultFile(Path(f"{self.project_root}/coverage.xml")),
201+
UploadCollectionResultFile(Path(f"{project_root}/coverage.xml")),
194202
UploadCollectionResultFile(
195-
Path(f"{self.project_root}/subdirectory/test_coverage.xml")
203+
Path(f"{project_root}/subdirectory/test_coverage.xml")
196204
),
197205
]
198206
expected_paths = sorted([file.get_filename() for file in expected])
199-
self.assertEqual(result, expected_paths)
200-
201-
def test_find_coverage_files_with_no_files(self):
202-
result = self.coverage_file_finder.find_files()
203-
self.assertEqual(result, [])
204-
205-
def test_find_coverage_files_with_disabled_search(self):
206-
# Create some sample coverage files
207-
print("project root", self.project_root)
207+
assert result == expected_paths
208+
209+
def test_find_coverage_files_with_no_files(self, coverage_file_finder_fixture):
210+
(
211+
_,
212+
coverage_file_finder,
213+
) = coverage_file_finder_fixture
214+
result = coverage_file_finder.find_files()
215+
assert result == []
216+
217+
def test_find_coverage_files_with_disabled_search(
218+
self, coverage_file_finder_fixture
219+
):
220+
(
221+
project_root,
222+
coverage_file_finder,
223+
) = coverage_file_finder_fixture
224+
# Create some sample coverage coverage_file_finder_fixture
225+
print("project root", project_root)
208226
coverage_files = [
209-
self.project_root / "test_file.abc",
210-
self.project_root / "subdirectory" / "another_file.abc",
211-
self.project_root / "subdirectory" / "test_coverage.xml",
212-
self.project_root / "other_file.txt",
213-
self.project_root / ".tox" / "another_file.abc",
227+
project_root / "test_file.abc",
228+
project_root / "subdirectory" / "another_file.abc",
229+
project_root / "subdirectory" / "test_coverage.xml",
230+
project_root / "other_file.txt",
231+
project_root / ".tox" / "another_file.abc",
214232
]
215-
(self.project_root / "subdirectory").mkdir()
216-
(self.project_root / ".tox").mkdir()
233+
(project_root / "subdirectory").mkdir()
234+
(project_root / ".tox").mkdir()
217235
for file in coverage_files:
218236
file.touch()
219237

220238
# Disable search
221-
self.coverage_file_finder.disable_search = True
239+
coverage_file_finder.disable_search = True
222240

223241
result = sorted(
224-
[file.get_filename() for file in self.coverage_file_finder.find_files()]
242+
[file.get_filename() for file in coverage_file_finder.find_files()]
225243
)
226244

227245
expected = [
228-
UploadCollectionResultFile(Path(f"{self.project_root}/test_file.abc")),
246+
UploadCollectionResultFile(Path(f"{project_root}/test_file.abc")),
229247
UploadCollectionResultFile(
230-
Path(f"{self.project_root}/subdirectory/another_file.abc")
248+
Path(f"{project_root}/subdirectory/another_file.abc")
231249
),
232250
]
233251
expected_paths = sorted([file.get_filename() for file in expected])
234252

235-
self.assertEqual(result, expected_paths)
253+
assert result == expected_paths
236254

237-
def test_find_coverage_files_with_user_specified_files(self):
238-
# Create some sample coverage files
255+
def test_find_coverage_files_with_user_specified_files(
256+
self, coverage_file_finder_fixture
257+
):
258+
(
259+
project_root,
260+
coverage_file_finder,
261+
) = coverage_file_finder_fixture
262+
263+
# Create some sample coverage coverage_file_finder_fixture
239264
coverage_files = [
240-
self.project_root / "coverage.xml",
241-
self.project_root / "subdirectory" / "test_coverage.xml",
242-
self.project_root / "test_file.abc",
243-
self.project_root / "subdirectory" / "another_file.abc",
244-
self.project_root / ".tox" / "another_file.abc",
265+
project_root / "coverage.xml",
266+
project_root / "subdirectory" / "test_coverage.xml",
267+
project_root / "test_file.abc",
268+
project_root / "subdirectory" / "another_file.abc",
269+
project_root / ".tox" / "another_file.abc",
245270
]
246-
(self.project_root / "subdirectory").mkdir()
247-
(self.project_root / ".tox").mkdir()
271+
(project_root / "subdirectory").mkdir()
272+
(project_root / ".tox").mkdir()
248273
for file in coverage_files:
249274
file.touch()
250275

251276
result = sorted(
252-
[file.get_filename() for file in self.coverage_file_finder.find_files()]
277+
[file.get_filename() for file in coverage_file_finder.find_files()]
253278
)
254279

255280
expected = [
256-
UploadCollectionResultFile(Path(f"{self.project_root}/coverage.xml")),
281+
UploadCollectionResultFile(Path(f"{project_root}/coverage.xml")),
257282
UploadCollectionResultFile(
258-
Path(f"{self.project_root}/subdirectory/test_coverage.xml")
283+
Path(f"{project_root}/subdirectory/test_coverage.xml")
259284
),
260-
UploadCollectionResultFile(Path(f"{self.project_root}/test_file.abc")),
285+
UploadCollectionResultFile(Path(f"{project_root}/test_file.abc")),
261286
UploadCollectionResultFile(
262-
Path(f"{self.project_root}/subdirectory/another_file.abc")
287+
Path(f"{project_root}/subdirectory/another_file.abc")
263288
),
264289
]
265290
expected_paths = sorted([file.get_filename() for file in expected])
266-
self.assertEqual(result, expected_paths)
291+
assert result == expected_paths
267292

268-
def test_find_coverage_files_with_user_specified_files_not_found(self):
269-
# Create some sample coverage files
293+
def test_find_coverage_files_with_user_specified_files_not_found(
294+
self, coverage_file_finder_fixture
295+
):
296+
(
297+
project_root,
298+
coverage_file_finder,
299+
) = coverage_file_finder_fixture
300+
301+
# Create some sample coverage coverage_file_finder_fixture
270302
coverage_files = [
271-
self.project_root / "coverage.xml",
272-
self.project_root / "subdirectory" / "test_coverage.xml",
273-
self.project_root / ".tox" / "another_file.abc",
303+
project_root / "coverage.xml",
304+
project_root / "subdirectory" / "test_coverage.xml",
305+
project_root / ".tox" / "another_file.abc",
274306
]
275-
(self.project_root / "subdirectory").mkdir()
276-
(self.project_root / ".tox").mkdir()
307+
(project_root / "subdirectory").mkdir()
308+
(project_root / ".tox").mkdir()
277309
for file in coverage_files:
278310
file.touch()
279311

280312
# Add a non-existent file to explicitly_listed_files
281-
self.coverage_file_finder.explicitly_listed_files.append(
282-
self.project_root / "non_existent.xml"
313+
coverage_file_finder.explicitly_listed_files.append(
314+
project_root / "non_existent.xml"
283315
)
284316

285317
result = sorted(
286-
[file.get_filename() for file in self.coverage_file_finder.find_files()]
318+
[file.get_filename() for file in coverage_file_finder.find_files()]
287319
)
288320

289321
expected = [
290-
UploadCollectionResultFile(Path(f"{self.project_root}/coverage.xml")),
322+
UploadCollectionResultFile(Path(f"{project_root}/coverage.xml")),
291323
UploadCollectionResultFile(
292-
Path(f"{self.project_root}/subdirectory/test_coverage.xml")
324+
Path(f"{project_root}/subdirectory/test_coverage.xml")
293325
),
294326
]
295327
expected_paths = sorted([file.get_filename() for file in expected])
296-
self.assertEqual(result, expected_paths)
328+
assert result == expected_paths
297329

298330
def test_find_coverage_files_with_user_specified_files_in_default_ignored_folder(
299-
self,
331+
self, coverage_file_finder_fixture
300332
):
333+
334+
(
335+
project_root,
336+
coverage_file_finder,
337+
) = coverage_file_finder_fixture
338+
301339
# Create some sample coverage files
302340
coverage_files = [
303-
self.project_root / "coverage.xml",
304-
self.project_root / "subdirectory" / "test_coverage.xml",
305-
self.project_root / "test_file.abc",
306-
self.project_root / "subdirectory" / "another_file.abc",
307-
self.project_root / ".tox" / "another_file.abc",
341+
project_root / "coverage.xml",
342+
project_root / "subdirectory" / "test_coverage.xml",
343+
project_root / "test_file.abc",
344+
project_root / "subdirectory" / "another_file.abc",
345+
project_root / ".tox" / "another_file.abc",
308346
]
309-
(self.project_root / "subdirectory").mkdir()
310-
(self.project_root / ".tox").mkdir()
347+
(project_root / "subdirectory").mkdir()
348+
(project_root / ".tox").mkdir()
311349
for file in coverage_files:
312350
file.touch()
313351

314-
self.coverage_file_finder.explicitly_listed_files = [
315-
self.project_root / ".tox" / "another_file.abc",
352+
coverage_file_finder.explicitly_listed_files = [
353+
project_root / ".tox" / "another_file.abc",
354+
]
355+
result = sorted(
356+
[file.get_filename() for file in coverage_file_finder.find_files()]
357+
)
358+
359+
expected = [
360+
UploadCollectionResultFile(Path(f"{project_root}/coverage.xml")),
361+
UploadCollectionResultFile(
362+
Path(f"{project_root}/subdirectory/test_coverage.xml")
363+
),
364+
UploadCollectionResultFile(Path(f"{project_root}/.tox/another_file.abc")),
316365
]
366+
expected_paths = sorted([file.get_filename() for file in expected])
367+
368+
assert result == expected_paths
369+
370+
def test_find_coverage_files_with_user_specified_files_in_excluded(
371+
self, capsys, coverage_file_finder_fixture
372+
):
373+
(
374+
project_root,
375+
coverage_file_finder,
376+
) = coverage_file_finder_fixture
377+
378+
# Create some sample coverage coverage_file_finder_fixture
379+
coverage_files = [
380+
project_root / "coverage.xml",
381+
project_root / "subdirectory" / "test_coverage.xml",
382+
project_root / "test_file.abc",
383+
project_root / "subdirectory" / "another_file.abc",
384+
project_root / "subdirectory" / "another_file.bash",
385+
project_root / ".tox" / "another_file.abc",
386+
]
387+
(project_root / "subdirectory").mkdir()
388+
(project_root / ".tox").mkdir()
389+
for file in coverage_files:
390+
file.touch()
391+
392+
coverage_file_finder.explicitly_listed_files.append(
393+
project_root / "subdirectory" / "another_file.bash"
394+
)
317395
result = sorted(
318-
[file.get_filename() for file in self.coverage_file_finder.find_files()]
396+
[file.get_filename() for file in coverage_file_finder.find_files()]
319397
)
320398

321399
expected = [
322-
UploadCollectionResultFile(Path(f"{self.project_root}/coverage.xml")),
400+
UploadCollectionResultFile(Path(f"{project_root}/coverage.xml")),
323401
UploadCollectionResultFile(
324-
Path(f"{self.project_root}/subdirectory/test_coverage.xml")
402+
Path(f"{project_root}/subdirectory/test_coverage.xml")
325403
),
404+
UploadCollectionResultFile(Path(f"{project_root}/test_file.abc")),
326405
UploadCollectionResultFile(
327-
Path(f"{self.project_root}/.tox/another_file.abc")
406+
Path(f"{project_root}/subdirectory/another_file.abc")
407+
),
408+
UploadCollectionResultFile(
409+
Path(f"{project_root}/subdirectory/another_file.bash")
328410
),
329411
]
330412
expected_paths = sorted([file.get_filename() for file in expected])
331-
self.assertEqual(result, expected_paths)
413+
414+
assert result == expected_paths
415+
416+
assert (
417+
"Some files being explicitly added are found in the list of excluded files for upload. We are still going to search for the explicitly added files."
418+
in capsys.readouterr().err
419+
)

0 commit comments

Comments
 (0)