Skip to content

Commit 58738f7

Browse files
Centralize file-path existence checks for upload managers
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent bc2e548 commit 58738f7

6 files changed

Lines changed: 76 additions & 28 deletions

File tree

hyperbrowser/client/file_utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import os
2+
3+
from hyperbrowser.exceptions import HyperbrowserError
4+
5+
6+
def ensure_existing_file_path(
7+
file_path: str,
8+
*,
9+
missing_file_message: str,
10+
not_file_message: str,
11+
) -> None:
12+
if not os.path.exists(file_path):
13+
raise HyperbrowserError(missing_file_message)
14+
if not os.path.isfile(file_path):
15+
raise HyperbrowserError(not_file_message)

hyperbrowser/client/managers/async_manager/extension.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import os
21
from typing import List
32

43
from hyperbrowser.exceptions import HyperbrowserError
4+
from ...file_utils import ensure_existing_file_path
55
from hyperbrowser.models.extension import CreateExtensionParams, ExtensionResponse
66

77

@@ -14,13 +14,11 @@ async def create(self, params: CreateExtensionParams) -> ExtensionResponse:
1414
payload = params.model_dump(exclude_none=True, by_alias=True)
1515
payload.pop("filePath", None)
1616

17-
# Check if file exists before trying to open it
18-
if not os.path.exists(file_path):
19-
raise HyperbrowserError(f"Extension file not found at path: {file_path}")
20-
if not os.path.isfile(file_path):
21-
raise HyperbrowserError(
22-
f"Extension file path must point to a file: {file_path}"
23-
)
17+
ensure_existing_file_path(
18+
file_path,
19+
missing_file_message=f"Extension file not found at path: {file_path}",
20+
not_file_message=f"Extension file path must point to a file: {file_path}",
21+
)
2422

2523
try:
2624
with open(file_path, "rb") as extension_file:

hyperbrowser/client/managers/async_manager/session.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import IO, List, Optional, Union, overload
44
import warnings
55
from hyperbrowser.exceptions import HyperbrowserError
6+
from ...file_utils import ensure_existing_file_path
67
from ....models.session import (
78
BasicResponse,
89
CreateSessionParams,
@@ -115,12 +116,11 @@ async def upload_file(
115116
) -> UploadFileResponse:
116117
if isinstance(file_input, (str, PathLike)):
117118
file_path = os.fspath(file_input)
118-
if not os.path.exists(file_path):
119-
raise HyperbrowserError(f"Upload file not found at path: {file_path}")
120-
if not os.path.isfile(file_path):
121-
raise HyperbrowserError(
122-
f"Upload file path must point to a file: {file_path}"
123-
)
119+
ensure_existing_file_path(
120+
file_path,
121+
missing_file_message=f"Upload file not found at path: {file_path}",
122+
not_file_message=f"Upload file path must point to a file: {file_path}",
123+
)
124124
try:
125125
with open(file_path, "rb") as file_obj:
126126
files = {"file": file_obj}

hyperbrowser/client/managers/sync_manager/extension.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import os
21
from typing import List
32

43
from hyperbrowser.exceptions import HyperbrowserError
4+
from ...file_utils import ensure_existing_file_path
55
from hyperbrowser.models.extension import CreateExtensionParams, ExtensionResponse
66

77

@@ -14,13 +14,11 @@ def create(self, params: CreateExtensionParams) -> ExtensionResponse:
1414
payload = params.model_dump(exclude_none=True, by_alias=True)
1515
payload.pop("filePath", None)
1616

17-
# Check if file exists before trying to open it
18-
if not os.path.exists(file_path):
19-
raise HyperbrowserError(f"Extension file not found at path: {file_path}")
20-
if not os.path.isfile(file_path):
21-
raise HyperbrowserError(
22-
f"Extension file path must point to a file: {file_path}"
23-
)
17+
ensure_existing_file_path(
18+
file_path,
19+
missing_file_message=f"Extension file not found at path: {file_path}",
20+
not_file_message=f"Extension file path must point to a file: {file_path}",
21+
)
2422

2523
try:
2624
with open(file_path, "rb") as extension_file:

hyperbrowser/client/managers/sync_manager/session.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import IO, List, Optional, Union, overload
44
import warnings
55
from hyperbrowser.exceptions import HyperbrowserError
6+
from ...file_utils import ensure_existing_file_path
67
from ....models.session import (
78
BasicResponse,
89
CreateSessionParams,
@@ -107,12 +108,11 @@ def upload_file(
107108
) -> UploadFileResponse:
108109
if isinstance(file_input, (str, PathLike)):
109110
file_path = os.fspath(file_input)
110-
if not os.path.exists(file_path):
111-
raise HyperbrowserError(f"Upload file not found at path: {file_path}")
112-
if not os.path.isfile(file_path):
113-
raise HyperbrowserError(
114-
f"Upload file path must point to a file: {file_path}"
115-
)
111+
ensure_existing_file_path(
112+
file_path,
113+
missing_file_message=f"Upload file not found at path: {file_path}",
114+
not_file_message=f"Upload file path must point to a file: {file_path}",
115+
)
116116
try:
117117
with open(file_path, "rb") as file_obj:
118118
files = {"file": file_obj}

tests/test_file_utils.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from pathlib import Path
2+
3+
import pytest
4+
5+
from hyperbrowser.client.file_utils import ensure_existing_file_path
6+
from hyperbrowser.exceptions import HyperbrowserError
7+
8+
9+
def test_ensure_existing_file_path_accepts_existing_file(tmp_path: Path):
10+
file_path = tmp_path / "file.txt"
11+
file_path.write_text("content")
12+
13+
ensure_existing_file_path(
14+
str(file_path),
15+
missing_file_message="missing",
16+
not_file_message="not-file",
17+
)
18+
19+
20+
def test_ensure_existing_file_path_raises_for_missing_file(tmp_path: Path):
21+
missing_path = tmp_path / "missing.txt"
22+
23+
with pytest.raises(HyperbrowserError, match="missing"):
24+
ensure_existing_file_path(
25+
str(missing_path),
26+
missing_file_message="missing",
27+
not_file_message="not-file",
28+
)
29+
30+
31+
def test_ensure_existing_file_path_raises_for_directory(tmp_path: Path):
32+
with pytest.raises(HyperbrowserError, match="not-file"):
33+
ensure_existing_file_path(
34+
str(tmp_path),
35+
missing_file_message="missing",
36+
not_file_message="not-file",
37+
)

0 commit comments

Comments
 (0)