Skip to content

Commit

Permalink
Migrated basic streams
Browse files Browse the repository at this point in the history
  • Loading branch information
lazebnyi committed May 17, 2024
1 parent d9792e7 commit 0d79022
Show file tree
Hide file tree
Showing 8 changed files with 1,875 additions and 493 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ data:
connectorSubtype: api
connectorType: source
definitionId: 137ece28-5434-455c-8f34-69dc3782f451
dockerImageTag: 2.1.2
dockerImageTag: 3.0.0
dockerRepository: airbyte/source-linkedin-ads
documentationUrl: https://docs.airbyte.com/integrations/sources/linkedin-ads
githubIssueLabel: source-linkedin-ads
Expand Down Expand Up @@ -65,6 +65,13 @@ data:
- "ad_member_seniority_analytics"
- "ad_member_region_analytics"
- "ad_member_company_analytics"
3.0.0:
message: This upgrade changes primary key for AccountUsers streams from account to account, users so that fix deduplication for this stream.
upgradeDeadline: "2024-06-17"
scopedImpact:
- scopeType: stream
impactedScopes:
- "account_users"
suggestedStreams:
streams:
- accounts
Expand Down
324 changes: 309 additions & 15 deletions airbyte-integrations/connectors/source-linkedin-ads/poetry.lock

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ include = "source_linkedin_ads"

[tool.poetry.dependencies]
python = "^3.9,<3.12"
airbyte-cdk = "0.80.0"
airbyte-cdk = "0.89.0"

[tool.poetry.scripts]
source-linkedin-ads = "source_linkedin_ads.run:run"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.

from airbyte_cdk.sources.declarative.requesters import HttpRequester
from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_request_options_provider import (
InterpolatedRequestOptionsProvider,
RequestInput,
)
from dataclasses import dataclass
from typing import Any, Mapping, Optional
from urllib.parse import urljoin

import requests
from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_request_options_provider import (
InterpolatedRequestOptionsProvider,
)
from airbyte_cdk.sources.streams.http.exceptions import DefaultBackoffException, RequestBodyException, UserDefinedBackoffException
from airbyte_cdk.sources.streams.http.http import BODY_REQUEST_METHODS
from urllib.parse import urlencode


@dataclass
class SafeEncodeHttpRequester(HttpRequester):
"""
This custom component safely validates query parameters, ignoring the symbols ():,% for UTF-8 encoding.
Attributes:
request_body_json: Optional JSON body for the request.
request_headers: Optional headers for the request.
request_parameters: Optional parameters for the request.
request_body_data: Optional data body for the request.
"""
request_body_json: Optional[RequestInput] = None
request_headers: Optional[RequestInput] = None
request_parameters: Optional[RequestInput] = None
request_body_data: Optional[RequestInput] = None

def __post_init__(self, parameters: Mapping[str, Any]) -> None:
self.request_options_provider = InterpolatedRequestOptionsProvider(
request_body_data=self.request_body_data,
request_body_json=self.request_body_json,
request_headers=self.request_headers,
request_parameters=self.request_parameters,
config=self.config,
parameters=parameters or {},
)
super().__post_init__(parameters)

def _create_prepared_request(
self,
path: str,
headers: Optional[Mapping[str, str]] = None,
params: Optional[Mapping[str, Any]] = None,
json: Any = None,
data: Any = None,
) -> requests.PreparedRequest:
url = urljoin(self.get_url_base(), path)
http_method = str(self._http_method.value)
query_params = self.deduplicate_query_params(url, params)
query_params = urlencode(query_params, safe="():,%")
args = {"method": http_method, "url": url, "headers": headers, "params": query_params}
if http_method.upper() in BODY_REQUEST_METHODS:
if json and data:
raise RequestBodyException(
"At the same time only one of the 'request_body_data' and 'request_body_json' functions can return data"
)
elif json:
args["json"] = json
elif data:
args["data"] = data

return self._session.prepare_request(requests.Request(**args))
Loading

0 comments on commit 0d79022

Please sign in to comment.