From c00f36af54fbde032485b56f4a282a512513c268 Mon Sep 17 00:00:00 2001 From: davidteather <34144122+davidteather@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:34:14 -0500 Subject: [PATCH 1/4] fix: webshare provider respects `page` param in search_params Previously, `list_proxies()` would ignore the `page` parameter and fetch all available pages. Now fetches only the specified page when `page` is provided. Fixes #3 --- proxyproviders/providers/webshare.py | 2 +- tests/providers/test_webshare.py | 67 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/proxyproviders/providers/webshare.py b/proxyproviders/providers/webshare.py index b8878f5..97f4473 100644 --- a/proxyproviders/providers/webshare.py +++ b/proxyproviders/providers/webshare.py @@ -92,7 +92,7 @@ def _fetch_proxies(self) -> List[Proxy]: all_proxies.extend([self._convert_to_proxy(proxy) for proxy in proxy_data]) - if data.get("next") is None: # no more pages + if "page" in self.search_params or data.get("next") is None: break return all_proxies diff --git a/tests/providers/test_webshare.py b/tests/providers/test_webshare.py index 5cf24f5..627e218 100644 --- a/tests/providers/test_webshare.py +++ b/tests/providers/test_webshare.py @@ -182,6 +182,73 @@ def test_bad_proxy_format_response(mock_webshare): mock_webshare._fetch_proxies() +@responses.activate +def test_fetch_proxies_specific_page_stops_after_one_request(): + """ + Regression test: When 'page' is in search_params, _fetch_proxies() must + make exactly one API call and return only that page's results, even if the + response contains a 'next' URL indicating further pages exist. + """ + provider = Webshare( + api_key="test-api-key", search_params={"page": 2, "page_size": 25} + ) + + responses.add( + responses.GET, + "https://proxy.webshare.io/api/v2/proxy/list", + json={ + "results": [ + { + "id": "1", + "username": "user1", + "password": "pass1", + "proxy_address": "192.168.1.1", + "port": 8080, + "country_code": "US", + "city_name": "New York", + "created_at": "2023-05-10T12:34:56", + } + ], + "next": "https://proxy.webshare.io/api/v2/proxy/list?page=3&page_size=25", + }, + status=200, + ) + + proxies = provider._fetch_proxies() + + assert len(responses.calls) == 1 + assert len(proxies) == 1 + assert proxies[0].proxy_address == "192.168.1.1" + + +@responses.activate +def test_fetch_proxies_specific_page_sends_correct_params(): + """ + Regression test: Verify the page value from search_params is forwarded + to the API verbatim (not overridden by the internal loop counter). + """ + provider = Webshare( + api_key="test-api-key", search_params={"page": 5, "page_size": 10} + ) + + responses.add( + responses.GET, + "https://proxy.webshare.io/api/v2/proxy/list", + json={ + "results": [], + "next": "https://proxy.webshare.io/api/v2/proxy/list?page=6&page_size=10", + }, + status=200, + ) + + provider._fetch_proxies() + + assert len(responses.calls) == 1 + request_url = responses.calls[0].request.url + assert "page=5" in request_url + assert "page_size=10" in request_url + + @responses.activate def test_invalid_proxy_timestamp(mock_webshare): """ From 799ab18310c9ae5c24240d29ce30f3f24d321449 Mon Sep 17 00:00:00 2001 From: davidteather <34144122+davidteather@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:40:01 -0500 Subject: [PATCH 2/4] chore: update CI actions to use poetry v1 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bbf8e9f..fc9aacf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Poetry - run: curl -sSL https://install.python-poetry.org | python3 - + run: curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.8.3 python3 - - name: Configure Poetry to create virtualenvs in project root run: poetry config virtualenvs.in-project true From 3163edaee4d8d27ddeea333c1a7e58da7792ed09 Mon Sep 17 00:00:00 2001 From: davidteather <34144122+davidteather@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:46:46 -0500 Subject: [PATCH 3/4] bumpver and add tool.petry pyproject --- proxyproviders/version.py | 2 +- pyproject.toml | 8 +++++++- setup.cfg | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/proxyproviders/version.py b/proxyproviders/version.py index df44003..35fd71c 100644 --- a/proxyproviders/version.py +++ b/proxyproviders/version.py @@ -1,3 +1,3 @@ """Version information for proxyproviders package.""" -__version__ = "0.2.1" +__version__ = "0.2.2" diff --git a/pyproject.toml b/pyproject.toml index 824ecd4..ff32052 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,9 +2,15 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" +[tool.poetry] +name = "proxyproviders" +version = "0.2.2" +description = "A unified interface for different proxy providers" +authors = ["David Teather "] + [project] name = "proxyproviders" -version = "0.2.1" +version = "0.2.2" description = "A unified interface for different proxy providers" readme = "README.md" authors = [{ name = "David Teather", email = "contact.davidteather@gmail.com" }] diff --git a/setup.cfg b/setup.cfg index c8ba5ae..a1d69c8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.2.1 +current_version = 0.2.2 [bumpversion:file:setup.cfg] search = version = {current_version} From 78c24053450221ec0cb38e24589c6b3828e1d472 Mon Sep 17 00:00:00 2001 From: davidteather <34144122+davidteather@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:50:52 -0500 Subject: [PATCH 4/4] add poetry python dependency to pyproject --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index ff32052..a4363be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,9 @@ version = "0.2.2" description = "A unified interface for different proxy providers" authors = ["David Teather "] +[tool.poetry.dependencies] +python = ">=3.9" + [project] name = "proxyproviders" version = "0.2.2"