Skip to content

Commit 10184ea

Browse files
Centralize shared web request execution helpers
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent dff5ecf commit 10184ea

File tree

11 files changed

+479
-73
lines changed

11 files changed

+479
-73
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ This runs lint, format checks, compile checks, tests, and package build.
138138
- `tests/test_web_operation_metadata_usage.py` (web manager operation-metadata usage enforcement),
139139
- `tests/test_web_pagination_internal_reuse.py` (web pagination helper internal reuse of shared job pagination helpers),
140140
- `tests/test_web_payload_helper_usage.py` (web manager payload-helper usage enforcement),
141+
- `tests/test_web_request_helper_usage.py` (web manager request-helper usage enforcement),
141142
- `tests/test_web_route_constants_usage.py` (web manager route-constant usage enforcement).
142143

143144
## Code quality conventions

hyperbrowser/client/managers/async_manager/web/batch_fetch.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@
3131
DEFAULT_POLLING_RETRY_ATTEMPTS,
3232
DEFAULT_POLL_INTERVAL_SECONDS,
3333
)
34-
from ...response_utils import parse_response_model
34+
from ...web_request_utils import (
35+
get_web_job_async,
36+
get_web_job_status_async,
37+
start_web_job_async,
38+
)
3539
from ...start_job_utils import build_started_job_context
3640

3741

@@ -46,23 +50,19 @@ async def start(
4650
self, params: StartBatchFetchJobParams
4751
) -> StartBatchFetchJobResponse:
4852
payload = build_batch_fetch_start_payload(params)
49-
50-
response = await self._client.transport.post(
51-
self._client._build_url(self._ROUTE_PREFIX),
52-
data=payload,
53-
)
54-
return parse_response_model(
55-
response.data,
53+
return await start_web_job_async(
54+
client=self._client,
55+
route_prefix=self._ROUTE_PREFIX,
56+
payload=payload,
5657
model=StartBatchFetchJobResponse,
5758
operation_name=self._OPERATION_METADATA.start_operation_name,
5859
)
5960

6061
async def get_status(self, job_id: str) -> BatchFetchJobStatusResponse:
61-
response = await self._client.transport.get(
62-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}/status")
63-
)
64-
return parse_response_model(
65-
response.data,
62+
return await get_web_job_status_async(
63+
client=self._client,
64+
route_prefix=self._ROUTE_PREFIX,
65+
job_id=job_id,
6666
model=BatchFetchJobStatusResponse,
6767
operation_name=self._OPERATION_METADATA.status_operation_name,
6868
)
@@ -71,12 +71,11 @@ async def get(
7171
self, job_id: str, params: Optional[GetBatchFetchJobParams] = None
7272
) -> BatchFetchJobResponse:
7373
query_params = build_batch_fetch_get_params(params)
74-
response = await self._client.transport.get(
75-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}"),
74+
return await get_web_job_async(
75+
client=self._client,
76+
route_prefix=self._ROUTE_PREFIX,
77+
job_id=job_id,
7678
params=query_params,
77-
)
78-
return parse_response_model(
79-
response.data,
8079
model=BatchFetchJobResponse,
8180
operation_name=self._OPERATION_METADATA.job_operation_name,
8281
)

hyperbrowser/client/managers/async_manager/web/crawl.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@
3131
DEFAULT_POLLING_RETRY_ATTEMPTS,
3232
DEFAULT_POLL_INTERVAL_SECONDS,
3333
)
34-
from ...response_utils import parse_response_model
34+
from ...web_request_utils import (
35+
get_web_job_async,
36+
get_web_job_status_async,
37+
start_web_job_async,
38+
)
3539
from ...start_job_utils import build_started_job_context
3640

3741

@@ -44,23 +48,19 @@ def __init__(self, client):
4448

