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

Commit 0b82e6b

Browse files
committed
using regex for slugs, reconstruct code to follow cli's architecture
1 parent 3a3488a commit 0b82e6b

File tree

5 files changed

+98
-65
lines changed

5 files changed

+98
-65
lines changed

codecov_cli/commands/base_picking.py

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import click
66

77
from codecov_cli.fallbacks import CodecovOption, FallbackFieldEnum
8-
from codecov_cli.helpers.encoder import slug_is_invalid
9-
from codecov_cli.helpers.request import send_put_request
8+
from codecov_cli.helpers.encoder import slug_without_subgroups_is_invalid
9+
from codecov_cli.services.commit.base_picking import base_picking_logic
1010

1111
logger = logging.getLogger("codecovcli")
1212

@@ -66,30 +66,15 @@ def pr_base_picking(
6666
),
6767
)
6868

69-
if slug_is_invalid(slug):
69+
if slug_without_subgroups_is_invalid(slug):
7070
logger.error(
7171
"Slug is invalid. Slug should be in the form of owner_username/repo_name"
7272
)
7373
return
7474

75-
data = {
76-
"user_provided_base_sha": base_sha,
77-
}
78-
headers = {"Authorization": f"token {token.hex}"}
79-
url = f"https://api.codecov.io/api/v1/{service}/{slug}/pulls/{pr}"
80-
sending_result = send_put_request(url=url, data=data, headers=headers)
81-
82-
if sending_result.warnings:
83-
number_warnings = len(sending_result.warnings)
84-
pluralization = "s" if number_warnings > 1 else ""
75+
res = base_picking_logic(base_sha, pr, slug, token, service)
76+
if not res.error:
8577
logger.info(
86-
f"Base picking process had {number_warnings} warning{pluralization}",
78+
"Base picking finished successfully",
79+
extra=dict(extra_log_attributes=dict(response=res.text)),
8780
)
88-
for ind, w in enumerate(sending_result.warnings):
89-
logger.warning(f"Warning {ind + 1}: {w}")
90-
if sending_result.error is not None:
91-
logger.error(f"Base picking failed: {sending_result.error.description}")
92-
return
93-
94-
logger.info("Base picking finished successfully")
95-
logger.info(sending_result.text)

codecov_cli/helpers/encoder.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
1+
import re
2+
3+
slug_without_subgroups_regex = re.compile(r"[^/\s]+\/[^/\s]+$")
4+
slug_with_subgroups_regex = re.compile(r"[^/\s]+(\/[^/\s]+)+$")
5+
6+
17
def encode_slug(slug: str):
2-
if "/" not in slug:
8+
if slug_with_subgroups_is_invalid(slug):
39
raise ValueError("The provided slug is invalid")
410
owner, repo = slug.rsplit("/", 1)
511
encoded_owner = ":::".join(owner.split("/"))
612
encoded_slug = "::::".join([encoded_owner, repo])
713
return encoded_slug
814

915

10-
def slug_is_invalid(slug: str):
11-
if "/" not in slug or slug.count("/") > 1:
12-
return True
13-
return False
16+
def slug_without_subgroups_is_invalid(slug: str):
17+
"""
18+
Checks if slug is in the form of owner/repo
19+
Returns True if it's invalid, otherwise return False
20+
"""
21+
return not slug or not slug_without_subgroups_regex.match(slug)
22+
23+
24+
def slug_with_subgroups_is_invalid(slug: str):
25+
"""
26+
Checks if slug is in the form of owner/repo or owner/subgroup/repo
27+
Returns True if it's invalid, otherwise return False
28+
"""
29+
return not slug or not slug_with_subgroups_regex.match(slug)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import logging
2+
3+
from codecov_cli.helpers.request import log_warnings_and_errors_if_any, send_put_request
4+
5+
logger = logging.getLogger("codecovcli")
6+
7+
8+
def base_picking_logic(base_sha, pr, slug, token, service):
9+
data = {
10+
"user_provided_base_sha": base_sha,
11+
}
12+
headers = {"Authorization": f"token {token.hex}"}
13+
url = f"https://api.codecov.io/api/v1/{service}/{slug}/pulls/{pr}"
14+
sending_result = send_put_request(url=url, data=data, headers=headers)
15+
16+
log_warnings_and_errors_if_any(sending_result, "Base picking")
17+
return sending_result

tests/helpers/test_encoder.py

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,55 @@
11
import pytest
22

3-
from codecov_cli.helpers.encoder import encode_slug, slug_is_invalid
4-
5-
6-
def test_invalid_slug():
7-
slug = "invalid-slug"
3+
from codecov_cli.helpers.encoder import encode_slug, slug_without_subgroups_is_invalid
4+
5+
6+
@pytest.mark.parametrize(
7+
"slug",
8+
[
9+
("invalid_slug"),
10+
(""),
11+
("/"),
12+
("//"),
13+
("///"),
14+
("random string"),
15+
(None),
16+
],
17+
)
18+
def test_encode_invalid_slug(slug):
819
with pytest.raises(ValueError) as ex:
920
encode_slug(slug)
1021

1122

12-
def test_encode_slug():
13-
slug = "owner/repo"
14-
encoded_slug = encode_slug(slug)
15-
assert encoded_slug == "owner::::repo"
16-
17-
18-
def test_encode_owner_with_subgroups_slug():
19-
slug = "owner/subgroup/repo"
20-
encoded_slug = encode_slug(slug)
21-
assert encoded_slug == "owner:::subgroup::::repo"
22-
23-
24-
def test_invalid_slug2():
25-
slug = "invalid_slug"
26-
assert slug_is_invalid(slug)
23+
@pytest.mark.parametrize(
24+
"slug, encoded_slug",
25+
[
26+
("owner/repo", "owner::::repo"),
27+
("owner/subgroup/repo", "owner:::subgroup::::repo"),
28+
],
29+
)
30+
def test_encode_valid_slug(slug, encoded_slug):
31+
expected_encoded_slug = encode_slug(slug)
32+
assert expected_encoded_slug == encoded_slug
33+
34+
35+
@pytest.mark.parametrize(
36+
"slug",
37+
[
38+
("invalid_slug"),
39+
(""),
40+
("/"),
41+
("//"),
42+
("///"),
43+
("random string"),
44+
("owner/subgroup/repo"),
45+
("owner//repo"),
46+
(None),
47+
],
48+
)
49+
def test_invalid_slug(slug):
50+
assert slug_without_subgroups_is_invalid(slug)
2751

2852

2953
def test_valid_slug():
3054
slug = "owner/repo"
31-
assert not slug_is_invalid(slug)
55+
assert not slug_without_subgroups_is_invalid(slug)

tests/test_base_picking.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
from codecov_cli.commands.base_picking import pr_base_picking
66
from codecov_cli.main import cli
7-
from codecov_cli.types import RequestError, RequestResult
7+
from codecov_cli.types import RequestError, RequestResult, RequestResultWarning
88

99

1010
def test_base_picking_command(mocker):
1111
mocked_response = mocker.patch(
12-
"codecov_cli.commands.base_picking.send_put_request",
12+
"codecov_cli.services.commit.base_picking.send_put_request",
1313
return_value=RequestResult(status_code=200, error=None, warnings=[], text=""),
1414
)
1515
token = uuid.uuid4()
@@ -30,10 +30,6 @@ def test_base_picking_command(mocker):
3030
],
3131
)
3232
assert result.exit_code == 0
33-
assert (
34-
f'debug: Starting base picking process --- {{"pr": "11", "slug": "owner/repo", "token": "{token}", "service": "github"}}'
35-
in result.output
36-
)
3733
assert "info: Base picking finished successfully" in result.output
3834
mocked_response.assert_called_once()
3935

@@ -65,9 +61,12 @@ def test_base_picking_command_slug_invalid(mocker):
6561

6662
def test_base_picking_command_warnings(mocker):
6763
mocked_response = mocker.patch(
68-
"codecov_cli.commands.base_picking.send_put_request",
64+
"codecov_cli.services.commit.base_picking.send_put_request",
6965
return_value=RequestResult(
70-
status_code=200, error=None, warnings=["some random warning"], text=""
66+
error=None,
67+
warnings=[RequestResultWarning(message="some random warning")],
68+
status_code=200,
69+
text="",
7170
),
7271
)
7372
token = uuid.uuid4()
@@ -88,10 +87,6 @@ def test_base_picking_command_warnings(mocker):
8887
],
8988
)
9089
assert result.exit_code == 0
91-
assert (
92-
f'debug: Starting base picking process --- {{"pr": "11", "slug": "owner/repo", "token": "{token}", "service": "github"}}'
93-
in result.output
94-
)
9590
assert "info: Base picking process had 1 warning" in result.output
9691
assert "Warning 1: some random warning" in result.output
9792
assert "info: Base picking finished successfully" in result.output
@@ -100,7 +95,7 @@ def test_base_picking_command_warnings(mocker):
10095

10196
def test_base_picking_command_error(mocker):
10297
mocked_response = mocker.patch(
103-
"codecov_cli.commands.base_picking.send_put_request",
98+
"codecov_cli.services.commit.base_picking.send_put_request",
10499
return_value=RequestResult(
105100
status_code=401,
106101
error=RequestError(
@@ -132,9 +127,5 @@ def test_base_picking_command_error(mocker):
132127
mocked_response.assert_called_once()
133128
print(result.output)
134129
assert result.exit_code == 0
135-
assert (
136-
f'debug: Starting base picking process --- {{"pr": "11", "slug": "owner/repo", "token": "{token}", "service": "github"}}'
137-
in result.output
138-
)
139130
assert "error: Base picking failed: Unauthorized" in result.output
140131
assert "info: Base picking finished successfully" not in result.output

0 commit comments

Comments
 (0)