Skip to content

Commit ededb1f

Browse files
committed
fix: len(None) bug
the bug was the the NoVersioningSystem class was not defining the list_relevant_files method, which meant it as falling back to the VersioningSystemInterface definition which returns None. This commit make the VersioningSystemInterface an ABC and makes all the relevant methods abstract, then implements the methods on the VersioningSystem implementations.
1 parent e4be32d commit ededb1f

File tree

5 files changed

+56
-7
lines changed

5 files changed

+56
-7
lines changed

codecov_cli/helpers/versioning_systems.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,27 @@
66

77
from codecov_cli.fallbacks import FallbackFieldEnum
88
from codecov_cli.helpers.git import parse_git_service, parse_slug
9+
from abc import ABC, abstractmethod
910

1011
logger = logging.getLogger("codecovcli")
1112

1213

13-
class VersioningSystemInterface(object):
14+
class VersioningSystemInterface(ABC):
1415
def __repr__(self) -> str:
1516
return str(type(self))
1617

18+
@abstractmethod
1719
def get_fallback_value(self, fallback_field: FallbackFieldEnum) -> t.Optional[str]:
1820
pass
1921

22+
@abstractmethod
2023
def get_network_root(self) -> t.Optional[Path]:
2124
pass
2225

23-
def list_relevant_files(self, directory: t.Optional[Path] = None) -> t.List[str]:
26+
@abstractmethod
27+
def list_relevant_files(
28+
self, directory: t.Optional[Path] = None
29+
) -> t.Optional[t.List[str]]:
2430
pass
2531

2632

@@ -119,8 +125,8 @@ def get_network_root(self):
119125
return Path(p.stdout.decode().rstrip())
120126
return None
121127

122-
def list_relevant_files(self, root_folder: t.Optional[Path] = None) -> t.List[str]:
123-
dir_to_use = root_folder or self.get_network_root()
128+
def list_relevant_files(self, directory: t.Optional[Path] = None) -> t.List[str]:
129+
dir_to_use = directory or self.get_network_root()
124130
if dir_to_use is None:
125131
raise ValueError("Can't determine root folder")
126132

@@ -145,3 +151,9 @@ def is_available(cls):
145151

146152
def get_network_root(self):
147153
return Path.cwd()
154+
155+
def get_fallback_value(self, fallback_field: FallbackFieldEnum):
156+
return None
157+
158+
def list_relevant_files(self, directory: t.Optional[Path] = None) -> t.List[str]:
159+
return []

codecov_cli/services/upload/network_finder.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(
2020
def find_files(self, ignore_filters=False) -> typing.List[str]:
2121
files = self.versioning_system.list_relevant_files(self.network_root_folder)
2222

23-
if not ignore_filters:
23+
if files and not ignore_filters:
2424
if self.network_filter:
2525
files = [file for file in files if file.startswith(self.network_filter)]
2626
if self.network_prefix:

codecov_cli/services/upload/upload_collector.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def generate_upload_data(
166166
f"Found {len(report_files)} {report_type.value} files to report"
167167
)
168168
logger.debug(
169-
f"Found {len(network)} network files to report, ({len(unfiltered_network)} without filtering)"
169+
f"Found {len(network) if network else None} network files to report, ({len(unfiltered_network) if network else None} without filtering)"
170170
)
171171
if not report_files:
172172
if report_type == ReportType.TEST_RESULTS:

tests/factory.py

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
55
from codecov_cli.helpers.versioning_systems import VersioningSystemInterface
66
from codecov_cli.runners.types import LabelAnalysisRunnerInterface
7+
from pathlib import Path
78

89

910
class FakeProvider(CIAdapterBase):
@@ -73,6 +74,12 @@ def __init__(self, values_dict: Optional[dict] = None):
7374
def get_fallback_value(self, fallback_field: FallbackFieldEnum) -> Optional[str]:
7475
return self.values_dict[fallback_field]
7576

77+
def get_network_root(self) -> Optional[Path]:
78+
return None
79+
80+
def list_relevant_files(self, directory: Optional[Path] = None) -> List[str]:
81+
return []
82+
7683

7784
class FakeRunner(LabelAnalysisRunnerInterface):
7885
dry_run_runner_options = ["--labels"]

tests/services/upload/test_upload_collector.py

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from pathlib import Path
22
from unittest.mock import patch
33

4-
from codecov_cli.helpers.versioning_systems import GitVersioningSystem
4+
from codecov_cli.helpers.versioning_systems import (
5+
GitVersioningSystem,
6+
NoVersioningSystem,
7+
)
58
from codecov_cli.services.upload.file_finder import FileFinder
69
from codecov_cli.services.upload.network_finder import NetworkFinder
710
from codecov_cli.services.upload.upload_collector import UploadCollector
@@ -174,3 +177,30 @@ def test_generate_upload_data(tmp_path):
174177

175178
for file in expected:
176179
assert file in res.files
180+
181+
182+
@patch("codecov_cli.services.upload.upload_collector.logger")
183+
@patch.object(GitVersioningSystem, "get_network_root", return_value=None)
184+
def test_generate_upload_data_with_none_network(
185+
mock_get_network_root, mock_logger, tmp_path
186+
):
187+
(tmp_path / "coverage.xml").touch()
188+
189+
file_finder = FileFinder(tmp_path)
190+
network_finder = NetworkFinder(NoVersioningSystem(), None, None, None)
191+
192+
collector = UploadCollector([], network_finder, file_finder, {})
193+
194+
res = collector.generate_upload_data()
195+
196+
mock_logger.debug.assert_any_call("Collecting relevant files")
197+
mock_logger.debug.assert_any_call(
198+
"Found None network files to report, (None without filtering)"
199+
)
200+
201+
mock_logger.info.assert_any_call("Found 1 coverage files to report")
202+
mock_logger.info.assert_any_call("> {}".format(tmp_path / "coverage.xml"))
203+
204+
assert res.network == []
205+
assert len(res.files) == 1
206+
assert len(res.file_fixes) == 0

0 commit comments

Comments
 (0)