4549
async def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
4650
payload = build_web_crawl_start_payload(params)
47-
48-
response = await self._client.transport.post(
49-
self._client._build_url(self._ROUTE_PREFIX),
50-
data=payload,
51-
)
52-
return parse_response_model(
53-
response.data,
51+
return await start_web_job_async(
52+
client=self._client,
53+
route_prefix=self._ROUTE_PREFIX,
54+
payload=payload,
5455
model=StartWebCrawlJobResponse,
5556
operation_name=self._OPERATION_METADATA.start_operation_name,
5657
)
5758

5859
async def get_status(self, job_id: str) -> WebCrawlJobStatusResponse:
59-
response = await self._client.transport.get(
60-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}/status")
61-
)
62-
return parse_response_model(
63-
response.data,
60+
return await get_web_job_status_async(
61+
client=self._client,
62+
route_prefix=self._ROUTE_PREFIX,
63+
job_id=job_id,
6464
model=WebCrawlJobStatusResponse,
6565
operation_name=self._OPERATION_METADATA.status_operation_name,
6666
)
@@ -69,12 +69,11 @@ async def get(
6969
self, job_id: str, params: Optional[GetWebCrawlJobParams] = None
7070
) -> WebCrawlJobResponse:
7171
query_params = build_web_crawl_get_params(params)
72-
response = await self._client.transport.get(
73-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}"),
72+
return await get_web_job_async(
73+
client=self._client,
74+
route_prefix=self._ROUTE_PREFIX,
75+
job_id=job_id,
7476
params=query_params,
75-
)
76-
return parse_response_model(
77-
response.data,
7877
model=WebCrawlJobResponse,
7978
operation_name=self._OPERATION_METADATA.job_operation_name,
8079
)

hyperbrowser/client/managers/sync_manager/web/batch_fetch.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
DEFAULT_POLLING_RETRY_ATTEMPTS,
3232
DEFAULT_POLL_INTERVAL_SECONDS,
3333
)
34-
from ...response_utils import parse_response_model
34+
from ...web_request_utils import get_web_job, get_web_job_status, start_web_job
3535
from ...start_job_utils import build_started_job_context
3636

3737

@@ -44,23 +44,19 @@ def __init__(self, client):
4444

4545
def start(self, params: StartBatchFetchJobParams) -> StartBatchFetchJobResponse:
4646
payload = build_batch_fetch_start_payload(params)
47-
48-
response = self._client.transport.post(
49-
self._client._build_url(self._ROUTE_PREFIX),
50-
data=payload,
51-
)
52-
return parse_response_model(
53-
response.data,
47+
return start_web_job(
48+
client=self._client,
49+
route_prefix=self._ROUTE_PREFIX,
50+
payload=payload,
5451
model=StartBatchFetchJobResponse,
5552
operation_name=self._OPERATION_METADATA.start_operation_name,
5653
)
5754

5855
def get_status(self, job_id: str) -> BatchFetchJobStatusResponse:
59-
response = self._client.transport.get(
60-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}/status")
61-
)
62-
return parse_response_model(
63-
response.data,
56+
return get_web_job_status(
57+
client=self._client,
58+
route_prefix=self._ROUTE_PREFIX,
59+
job_id=job_id,
6460
model=BatchFetchJobStatusResponse,
6561
operation_name=self._OPERATION_METADATA.status_operation_name,
6662
)
@@ -69,12 +65,11 @@ def get(
6965
self, job_id: str, params: Optional[GetBatchFetchJobParams] = None
7066
) -> BatchFetchJobResponse:
7167
query_params = build_batch_fetch_get_params(params)
72-
response = self._client.transport.get(
73-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}"),
68+
return get_web_job(
69+
client=self._client,
70+
route_prefix=self._ROUTE_PREFIX,
71+
job_id=job_id,
7472
params=query_params,
75-
)
76-
return parse_response_model(
77-
response.data,
7873
model=BatchFetchJobResponse,
7974
operation_name=self._OPERATION_METADATA.job_operation_name,
8075
)

hyperbrowser/client/managers/sync_manager/web/crawl.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
DEFAULT_POLLING_RETRY_ATTEMPTS,
3030
DEFAULT_POLL_INTERVAL_SECONDS,
3131
)
32-
from ...response_utils import parse_response_model
32+
from ...web_request_utils import get_web_job, get_web_job_status, start_web_job
3333
from ...start_job_utils import build_started_job_context
3434

3535

@@ -42,23 +42,19 @@ def __init__(self, client):
4242

