Skip to content

Commit b79169d

Browse files
authored
Merge pull request #288 from autoscrape-labs/refactor/type-checking
refactor: refactor type hints for better clarity and future compatibility
2 parents c16083b + e12c4e5 commit b79169d

23 files changed

+588
-472
lines changed

pydoll/browser/chromium/base.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import asyncio
24
import json
35
import logging
@@ -8,11 +10,9 @@
810
from contextlib import suppress
911
from functools import partial
1012
from random import randint
11-
from tempfile import TemporaryDirectory
12-
from typing import Any, Awaitable, Callable, Optional, overload
13+
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Optional, overload
1314
from urllib.parse import urlsplit, urlunsplit
1415

15-
from pydoll.browser.interfaces import BrowserOptionsManager
1616
from pydoll.browser.managers import (
1717
BrowserProcessManager,
1818
ProxyManager,
@@ -35,30 +35,38 @@
3535
MissingTargetOrWebSocket,
3636
NoValidTabFound,
3737
)
38-
from pydoll.protocol.base import Command, Response, T_CommandParams, T_CommandResponse
39-
from pydoll.protocol.browser.methods import (
40-
GetVersionResponse,
41-
GetVersionResult,
42-
GetWindowForTargetResponse,
43-
)
44-
from pydoll.protocol.browser.types import Bounds, DownloadBehavior, PermissionType
45-
from pydoll.protocol.fetch.events import FetchEvent, RequestPausedEvent
46-
from pydoll.protocol.fetch.types import AuthChallengeResponseType, HeaderEntry
47-
from pydoll.protocol.network.types import (
48-
Cookie,
49-
CookieParam,
50-
ErrorReason,
51-
RequestMethod,
52-
ResourceType,
53-
)
54-
from pydoll.protocol.storage.methods import GetCookiesResponse
55-
from pydoll.protocol.target.methods import (
56-
CreateBrowserContextResponse,
57-
CreateTargetResponse,
58-
GetBrowserContextsResponse,
59-
GetTargetsResponse,
60-
)
61-
from pydoll.protocol.target.types import TargetInfo
38+
from pydoll.protocol.browser.types import DownloadBehavior
39+
from pydoll.protocol.fetch.events import FetchEvent
40+
from pydoll.protocol.fetch.types import AuthChallengeResponseType
41+
42+
if TYPE_CHECKING:
43+
from tempfile import TemporaryDirectory
44+
45+
from pydoll.browser.interfaces import BrowserOptionsManager
46+
from pydoll.protocol.base import Command, Response, T_CommandParams, T_CommandResponse
47+
from pydoll.protocol.browser.methods import (
48+
GetVersionResponse,
49+
GetVersionResult,
50+
GetWindowForTargetResponse,
51+
)
52+
from pydoll.protocol.browser.types import Bounds, PermissionType
53+
from pydoll.protocol.fetch.events import RequestPausedEvent
54+
from pydoll.protocol.fetch.types import HeaderEntry
55+
from pydoll.protocol.network.types import (
56+
Cookie,
57+
CookieParam,
58+
ErrorReason,
59+
RequestMethod,
60+
ResourceType,
61+
)
62+
from pydoll.protocol.storage.methods import GetCookiesResponse
63+
from pydoll.protocol.target.methods import (
64+
CreateBrowserContextResponse,
65+
CreateTargetResponse,
66+
GetBrowserContextsResponse,
67+
GetTargetsResponse,
68+
)
69+
from pydoll.protocol.target.types import TargetInfo
6270

6371
logger = logging.getLogger(__name__)
6472

pydoll/browser/chromium/chrome.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
from __future__ import annotations
2+
13
import logging
24
import platform
3-
from typing import Optional
5+
from typing import TYPE_CHECKING, Optional
46

57
from pydoll.browser.chromium.base import Browser
68
from pydoll.browser.managers import ChromiumOptionsManager
7-
from pydoll.browser.options import ChromiumOptions
89
from pydoll.exceptions import UnsupportedOS
910
from pydoll.utils import validate_browser_paths
1011

12+
if TYPE_CHECKING:
13+
from pydoll.browser.options import ChromiumOptions
14+
1115
logger = logging.getLogger(__name__)
1216

1317

pydoll/browser/chromium/edge.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
from __future__ import annotations
2+
13
import logging
24
import platform
3-
from typing import Optional
5+
from typing import TYPE_CHECKING, Optional
46

57
from pydoll.browser.chromium.base import Browser
68
from pydoll.browser.managers import ChromiumOptionsManager
7-
from pydoll.browser.options import Options
89
from pydoll.exceptions import UnsupportedOS
910
from pydoll.utils import validate_browser_paths
1011

