From ab5a193915dfdf1e6edff98258e931e8190a8ebc Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Sun, 14 Aug 2022 15:01:57 +0300 Subject: [PATCH 01/10] bump version source-amazon-ads 0.1.13 Signed-off-by: Sergey Chvalyuk --- airbyte-integrations/connectors/source-amazon-ads/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-amazon-ads/Dockerfile b/airbyte-integrations/connectors/source-amazon-ads/Dockerfile index b0ebacf5609e1..f19b95db7814a 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-amazon-ads/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.12 +LABEL io.airbyte.version=0.1.13 LABEL io.airbyte.name=airbyte/source-amazon-ads From 3c17aec223fc8556acb605d9a44b2bf3da10ab04 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Sun, 14 Aug 2022 15:04:18 +0300 Subject: [PATCH 02/10] REPORTING_PERIOD = 60 # added Signed-off-by: Sergey Chvalyuk --- .../streams/report_streams/report_streams.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py index 01814cdd6c78f..14e163be0aa38 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py @@ -92,6 +92,8 @@ class ReportStream(BasicAmazonAdsStream, ABC): primary_key = ["profileId", "recordType", "reportDate", "updatedAt"] # Amazon ads updates the data for the next 3 days LOOK_BACK_WINDOW = 3 + # https://advertising.amazon.com/API/docs/en-us/reporting/v2/faq#what-is-the-available-report-history-for-the-version-2-reporting-api + REPORTING_PERIOD = 60 # (Service limits section) # Format used to specify metric generation date over Amazon Ads API. REPORT_DATE_FORMAT = "YYYYMMDD" @@ -274,9 +276,9 @@ def get_start_date(self, profile: Profile, stream_state: Mapping[str, Any]) -> D start_date = stream_state.get(str(profile.profileId), {}).get(self.cursor_field) if start_date: start_date = pendulum.from_format(start_date, self.REPORT_DATE_FORMAT).date() - return max(start_date, today.subtract(days=60)) + return max(start_date, today.subtract(days=self.REPORTING_PERIOD)) if self._start_date: - return max(self._start_date, today.subtract(days=60)) + return max(self._start_date, today.subtract(days=self.REPORTING_PERIOD)) return today def stream_slices( From 70098e8146fe76e72fec10abc2d34ebf49189b82 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Sun, 14 Aug 2022 15:39:06 +0300 Subject: [PATCH 03/10] stream_slices lazy generator Signed-off-by: Sergey Chvalyuk --- .../streams/report_streams/report_streams.py | 32 ++++++++++++------- .../unit_tests/test_report_streams.py | 12 +++---- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py index 14e163be0aa38..032e3611182d2 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py @@ -21,6 +21,7 @@ from pydantic import BaseModel from source_amazon_ads.schemas import CatalogModel, MetricsReport, Profile from source_amazon_ads.streams.common import BasicAmazonAdsStream +from source_amazon_ads.utils import iterate_one_by_one logger = AirbyteLogger() @@ -267,9 +268,12 @@ def _send_http_request(self, url: str, profile_id: int, json: dict = None): raise TooManyRequests() return response - def get_date_range(self, start_date: Date, end_date: Date) -> Iterable[str]: - for days in range((end_date - start_date).days + 1): - yield start_date.add(days=days).format(ReportStream.REPORT_DATE_FORMAT) + def get_date_range(self, start_date: Date, timezone: str) -> Iterable[str]: + while True: + if start_date > pendulum.today(tz=timezone).date(): + break + yield start_date.format(self.REPORT_DATE_FORMAT) + start_date = start_date.add(days=1) def get_start_date(self, profile: Profile, stream_state: Mapping[str, Any]) -> Date: today = pendulum.today(tz=profile.timezone).date() @@ -281,21 +285,25 @@ def get_start_date(self, profile: Profile, stream_state: Mapping[str, Any]) -> D return max(self._start_date, today.subtract(days=self.REPORTING_PERIOD)) return today + def stream_profile_slices(self, profile: Profile, stream_state: Mapping[str, Any]) -> Iterable[Mapping[str, Any]]: + start_date = self.get_start_date(profile, stream_state) + for report_date in self.get_date_range(start_date, profile.timezone): + yield {"profile": profile, self.cursor_field: report_date} + def stream_slices( self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None ) -> Iterable[Optional[Mapping[str, Any]]]: stream_state = stream_state or {} + no_data = True + + generators = [self.stream_profile_slices(profile, stream_state) for profile in self._profiles] + for _slice in iterate_one_by_one(*generators): + no_data = False + yield _slice - slices = [] - for profile in self._profiles: - today = pendulum.today(tz=profile.timezone).date() - start_date = self.get_start_date(profile, stream_state) - for report_date in self.get_date_range(start_date, today): - slices.append({"profile": profile, self.cursor_field: report_date}) - if not slices: - return [None] - return slices + if no_data: + yield None def get_updated_state(self, current_stream_state: Dict[str, Any], latest_data: Mapping[str, Any]) -> Mapping[str, Any]: profileId = str(latest_data["profileId"]) diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py index 3bd230139e36d..440fcfb70c724 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py @@ -301,7 +301,7 @@ def __call__(self, request): def test_display_report_stream_slices_full_refresh(config): profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) - slices = stream.stream_slices(SyncMode.full_refresh, cursor_field=stream.cursor_field) + slices = list(stream.stream_slices(SyncMode.full_refresh, cursor_field=stream.cursor_field)) assert slices == [{"profile": profiles[0], "reportDate": "20210729"}] @@ -311,7 +311,7 @@ def test_display_report_stream_slices_incremental(config): profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) stream_state = {str(profiles[0].profileId): {"reportDate": "20210725"}} - slices = stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state) + slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state)) assert slices == [ {"profile": profiles[0], "reportDate": "20210725"}, {"profile": profiles[0], "reportDate": "20210726"}, @@ -321,13 +321,13 @@ def test_display_report_stream_slices_incremental(config): ] stream_state = {str(profiles[0].profileId): {"reportDate": "20210730"}} - slices = stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state) + slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state)) assert slices == [None] - slices = stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state={}) + slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state={})) assert slices == [{"profile": profiles[0], "reportDate": "20210729"}] - slices = stream.stream_slices(SyncMode.incremental, cursor_field=None, stream_state={}) + slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=None, stream_state={})) assert slices == [{"profile": profiles[0], "reportDate": "20210729"}] @@ -358,5 +358,5 @@ def test_stream_slices_different_timezones(config): profile1 = Profile(profileId=1, timezone="America/Los_Angeles", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller")) profile2 = Profile(profileId=2, timezone="UTC", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller")) stream = SponsoredProductsReportStream(config, [profile1, profile2], authenticator=mock.MagicMock()) - slices = stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state={}) + slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state={})) assert slices == [{"profile": profile1, "reportDate": "20210731"}, {"profile": profile2, "reportDate": "20210801"}] From 9e0beedbff09313d4fc926b678a149a6c7e5db08 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Sun, 14 Aug 2022 15:40:26 +0300 Subject: [PATCH 04/10] iterate_one_by_one added Signed-off-by: Sergey Chvalyuk --- .../source-amazon-ads/source_amazon_ads/utils.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/utils.py diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/utils.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/utils.py new file mode 100644 index 0000000000000..caa66c1d13bbb --- /dev/null +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/utils.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +def iterate_one_by_one(*iterables): + iterables = list(iterables) + while iterables: + iterable = iterables.pop(0) + try: + yield next(iterable) + except StopIteration: + pass + else: + iterables.append(iterable) From 52bdd8a89fedeb87b4c8d3a8f5c19cd10c54b4b0 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Sun, 14 Aug 2022 13:51:08 +0000 Subject: [PATCH 05/10] auto-bump connector version [ci skip] --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- airbyte-config/init/src/main/resources/seed/source_specs.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 889a5eedc5358..564e4a039e26f 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -17,7 +17,7 @@ - name: Amazon Ads sourceDefinitionId: c6b0a29e-1da9-4512-9002-7bfd0cba2246 dockerRepository: airbyte/source-amazon-ads - dockerImageTag: 0.1.12 + dockerImageTag: 0.1.13 documentationUrl: https://docs.airbyte.io/integrations/sources/amazon-ads icon: amazonads.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 80d2d5138cee8..69e37dc14992a 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -87,7 +87,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-amazon-ads:0.1.12" +- dockerImage: "airbyte/source-amazon-ads:0.1.13" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amazon-ads" connectionSpecification: From 824c7add0d315874c26229205aa134cc75877526 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Sun, 14 Aug 2022 18:38:57 +0300 Subject: [PATCH 06/10] test_stream_slices_lazy_evaluation added Signed-off-by: Sergey Chvalyuk --- .../connectors/source-amazon-ads/Dockerfile | 2 +- .../connectors/source-amazon-ads/setup.py | 2 +- .../unit_tests/test_report_streams.py | 32 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-amazon-ads/Dockerfile b/airbyte-integrations/connectors/source-amazon-ads/Dockerfile index f19b95db7814a..0c9c33346bf2d 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-amazon-ads/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.13 +LABEL io.airbyte.version=0.1.14 LABEL io.airbyte.name=airbyte/source-amazon-ads diff --git a/airbyte-integrations/connectors/source-amazon-ads/setup.py b/airbyte-integrations/connectors/source-amazon-ads/setup.py index 5d9c4a766fd81..7f4200df6c1b0 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/setup.py +++ b/airbyte-integrations/connectors/source-amazon-ads/setup.py @@ -12,7 +12,7 @@ "pytest-mock~=3.7.0", "jsonschema~=3.2.0", "responses~=0.13.3", - "freezegun~=1.1.0", + "freezegun~=1.2.0", ] setup( diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py index 440fcfb70c724..347fd6bb8b0dd 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py @@ -4,6 +4,7 @@ import re from base64 import b64decode +from datetime import timedelta from unittest import mock import pytest @@ -360,3 +361,34 @@ def test_stream_slices_different_timezones(config): stream = SponsoredProductsReportStream(config, [profile1, profile2], authenticator=mock.MagicMock()) slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state={})) assert slices == [{"profile": profile1, "reportDate": "20210731"}, {"profile": profile2, "reportDate": "20210801"}] + + +def test_stream_slices_lazy_evaluation(config): + with freeze_time("2022-06-01T23:50:00+00:00") as frozen_datetime: + config["start_date"] = "2021-05-10" + profile1 = Profile(profileId=1, timezone="UTC", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller")) + profile2 = Profile(profileId=2, timezone="UTC", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller")) + + stream = SponsoredProductsReportStream(config, [profile1, profile2], authenticator=mock.MagicMock()) + stream.REPORTING_PERIOD = 5 + + slices = [] + for _slice in stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field): + slices.append(_slice) + frozen_datetime.tick(delta=timedelta(minutes=10)) + + assert slices == [ + {"profile": profile1, "reportDate": "20220527"}, + {"profile": profile2, "reportDate": "20220528"}, + {"profile": profile1, "reportDate": "20220528"}, + {"profile": profile2, "reportDate": "20220529"}, + {"profile": profile1, "reportDate": "20220529"}, + {"profile": profile2, "reportDate": "20220530"}, + {"profile": profile1, "reportDate": "20220530"}, + {"profile": profile2, "reportDate": "20220531"}, + {"profile": profile1, "reportDate": "20220531"}, + {"profile": profile2, "reportDate": "20220601"}, + {"profile": profile1, "reportDate": "20220601"}, + {"profile": profile2, "reportDate": "20220602"}, + {"profile": profile1, "reportDate": "20220602"}, + ] From 4cfc27ccbfc7228b68f1bbc60da6717569c2b255 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Mon, 15 Aug 2022 08:46:08 +0300 Subject: [PATCH 07/10] test_get_date_range_lazy_evaluation added Signed-off-by: Sergey Chvalyuk --- .../unit_tests/test_report_streams.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py index 347fd6bb8b0dd..c4c0765ea7266 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py @@ -5,6 +5,7 @@ import re from base64 import b64decode from datetime import timedelta +from functools import partial from unittest import mock import pytest @@ -392,3 +393,23 @@ def test_stream_slices_lazy_evaluation(config): {"profile": profile2, "reportDate": "20220602"}, {"profile": profile1, "reportDate": "20220602"}, ] + + +def test_get_date_range_lazy_evaluation(): + get_date_range = partial(SponsoredProductsReportStream.get_date_range, SponsoredProductsReportStream) + + with freeze_time("2022-06-01T12:00:00+00:00") as frozen_datetime: + date_range = list(get_date_range(start_date=Date(2022, 5, 29), timezone="UTC")) + assert date_range == ["20220529", "20220530", "20220531", "20220601"] + + date_range = list(get_date_range(start_date=Date(2022, 6, 1), timezone="UTC")) + assert date_range == ["20220601"] + + date_range = list(get_date_range(start_date=Date(2022, 6, 2), timezone="UTC")) + assert date_range == [] + + date_range = [] + for date in get_date_range(start_date=Date(2022, 5, 29), timezone="UTC"): + date_range.append(date) + frozen_datetime.tick(delta=timedelta(hours=3)) + assert date_range == ["20220529", "20220530", "20220531", "20220601", "20220602"] From 61f34e7815f18fa03a3bd416566c3de0b7618241 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Mon, 15 Aug 2022 08:47:26 +0300 Subject: [PATCH 08/10] revert versions Signed-off-by: Sergey Chvalyuk --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- airbyte-config/init/src/main/resources/seed/source_specs.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 564e4a039e26f..889a5eedc5358 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -17,7 +17,7 @@ - name: Amazon Ads sourceDefinitionId: c6b0a29e-1da9-4512-9002-7bfd0cba2246 dockerRepository: airbyte/source-amazon-ads - dockerImageTag: 0.1.13 + dockerImageTag: 0.1.12 documentationUrl: https://docs.airbyte.io/integrations/sources/amazon-ads icon: amazonads.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 69e37dc14992a..80d2d5138cee8 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -87,7 +87,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-amazon-ads:0.1.13" +- dockerImage: "airbyte/source-amazon-ads:0.1.12" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amazon-ads" connectionSpecification: From 64b1c6f83512939b72ad0f882d2304c4f6b70f94 Mon Sep 17 00:00:00 2001 From: Sergey Chvalyuk Date: Mon, 15 Aug 2022 08:52:39 +0300 Subject: [PATCH 09/10] amazon-ads.md updated Signed-off-by: Sergey Chvalyuk --- docs/integrations/sources/amazon-ads.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations/sources/amazon-ads.md b/docs/integrations/sources/amazon-ads.md index 8a072bdc3d12b..a5f2f7a2e859b 100644 --- a/docs/integrations/sources/amazon-ads.md +++ b/docs/integrations/sources/amazon-ads.md @@ -90,6 +90,7 @@ Information about expected report generation waiting time you may find [here](ht | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------| +| 0.1.14 | 2022-08-15 | [15637](https://github.com/airbytehq/airbyte/pull/15637) | Generate slices by lazy evaluation | | 0.1.12 | 2022-08-09 | [15469](https://github.com/airbytehq/airbyte/pull/15469) | Define primary_key for all report streams | | 0.1.11 | 2022-07-28 | [15031](https://github.com/airbytehq/airbyte/pull/15031) | Improve report streams date-range generation | | 0.1.10 | 2022-07-26 | [15042](https://github.com/airbytehq/airbyte/pull/15042) | Update `additionalProperties` field to true from schemas | From dbf15c831033b5dd34de8af475dc1ab00ab166c4 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Tue, 16 Aug 2022 16:45:00 +0000 Subject: [PATCH 10/10] auto-bump connector version [ci skip] --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- airbyte-config/init/src/main/resources/seed/source_specs.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index f8f8bd47cfbca..6723c98a93147 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -17,7 +17,7 @@ - name: Amazon Ads sourceDefinitionId: c6b0a29e-1da9-4512-9002-7bfd0cba2246 dockerRepository: airbyte/source-amazon-ads - dockerImageTag: 0.1.12 + dockerImageTag: 0.1.14 documentationUrl: https://docs.airbyte.io/integrations/sources/amazon-ads icon: amazonads.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 6bce86b8145b9..a8f6fa453cf41 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -87,7 +87,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-amazon-ads:0.1.12" +- dockerImage: "airbyte/source-amazon-ads:0.1.14" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amazon-ads" connectionSpecification: