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

Commit c0dfa1e

Browse files
🔨 Reformat for mypy, reformat GA yml files (#291)
1 parent 1ab928e commit c0dfa1e

13 files changed

Lines changed: 73 additions & 50 deletions

.github/workflows/docker-publish.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ jobs:
4343
with:
4444
cosign-release: 'v1.7.1'
4545

46-
4746
# Workaround: https://github.com/docker/build-push-action/issues/461
4847
- name: Setup Docker buildx
4948
uses: docker/setup-buildx-action@f03ac48505955848960e80bbb68046aa35c7b9e7

.github/workflows/documentation.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ jobs:
1818
runs-on: ubuntu-latest
1919
steps:
2020
- uses: actions/checkout@v3
21+
2122
- uses: actions/setup-python@v4
2223
with:
23-
python-version: '3.9'
24+
python-version: '3.11'
25+
2426
- run: |
2527
pip3 install -U pip setuptools poetry
2628
poetry config virtualenvs.create false

.github/workflows/pypi.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,21 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- uses: actions/checkout@v3
16+
1617
- name: Set up Python
1718
uses: actions/setup-python@v4
1819
with:
19-
python-version: '3.x'
20+
python-version: '3.11'
21+
2022
- name: Install dependencies
2123
run: |
2224
pip3 install -U pip setuptools poetry
25+
2326
- name: Build package
2427
run: |
2528
poetry config http-basic.pypi ${{ secrets.PYPI_USER }} ${{ secrets.PYPI_PASS }}
2629
poetry build
30+
2731
- name: Publish package
2832
run: |
2933
poetry publish

.github/workflows/python.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,49 +35,59 @@ jobs:
3535
poetry-cache: ~\AppData\Local\pypoetry\Cache
3636
steps:
3737
- uses: actions/checkout@v3
38+
3839
- name: Set up Python ${{ matrix.python-version }}
3940
uses: actions/setup-python@v4
4041
with:
4142
python-version: ${{ matrix.python-version }}
43+
4244
- uses: actions/cache@v3
4345
with:
4446
path: ${{ matrix.pip-cache }}
4547
key: ${{ runner.os }}-${{ matrix.python-version }}-pip-${{ hashFiles('**/poetry.lock') }}
4648
restore-keys: |
4749
${{ runner.os }}-${{ matrix.python-version }}-pip-
50+
4851
- uses: actions/cache@v3
4952
with:
5053
path: ${{ matrix.poetry-cache }}
5154
key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }}
5255
restore-keys: |
5356
${{ runner.os }}-${{ matrix.python-version }}-poetry-
57+
5458
- uses: actions/cache@v3
5559
with:
5660
path: .mypy_cache
5761
key: ${{ runner.os }}-${{ matrix.python-version }}-mypy-${{ hashFiles('**/poetry.lock') }}
5862
restore-keys: |
5963
${{ runner.os }}-${{ matrix.python-version }}-mypy-
64+
6065
- uses: actions/cache@v3
6166
with:
6267
path: ~/.cache/ms-playwright
6368
key: ${{ runner.os }}-${{ matrix.python-version }}-ms-playwright-${{ hashFiles('**/poetry.lock') }}
6469
restore-keys: |
6570
${{ runner.os }}-${{ matrix.python-version }}-ms-playwright-
71+
6672
- uses: actions/cache@v3
6773
with:
6874
path: ~/.wdm
6975
key: ${{ runner.os }}-webdriver-manager
76+
7077
- name: Install dependencies
7178
run: |
7279
make install-actions
80+
7381
- name: Lint
7482
run: |
7583
make lint
84+
7685
- name: Test
7786
env:
7887
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7988
run: |
8089
make test
90+
8191
- name: Code Coverage
8292
uses: codecov/codecov-action@v3.1.1
8393
if: ${{ success() }}

.github/workflows/testpypi.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,22 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- uses: actions/checkout@v3
16+
1617
- name: Set up Python
1718
uses: actions/setup-python@v4
1819
with:
19-
python-version: '3.x'
20+
python-version: '3.11'
21+
2022
- name: Install dependencies
2123
run: |
2224
pip3 install -U pip setuptools poetry
25+
2326
- name: Build package
2427
run: |
2528
poetry config repositories.testpypi https://test.pypi.org/legacy/
2629
poetry config http-basic.testpypi ${{ secrets.TEST_PYPI_USER }} ${{ secrets.TEST_PYPI_PASS }}
2730
poetry build
31+
2832
- name: Publish package
2933
run: |
3034
poetry publish -r testpypi

dude/base.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ class ScraperBase(ABC):
4747