12+
if TYPE_CHECKING:
13+
from pydoll.browser.options import Options
14+
1115
logger = logging.getLogger(__name__)
1216

1317

pydoll/browser/managers/browser_options_manager.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
from __future__ import annotations
2+
13
import logging
2-
from typing import Optional
4+
from typing import TYPE_CHECKING, Optional
35

4-
from pydoll.browser.interfaces import BrowserOptionsManager, Options
6+
from pydoll.browser.interfaces import BrowserOptionsManager
57
from pydoll.browser.options import ChromiumOptions
68
from pydoll.exceptions import InvalidOptionsObject
79

10+
if TYPE_CHECKING:
11+
from pydoll.browser.options import Options
12+
813
logger = logging.getLogger(__name__)
914

1015

pydoll/browser/managers/proxy_manager.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from __future__ import annotations
2+
13
import logging
2-
from typing import Optional
4+
from typing import TYPE_CHECKING, Optional
35

4-
from pydoll.browser.options import Options
6+
if TYPE_CHECKING:
7+
from pydoll.browser.options import Options
58

69
logger = logging.getLogger(__name__)
710

pydoll/browser/requests/request.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
It allows making HTTP requests using the browser's fetch API.
44
"""
55

6+
from __future__ import annotations
7+
68
import json as jsonlib
79
import logging
810
from typing import TYPE_CHECKING, Any, Callable, Optional, Union, cast
911
from urllib.parse import parse_qs, urlencode, urlparse, urlunparse
1012

11-
from pydoll.browser.requests.response import HTTPError, Response
13+
from pydoll.browser.requests.response import Response
1214
from pydoll.commands.runtime_commands import RuntimeCommands
1315
from pydoll.constants import Scripts
16+
from pydoll.exceptions import HTTPError
1417
from pydoll.protocol.fetch.types import HeaderEntry
15-
from pydoll.protocol.network.events import NetworkEvent
18+
from pydoll.protocol.network.events import NetworkEvent, ResponseReceivedExtraInfoEventParams
1619
from pydoll.protocol.network.types import CookieParam
1720

1821
logger = logging.getLogger(__name__)
@@ -27,7 +30,6 @@
2730
ResponseReceivedEvent,
2831
ResponseReceivedEventParams,
2932
ResponseReceivedExtraInfoEvent,
30-
ResponseReceivedExtraInfoEventParams,
3133
)
3234
from pydoll.protocol.runtime.methods import EvaluateResponse
3335

@@ -71,7 +73,7 @@ class Request:
7173
- Cookies are managed automatically by the browser
7274
"""
7375

74-
def __init__(self, tab: 'Tab'):
76+
def __init__(self, tab: Tab):
7577
"""Initialize a new Request instance bound to a browser tab.
7678
7779
Args:
@@ -81,8 +83,8 @@ def __init__(self, tab: 'Tab'):
8183
"""
8284
self.tab = tab
8385
self._network_events_enabled = False
84-
self._requests_sent: list['RequestSentEvent'] = []
85-
self._requests_received: list['RequestReceivedEvent'] = []
86+
self._requests_sent: list[RequestSentEvent] = []
87+
self._requests_received: list[RequestReceivedEvent] = []
8688
logger.debug('Request helper initialized for tab')
8789