4343
def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
4444
payload = build_web_crawl_start_payload(params)
45-
46-
response = self._client.transport.post(
47-
self._client._build_url(self._ROUTE_PREFIX),
48-
data=payload,
49-
)
50-
return parse_response_model(
51-
response.data,
45+
return start_web_job(
46+
client=self._client,
47+
route_prefix=self._ROUTE_PREFIX,
48+
payload=payload,
5249
model=StartWebCrawlJobResponse,
5350
operation_name=self._OPERATION_METADATA.start_operation_name,
5451
)
5552

5653
def get_status(self, job_id: str) -> WebCrawlJobStatusResponse:
57-
response = self._client.transport.get(
58-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}/status")
59-
)
60-
return parse_response_model(
61-
response.data,
54+
return get_web_job_status(
55+
client=self._client,
56+
route_prefix=self._ROUTE_PREFIX,
57+
job_id=job_id,
6258
model=WebCrawlJobStatusResponse,
6359
operation_name=self._OPERATION_METADATA.status_operation_name,
6460
)
@@ -67,12 +63,11 @@ def get(
6763
self, job_id: str, params: Optional[GetWebCrawlJobParams] = None
6864
) -> WebCrawlJobResponse:
6965
query_params = build_web_crawl_get_params(params)
70-
response = self._client.transport.get(
71-
self._client._build_url(f"{self._ROUTE_PREFIX}/{job_id}"),
66+
return get_web_job(
67+
client=self._client,
68+
route_prefix=self._ROUTE_PREFIX,
69+
job_id=job_id,
7270
params=query_params,
73-
)
74-
return parse_response_model(
75-
response.data,
7671
model=WebCrawlJobResponse,
7772
operation_name=self._OPERATION_METADATA.job_operation_name,
7873
)
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from typing import Any, Dict, Optional, Type, TypeVar
2+
3+
from .response_utils import parse_response_model
4+
5+
T = TypeVar("T")
6+
7+
8+
def start_web_job(
9+
*,
10+
client: Any,
11+
route_prefix: str,
12+
payload: Dict[str, Any],
13+
model: Type[T],
14+
operation_name: str,
15+
) -> T:
16+
response = client.transport.post(
17+
client._build_url(route_prefix),
18+
data=payload,
19+
)
20+
return parse_response_model(
21+
response.data,
22+
model=model,
23+
operation_name=operation_name,
24+
)
25+
26+
27+
def get_web_job_status(
28+
*,
29+
client: Any,
30+
route_prefix: str,
31+
job_id: str,
32+
model: Type[T],
33+
operation_name: str,
34+
) -> T:
35+
response = client.transport.get(
36+
client._build_url(f"{route_prefix}/{job_id}/status"),
37+
)
38+
return parse_response_model(
39+
response.data,
40+
model=model,
41+
operation_name=operation_name,
42+
)
43+
44+
45+
def get_web_job(
46+
*,
47+
client: Any,
48+
route_prefix: str,
49+
job_id: str,
50+
params: Optional[Dict[str, Any]],
51+
model: Type[T],
52+
operation_name: str,
53+
) -> T:
54+
response = client.transport.get(
55+
client._build_url(f"{route_prefix}/{job_id}"),
56+
params=params,
57+
)
58+
return parse_response_model(
59+
response.data,
60+
model=model,
61+
operation_name=operation_name,
62+
)
63+
64+
65+
async def start_web_job_async(
66+
*,
67+
client: Any,
68+
route_prefix: str,
69+
payload: Dict[str, Any],
70+
model: Type[T],
71+
operation_name: str,
72+
) -> T:
73+
response = await client.transport.post(
74+
client._build_url(route_prefix),
75+
data=payload,
76+
)
77+
return parse_response_model(
78+
response.data,
79+
model=model,
80+
operation_name=operation_name,
81+
)
82+
83+
84+
async def get_web_job_status_async(
85+
*,
86+
client: Any,
87+
route_prefix: str,
88+
job_id: str,
89+
model: Type[T],
90+
operation_name: str,
91+
) -> T:
92+
response = await client.transport.get(
93+
client._build_url(f"{route_prefix}/{job_id}/status"),
94+
)
95+
return parse_response_model(
96+
response.data,
97+
model=model,
98+
operation_name=operation_name,
99+
)
100+
101+
102+
async def get_web_job_async(
103+
*,
104+
client: Any,
105+
route_prefix: str,
106+
job_id: str,
107+
params: Optional[Dict[str, Any]],
108+
model: Type[T],
109+
operation_name: str,
110+
) -> T:
111+
response = await client.transport.get(
112+
client._build_url(f"{route_prefix}/{job_id}"),
113+
params=params,
114+
)
115+
return parse_response_model(
116+
response.data,
117+
model=model,
118+
operation_name=operation_name,
119+
)

tests/test_architecture_marker_usage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"tests/test_web_operation_metadata_usage.py",
6969
"tests/test_web_pagination_internal_reuse.py",
7070
"tests/test_web_payload_helper_usage.py",
71+
"tests/test_web_request_helper_usage.py",
7172
"tests/test_web_route_constants_usage.py",
7273
)
7374

tests/test_core_type_helper_usage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"hyperbrowser/client/managers/session_upload_utils.py",
5252
"hyperbrowser/client/managers/session_profile_update_utils.py",
5353
"hyperbrowser/client/managers/web_operation_metadata.py",
54+
"hyperbrowser/client/managers/web_request_utils.py",
5455
"hyperbrowser/client/managers/web_route_constants.py",
5556
"hyperbrowser/client/managers/web_pagination_utils.py",
5657
"hyperbrowser/client/managers/web_payload_utils.py",

0 commit comments

Comments
 (0)