4848
def __init__(
4949
self,
50-
rules: List[Rule] = None,
51-
groups: Dict[Callable, Selector] = None,
52-
save_rules: Dict[Tuple[str, bool], Any] = None,
50+
rules: Optional[List[Rule]] = None,
51+
groups: Optional[Dict[Callable, Selector]] = None,
52+
save_rules: Optional[Dict[Tuple[str, bool], Any]] = None,
5353
events: Optional[DefaultDict] = None,
5454
has_async: bool = False,
5555
requests: Optional[Deque] = None, # only valid for BeautifulSoup4, lxml and Parsel backends
@@ -140,20 +140,20 @@ def run(
140140

141141
def select(
142142
self,
143-
selector: str = None,
144-
group: str = None,
143+
selector: Optional[str] = None,
144+
group: Optional[str] = None,
145145
setup: bool = False,
146146
navigate: bool = False,
147147
url_match: Union[str, Callable] = "*",
148148
priority: int = 100,
149-
css: str = None,
150-
xpath: str = None,
151-
text: str = None,
152-
regex: str = None,
153-
group_css: str = None,
154-
group_xpath: str = None,
155-
group_text: str = None,
156-
group_regex: str = None,
149+
css: Optional[str] = None,
150+
xpath: Optional[str] = None,
151+
text: Optional[str] = None,
152+
regex: Optional[str] = None,
153+
group_css: Optional[str] = None,
154+
group_xpath: Optional[str] = None,
155+
group_text: Optional[str] = None,
156+
group_regex: Optional[str] = None,
157157
) -> Callable:
158158
"""
159159
Decorator to register a handler function to a given selector.
@@ -198,11 +198,11 @@ def wrapper(func: Callable) -> Union[Callable, Coroutine]:
198198

199199
def group(
200200
self,
201-
selector: str = None,
202-
css: str = None,
203-
xpath: str = None,
204-
text: str = None,
205-
regex: str = None,
201+
selector: Optional[str] = None,
202+
css: Optional[str] = None,
203+
xpath: Optional[str] = None,
204+
text: Optional[str] = None,
205+
regex: Optional[str] = None,
206206
) -> Callable:
207207
"""
208208
Decorator to register a handler function to a given group.
@@ -431,9 +431,9 @@ def run_event(self, event_name: str) -> None:
431431
class ScraperAbstract(ScraperBase):
432432
def __init__(
433433
self,
434-
rules: List[Rule] = None,
435-
groups: Dict[Callable, Selector] = None,
436-
save_rules: Dict[Tuple[str, bool], Any] = None,
434+
rules: Optional[List[Rule]] = None,
435+
groups: Optional[Dict[Callable, Selector]] = None,
436+
save_rules: Optional[Dict[Tuple[str, bool], Any]] = None,
437437
events: Optional[DefaultDict] = None,
438438
has_async: bool = False,
439439
requests: Optional[Deque] = None,

dude/optional/beautifulsoup_scraper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def run(
2323
self,
2424
urls: Sequence[str],
2525
pages: int = 1,
26-
proxy: ProxiesTypes = None,
26+
proxy: Optional[ProxiesTypes] = None,
2727
output: Optional[str] = None,
2828
format: str = "json",
2929
follow_urls: bool = False,
@@ -127,7 +127,7 @@ async def run_async(
127127
if i == pages or not await self.navigate_async():
128128
break
129129

130-
def setup(self, soup: BeautifulSoup = None) -> None:
130+
def setup(self, soup: Optional[BeautifulSoup] = None) -> None:
131131
"""
132132
This will only call the pre-setup and post-setup events if extra actions are needed to the soup object.
133133
:param soup: BeautifulSoup object
@@ -136,7 +136,7 @@ def setup(self, soup: BeautifulSoup = None) -> None:
136136
self.event_pre_setup(soup)
137137
self.event_post_setup(soup)
138138

139-
async def setup_async(self, soup: BeautifulSoup = None) -> None:
139+
async def setup_async(self, soup: Optional[BeautifulSoup] = None) -> None:
140140
"""
141141
This will only call the pre-setup and post-setup events if extra actions are needed to the soup object.
142142
:param soup: BeautifulSoup object
@@ -152,7 +152,7 @@ async def navigate_async(self) -> bool:
152152
return False
153153

154154
def collect_elements(
155-
self, soup: BeautifulSoup = None, url: str = None
155+
self, soup: Optional[BeautifulSoup] = None, url: Optional[str] = None
156156
) -> Iterable[Tuple[str, int, int, int, Any, Callable]]:
157157
assert soup is not None
158158
assert url is not None

dude/optional/lxml_scraper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def run(
2424
self,
2525
urls: Sequence[str],
2626
pages: int = 1,
27-
proxy: ProxiesTypes = None,
27+
proxy: Optional[ProxiesTypes] = None,
2828
output: Optional[str] = None,
2929
format: str = "json",
3030
follow_urls: bool = False,
@@ -131,7 +131,7 @@ async def run_async(
131131
if i == pages or not await self.navigate_async():
132132
break
133133

134-
def setup(self, tree: _ElementTree = None) -> None:
134+
def setup(self, tree: Optional[_ElementTree] = None) -> None:
135135
"""
136136
This will only call the pre-setup and post-setup events if extra actions are needed to the tree object.
137137
:param tree: _ElementTree object
@@ -140,7 +140,7 @@ def setup(self, tree: _ElementTree = None) -> None:
140140
self.event_pre_setup(tree)
141141
self.event_post_setup(tree)
142142

143-
async def setup_async(self, tree: _ElementTree = None) -> None:
143+
async def setup_async(self, tree: Optional[_ElementTree] = None) -> None:
144144
"""
145145
This will only call the pre-setup and post-setup events if extra actions are needed to the tree object.
146146
:param tree: _ElementTree object
@@ -156,7 +156,7 @@ async def navigate_async(self) -> bool:
156156
return False
157157

158158
def collect_elements(
159-
self, tree: _Element = None, url: str = None
159+
self, tree: Optional[_Element] = None, url: Optional[str] = None
160160
) -> Iterable[Tuple[str, int, int, int, Any, Callable]]:
161161
assert tree is not None
162162
assert url is not None

dude/optional/parsel_scraper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def run(
2323
self,
2424
urls: Sequence[str],
2525
pages: int = 1,
26-
proxy: ProxiesTypes = None,
26+
proxy: Optional[ProxiesTypes] = None,
2727
output: Optional[str] = None,
2828
format: str = "json",
2929
follow_urls: bool = False,
@@ -129,7 +129,7 @@ async def run_async(
129129
if i == pages or not await self.navigate_async():
130130
break
131131

132-
def setup(self, selector: ParselSelector = None) -> None:
132+
def setup(self, selector: Optional[ParselSelector] = None) -> None:
133133
"""
134134
This will only call the pre-setup and post-setup events if extra actions are needed to the selector object.
135135
:param selector: Selector object
@@ -138,7 +138,7 @@ def setup(self, selector: ParselSelector = None) -> None:
138138
self.event_pre_setup(selector)
139139
self.event_post_setup(selector)
140140

141-
async def setup_async(self, selector: ParselSelector = None) -> None:
141+
async def setup_async(self, selector: Optional[ParselSelector] = None) -> None:
142142
"""
143143
This will only call the pre-setup and post-setup events if extra actions are needed to the selector object.
144144
:param selector: Selector object
@@ -154,7 +154,7 @@ async def navigate_async(self) -> bool:
154154
return False
155155

156156
def collect_elements(
157-
self, selector: ParselSelector = None, url: str = None
157+
self, selector: Optional[ParselSelector] = None, url: Optional[str] = None
158158
) -> Iterable[Tuple[str, int, int, int, Any, Callable]]:
159159
assert selector is not None
160160
assert url is not None

dude/optional/selenium_scraper.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def run(
7373
**kwargs,
7474
)
7575

76-
def setup(self, driver: WebDriver = None) -> None:
76+
def setup(self, driver: Optional[WebDriver] = None) -> None:
7777
"""
7878
Executes setup handlers
7979
@@ -89,7 +89,7 @@ def setup(self, driver: WebDriver = None) -> None:
8989

9090
self.event_post_setup(driver)
9191

92-
async def setup_async(self, driver: WebDriver = None) -> None:
92+
async def setup_async(self, driver: Optional[WebDriver] = None) -> None:
9393
"""
9494
Executes setup handlers
9595
@@ -108,7 +108,7 @@ async def setup_async(self, driver: WebDriver = None) -> None:
108108

109109
await self.event_post_setup_async(driver)
110110

111-
def navigate(self, driver: WebDriver = None) -> bool:
111+
def navigate(self, driver: Optional[WebDriver] = None) -> bool:
112112
"""
113113
Executes navigate handlers
114114
@@ -122,7 +122,7 @@ def navigate(self, driver: WebDriver = None) -> bool:
122122
return True
123123
return False
124124

125-
async def navigate_async(self, driver: WebDriver = None) -> bool:
125+
async def navigate_async(self, driver: Optional[WebDriver] = None) -> bool:
126126
"""
127127
Executes navigate handlers
128128
@@ -262,7 +262,9 @@ def _get_driver(self, browser_type: str, headless: bool) -> WebDriver:
262262

263263
return driver
264264

265-
def collect_elements(self, driver: WebDriver = None) -> Iterable[Tuple[str, int, int, int, Any, Callable]]:
265+
def collect_elements(
266+
self, driver: Optional[WebDriver] = None
267+
) -> Iterable[Tuple[str, int, int, int, Any, Callable]]:
266268
"""
267269
Collects all the elements and returns a generator of element-handler pair.
268270
"""

0 commit comments

Comments
 (0)