8890
async def request(
@@ -334,7 +336,7 @@ def _handle_data_options(
334336
options['body'] = data
335337
logger.debug('Request data set as raw payload')
336338

337-
async def _execute_fetch_request(self, url: str, options: dict[str, Any]) -> 'EvaluateResponse':
339+
async def _execute_fetch_request(self, url: str, options: dict[str, Any]) -> EvaluateResponse:
338340
"""Execute the fetch request using browser's runtime."""
339341
script = Scripts.MAKE_REQUEST.format(url=jsonlib.dumps(url), options=jsonlib.dumps(options))
340342
await self._register_callbacks()
@@ -350,7 +352,7 @@ async def _execute_fetch_request(self, url: str, options: dict[str, Any]) -> 'Ev
350352

351353
@staticmethod
352354
def _build_response(
353-
result: 'EvaluateResponse',
355+
result: EvaluateResponse,
354356
response_headers: list[HeaderEntry],
355357
request_headers: list[HeaderEntry],
356358
cookies: list[CookieParam],
@@ -385,11 +387,11 @@ async def _register_callbacks(self) -> None:
385387
logger.debug('Network events enabled on tab for request capture')
386388

387389
def append_received_request(event: dict) -> None:
388-
self._requests_received.append(cast('RequestReceivedEvent', event))
390+
self._requests_received.append(cast(RequestReceivedEvent, event))
389391
logger.debug(f'Appended received request: event={event}')
390392

391393
def append_sent_request(event: dict) -> None:
392-
self._requests_sent.append(cast('RequestSentEvent', event))
394+
self._requests_sent.append(cast(RequestSentEvent, event))
393395
logger.debug(f'Appended sent request: event={event}')
394396

395397
await self.tab.on(
@@ -450,7 +452,7 @@ def _extract_sent_headers(self) -> list[HeaderEntry]:
450452

451453
@staticmethod
452454
def _extract_headers_from_events(
453-
events: Union[list['RequestSentEvent'], list['RequestReceivedEvent']],
455+
events: Union[list[RequestSentEvent], list[RequestReceivedEvent]],
454456
event_extractors: dict[str, Callable[[Any], list[HeaderEntry]]],
455457
) -> list[HeaderEntry]:
456458
"""Extract headers from network events using appropriate extractors.
@@ -488,7 +490,7 @@ def _extract_headers_from_events(
488490
return headers
489491

490492
def _extract_request_sent_headers(
491-
self, params: 'RequestWillBeSentEventParams'
493+
self, params: RequestWillBeSentEventParams
492494
) -> list[HeaderEntry]:
493495
"""Extract headers from main request event.
494496
@@ -503,7 +505,7 @@ def _extract_request_sent_headers(
503505
return self._convert_dict_to_header_entries(request.get('headers', {}))
504506

505507
def _extract_request_sent_extra_info_headers(
506-
self, params: 'RequestWillBeSentExtraInfoEventParams'
508+
self, params: RequestWillBeSentExtraInfoEventParams
507509
) -> list[HeaderEntry]:
508510
"""Extract headers from extra request info event.
509511
@@ -520,7 +522,7 @@ def _extract_request_sent_extra_info_headers(
520522
return self._convert_dict_to_header_entries(params.get('headers', {}))
521523

522524
def _extract_response_received_headers(
523-
self, params: 'ResponseReceivedEventParams'
525+
self, params: ResponseReceivedEventParams
524526
) -> list[HeaderEntry]:
525527
"""Extract headers from main response event.
526528
@@ -535,7 +537,7 @@ def _extract_response_received_headers(
535537
return self._convert_dict_to_header_entries(response.get('headers', {}))
536538

537539
def _extract_response_received_extra_info_headers(
538-
self, params: 'ResponseReceivedExtraInfoEventParams'
540+
self, params: ResponseReceivedExtraInfoEventParams
539541
) -> list[HeaderEntry]:
540542
"""Extract headers from extra response info event.
541543
@@ -583,7 +585,7 @@ def _extract_set_cookies(self) -> list[CookieParam]:
583585
f'response_extra_info_events={response_extra_info_events}'
584586
)
585587
for event in response_extra_info_events:
586-
params = cast('ResponseReceivedExtraInfoEventParams', event['params'])
588+
params = cast(ResponseReceivedExtraInfoEventParams, event['params'])
587589
headers = self._convert_dict_to_header_entries(params['headers'])
588590
logger.debug(f'Converting dictionary to header entries: headers={headers}')
589591
set_cookie_headers = [
@@ -598,7 +600,7 @@ def _extract_set_cookies(self) -> list[CookieParam]:
598600
logger.debug(f'Set cookies extracted: cookies={cookies}')
599601
return cookies
600602

601-
def _filter_response_extra_info_events(self) -> list['RequestReceivedEvent']:
603+
def _filter_response_extra_info_events(self) -> list[RequestReceivedEvent]:
602604
"""Filter network events to find those containing Set-Cookie information.
603605
604606
Returns:

pydoll/browser/requests/response.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
from __future__ import annotations
2+
13
import json as jsonlib
24
import logging
3-
from typing import Any, Optional, Union
5+
from typing import TYPE_CHECKING, Any, Optional, Union
6+
7+
from pydoll.exceptions import HTTPError
48

5-
from pydoll.protocol.fetch.types import HeaderEntry
6-
from pydoll.protocol.network.types import CookieParam
9+
if TYPE_CHECKING:
10+
from pydoll.protocol.fetch.types import HeaderEntry
11+
from pydoll.protocol.network.types import CookieParam
712

813
logger = logging.getLogger(__name__)
914

@@ -221,11 +226,3 @@ def raise_for_status(self) -> None:
221226
f'HTTP error status encountered: status={self.status_code}, url={self._url}'
222227
)
223228
raise HTTPError(f'{self.status_code} Client Error: for url {self._url}')
224-
225-
226-
class HTTPError(Exception):
227-
"""
228-
Exception raised for HTTP error responses (4xx and 5xx status codes).
229-
"""
230-
231-
pass

0 commit comments

Comments
 (0)