Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Bright Data Python SDK Changelog

## Version 2.5.1 - Lint cleanup

- **Chore**: pinned an explicit `ruff` lint rule scope (`select`) and sorted imports repo-wide. No behavior changes.

## Version 2.5.0 - CLI-credentials auth + scraper-core dedup

- **CLI-credentials auth fallback**: one `brightdata login` now authenticates the SDK too. With no token given, `BrightDataClient()` / `SyncBrightDataClient()` fall back to the token already saved by the Bright Data CLI. Resolution order: `token=` parameter → `BRIGHTDATA_API_TOKEN` / `BRIGHTDATA_API_KEY` env vars → CLI login → actionable error mentioning `brightdata login`.
Expand Down
8 changes: 7 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ where = ["src"]

[project]
name = "brightdata-sdk"
version = "2.5.0"
version = "2.5.1"
description = "Modern async-first Python SDK for Bright Data APIs"
authors = [{name = "Bright Data", email = "support@brightdata.com"}]
license = {text = "MIT"}
Expand Down Expand Up @@ -60,6 +60,12 @@ exclude = [
]

[tool.ruff.lint]
# Pyflakes + pycodestyle errors + isort (import sorting). Explicit, so newer
# ruff releases that broaden the "no select" default (e.g. datetimez, simplify,
# pyupgrade, bugbear) don't silently start failing CI with unrelated findings,
# and don't get auto-"fixed" into rewrites (e.g. Optional[X] -> X | None) that
# were never asked for.
select = ["E4", "E7", "E9", "F", "I"]
ignore = [
"E402", # Module level import not at top of file (common in notebooks/scripts)
"F841", # Local variable assigned but never used (common in tests)
Expand Down
86 changes: 43 additions & 43 deletions src/brightdata/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Bright Data Python SDK - Modern async-first SDK for Bright Data APIs."""

from importlib.metadata import version, PackageNotFoundError
from importlib.metadata import PackageNotFoundError, version

try:
__version__ = version("brightdata-sdk")
Expand All @@ -9,79 +9,79 @@
__version__ = "0.0.0.dev"

# Export main client (async)
from .browser.service import BrowserService
from .client import BrightDataClient
from .core.zone_manager import ZoneManager

# Export sync client adapter
from .sync_client import SyncBrightDataClient
# Export Discover API models
from .discover.models import DiscoverJob, DiscoverResult, DiscoverSnapshot

# Export exceptions
from .exceptions import (
APIError,
AuthenticationError,
BrightDataError,
NetworkError,
SSLError,
ValidationError,
ZoneError,
)

# Export result models
from .models import (
BaseResult,
ScrapeResult,
SearchResult,
CrawlResult,
Result,
ScrapeResult,
SearchResult,
)

# Export job model for manual trigger/poll/fetch
from .scrapers.job import ScrapeJob

# Export Discover API models
from .discover.models import DiscoverResult, DiscoverJob, DiscoverSnapshot

# Export payload models (dataclasses)
from .payloads import (
# Base
BasePayload,
URLPayload,
# Amazon
AmazonProductPayload,
AmazonReviewPayload,
AmazonSellerPayload,
# LinkedIn
LinkedInProfilePayload,
LinkedInJobPayload,
LinkedInCompanyPayload,
LinkedInPostPayload,
LinkedInProfileSearchPayload,
LinkedInJobSearchPayload,
LinkedInPostSearchPayload,
# Base
BasePayload,
# ChatGPT
ChatGPTPromptPayload,
FacebookCommentsPayload,
FacebookPostPayload,
FacebookPostsGroupPayload,
# Facebook
FacebookPostsProfilePayload,
FacebookPostsGroupPayload,
FacebookPostPayload,
FacebookCommentsPayload,
FacebookReelsPayload,
InstagramCommentPayload,
InstagramPostPayload,
InstagramPostsDiscoverPayload,
# Instagram
InstagramProfilePayload,
InstagramPostPayload,
InstagramCommentPayload,
InstagramReelPayload,
InstagramPostsDiscoverPayload,
InstagramReelsDiscoverPayload,
)

# Export exceptions
from .exceptions import (
BrightDataError,
ValidationError,
AuthenticationError,
APIError,
ZoneError,
NetworkError,
SSLError,
LinkedInCompanyPayload,
LinkedInJobPayload,
LinkedInJobSearchPayload,
LinkedInPostPayload,
LinkedInPostSearchPayload,
# LinkedIn
LinkedInProfilePayload,
LinkedInProfileSearchPayload,
URLPayload,
)

# Export Scraper Studio models
from .scraper_studio.models import ScraperStudioJob, JobStatus
from .scraper_studio.models import JobStatus, ScraperStudioJob
from .scraper_studio.service import ScraperStudioService

# Export job model for manual trigger/poll/fetch
from .scrapers.job import ScrapeJob

# Export sync client adapter
from .sync_client import SyncBrightDataClient

# Export services for advanced usage
from .web_unlocker.service import WebUnlockerService
from .scraper_studio.service import ScraperStudioService
from .browser.service import BrowserService
from .core.zone_manager import ZoneManager

__all__ = [
"__version__",
Expand Down
25 changes: 13 additions & 12 deletions src/brightdata/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
- Follow principle of least surprise - common patterns from other SDKs
"""

import os
import asyncio
import os
import warnings
from typing import Optional, Dict, Any, Union, List
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional, Union

try:
from dotenv import load_dotenv
Expand All @@ -21,22 +21,23 @@
except ImportError:
pass

from http import HTTPStatus

from .browser.service import BrowserService
from .cli_credentials import read_cli_credentials
from .core.engine import AsyncEngine
from .core.zone_manager import ZoneManager
from .web_unlocker.service import WebUnlockerService
from .scrapers.service import ScrapeService
from .serp.service import SearchService
from .crawler.service import CrawlerService
from .scraper_studio.service import ScraperStudioService
from .browser.service import BrowserService
from .discover.service import DiscoverService
from .discover.models import DiscoverResult, DiscoverJob
from .datasets import DatasetsClient
from .discover.models import DiscoverJob, DiscoverResult
from .discover.service import DiscoverService
from .exceptions import APIError, AuthenticationError, ValidationError
from .models import ScrapeResult
from .scraper_studio.service import ScraperStudioService
from .scrapers.service import ScrapeService
from .serp.service import SearchService
from .types import AccountInfo
from .cli_credentials import read_cli_credentials
from http import HTTPStatus
from .exceptions import ValidationError, AuthenticationError, APIError
from .web_unlocker.service import WebUnlockerService


class BrightDataClient:
Expand Down
10 changes: 6 additions & 4 deletions src/brightdata/core/engine.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
"""Async HTTP engine for Bright Data API operations."""

import asyncio
import aiohttp
import ssl
import warnings
from typing import Optional, Dict, Any
from http import HTTPStatus
from typing import Any, Dict, Optional

import aiohttp

from .. import __version__
from ..exceptions import AuthenticationError, NetworkError, SSLError
from http import HTTPStatus
from ..utils.ssl_helpers import is_ssl_certificate_error, get_ssl_error_message
from ..utils.ssl_helpers import get_ssl_error_message, is_ssl_certificate_error

# Rate limiting support
try:
Expand Down
8 changes: 5 additions & 3 deletions src/brightdata/core/zone_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@

import asyncio
import logging
import aiohttp
from typing import List, Dict, Any, Optional, Tuple
from http import HTTPStatus
from ..exceptions.errors import ZoneError, APIError, AuthenticationError
from typing import Any, Dict, List, Optional, Tuple

import aiohttp

from ..exceptions.errors import APIError, AuthenticationError, ZoneError

logger = logging.getLogger(__name__)

Expand Down
4 changes: 2 additions & 2 deletions src/brightdata/crawler/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
import json
from datetime import datetime, timezone
from http import HTTPStatus
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union

from .models import CrawlJob, CrawlResult
from ..exceptions import APIError, ValidationError
from ..utils.function_detection import get_caller_function_name
from ..utils.validation import validate_url, validate_url_list
from .models import CrawlJob, CrawlResult

if TYPE_CHECKING:
from ..client import BrightDataClient
Expand Down
Loading
Loading