diff --git a/airbyte-integrations/connectors/source-amazon-ads/integration_tests/spec.json b/airbyte-integrations/connectors/source-amazon-ads/integration_tests/spec.json
index 9e5131c4148d..f131594106f3 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/integration_tests/spec.json
+++ b/airbyte-integrations/connectors/source-amazon-ads/integration_tests/spec.json
@@ -1,11 +1,11 @@
{
- "documentationUrl": "https://docs.airbyte.com/integrations/sources/amazon-ads",
"connectionSpecification": {
- "title": "Amazon Ads Spec",
+ "title": "Source Amazon Ads",
"type": "object",
"properties": {
"auth_type": {
"title": "Auth Type",
+ "default": "oauth2.0",
"const": "oauth2.0",
"order": 0,
"type": "string"
@@ -34,18 +34,18 @@
"region": {
"title": "Region",
"description": "Region to pull data from (EU/NA/FE). See docs for more details.",
- "enum": ["NA", "EU", "FE"],
- "type": "string",
"default": "NA",
- "order": 4
+ "enum": ["NA", "EU", "FE"],
+ "order": 4,
+ "type": "string"
},
"start_date": {
"title": "Start Date",
"description": "The Start date for collecting reports, should not be more than 60 days in the past. In YYYY-MM-DD format",
"examples": ["2022-10-10", "2022-10-22"],
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
"order": 5,
"type": "string",
- "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
"format": "date"
},
"profiles": {
@@ -69,13 +69,16 @@
"state_filter": {
"title": "State Filter",
"description": "Reflects the state of the Display, Product, and Brand Campaign streams as enabled, paused, or archived. If you do not populate this field, it will be ignored completely.",
+ "default": [],
+ "order": 8,
+ "type": "array",
"items": {
- "type": "string",
- "enum": ["enabled", "paused", "archived"]
+ "title": "StateFilterEnum",
+ "description": "An enumeration.",
+ "enum": ["enabled", "paused", "archived"],
+ "type": "string"
},
- "type": "array",
- "uniqueItems": true,
- "order": 8
+ "uniqueItems": true
},
"look_back_window": {
"title": "Look Back Window",
@@ -88,8 +91,12 @@
"report_record_types": {
"title": "Report Record Types",
"description": "Optional configuration which accepts an array of string of record types. Leave blank for default behaviour to pull all report types. Use this config option only if you want to pull specific report type(s). See docs for more details",
+ "default": [],
+ "order": 10,
+ "type": "array",
"items": {
- "type": "string",
+ "title": "ReportRecordTypeEnum",
+ "description": "An enumeration.",
"enum": [
"adGroups",
"asins",
@@ -99,16 +106,17 @@
"keywords",
"productAds",
"targets"
- ]
+ ],
+ "type": "string"
},
- "type": "array",
- "uniqueItems": true,
- "order": 10
+ "uniqueItems": true
}
},
- "required": ["client_id", "client_secret", "refresh_token"],
- "additionalProperties": true
+ "required": ["client_id", "client_secret", "refresh_token"]
},
+ "documentationUrl": "https://docs.airbyte.com/integrations/sources/amazon-ads",
+ "supportsNormalization": false,
+ "supportsDBT": false,
"advanced_auth": {
"auth_flow_type": "oauth2.0",
"predicate_key": ["auth_type"],
diff --git a/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml b/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
index 4aaafc13b796..57f4e54868b7 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
+++ b/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
@@ -13,7 +13,7 @@ data:
connectorSubtype: api
connectorType: source
definitionId: c6b0a29e-1da9-4512-9002-7bfd0cba2246
- dockerImageTag: 6.0.0
+ dockerImageTag: 6.1.0
dockerRepository: airbyte/source-amazon-ads
documentationUrl: https://docs.airbyte.com/integrations/sources/amazon-ads
githubIssueLabel: source-amazon-ads
diff --git a/airbyte-integrations/connectors/source-amazon-ads/poetry.lock b/airbyte-integrations/connectors/source-amazon-ads/poetry.lock
index 714fa302e666..dc1cb5661a16 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/poetry.lock
+++ b/airbyte-integrations/connectors/source-amazon-ads/poetry.lock
@@ -2,30 +2,33 @@
[[package]]
name = "airbyte-cdk"
-version = "0.90.0"
+version = "5.17.0"
description = "A framework for writing Airbyte Connectors."
optional = false
-python-versions = "<4.0,>=3.9"
+python-versions = "<4.0,>=3.10"
files = [
- {file = "airbyte_cdk-0.90.0-py3-none-any.whl", hash = "sha256:bd0aa5843cdc4901f2e482f0e86695ca4e6db83b65c5017799255dd20535cf56"},
- {file = "airbyte_cdk-0.90.0.tar.gz", hash = "sha256:25cefc010718bada5cce3f87e7ae93068630732c0d34ce5145f8ddf7457d4d3c"},
+ {file = "airbyte_cdk-5.17.0-py3-none-any.whl", hash = "sha256:135a8fc43b00a92169dfcdc43c1d7c629aba871a0b471f950ca5d76d3741fc92"},
+ {file = "airbyte_cdk-5.17.0.tar.gz", hash = "sha256:5db70cbacec80ba3beabe4253480ab9a3947a450e8d0e39af4a91638b317b32a"},
]
[package.dependencies]
-airbyte-protocol-models = ">=0.9.0,<1.0"
+airbyte-protocol-models-dataclasses = ">=0.13,<0.14"
backoff = "*"
cachetools = "*"
cryptography = ">=42.0.5,<43.0.0"
Deprecated = ">=1.2,<1.3"
-dpath = ">=2.0.1,<2.1.0"
+dpath = ">=2.1.6,<3.0.0"
genson = "1.2.2"
isodate = ">=0.6.1,<0.7.0"
Jinja2 = ">=3.1.2,<3.2.0"
jsonref = ">=0.2,<0.3"
jsonschema = ">=3.2.0,<3.3.0"
langchain_core = "0.1.42"
+nltk = "3.8.1"
+orjson = ">=3.10.7,<4.0.0"
+pandas = "2.2.2"
pendulum = "<3.0.0"
-pydantic = ">=1.10.8,<2.0.0"
+pydantic = ">=2.7,<3.0"
pyjwt = ">=2.8.0,<3.0.0"
pyrate-limiter = ">=3.1.0,<3.2.0"
python-dateutil = "*"
@@ -33,26 +36,37 @@ pytz = "2024.1"
PyYAML = ">=6.0.1,<7.0.0"
requests = "*"
requests_cache = "*"
+serpyco-rs = ">=1.10.2,<2.0.0"
wcmatch = "8.4"
+xmltodict = ">=0.13.0,<0.14.0"
[package.extras]
-file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"]
+file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "python-snappy (==0.7.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"]
sphinx-docs = ["Sphinx (>=4.2,<4.3)", "sphinx-rtd-theme (>=1.0,<1.1)"]
+sql = ["sqlalchemy (>=2.0,!=2.0.36,<3.0)"]
vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.4.0)"]
[[package]]
-name = "airbyte-protocol-models"
+name = "airbyte-protocol-models-dataclasses"
version = "0.13.0"
-description = "Declares the Airbyte Protocol."
+description = "Declares the Airbyte Protocol using Python Dataclasses. Dataclasses in Python have less performance overhead compared to Pydantic models, making them a more efficient choice for scenarios where speed and memory usage are critical"
optional = false
python-versions = ">=3.8"
files = [
- {file = "airbyte_protocol_models-0.13.0-py3-none-any.whl", hash = "sha256:fa8b7e1a85f9ae171c50b30d23b317da1740d051994fd3ed648f9dfba00250e2"},
- {file = "airbyte_protocol_models-0.13.0.tar.gz", hash = "sha256:09d8900ba8674a9315fa1799d17026f6b38d2187c08160449540ee93331ed2e7"},
+ {file = "airbyte_protocol_models_dataclasses-0.13.0-py3-none-any.whl", hash = "sha256:0aedb99ffc4f9aab0ce91bba2c292fa17cd8fd4b42eeba196d6a16c20bbbd7a5"},
+ {file = "airbyte_protocol_models_dataclasses-0.13.0.tar.gz", hash = "sha256:72e67850d661e2808406aec5839b3158ebb94d3553b798dbdae1b4a278548d2f"},
]
-[package.dependencies]
-pydantic = ">=1.9.2,<2.0.0"
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+description = "Reusable constraint types to use with typing.Annotated"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
[[package]]
name = "anyio"
@@ -76,6 +90,17 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)",
test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"]
trio = ["trio (>=0.26.1)"]
+[[package]]
+name = "attributes-doc"
+version = "0.4.0"
+description = "PEP 224 implementation"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "attributes-doc-0.4.0.tar.gz", hash = "sha256:b1576c94a714e9fc2c65c47cf10d0c8e1a5f7c4f5ae7f69006be108d95cbfbfb"},
+ {file = "attributes_doc-0.4.0-py2.py3-none-any.whl", hash = "sha256:4c3007d9e58f3a6cb4b9c614c4d4ce2d92161581f28e594ddd8241cc3a113bdd"},
+]
+
[[package]]
name = "attrs"
version = "24.2.0"
@@ -358,6 +383,20 @@ files = [
{file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
]
+[[package]]
+name = "click"
+version = "8.1.7"
+description = "Composable command line interface toolkit"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
+ {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -442,13 +481,13 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"]
[[package]]
name = "dpath"
-version = "2.0.8"
+version = "2.2.0"
description = "Filesystem-like pathing and searching for dictionaries"
optional = false
python-versions = ">=3.7"
files = [
- {file = "dpath-2.0.8-py3-none-any.whl", hash = "sha256:f92f595214dd93a00558d75d4b858beee519f4cffca87f02616ad6cd013f3436"},
- {file = "dpath-2.0.8.tar.gz", hash = "sha256:a3440157ebe80d0a3ad794f1b61c571bef125214800ffdb9afc9424e8250fe9b"},
+ {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"},
+ {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"},
]
[[package]]
@@ -602,6 +641,17 @@ MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
+[[package]]
+name = "joblib"
+version = "1.4.2"
+description = "Lightweight pipelining with Python functions"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"},
+ {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"},
+]
+
[[package]]
name = "jsonpatch"
version = "1.33"
@@ -683,13 +733,13 @@ extended-testing = ["jinja2 (>=3,<4)"]
[[package]]
name = "langsmith"
-version = "0.1.137"
+version = "0.1.138"
description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
- {file = "langsmith-0.1.137-py3-none-any.whl", hash = "sha256:4256d5c61133749890f7b5c88321dbb133ce0f440c621ea28e76513285859b81"},
- {file = "langsmith-0.1.137.tar.gz", hash = "sha256:56cdfcc6c74cb20a3f437d5bd144feb5bf93f54c5a2918d1e568cbd084a372d4"},
+ {file = "langsmith-0.1.138-py3-none-any.whl", hash = "sha256:5c2bd5c11c75f7b3d06a0f06b115186e7326ca969fd26d66ffc65a0669012aee"},
+ {file = "langsmith-0.1.138.tar.gz", hash = "sha256:1ecf613bb52f6bf17f1510e24ad8b70d4b0259bc9d3dbfd69b648c66d4644f0b"},
]
[package.dependencies]
@@ -769,6 +819,93 @@ files = [
{file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
]
+[[package]]
+name = "nltk"
+version = "3.8.1"
+description = "Natural Language Toolkit"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"},
+ {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"},
+]
+
+[package.dependencies]
+click = "*"
+joblib = "*"
+regex = ">=2021.8.3"
+tqdm = "*"
+
+[package.extras]
+all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"]
+corenlp = ["requests"]
+machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"]
+plot = ["matplotlib"]
+tgrep = ["pyparsing"]
+twitter = ["twython"]
+
+[[package]]
+name = "numpy"
+version = "2.1.2"
+description = "Fundamental package for array computing in Python"
+optional = false
+python-versions = ">=3.10"
+files = [
+ {file = "numpy-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30d53720b726ec36a7f88dc873f0eec8447fbc93d93a8f079dfac2629598d6ee"},
+ {file = "numpy-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d3ca0a72dd8846eb6f7dfe8f19088060fcb76931ed592d29128e0219652884"},
+ {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:fc44e3c68ff00fd991b59092a54350e6e4911152682b4782f68070985aa9e648"},
+ {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7c1c60328bd964b53f8b835df69ae8198659e2b9302ff9ebb7de4e5a5994db3d"},
+ {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdb606a7478f9ad91c6283e238544451e3a95f30fb5467fbf715964341a8a86"},
+ {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d666cb72687559689e9906197e3bec7b736764df6a2e58ee265e360663e9baf7"},
+ {file = "numpy-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6eef7a2dbd0abfb0d9eaf78b73017dbfd0b54051102ff4e6a7b2980d5ac1a03"},
+ {file = "numpy-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12edb90831ff481f7ef5f6bc6431a9d74dc0e5ff401559a71e5e4611d4f2d466"},
+ {file = "numpy-2.1.2-cp310-cp310-win32.whl", hash = "sha256:a65acfdb9c6ebb8368490dbafe83c03c7e277b37e6857f0caeadbbc56e12f4fb"},
+ {file = "numpy-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:860ec6e63e2c5c2ee5e9121808145c7bf86c96cca9ad396c0bd3e0f2798ccbe2"},
+ {file = "numpy-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b42a1a511c81cc78cbc4539675713bbcf9d9c3913386243ceff0e9429ca892fe"},
+ {file = "numpy-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:faa88bc527d0f097abdc2c663cddf37c05a1c2f113716601555249805cf573f1"},
+ {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c82af4b2ddd2ee72d1fc0c6695048d457e00b3582ccde72d8a1c991b808bb20f"},
+ {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:13602b3174432a35b16c4cfb5de9a12d229727c3dd47a6ce35111f2ebdf66ff4"},
+ {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebec5fd716c5a5b3d8dfcc439be82a8407b7b24b230d0ad28a81b61c2f4659a"},
+ {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2b49c3c0804e8ecb05d59af8386ec2f74877f7ca8fd9c1e00be2672e4d399b1"},
+ {file = "numpy-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cbba4b30bf31ddbe97f1c7205ef976909a93a66bb1583e983adbd155ba72ac2"},
+ {file = "numpy-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e00ea6fc82e8a804433d3e9cedaa1051a1422cb6e443011590c14d2dea59146"},
+ {file = "numpy-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5006b13a06e0b38d561fab5ccc37581f23c9511879be7693bd33c7cd15ca227c"},
+ {file = "numpy-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:f1eb068ead09f4994dec71c24b2844f1e4e4e013b9629f812f292f04bd1510d9"},
+ {file = "numpy-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7bf0a4f9f15b32b5ba53147369e94296f5fffb783db5aacc1be15b4bf72f43b"},
+ {file = "numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db"},
+ {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f751ed0a2f250541e19dfca9f1eafa31a392c71c832b6bb9e113b10d050cb0f1"},
+ {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bd33f82e95ba7ad632bc57837ee99dba3d7e006536200c4e9124089e1bf42426"},
+ {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0"},
+ {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df"},
+ {file = "numpy-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ab4754d432e3ac42d33a269c8567413bdb541689b02d93788af4131018cbf366"},
+ {file = "numpy-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e585c8ae871fd38ac50598f4763d73ec5497b0de9a0ab4ef5b69f01c6a046142"},
+ {file = "numpy-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9c6c754df29ce6a89ed23afb25550d1c2d5fdb9901d9c67a16e0b16eaf7e2550"},
+ {file = "numpy-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e"},
+ {file = "numpy-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a84498e0d0a1174f2b3ed769b67b656aa5460c92c9554039e11f20a05650f00d"},
+ {file = "numpy-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d6ec0d4222e8ffdab1744da2560f07856421b367928026fb540e1945f2eeeaf"},
+ {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:259ec80d54999cc34cd1eb8ded513cb053c3bf4829152a2e00de2371bd406f5e"},
+ {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:675c741d4739af2dc20cd6c6a5c4b7355c728167845e3c6b0e824e4e5d36a6c3"},
+ {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b2d4e667895cc55e3ff2b56077e4c8a5604361fc21a042845ea3ad67465aa8"},
+ {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43cca367bf94a14aca50b89e9bc2061683116cfe864e56740e083392f533ce7a"},
+ {file = "numpy-2.1.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:76322dcdb16fccf2ac56f99048af32259dcc488d9b7e25b51e5eca5147a3fb98"},
+ {file = "numpy-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32e16a03138cabe0cb28e1007ee82264296ac0983714094380b408097a418cfe"},
+ {file = "numpy-2.1.2-cp313-cp313-win32.whl", hash = "sha256:242b39d00e4944431a3cd2db2f5377e15b5785920421993770cddb89992c3f3a"},
+ {file = "numpy-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f2ded8d9b6f68cc26f8425eda5d3877b47343e68ca23d0d0846f4d312ecaa445"},
+ {file = "numpy-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ffef621c14ebb0188a8633348504a35c13680d6da93ab5cb86f4e54b7e922b5"},
+ {file = "numpy-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad369ed238b1959dfbade9018a740fb9392c5ac4f9b5173f420bd4f37ba1f7a0"},
+ {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d82075752f40c0ddf57e6e02673a17f6cb0f8eb3f587f63ca1eaab5594da5b17"},
+ {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1600068c262af1ca9580a527d43dc9d959b0b1d8e56f8a05d830eea39b7c8af6"},
+ {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a26ae94658d3ba3781d5e103ac07a876b3e9b29db53f68ed7df432fd033358a8"},
+ {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13311c2db4c5f7609b462bc0f43d3c465424d25c626d95040f073e30f7570e35"},
+ {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:2abbf905a0b568706391ec6fa15161fad0fb5d8b68d73c461b3c1bab6064dd62"},
+ {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ef444c57d664d35cac4e18c298c47d7b504c66b17c2ea91312e979fcfbdfb08a"},
+ {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bdd407c40483463898b84490770199d5714dcc9dd9b792f6c6caccc523c00952"},
+ {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:da65fb46d4cbb75cb417cddf6ba5e7582eb7bb0b47db4b99c9fe5787ce5d91f5"},
+ {file = "numpy-2.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c193d0b0238638e6fc5f10f1b074a6993cb13b0b431f64079a509d63d3aa8b7"},
+ {file = "numpy-2.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a7d80b2e904faa63068ead63107189164ca443b42dd1930299e0d1cb041cec2e"},
+ {file = "numpy-2.1.2.tar.gz", hash = "sha256:13532a088217fa624c99b843eeb54640de23b3414b14aa66d023805eb731066c"},
+]
+
[[package]]
name = "orjson"
version = "3.10.10"
@@ -847,6 +984,78 @@ files = [
{file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
]
+[[package]]
+name = "pandas"
+version = "2.2.2"
+description = "Powerful data structures for data analysis, time series, and statistics"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"},
+ {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"},
+ {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"},
+ {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"},
+ {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"},
+ {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"},
+ {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"},
+ {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"},
+ {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"},
+ {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"},
+ {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"},
+ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"},
+ {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"},
+ {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"},
+ {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"},
+ {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"},
+ {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"},
+ {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"},
+ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"},
+ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"},
+ {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"},
+ {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"},
+ {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"},
+ {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"},
+ {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"},
+ {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"},
+ {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"},
+ {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"},
+ {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"},
+]
+
+[package.dependencies]
+numpy = [
+ {version = ">=1.22.4", markers = "python_version < \"3.11\""},
+ {version = ">=1.23.2", markers = "python_version == \"3.11\""},
+]
+python-dateutil = ">=2.8.2"
+pytz = ">=2020.1"
+tzdata = ">=2022.7"
+
+[package.extras]
+all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
+aws = ["s3fs (>=2022.11.0)"]
+clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
+compression = ["zstandard (>=0.19.0)"]
+computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
+consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
+excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
+feather = ["pyarrow (>=10.0.1)"]
+fss = ["fsspec (>=2022.11.0)"]
+gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
+hdf5 = ["tables (>=3.8.0)"]
+html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
+mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
+output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
+parquet = ["pyarrow (>=10.0.1)"]
+performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
+plot = ["matplotlib (>=3.6.3)"]
+postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
+pyarrow = ["pyarrow (>=10.0.1)"]
+spss = ["pyreadstat (>=1.2.0)"]
+sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
+test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
+xml = ["lxml (>=4.9.2)"]
+
[[package]]
name = "pendulum"
version = "2.1.2"
@@ -925,62 +1134,124 @@ files = [
[[package]]
name = "pydantic"
-version = "1.10.18"
-description = "Data validation and settings management using python type hints"
+version = "2.9.2"
+description = "Data validation using Python type hints"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "pydantic-1.10.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e405ffcc1254d76bb0e760db101ee8916b620893e6edfbfee563b3c6f7a67c02"},
- {file = "pydantic-1.10.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e306e280ebebc65040034bff1a0a81fd86b2f4f05daac0131f29541cafd80b80"},
- {file = "pydantic-1.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11d9d9b87b50338b1b7de4ebf34fd29fdb0d219dc07ade29effc74d3d2609c62"},
- {file = "pydantic-1.10.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b661ce52c7b5e5f600c0c3c5839e71918346af2ef20062705ae76b5c16914cab"},
- {file = "pydantic-1.10.18-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c20f682defc9ef81cd7eaa485879ab29a86a0ba58acf669a78ed868e72bb89e0"},
- {file = "pydantic-1.10.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c5ae6b7c8483b1e0bf59e5f1843e4fd8fd405e11df7de217ee65b98eb5462861"},
- {file = "pydantic-1.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:74fe19dda960b193b0eb82c1f4d2c8e5e26918d9cda858cbf3f41dd28549cb70"},
- {file = "pydantic-1.10.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72fa46abace0a7743cc697dbb830a41ee84c9db8456e8d77a46d79b537efd7ec"},
- {file = "pydantic-1.10.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef0fe7ad7cbdb5f372463d42e6ed4ca9c443a52ce544472d8842a0576d830da5"},
- {file = "pydantic-1.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a00e63104346145389b8e8f500bc6a241e729feaf0559b88b8aa513dd2065481"},
- {file = "pydantic-1.10.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae6fa2008e1443c46b7b3a5eb03800121868d5ab6bc7cda20b5df3e133cde8b3"},
- {file = "pydantic-1.10.18-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9f463abafdc92635da4b38807f5b9972276be7c8c5121989768549fceb8d2588"},
- {file = "pydantic-1.10.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3445426da503c7e40baccefb2b2989a0c5ce6b163679dd75f55493b460f05a8f"},
- {file = "pydantic-1.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:467a14ee2183bc9c902579bb2f04c3d3dac00eff52e252850509a562255b2a33"},
- {file = "pydantic-1.10.18-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:efbc8a7f9cb5fe26122acba1852d8dcd1e125e723727c59dcd244da7bdaa54f2"},
- {file = "pydantic-1.10.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24a4a159d0f7a8e26bf6463b0d3d60871d6a52eac5bb6a07a7df85c806f4c048"},
- {file = "pydantic-1.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b74be007703547dc52e3c37344d130a7bfacca7df112a9e5ceeb840a9ce195c7"},
- {file = "pydantic-1.10.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcb20d4cb355195c75000a49bb4a31d75e4295200df620f454bbc6bdf60ca890"},
- {file = "pydantic-1.10.18-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46f379b8cb8a3585e3f61bf9ae7d606c70d133943f339d38b76e041ec234953f"},
- {file = "pydantic-1.10.18-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbfbca662ed3729204090c4d09ee4beeecc1a7ecba5a159a94b5a4eb24e3759a"},
- {file = "pydantic-1.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:c6d0a9f9eccaf7f438671a64acf654ef0d045466e63f9f68a579e2383b63f357"},
- {file = "pydantic-1.10.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d5492dbf953d7d849751917e3b2433fb26010d977aa7a0765c37425a4026ff1"},
- {file = "pydantic-1.10.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe734914977eed33033b70bfc097e1baaffb589517863955430bf2e0846ac30f"},
- {file = "pydantic-1.10.18-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15fdbe568beaca9aacfccd5ceadfb5f1a235087a127e8af5e48df9d8a45ae85c"},
- {file = "pydantic-1.10.18-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c3e742f62198c9eb9201781fbebe64533a3bbf6a76a91b8d438d62b813079dbc"},
- {file = "pydantic-1.10.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19a3bd00b9dafc2cd7250d94d5b578edf7a0bd7daf102617153ff9a8fa37871c"},
- {file = "pydantic-1.10.18-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce3fcf75b2bae99aa31bd4968de0474ebe8c8258a0110903478bd83dfee4e3b"},
- {file = "pydantic-1.10.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:335a32d72c51a313b33fa3a9b0fe283503272ef6467910338e123f90925f0f03"},
- {file = "pydantic-1.10.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34a3613c7edb8c6fa578e58e9abe3c0f5e7430e0fc34a65a415a1683b9c32d9a"},
- {file = "pydantic-1.10.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9ee4e6ca1d9616797fa2e9c0bfb8815912c7d67aca96f77428e316741082a1b"},
- {file = "pydantic-1.10.18-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23e8ec1ce4e57b4f441fc91e3c12adba023fedd06868445a5b5f1d48f0ab3682"},
- {file = "pydantic-1.10.18-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:44ae8a3e35a54d2e8fa88ed65e1b08967a9ef8c320819a969bfa09ce5528fafe"},
- {file = "pydantic-1.10.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5389eb3b48a72da28c6e061a247ab224381435256eb541e175798483368fdd3"},
- {file = "pydantic-1.10.18-cp38-cp38-win_amd64.whl", hash = "sha256:069b9c9fc645474d5ea3653788b544a9e0ccd3dca3ad8c900c4c6eac844b4620"},
- {file = "pydantic-1.10.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80b982d42515632eb51f60fa1d217dfe0729f008e81a82d1544cc392e0a50ddf"},
- {file = "pydantic-1.10.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aad8771ec8dbf9139b01b56f66386537c6fe4e76c8f7a47c10261b69ad25c2c9"},
- {file = "pydantic-1.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941a2eb0a1509bd7f31e355912eb33b698eb0051730b2eaf9e70e2e1589cae1d"},
- {file = "pydantic-1.10.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65f7361a09b07915a98efd17fdec23103307a54db2000bb92095457ca758d485"},
- {file = "pydantic-1.10.18-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6951f3f47cb5ca4da536ab161ac0163cab31417d20c54c6de5ddcab8bc813c3f"},
- {file = "pydantic-1.10.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a4c5eec138a9b52c67f664c7d51d4c7234c5ad65dd8aacd919fb47445a62c86"},
- {file = "pydantic-1.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:49e26c51ca854286bffc22b69787a8d4063a62bf7d83dc21d44d2ff426108518"},
- {file = "pydantic-1.10.18-py3-none-any.whl", hash = "sha256:06a189b81ffc52746ec9c8c007f16e5167c8b0a696e1a726369327e3db7b2a82"},
- {file = "pydantic-1.10.18.tar.gz", hash = "sha256:baebdff1907d1d96a139c25136a9bb7d17e118f133a76a2ef3b845e831e3403a"},
+ {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"},
+ {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"},
]
[package.dependencies]
-typing-extensions = ">=4.2.0"
+annotated-types = ">=0.6.0"
+pydantic-core = "2.23.4"
+typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""}
[package.extras]
-dotenv = ["python-dotenv (>=0.10.4)"]
-email = ["email-validator (>=1.0.3)"]
+email = ["email-validator (>=2.0.0)"]
+timezone = ["tzdata"]
+
+[[package]]
+name = "pydantic-core"
+version = "2.23.4"
+description = "Core functionality for Pydantic validation and serialization"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"},
+ {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"},
+ {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"},
+ {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"},
+ {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"},
+ {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"},
+ {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"},
+ {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"},
+ {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"},
+ {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"},
+ {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"},
+ {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"},
+ {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"},
+ {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"},
+ {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"},
+ {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"},
+ {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"},
+ {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"},
+ {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"},
+ {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"},
+ {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"},
+ {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"},
+]
+
+[package.dependencies]
+typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
[[package]]
name = "pyjwt"
@@ -1192,6 +1463,109 @@ files = [
{file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
]
+[[package]]
+name = "regex"
+version = "2024.9.11"
+description = "Alternative regular expression module, to replace re."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"},
+ {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"},
+ {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"},
+ {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"},
+ {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"},
+ {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"},
+ {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"},
+ {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"},
+ {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"},
+ {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"},
+ {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"},
+ {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"},
+ {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"},
+ {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"},
+ {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"},
+ {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"},
+ {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"},
+ {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"},
+ {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"},
+ {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"},
+ {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"},
+ {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"},
+ {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"},
+ {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"},
+ {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"},
+ {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"},
+ {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"},
+ {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"},
+ {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"},
+ {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"},
+ {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"},
+ {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"},
+ {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"},
+ {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"},
+ {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"},
+ {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"},
+ {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"},
+ {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"},
+ {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"},
+ {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"},
+ {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"},
+ {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"},
+ {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"},
+ {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"},
+ {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"},
+ {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"},
+ {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"},
+ {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"},
+ {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"},
+ {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"},
+ {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"},
+ {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"},
+ {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"},
+ {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"},
+ {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"},
+ {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"},
+ {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"},
+ {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"},
+ {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"},
+ {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"},
+ {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"},
+ {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"},
+ {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"},
+ {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"},
+ {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"},
+ {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"},
+ {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"},
+ {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"},
+ {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"},
+ {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"},
+ {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"},
+ {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"},
+ {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"},
+ {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"},
+ {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"},
+ {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"},
+ {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"},
+ {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"},
+ {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"},
+]
+
[[package]]
name = "requests"
version = "2.32.3"
@@ -1276,23 +1650,76 @@ requests = ">=2.0.1,<3.0.0"
[[package]]
name = "responses"
-version = "0.23.3"
+version = "0.25.3"
description = "A utility library for mocking out the `requests` Python library."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "responses-0.23.3-py3-none-any.whl", hash = "sha256:e6fbcf5d82172fecc0aa1860fd91e58cbfd96cee5e96da5b63fa6eb3caa10dd3"},
- {file = "responses-0.23.3.tar.gz", hash = "sha256:205029e1cb334c21cb4ec64fc7599be48b859a0fd381a42443cdd600bfe8b16a"},
+ {file = "responses-0.25.3-py3-none-any.whl", hash = "sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb"},
+ {file = "responses-0.25.3.tar.gz", hash = "sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba"},
]
[package.dependencies]
pyyaml = "*"
requests = ">=2.30.0,<3.0"
-types-PyYAML = "*"
urllib3 = ">=1.25.10,<3.0"
[package.extras]
-tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-requests"]
+tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"]
+
+[[package]]
+name = "serpyco-rs"
+version = "1.11.0"
+description = ""
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4b2bd933539bd8c84315e2fb5ae52ef7a58ace5a6dfe3f8b73f74dc71216779e"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627f957889ff73c4d2269fc7b6bba93212381befe03633e7cb5495de66ba9a33"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0933620abc01434023e0e3e22255b7e4ab9b427b5a9a5ee00834656d792377a"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9ce46683d92e34abb20304817fc5ac6cb141a06fc7468dedb1d8865a8a9682f6"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bda437d86e8859bf91c189c1f4650899822f6d6d7b02b48f5729da904eb7bb7d"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a72bfbd282af17ebe76d122639013e802c09902543fdbbd828fb2159ec9755e"},
+ {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d4808df5384e3e8581e31a90ba7a1fa501c0837b1f174284bb8a4555b6864ea"},
+ {file = "serpyco_rs-1.11.0-cp310-none-win_amd64.whl", hash = "sha256:c7b60aef4c16d68efb0d6241f05d0a434d873d98449cbb4366b0d385f0a7172b"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d47ee577cf4d69b53917615cb031ad8708eb2f59fe78194b1968c13130fc2f7"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6090d9a1487237cdd4e9362a823eede23249602019b917e7bd57846179286e79"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7192eb3df576386fefd595ea31ae25c62522841ffec7e7aeb37a80b55bdc3213"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b52ef8affb7e71b9b98a7d5216d6a7ad03b04e990acb147cd9211c8b931c5487"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3480e09e473560c60e74aaa789e6b4d079637371aae0a98235440111464bbba7"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c92e36b0ab6fe866601c2331f7e99c809a126d21963c03d8a5c29331526deed"},
+ {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84f497361952d4566bc1f77e9e15a84a2614f593cc671fbf0a0fa80046f9c3d7"},
+ {file = "serpyco_rs-1.11.0-cp311-none-win_amd64.whl", hash = "sha256:37fc1cf192bef9784fbf1f4e03cec21750b9e704bef55cc0442f71a715eee920"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3ea93d485f03dc8b0cfb0d477f0ad2e86e78f0461b53010656ab5b4db1b41fb0"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7772410d15694b03f9c5500a2c47d62eed76e191bea4087ad042250346b1a38e"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42118463c1679846cffd2f06f47744c9b9eb33c5d0448afd88ea19e1a81a8ddd"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:79481a455b76cc56021dc55bb6d5bdda1b2b32bcb6a1ee711b597140d112e9b1"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8fd79051f9af9591fc03cf7d3033ff180416301f6a4fd3d1e3d92ebd2d68697"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c8f9aeed734a3b51f7349d04ec9063516ffa4e10b632d75e9b1309e4930e4"},
+ {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15609158b0d9591ffa118302cd9d0039970cb3faf91dce32975f7d276e7411d5"},
+ {file = "serpyco_rs-1.11.0-cp312-none-win_amd64.whl", hash = "sha256:00081eae77fbf4c5d88371c5586317ab02ccb293a330b460869a283edf2b7b69"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3028893366a1985adcedb13fa8f6f98c087c185efc427f94c2ccdafa40f45832"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c18bf511316f3abf648a68ee62ef88617bec57d3fcde69466b4361102715ae5"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7dde9ef09cdfaf7c62378186b9e29f54ec76114be4c347be6a06dd559c5681e"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:18500ebc5e75285841e35585a238629a990b709e14f68933233640d15ca17d5f"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47c23132d4e03982703a7630aa09877b41e499722142f76b6153f6619b612f3"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f8e6ba499f6a0825bee0d8f8764569d367af871b563fc6512c171474e8e5383"},
+ {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15438a076047c34cff6601a977df54948e8d39d1a86f89d05c48bc60f4c12a61"},
+ {file = "serpyco_rs-1.11.0-cp313-none-win_amd64.whl", hash = "sha256:84ee2c109415bd81904fc9abb9aec86a5dd13166808c21142cf23ec639f683bd"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5c97c16c865261577fac4effeccc7ef5e0a1e8e35e7a3ee6c90c77c3a4cd7ff9"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47825e70f86fd6ef7c4a835dea3d6e8eef4fee354ed7b39ced99f31aba74a86e"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24d220220365110edba2f778f41ab3cf396883da0f26e1361a3ada9bd0227f73"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a46f334af5a9d77acc6e1e58f355ae497900a2798929371f0545e274f6e6166"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d72b748acce4b4e3c7c9724e1eb33d033a1c26b08a698b393e0288060e0901"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2b8b6f205e8cc038d4d30dd0e70eece7bbecc816eb2f3787c330dc2218e232d"},
+ {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038d748bfff31f150f0c3edab2766b8843edb952cb1bd3bf547886beb0912dae"},
+ {file = "serpyco_rs-1.11.0-cp39-none-win_amd64.whl", hash = "sha256:0fee1c89ec2cb013dc232e4ebef88e2844357ce8631063b56639dbfb83762f20"},
+ {file = "serpyco_rs-1.11.0.tar.gz", hash = "sha256:70a844615ffb229e6e89c204b3ab7404aacaf2838911814c7d847969b8da2e3a"},
+]
+
+[package.dependencies]
+attributes-doc = "*"
+typing-extensions = "*"
[[package]]
name = "setuptools"
@@ -1363,16 +1790,25 @@ files = [
]
[[package]]
-name = "types-pyyaml"
-version = "6.0.12.20240917"
-description = "Typing stubs for PyYAML"
+name = "tqdm"
+version = "4.66.6"
+description = "Fast, Extensible Progress Meter"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.7"
files = [
- {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"},
- {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"},
+ {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"},
+ {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"},
]
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
+notebook = ["ipywidgets (>=6)"]
+slack = ["slack-sdk"]
+telegram = ["requests"]
+
[[package]]
name = "typing-extensions"
version = "4.12.2"
@@ -1384,6 +1820,17 @@ files = [
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
+[[package]]
+name = "tzdata"
+version = "2024.2"
+description = "Provider of IANA time zone data"
+optional = false
+python-versions = ">=2"
+files = [
+ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
+ {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
+]
+
[[package]]
name = "url-normalize"
version = "1.4.3"
@@ -1508,7 +1955,18 @@ files = [
{file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"},
]
+[[package]]
+name = "xmltodict"
+version = "0.13.0"
+description = "Makes working with XML feel like you are working with JSON"
+optional = false
+python-versions = ">=3.4"
+files = [
+ {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"},
+ {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"},
+]
+
[metadata]
lock-version = "2.0"
-python-versions = "^3.9,<3.12"
-content-hash = "f9cc9aa4f9fd49406de4d61d63aec486504655fcb1f7f996d633d78ee4183a03"
+python-versions = "^3.10,<3.12"
+content-hash = "cf8e95efb8a58d09996a9005c63f5455e7198fc508d79a340399617072c1aba0"
diff --git a/airbyte-integrations/connectors/source-amazon-ads/pyproject.toml b/airbyte-integrations/connectors/source-amazon-ads/pyproject.toml
index cf80c4716fd3..bc9e6f48b7ad 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/pyproject.toml
+++ b/airbyte-integrations/connectors/source-amazon-ads/pyproject.toml
@@ -3,7 +3,7 @@ requires = [ "poetry-core>=1.0.0",]
build-backend = "poetry.core.masonry.api"
[tool.poetry]
-version = "6.0.0"
+version = "6.1.0"
name = "source-amazon-ads"
description = "Source implementation for Amazon Ads."
authors = [ "Airbyte ",]
@@ -16,15 +16,14 @@ repository = "https://github.com/airbytehq/airbyte"
include = "source_amazon_ads"
[tool.poetry.dependencies]
-python = "^3.9,<3.12"
-airbyte-cdk = "0.90.0"
-pendulum = "==2.1.2"
+python = "^3.10,<3.12"
+airbyte-cdk = "^5"
[tool.poetry.scripts]
source-amazon-ads = "source_amazon_ads.run:run"
[tool.poetry.group.dev.dependencies]
-responses = "^0.23.1"
+responses = "^0.25"
freezegun = "*"
requests-mock = "*"
pytest-mock = "*"
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/declarative_source_adapter.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/declarative_source_adapter.py
deleted file mode 100644
index 5772e3ba862d..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/declarative_source_adapter.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
-#
-
-
-from logging import Logger
-from typing import Any, List, Mapping
-
-from airbyte_cdk.models import AirbyteConnectionStatus, ConnectorSpecification
-from airbyte_cdk.sources import AbstractSource
-from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource
-from airbyte_cdk.sources.streams import Stream
-
-
-class DeclarativeSourceAdapter(YamlDeclarativeSource):
- def __init__(self, source: AbstractSource) -> None:
- self._source = source
- super().__init__(path_to_yaml="manifest.yaml")
- self._set_adapted_methods()
-
- @property
- def name(self) -> str:
- return self._source.name
-
- def spec(self, logger: Logger) -> ConnectorSpecification:
- return self._source.spec(logger)
-
- def check(self, logger: Logger, config: Mapping[str, Any]) -> AirbyteConnectionStatus:
- return self._source.check(logger, config)
-
- def streams(self, config: Mapping[str, Any]) -> List[Stream]:
- return self._source.streams(config)
-
- def _validate_source(self) -> None:
- """Skipping manifest validation as it can be incomplete when use adapter"""
- return
-
- def _set_adapted_methods(self) -> None:
- """
- Since the adapter is intended to smoothly migrate the connector,
- this method determines whether each of methods `spec`, `check`, and `streams` was declared in the manifest file
- and if yes, makes the source use it, otherwise the method defined in the source will be used
- """
- adapted_methods = ("spec", "check", "streams")
- for method in adapted_methods:
- if method in self.resolved_manifest:
- self._source.__setattr__(method, getattr(super(), method))
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
index 0436d379599e..a8012240de66 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
@@ -8,10 +8,9 @@
from airbyte_cdk.entrypoint import launch
from source_amazon_ads import SourceAmazonAds
from source_amazon_ads.config_migrations import MigrateStartDate
-from source_amazon_ads.declarative_source_adapter import DeclarativeSourceAdapter
def run():
- source = DeclarativeSourceAdapter(source=SourceAmazonAds())
+ source = SourceAmazonAds()
MigrateStartDate.migrate(sys.argv[1:], source)
launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/__init__.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/__init__.py
deleted file mode 100644
index 053c733ac2ff..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/__init__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-from .attribution_report import AttributionReportModel
-from .common import (
- CatalogModel,
- Keywords,
- MetricsReport,
- NegativeKeywords,
- Portfolio
-)
-from .profile import Profile
-from .sponsored_brands import (
- BrandsAdGroup,
- BrandsCampaign,
-)
-from .sponsored_display import DisplayAdGroup, DisplayBudgetRules, DisplayCampaign, DisplayCreatives, DisplayProductAds, DisplayTargeting
-from .sponsored_products import (
- ProductAd,
- ProductAdGroupBidRecommendations,
- ProductAdGroups,
- ProductAdGroupSuggestedKeywords,
- ProductCampaign,
- ProductTargeting,
- SponsoredProductCampaignNegativeKeywordsModel,
- SponsoredProductKeywordsModel,
- SponsoredProductNegativeKeywordsModel
-)
-
-__all__ = [
- "BrandsAdGroup",
- "BrandsCampaign",
- "CatalogModel",
- "DisplayAdGroup",
- "DisplayCampaign",
- "DisplayProductAds",
- "DisplayTargeting",
- "DisplayBudgetRules",
- "Keywords",
- "DisplayCreatives",
- "MetricsReport",
- "NegativeKeywords",
- "CampaignNegativeKeywords",
- "Portfolio",
- "ProductAd",
- "ProductAdGroups",
- "ProductAdGroupBidRecommendations",
- "ProductAdGroupSuggestedKeywords",
- "ProductCampaign",
- "ProductTargeting",
- "Profile",
- "AttributionReportModel",
- "SponsoredProductCampaignNegativeKeywordsModel",
- "SponsoredProductKeywordsModel",
- "SponsoredProductNegativeKeywordsModel"
-]
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report.py
deleted file mode 100644
index b7b3e89c5a79..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from typing import Optional
-
-from .common import CatalogModel
-
-
-class AttributionReportModel(CatalogModel):
- date: str
- brandName: str
- marketplace: str
- campaignId: Optional[str]
- productAsin: str
- productConversionType: str
- advertiserName: str
- adGroupId: Optional[str]
- creativeId: Optional[str]
- productName: str
- productCategory: str
- productSubcategory: str
- productGroup: str
- publisher: Optional[str]
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_adgroup.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_adgroup.json
new file mode 100644
index 000000000000..80422aa45cf3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_adgroup.json
@@ -0,0 +1,118 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "date": {
+ "type": ["null", "string"]
+ },
+ "brandName": {
+ "type": ["null", "string"]
+ },
+ "marketplace": {
+ "type": ["null", "string"]
+ },
+ "campaignId": {
+ "type": ["null", "string"]
+ },
+ "productAsin": {
+ "type": ["null", "string"]
+ },
+ "productConversionType": {
+ "type": ["null", "string"]
+ },
+ "advertiserName": {
+ "type": ["null", "string"]
+ },
+ "adGroupId": {
+ "type": ["null", "string"]
+ },
+ "creativeId": {
+ "type": ["null", "string"]
+ },
+ "productName": {
+ "type": ["null", "string"]
+ },
+ "productCategory": {
+ "type": ["null", "string"]
+ },
+ "productSubcategory": {
+ "type": ["null", "string"]
+ },
+ "productGroup": {
+ "type": ["null", "string"]
+ },
+ "publisher": {
+ "type": ["null", "string"]
+ },
+ "Click-throughs": {
+ "type": ["null", "string"]
+ },
+ "attributedDetailPageViewsClicks14d": {
+ "type": ["null", "string"]
+ },
+ "attributedAddToCartClicks14d": {
+ "type": ["null", "string"]
+ },
+ "attributedPurchases14d": {
+ "type": ["null", "string"]
+ },
+ "unitsSold14d": {
+ "type": ["null", "string"]
+ },
+ "attributedSales14d": {
+ "type": ["null", "string"]
+ },
+ "attributedTotalDetailPageViewsClicks14d": {
+ "type": ["null", "string"]
+ },
+ "attributedTotalAddToCartClicks14d": {
+ "type": ["null", "string"]
+ },
+ "attributedTotalPurchases14d": {
+ "type": ["null", "string"]
+ },
+ "totalUnitsSold14d": {
+ "type": ["null", "string"]
+ },
+ "totalAttributedSales14d": {
+ "type": ["null", "string"]
+ },
+ "brb_bonus_amount": {
+ "type": ["null", "string"]
+ },
+ "brandHaloDetailPageViewsClicks14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloAttributedAddToCartClicks14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloAttributedPurchases14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloUnitsSold14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloAttributedSales14d": {
+ "type": ["null", "string"]
+ },
+ "attributedNewToBrandPurchases14d": {
+ "type": ["null", "string"]
+ },
+ "attributedNewToBrandUnitsSold14d": {
+ "type": ["null", "string"]
+ },
+ "attributedNewToBrandSales14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloNewToBrandPurchases14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloNewToBrandUnitsSold14d": {
+ "type": ["null", "string"]
+ },
+ "brandHaloNewToBrandSales14d": {
+ "type": ["null", "string"]
+ }
+ },
+ "title": "attribution_report_performance_adgroup",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_campaign.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_campaign.json
new file mode 100644
index 000000000000..2dc5c6ef17a3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_campaign.json
@@ -0,0 +1,44 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "date": { "type": ["null", "string"] },
+ "brandName": { "type": ["null", "string"] },
+ "marketplace": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "productAsin": { "type": ["null", "string"] },
+ "productConversionType": { "type": ["null", "string"] },
+ "advertiserName": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "creativeId": { "type": ["null", "string"] },
+ "productName": { "type": ["null", "string"] },
+ "productCategory": { "type": ["null", "string"] },
+ "productSubcategory": { "type": ["null", "string"] },
+ "productGroup": { "type": ["null", "string"] },
+ "publisher": { "type": ["null", "string"] },
+ "Click-throughs": { "type": ["null", "string"] },
+ "attributedDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedPurchases14d": { "type": ["null", "string"] },
+ "unitsSold14d": { "type": ["null", "string"] },
+ "attributedSales14d": { "type": ["null", "string"] },
+ "attributedTotalDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedTotalAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedTotalPurchases14d": { "type": ["null", "string"] },
+ "totalUnitsSold14d": { "type": ["null", "string"] },
+ "totalAttributedSales14d": { "type": ["null", "string"] },
+ "brb_bonus_amount": { "type": ["null", "string"] },
+ "brandHaloDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedPurchases14d": { "type": ["null", "string"] },
+ "brandHaloUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloAttributedSales14d": { "type": ["null", "string"] },
+ "attributedNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "attributedNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "attributedNewToBrandSales14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandSales14d": { "type": ["null", "string"] }
+ },
+ "title": "attribution_report_performance_campaign",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_creative.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_creative.json
new file mode 100644
index 000000000000..752537d60c06
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_creative.json
@@ -0,0 +1,44 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "date": { "type": ["null", "string"] },
+ "brandName": { "type": ["null", "string"] },
+ "marketplace": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "productAsin": { "type": ["null", "string"] },
+ "productConversionType": { "type": ["null", "string"] },
+ "advertiserName": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "creativeId": { "type": ["null", "string"] },
+ "productName": { "type": ["null", "string"] },
+ "productCategory": { "type": ["null", "string"] },
+ "productSubcategory": { "type": ["null", "string"] },
+ "productGroup": { "type": ["null", "string"] },
+ "publisher": { "type": ["null", "string"] },
+ "Click-throughs": { "type": ["null", "string"] },
+ "attributedDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedPurchases14d": { "type": ["null", "string"] },
+ "unitsSold14d": { "type": ["null", "string"] },
+ "attributedSales14d": { "type": ["null", "string"] },
+ "attributedTotalDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedTotalAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedTotalPurchases14d": { "type": ["null", "string"] },
+ "totalUnitsSold14d": { "type": ["null", "string"] },
+ "totalAttributedSales14d": { "type": ["null", "string"] },
+ "brb_bonus_amount": { "type": ["null", "string"] },
+ "brandHaloDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedPurchases14d": { "type": ["null", "string"] },
+ "brandHaloUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloAttributedSales14d": { "type": ["null", "string"] },
+ "attributedNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "attributedNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "attributedNewToBrandSales14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandSales14d": { "type": ["null", "string"] }
+ },
+ "title": "attribution_report_performance_creative",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_products.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_products.json
new file mode 100644
index 000000000000..9d367b04ac7b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_products.json
@@ -0,0 +1,44 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "date": { "type": ["null", "string"] },
+ "brandName": { "type": ["null", "string"] },
+ "marketplace": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "productAsin": { "type": ["null", "string"] },
+ "productConversionType": { "type": ["null", "string"] },
+ "advertiserName": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "creativeId": { "type": ["null", "string"] },
+ "productName": { "type": ["null", "string"] },
+ "productCategory": { "type": ["null", "string"] },
+ "productSubcategory": { "type": ["null", "string"] },
+ "productGroup": { "type": ["null", "string"] },
+ "publisher": { "type": ["null", "string"] },
+ "Click-throughs": { "type": ["null", "string"] },
+ "attributedDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedPurchases14d": { "type": ["null", "string"] },
+ "unitsSold14d": { "type": ["null", "string"] },
+ "attributedSales14d": { "type": ["null", "string"] },
+ "attributedTotalDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "attributedTotalAddToCartClicks14d": { "type": ["null", "string"] },
+ "attributedTotalPurchases14d": { "type": ["null", "string"] },
+ "totalUnitsSold14d": { "type": ["null", "string"] },
+ "totalAttributedSales14d": { "type": ["null", "string"] },
+ "brb_bonus_amount": { "type": ["null", "string"] },
+ "brandHaloDetailPageViewsClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedAddToCartClicks14d": { "type": ["null", "string"] },
+ "brandHaloAttributedPurchases14d": { "type": ["null", "string"] },
+ "brandHaloUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloAttributedSales14d": { "type": ["null", "string"] },
+ "attributedNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "attributedNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "attributedNewToBrandSales14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandPurchases14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "brandHaloNewToBrandSales14d": { "type": ["null", "string"] }
+ },
+ "title": "attribution_report_products",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/common.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/common.py
deleted file mode 100644
index 89485a7a8d72..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/common.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from decimal import Decimal
-from typing import Any, Dict, Iterable, Type
-
-from pydantic import BaseModel, create_model
-
-
-class CatalogModel(BaseModel):
- class Config:
- arbitrary_types_allowed = True
-
- @classmethod
- def schema_extra(cls, schema: Dict[str, Any], model: Type["BaseModel"]) -> None:
- # Modify pydantic generated jsonschema.
- # Remove "title" and "description" fields to reduce size.
- schema.pop("title", None)
- schema.pop("description", None)
- # Remove required section so any missing attribute from API wont break object validation.
- schema.pop("required", None)
- # According to https://github.com/airbytehq/airbyte/issues/14196 set additionalProperties to True
- if schema.pop("additionalProperties", None):
- schema["additionalProperties"] = True
- for name, prop in schema.get("properties", {}).items():
- prop.pop("title", None)
- prop.pop("description", None)
- if prop.pop("additionalProperties", None):
- prop["additionalProperties"] = True
- allow_none = model.__fields__[name].allow_none
- # Pydantic doesnt treat Union[None, Any] type correctly when
- # generation jsonschema so we cant set field as nullable (i.e.
- # field that can have either null and non-null values),
- # generate this jsonschema value manually.
- if "type" in prop:
- if allow_none:
- prop["type"] = ["null", prop["type"]]
- if prop["type"] == "array" and prop["items"]:
- if prop["items"].pop("additionalProperties", None):
- prop["items"]["additionalProperties"] = True
- if schema["type"] == "object":
- schema["type"] = ["object", "null"]
-
-
-class MetricsReport(CatalogModel):
- profileId: int
- recordType: str
- reportDate: str
- recordId: str
- # This property will be overwritten with autogenerated model based on metrics list
- metric: None
-
- @classmethod
- def generate_metric_model(cls, metric_list: Iterable[str]) -> CatalogModel:
- metrics_obj_model = create_model("MetricObjModel", **{f: (str, None) for f in metric_list}, __base__=CatalogModel)
- return create_model("MetricsModel", metric=(metrics_obj_model, None), __base__=cls)
-
-
-class Targeting(CatalogModel):
- targetId: Decimal
- adGroupId: Decimal
- state: str
- expressionType: str
- bid: Decimal
-
-
-class KeywordsBase(CatalogModel):
- keywordId: Decimal
- campaignId: Decimal
- adGroupId: Decimal
- state: str
- keywordText: str
-
-
-class Keywords(KeywordsBase):
- nativeLanguageKeyword: str
- matchType: str
- bid: Decimal
-
-
-class NegativeKeywords(KeywordsBase):
- matchType: str
-
-
-class Budget(CatalogModel):
- amount: Decimal = None
- currencyCode: str = None
- policy: str = None
- startDate: str = None
- endDate: str = None
-
-
-class Portfolio(CatalogModel):
- portfolioId: int
- name: str = None
- budget: Budget = None
- inBudget: bool = None
- state: str = None
- creationDate: int = None
- lastUpdatedDate: int = None
- servingStatus: str = None
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/portfolios.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/portfolios.json
new file mode 100644
index 000000000000..cf7539e2c60e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/portfolios.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "portfolioId": { "type": ["null", "integer"] },
+ "name": { "type": ["null", "string"] },
+ "budget": {
+ "type": ["object", "null"],
+ "properties": {
+ "amount": { "type": ["null", "number"] },
+ "currencyCode": { "type": ["null", "string"] },
+ "policy": { "type": ["null", "string"] },
+ "startDate": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] }
+ }
+ },
+ "inBudget": { "type": ["null", "boolean"] },
+ "state": { "type": ["null", "string"] },
+ "creationDate": { "type": ["null", "integer"] },
+ "lastUpdatedDate": { "type": ["null", "integer"] },
+ "servingStatus": { "type": ["null", "string"] }
+ },
+ "title": "portfolios",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profile.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profile.py
deleted file mode 100644
index 0bc6c509334f..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profile.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from decimal import Decimal
-
-from .common import CatalogModel
-
-
-class AccountInfo(CatalogModel):
- marketplaceStringId: str
- id: str
- type: str
- name: str = None
- subType: str = None
- validPaymentMethod: bool = None
-
-
-class Profile(CatalogModel):
- profileId: int
- countryCode: str = None
- currencyCode: str = None
- dailyBudget: Decimal = None
- timezone: str
- accountInfo: AccountInfo
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profiles.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profiles.json
new file mode 100644
index 000000000000..53ba437b6a4b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profiles.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "profileId": { "type": ["null", "integer"] },
+ "countryCode": { "type": ["null", "string"] },
+ "currencyCode": { "type": ["null", "string"] },
+ "dailyBudget": { "type": ["null", "number"] },
+ "timezone": { "type": ["null", "string"] },
+ "accountInfo": {
+ "type": ["object", "null"],
+ "properties": {
+ "marketplaceStringId": { "type": ["null", "string"] },
+ "id": { "type": ["null", "string"] },
+ "type": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "subType": { "type": ["null", "string"] },
+ "validPaymentMethod": { "type": ["null", "boolean"] }
+ }
+ }
+ },
+ "title": "profiles",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands.py
deleted file mode 100644
index 51d8f091e81c..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from decimal import Decimal
-from typing import Any, Dict, List, Optional
-
-from .common import CatalogModel
-
-
-class LandingPage(CatalogModel):
- pageType: str
- url: str
-
-
-class BidAdjustment(CatalogModel):
- bidAdjustmentPredicate: str
- bidAdjustmentPercent: int
-
-
-class Creative(CatalogModel):
- brandName: str
- brandLogoAssetID: str
- brandLogoUrl: str
- asins: List[str]
- shouldOptimizeAsins: bool
-
-
-class BrandsCampaign(CatalogModel):
- campaignId: str
- name: str
- tags: Dict[str, str]
- budget: Decimal
- budgetType: str
- startDate: str
- endDate: str
- state: str
- brandEntityId: str
- portfolioId: str
- ruleBasedBudget: Optional[Dict[str, Any]]
- bidding: Optional[Dict[str, Any]]
- productLocation: Optional[str]
- costType: Optional[str]
- smartDefault: Optional[List[str]]
- extendedData: Optional[Dict[str, Any]]
-
-
-class BrandsAdGroup(CatalogModel):
- campaignId: str
- adGroupId: str
- name: str
- state: str
- extendedData: Dict[str, Any]
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_ad_groups.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_ad_groups.json
new file mode 100644
index 000000000000..7b1232ba8518
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_ad_groups.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "campaignId": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_brands_ad_groups",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_campaigns.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_campaigns.json
new file mode 100644
index 000000000000..1c528e9c6535
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_campaigns.json
@@ -0,0 +1,26 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "campaignId": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "tags": { "type": ["null", "object"], "additionalProperties": true },
+ "budget": { "type": ["null", "number"] },
+ "budgetType": { "type": ["null", "string"] },
+ "startDate": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "brandEntityId": { "type": ["null", "string"] },
+ "portfolioId": { "type": ["null", "string"] },
+ "ruleBasedBudget": { "type": ["null", "object"] },
+ "bidding": { "type": ["null", "object"] },
+ "productLocation": { "type": ["null", "string"] },
+ "costType": { "type": ["null", "string"] },
+ "smartDefault": {
+ "type": ["null", "array"],
+ "items": { "type": ["null", "string"] }
+ },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_brands_campaigns",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_keywords.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_keywords.json
new file mode 100644
index 000000000000..6a179f71d387
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_keywords.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "campaignId": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_brands_keywords",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_v3_report_stream.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_v3_report_stream.json
new file mode 100644
index 000000000000..e83fcc7d2ce0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_v3_report_stream.json
@@ -0,0 +1,32 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "profileId": { "type": ["null", "integer"] },
+ "recordType": { "type": ["null", "string"] },
+ "reportDate": { "type": ["null", "string"] },
+ "recordId": { "type": ["null", "string"] },
+ "metric": {
+ "type": ["object", "null"],
+ "properties": {
+ "attributionType": { "type": ["null", "string"] },
+ "campaignName": { "type": ["null", "string"] },
+ "newToBrandSales14d": { "type": ["null", "string"] },
+ "orders14d": { "type": ["null", "string"] },
+ "productName": { "type": ["null", "string"] },
+ "sales14d": { "type": ["null", "string"] },
+ "newToBrandPurchasesPercentage14d": { "type": ["null", "string"] },
+ "purchasedAsin": { "type": ["null", "string"] },
+ "newToBrandSalesPercentage14d": { "type": ["null", "string"] },
+ "productCategory": { "type": ["null", "string"] },
+ "newToBrandPurchases14d": { "type": ["null", "string"] },
+ "newToBrandUnitsSoldPercentage14d": { "type": ["null", "string"] },
+ "unitsSold14d": { "type": ["null", "string"] },
+ "adGroupName": { "type": ["null", "string"] },
+ "newToBrandUnitsSold14d": { "type": ["null", "string"] },
+ "campaignBudgetCurrencyCode": { "type": ["null", "string"] }
+ }
+ }
+ },
+ "title": "sponsored_brands_v3_report_stream",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
deleted file mode 100644
index 83e845fb36ed..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from decimal import Decimal
-from typing import Any, Dict, List, Optional
-
-from .common import CatalogModel, Targeting
-
-
-class DisplayCampaign(CatalogModel):
- campaignId: Decimal
- name: str
- budgetType: str
- budget: Decimal
- startDate: str
- endDate: str = None
- costType: str
- state: str
- portfolioId: int = None
- tactic: str
- deliveryProfile: str
-
-
-class DisplayAdGroup(CatalogModel):
- name: str
- campaignId: Decimal
- adGroupId: Decimal
- defaultBid: Decimal
- bidOptimization: str
- state: str
- tactic: str
- creativeType: str
-
-
-class DisplayProductAds(CatalogModel):
- state: str
- adId: Decimal
- campaignId: Decimal
- adGroupId: Decimal
- asin: str
- sku: str
-
-
-class DisplayTargeting(Targeting):
- campaignId: Decimal
- expression: List[Dict[str, str]]
- resolvedExpression: List[Dict[str, str]]
-
-
-class DisplayCreatives(CatalogModel):
- adGroupId: Decimal
- creativeId: Decimal
- creativeType: str
- properties: Dict[str, Any]
- moderationStatus: str
-
-
-class DisplayBudgetRuleDetailsPerformanceMeasureCondition(CatalogModel):
- metricName: str
- comparisonOperator: str
- threshold: Decimal
-
-
-class DisplayBudgetRuleDetailsRecurrenceIntraDaySchedule(CatalogModel):
- startTime: str
- endTime: str
-
-
-class DisplayBudgetRuleDetailsRecurrence(CatalogModel):
- type: str
- daysOfWeek: List[str] = None
- intraDaySchedule: List[DisplayBudgetRuleDetailsRecurrenceIntraDaySchedule] = None
- threshold: Decimal
-
-
-class DisplayBudgetRuleDetailsBudgetIncreaseBy(CatalogModel):
- type: str
- value: Decimal
-
-
-class DisplayBudgetRuleDetailsDurationEventTypeRuleDuration(CatalogModel):
- eventId: str
- endDate: str
- eventName: str
- startDate: str
-
-
-class DisplayBudgetRuleDetailsDurationDateRangeTypeRuleDuration(CatalogModel):
- endDate: Optional[str]
- startDate: str
-
-
-class DisplayBudgetRuleDetailsDuration(CatalogModel):
- eventTypeRuleDuration: Optional[DisplayBudgetRuleDetailsDurationEventTypeRuleDuration] = None
- dateRangeTypeRuleDuration: Optional[DisplayBudgetRuleDetailsDurationDateRangeTypeRuleDuration] = None
-
-
-class DisplayBudgetRuleDetails(CatalogModel):
- name: str
- ruleType: str = None
- duration: Optional[DisplayBudgetRuleDetailsDuration] = None
- budgetIncreaseBy: Optional[DisplayBudgetRuleDetailsBudgetIncreaseBy] = None
- recurrence: Optional[DisplayBudgetRuleDetailsRecurrence] = None
- performanceMeasureCondition: Optional[DisplayBudgetRuleDetailsPerformanceMeasureCondition] = None
-
-
-class DisplayBudgetRules(CatalogModel):
- ruleId: str
- ruleStatus: str
- ruleState: str
- lastUpdatedDate: Optional[Decimal]
- createdDate: Decimal
- ruleDetails: DisplayBudgetRuleDetails = None
- ruleStatusDetails: Dict[str, str] = None
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_ad_groups.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_ad_groups.json
new file mode 100644
index 000000000000..504e5e24c5fc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_ad_groups.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "name": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "number"] },
+ "adGroupId": { "type": ["null", "number"] },
+ "defaultBid": { "type": ["null", "number"] },
+ "bidOptimization": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "tactic": { "type": ["null", "string"] },
+ "creativeType": { "type": ["null", "string"] }
+ },
+ "title": "sponsored_display_ad_groups",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_budget_rules.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_budget_rules.json
new file mode 100644
index 000000000000..e52d1d6ff896
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_budget_rules.json
@@ -0,0 +1,80 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "ruleId": { "type": ["null", "string"] },
+ "ruleStatus": { "type": ["null", "string"] },
+ "ruleState": { "type": ["null", "string"] },
+ "lastUpdatedDate": { "type": ["null", "number"] },
+ "createdDate": { "type": ["null", "number"] },
+ "ruleDetails": {
+ "type": ["object", "null"],
+ "properties": {
+ "name": { "type": ["null", "string"] },
+ "ruleType": { "type": ["null", "string"] },
+ "duration": {
+ "type": ["object", "null"],
+ "properties": {
+ "eventTypeRuleDuration": {
+ "type": ["object", "null"],
+ "properties": {
+ "eventId": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] },
+ "eventName": { "type": ["null", "string"] },
+ "startDate": { "type": ["null", "string"] }
+ }
+ },
+ "dateRangeTypeRuleDuration": {
+ "type": ["object", "null"],
+ "properties": {
+ "endDate": { "type": ["null", "string"] },
+ "startDate": { "type": ["null", "string"] }
+ }
+ }
+ }
+ },
+ "budgetIncreaseBy": {
+ "type": ["object", "null"],
+ "properties": {
+ "type": { "type": ["null", "string"] },
+ "value": { "type": ["null", "number"] }
+ }
+ },
+ "recurrence": {
+ "type": ["object", "null"],
+ "properties": {
+ "type": { "type": ["null", "string"] },
+ "daysOfWeek": {
+ "type": ["null", "array"],
+ "items": { "type": ["null", "string"] }
+ },
+ "intraDaySchedule": {
+ "type": ["null", "array"],
+ "items": {
+ "type": ["object", "null"],
+ "properties": {
+ "startTime": { "type": ["null", "string"] },
+ "endTime": { "type": ["null", "string"] }
+ }
+ }
+ },
+ "threshold": { "type": ["null", "number"] }
+ }
+ },
+ "performanceMeasureCondition": {
+ "type": ["object", "null"],
+ "properties": {
+ "metricName": { "type": ["null", "string"] },
+ "comparisonOperator": { "type": ["null", "string"] },
+ "threshold": { "type": ["null", "number"] }
+ }
+ }
+ }
+ },
+ "ruleStatusDetails": {
+ "type": ["null", "object"],
+ "additionalProperties": true
+ }
+ },
+ "title": "sponsored_display_budget_rules",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_campaigns.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_campaigns.json
new file mode 100644
index 000000000000..f243730a264b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_campaigns.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "campaignId": { "type": ["null", "number"] },
+ "name": { "type": ["null", "string"] },
+ "budgetType": { "type": ["null", "string"] },
+ "budget": { "type": ["null", "number"] },
+ "startDate": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] },
+ "costType": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "portfolioId": { "type": ["null", "integer"] },
+ "tactic": { "type": ["null", "string"] },
+ "deliveryProfile": { "type": ["null", "string"] }
+ },
+ "title": "sponsored_display_campaigns",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_creatives.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_creatives.json
new file mode 100644
index 000000000000..e9e88d46bcc0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_creatives.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "adGroupId": { "type": ["null", "number"] },
+ "creativeId": { "type": ["null", "number"] },
+ "creativeType": { "type": ["null", "string"] },
+ "properties": { "type": ["null", "object"] },
+ "moderationStatus": { "type": ["null", "string"] }
+ },
+ "title": "sponsored_display_creatives",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_product_ads.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_product_ads.json
new file mode 100644
index 000000000000..3381bd7b65b3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_product_ads.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "state": { "type": ["null", "string"] },
+ "adId": { "type": ["null", "number"] },
+ "campaignId": { "type": ["null", "number"] },
+ "adGroupId": { "type": ["null", "number"] },
+ "asin": { "type": ["null", "string"] },
+ "sku": { "type": ["null", "string"] }
+ },
+ "title": "sponsored_display_product_ads",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_report_stream.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_report_stream.json
new file mode 100644
index 000000000000..9bbacd40ff50
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_report_stream.json
@@ -0,0 +1,96 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "profileId": { "type": ["null", "integer"] },
+ "recordType": { "type": ["null", "string"] },
+ "reportDate": { "type": ["null", "string"] },
+ "recordId": { "type": ["null", "string"] },
+ "metric": {
+ "type": ["object", "null"],
+ "properties": {
+ "videoUnmutes": { "type": ["null", "string"] },
+ "royaltyQualifiedBorrowsFromClicks": { "type": ["null", "string"] },
+ "newToBrandDetailPageViewClicks": { "type": ["null", "string"] },
+ "videoCompleteViews": { "type": ["null", "string"] },
+ "unitsSold": { "type": ["null", "string"] },
+ "newToBrandPurchases": { "type": ["null", "string"] },
+ "addToListFromClicks": { "type": ["null", "string"] },
+ "videoMidpointViews": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "campaignStatus": { "type": ["null", "string"] },
+ "brandedSearches": { "type": ["null", "string"] },
+ "eCPAddToCart": { "type": ["null", "string"] },
+ "qualifiedBorrowsFromClicks": { "type": ["null", "string"] },
+ "detailPageViews": { "type": ["null", "string"] },
+ "sales": { "type": ["null", "string"] },
+ "viewabilityRate": { "type": ["null", "string"] },
+ "newToBrandECPDetailPageView": { "type": ["null", "string"] },
+ "purchases": { "type": ["null", "string"] },
+ "newToBrandUnitsSold": { "type": ["null", "string"] },
+ "campaignName": { "type": ["null", "string"] },
+ "clicks": { "type": ["null", "string"] },
+ "addToList": { "type": ["null", "string"] },
+ "campaignBudgetAmount": { "type": ["null", "string"] },
+ "royaltyQualifiedBorrowsFromViews": { "type": ["null", "string"] },
+ "unitsSoldClicks": { "type": ["null", "string"] },
+ "brandedSearchesClicks": { "type": ["null", "string"] },
+ "addToCartRate": { "type": ["null", "string"] },
+ "newToBrandDetailPageViewRate": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] },
+ "targetingText": { "type": ["null", "string"] },
+ "unitsSoldBrandHalo": { "type": ["null", "string"] },
+ "videoFirstQuartileViews": { "type": ["null", "string"] },
+ "adId": { "type": ["null", "string"] },
+ "costType": { "type": ["null", "string"] },
+ "newToBrandUnitsSoldClicks": { "type": ["null", "string"] },
+ "brandedSearchesViews": { "type": ["null", "string"] },
+ "leads": { "type": ["null", "string"] },
+ "startDate": { "type": ["null", "string"] },
+ "linkOuts": { "type": ["null", "string"] },
+ "qualifiedBorrowsFromViews": { "type": ["null", "string"] },
+ "addToListFromViews": { "type": ["null", "string"] },
+ "addToCart": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "newToBrandSalesClicks": { "type": ["null", "string"] },
+ "detailPageViewsClicks": { "type": ["null", "string"] },
+ "promotedSku": { "type": ["null", "string"] },
+ "newToBrandPurchasesClicks": { "type": ["null", "string"] },
+ "salesBrandHaloClicks": { "type": ["null", "string"] },
+ "salesPromotedClicks": { "type": ["null", "string"] },
+ "newToBrandDetailPageViews": { "type": ["null", "string"] },
+ "conversionsBrandHaloClicks": { "type": ["null", "string"] },
+ "addToCartClicks": { "type": ["null", "string"] },
+ "unitsSoldBrandHaloClicks": { "type": ["null", "string"] },
+ "eCPBrandSearch": { "type": ["null", "string"] },
+ "conversionsBrandHalo": { "type": ["null", "string"] },
+ "promotedAsin": { "type": ["null", "string"] },
+ "addToCartViews": { "type": ["null", "string"] },
+ "qualifiedBorrows": { "type": ["null", "string"] },
+ "impressionsViews": { "type": ["null", "string"] },
+ "leadFormOpens": { "type": ["null", "string"] },
+ "newToBrandSales": { "type": ["null", "string"] },
+ "newToBrandDetailPageViewViews": { "type": ["null", "string"] },
+ "purchasesPromotedClicks": { "type": ["null", "string"] },
+ "salesClicks": { "type": ["null", "string"] },
+ "salesBrandHalo": { "type": ["null", "string"] },
+ "targetingId": { "type": ["null", "string"] },
+ "purchasesClicks": { "type": ["null", "string"] },
+ "impressions": { "type": ["null", "string"] },
+ "cost": { "type": ["null", "string"] },
+ "royaltyQualifiedBorrows": { "type": ["null", "string"] },
+ "targetingExpression": { "type": ["null", "string"] },
+ "brandedSearchRate": { "type": ["null", "string"] },
+ "impressionsFrequencyAverage": { "type": ["null", "string"] },
+ "bidOptimization": { "type": ["null", "string"] },
+ "videoThirdQuartileViews": { "type": ["null", "string"] },
+ "cumulativeReach": { "type": ["null", "string"] },
+ "asinBrandHalo": { "type": ["null", "string"] },
+ "adGroupName": { "type": ["null", "string"] },
+ "campaignBudgetCurrencyCode": { "type": ["null", "string"] },
+ "viewClickThroughRate": { "type": ["null", "string"] }
+ }
+ }
+ },
+ "title": "sponsored_display_report_stream",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_targetings.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_targetings.json
new file mode 100644
index 000000000000..86a1ddf5f5a6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_targetings.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "targetId": { "type": ["null", "number"] },
+ "adGroupId": { "type": ["null", "number"] },
+ "state": { "type": ["null", "string"] },
+ "expressionType": { "type": ["null", "string"] },
+ "bid": { "type": ["null", "number"] },
+ "campaignId": { "type": ["null", "number"] },
+ "expression": {
+ "type": "array",
+ "items": { "type": ["null", "object"], "additionalProperties": true }
+ },
+ "resolvedExpression": {
+ "type": "array",
+ "items": { "type": ["null", "object"], "additionalProperties": true }
+ }
+ },
+ "title": "sponsored_display_targetings",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_bid_recommendations.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_bid_recommendations.json
new file mode 100644
index 000000000000..cb895d6c08e2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_bid_recommendations.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "adGroupId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "theme": { "type": ["null", "string"] },
+ "bidRecommendationsForTargetingExpressions": {
+ "type": "array",
+ "items": {
+ "type": ["object", "null"],
+ "properties": {
+ "bidValues": {
+ "type": "array",
+ "items": {
+ "type": ["null", "object"],
+ "additionalProperties": true
+ }
+ },
+ "targetingExpression": {
+ "type": ["null", "object"],
+ "additionalProperties": true
+ }
+ }
+ }
+ }
+ },
+ "title": "sponsored_product_ad_group_bid_recommendations",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_suggested_keywords.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_suggested_keywords.json
new file mode 100644
index 000000000000..6a5afdb755de
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_suggested_keywords.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "adGroupId": { "type": ["null", "integer"] },
+ "suggestedKeywords": {
+ "type": ["null", "array"],
+ "items": {
+ "type": ["object", "null"],
+ "properties": {
+ "keywordText": { "type": ["null", "string"] },
+ "matchType": { "type": ["null", "string"] }
+ }
+ }
+ }
+ },
+ "title": "sponsored_product_ad_group_suggested_keywords",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_groups.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_groups.json
new file mode 100644
index 000000000000..902592a5567f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_groups.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "adGroupId": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "defaultBid": { "type": ["null", "number"] },
+ "state": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_ad_groups",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ads.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ads.json
new file mode 100644
index 000000000000..8719813651c2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ads.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "adId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "customText": { "type": ["null", "string"] },
+ "asin": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "sku": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_ads",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaign_negative_keywords.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaign_negative_keywords.json
new file mode 100644
index 000000000000..f8a439d82ec7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaign_negative_keywords.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "keywordId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "number"] },
+ "state": { "type": ["null", "string"] },
+ "keywordText": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_campaign_negative_keywords",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaigns.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaigns.json
new file mode 100644
index 000000000000..a5864bfb9c11
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaigns.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "portfolioId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "name": { "type": ["null", "string"] },
+ "tags": { "type": ["null", "object"], "additionalProperties": true },
+ "targetingType": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "dynamicBidding": { "type": ["null", "object"] },
+ "startDate": { "type": ["null", "string"] },
+ "endDate": { "type": ["null", "string"] },
+ "budget": { "type": ["null", "object"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_campaigns",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_keywords.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_keywords.json
new file mode 100644
index 000000000000..9c1e8b755145
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_keywords.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "keywordId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "keywordText": { "type": ["null", "string"] },
+ "nativeLanguageLocale": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_keywords",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_negative_keywords.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_negative_keywords.json
new file mode 100644
index 000000000000..c1b847949b24
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_negative_keywords.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "keywordId": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "keywordText": { "type": ["null", "string"] },
+ "nativeLanguageLocale": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_negative_keywords",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_targetings.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_targetings.json
new file mode 100644
index 000000000000..bb206b1fba35
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_targetings.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "expression": {
+ "type": ["null", "array"],
+ "items": { "type": ["null", "object"], "additionalProperties": true }
+ },
+ "targetId": { "type": ["null", "string"] },
+ "resolvedExpression": {
+ "type": "array",
+ "items": { "type": ["null", "object"], "additionalProperties": true }
+ },
+ "campaignId": { "type": ["null", "string"] },
+ "expressionType": { "type": ["null", "string"] },
+ "state": { "type": ["null", "string"] },
+ "bid": { "type": ["null", "number"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "extendedData": { "type": ["null", "object"] }
+ },
+ "title": "sponsored_product_targetings",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products.py
deleted file mode 100644
index 6ef9a7b5ff1d..000000000000
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products.py
+++ /dev/null
@@ -1,114 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-from decimal import Decimal
-from typing import Any, Dict, List, Optional
-
-from .common import CatalogModel, KeywordsBase
-
-
-class Adjustments(CatalogModel):
- predicate: str
- percentage: Decimal
-
-
-class Bidding(CatalogModel):
- strategy: str
- adjustments: List[Adjustments]
-
-
-class ProductCampaign(CatalogModel):
- portfolioId: str
- campaignId: str
- name: str
- tags: Dict[str, str]
- targetingType: str
- state: str
- dynamicBidding: Dict[str, Any]
- startDate: str
- endDate: str
- budget: Dict[str, Any]
- extendedData: Optional[Dict[str, Any]]
-
-
-class ProductAdGroups(CatalogModel):
- adGroupId: str
- name: str
- campaignId: str
- defaultBid: Decimal
- state: str
- extendedData: dict
-
-
-class BidRecommendations(CatalogModel):
- bidValues: List[Dict[str, str]]
- targetingExpression: Dict[str, str]
-
-
-class ProductAdGroupBidRecommendations(CatalogModel):
- adGroupId: str
- campaignId: str
- theme: str
- bidRecommendationsForTargetingExpressions: List[BidRecommendations]
-
-
-class SuggestedKeyword(CatalogModel):
- keywordText: str
- matchType: str
-
-
-class ProductAdGroupSuggestedKeywords(CatalogModel):
- adGroupId: int
- suggestedKeywords: List[SuggestedKeyword] = None
-
-
-class ProductAd(CatalogModel):
- adId: str
- campaignId: str
- customText: str
- asin: str
- state: str
- sku: str
- adGroupId: str
- extendedData: Optional[Dict[str, Any]]
-
-
-class ProductTargeting(CatalogModel):
- expression: List[Dict[str, str]]
- targetId: str
- resolvedExpression: List[Dict[str, str]]
- campaignId: str
- expressionType: str
- state: str
- bid: float
- adGroupId: str
- extendedData: Optional[Dict[str, Any]]
-
-
-class SponsoredProductCampaignNegativeKeywordsModel(KeywordsBase):
- keywordId: str
- campaignId: str
- state: str
- keywordText: str
- extendedData: Optional[Dict[str, Any]]
-
-
-class SponsoredProductKeywordsModel(KeywordsBase):
- keywordId: str
- nativeLanguageLocale: str
- campaignId: str
- state: str
- adGroupId: str
- keywordText: str
- extendedData: Optional[Dict[str, Any]]
-
-
-class SponsoredProductNegativeKeywordsModel(KeywordsBase):
- keywordId: str
- nativeLanguageLocale: str
- campaignId: str
- state: str
- adGroupId: str
- keywordText: str
- extendedData: Optional[Dict[str, Any]]
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products_report_stream.json b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products_report_stream.json
new file mode 100644
index 000000000000..0c2a7ce9c560
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products_report_stream.json
@@ -0,0 +1,70 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "properties": {
+ "profileId": { "type": ["null", "integer"] },
+ "recordType": { "type": ["null", "string"] },
+ "reportDate": { "type": ["null", "string"] },
+ "recordId": { "type": ["null", "string"] },
+ "metric": {
+ "type": ["object", "null"],
+ "properties": {
+ "advertisedAsin": { "type": ["null", "string"] },
+ "unitsSoldSameSku1d": { "type": ["null", "string"] },
+ "unitsSoldSameSku30d": { "type": ["null", "string"] },
+ "campaignApplicableBudgetRuleId": { "type": ["null", "string"] },
+ "matchType": { "type": ["null", "string"] },
+ "purchasesSameSku1d": { "type": ["null", "string"] },
+ "unitsSoldClicks7d": { "type": ["null", "string"] },
+ "adGroupId": { "type": ["null", "string"] },
+ "campaignStatus": { "type": ["null", "string"] },
+ "advertisedSku": { "type": ["null", "string"] },
+ "campaignRuleBasedBudgetAmount": { "type": ["null", "string"] },
+ "unitsSoldSameSku7d": { "type": ["null", "string"] },
+ "keywordId": { "type": ["null", "string"] },
+ "campaignApplicableBudgetRuleName": { "type": ["null", "string"] },
+ "keyword": { "type": ["null", "string"] },
+ "sales30d": { "type": ["null", "string"] },
+ "campaignName": { "type": ["null", "string"] },
+ "clicks": { "type": ["null", "string"] },
+ "purchasesSameSku7d": { "type": ["null", "string"] },
+ "salesOtherSku14d": { "type": ["null", "string"] },
+ "attributedSalesSameSku30d": { "type": ["null", "string"] },
+ "salesOtherSku30d": { "type": ["null", "string"] },
+ "campaignBudgetAmount": { "type": ["null", "string"] },
+ "purchasesSameSku14d": { "type": ["null", "string"] },
+ "sales14d": { "type": ["null", "string"] },
+ "purchasedAsin": { "type": ["null", "string"] },
+ "sales7d": { "type": ["null", "string"] },
+ "attributedSalesSameSku14d": { "type": ["null", "string"] },
+ "unitsSoldOtherSku30d": { "type": ["null", "string"] },
+ "targeting": { "type": ["null", "string"] },
+ "salesOtherSku7d": { "type": ["null", "string"] },
+ "attributedSalesSameSku7d": { "type": ["null", "string"] },
+ "salesOtherSku1d": { "type": ["null", "string"] },
+ "purchases14d": { "type": ["null", "string"] },
+ "purchases1d": { "type": ["null", "string"] },
+ "campaignId": { "type": ["null", "string"] },
+ "unitsSoldClicks30d": { "type": ["null", "string"] },
+ "unitsSoldClicks14d": { "type": ["null", "string"] },
+ "sales1d": { "type": ["null", "string"] },
+ "unitsSoldOtherSku1d": { "type": ["null", "string"] },
+ "purchases7d": { "type": ["null", "string"] },
+ "keywordType": { "type": ["null", "string"] },
+ "unitsSoldClicks1d": { "type": ["null", "string"] },
+ "purchases30d": { "type": ["null", "string"] },
+ "purchasesSameSku30d": { "type": ["null", "string"] },
+ "unitsSoldOtherSku7d": { "type": ["null", "string"] },
+ "impressions": { "type": ["null", "string"] },
+ "attributedSalesSameSku1d": { "type": ["null", "string"] },
+ "cost": { "type": ["null", "string"] },
+ "unitsSoldOtherSku14d": { "type": ["null", "string"] },
+ "unitsSoldSameSku14d": { "type": ["null", "string"] },
+ "adId": { "type": ["null", "string"] },
+ "adGroupName": { "type": ["null", "string"] },
+ "campaignBudgetCurrencyCode": { "type": ["null", "string"] }
+ }
+ }
+ },
+ "title": "sponsored_products_report_stream",
+ "type": ["null", "object"]
+}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py
index cca9dfcd088e..0099d0cf9e51 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py
@@ -7,11 +7,12 @@
from typing import Any, List, Mapping, Optional, Tuple
import pendulum
+from airbyte_cdk.models import AdvancedAuth, AuthFlowType, ConnectorSpecification, DestinationSyncMode, OAuthConfigSpecification
from airbyte_cdk.sources import AbstractSource
from airbyte_cdk.sources.streams import Stream
from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator
-from .schemas import Profile
+from .spec import SourceAmazonAdsSpec
from .streams import (
AttributionReportPerformanceAdgroup,
AttributionReportPerformanceCampaign,
@@ -132,7 +133,11 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]:
AttributionReportProducts,
]
portfolios_stream = Portfolios(**stream_args)
- return [profiles_stream, portfolios_stream, *[stream_class(**stream_args) for stream_class in non_profile_stream_classes]]
+ return [
+ profiles_stream,
+ portfolios_stream,
+ *[stream_class(**stream_args) for stream_class in non_profile_stream_classes],
+ ]
@staticmethod
def _make_authenticator(config: Mapping[str, Any]):
@@ -144,13 +149,51 @@ def _make_authenticator(config: Mapping[str, Any]):
)
@staticmethod
- def _choose_profiles(config: Mapping[str, Any], available_profiles: List[Profile]):
+ def _choose_profiles(config: Mapping[str, Any], available_profiles: List[dict[str, Any]]):
requested_profiles = config.get("profiles", [])
requested_marketplace_ids = config.get("marketplace_ids", [])
if requested_profiles or requested_marketplace_ids:
return [
profile
for profile in available_profiles
- if profile.profileId in requested_profiles or profile.accountInfo.marketplaceStringId in requested_marketplace_ids
+ if profile["profileId"] in requested_profiles or profile["accountInfo"]["marketplaceStringId"] in requested_marketplace_ids
]
return available_profiles
+
+ def spec(self, logger: logging.Logger) -> ConnectorSpecification:
+
+ return ConnectorSpecification(
+ documentationUrl="https://docs.airbyte.com/integrations/sources/amazon-ads",
+ connectionSpecification=SourceAmazonAdsSpec.schema(),
+ supportsDBT=False,
+ advanced_auth=AdvancedAuth(
+ auth_flow_type=AuthFlowType.oauth2_0,
+ predicate_key=["auth_type"],
+ predicate_value="oauth2.0",
+ oauth_config_specification=OAuthConfigSpecification(
+ oauth_user_input_from_connector_config_specification={
+ "type": "object",
+ "additionalProperties": False,
+ "properties": {"region": {"type": "string", "path_in_connector_config": ["region"]}},
+ },
+ complete_oauth_output_specification={
+ "type": "object",
+ "additionalProperties": True,
+ "properties": {"refresh_token": {"type": "string", "path_in_connector_config": ["refresh_token"]}},
+ },
+ complete_oauth_server_input_specification={
+ "type": "object",
+ "additionalProperties": True,
+ "properties": {"client_id": {"type": "string"}, "client_secret": {"type": "string"}},
+ },
+ complete_oauth_server_output_specification={
+ "type": "object",
+ "additionalProperties": True,
+ "properties": {
+ "client_id": {"type": "string", "path_in_connector_config": ["client_id"]},
+ "client_secret": {"type": "string", "path_in_connector_config": ["client_secret"]},
+ },
+ },
+ ),
+ ),
+ )
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py
new file mode 100644
index 000000000000..3156ac42e5a4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py
@@ -0,0 +1,103 @@
+# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
+
+
+from datetime import date
+from enum import Enum
+from typing import List, Optional
+
+from airbyte_cdk.sources.config import BaseConfig
+from pydantic.v1 import Field
+
+
+class StateFilterEnum(str, Enum):
+ enabled = "enabled"
+ paused = "paused"
+ archived = "archived"
+
+
+class ReportRecordTypeEnum(str, Enum):
+ adGroups = "adGroups"
+ asins = "asins"
+ asins_keywords = "asins_keywords"
+ asins_targets = "asins_targets"
+ campaigns = "campaigns"
+ keywords = "keywords"
+ productAds = "productAds"
+ targets = "targets"
+
+
+class SourceAmazonAdsSpec(BaseConfig):
+ class Config:
+ title = "Source Amazon Ads"
+ use_enum_values = True
+
+ auth_type: str = Field("oauth2.0", const=True, title="Auth Type", order=0)
+ client_id: str = Field(
+ ...,
+ description='The client ID of your Amazon Ads developer application. See the docs for more information.',
+ title="Client ID",
+ airbyte_secret=True,
+ order=1,
+ )
+ client_secret: str = Field(
+ ...,
+ description='The client secret of your Amazon Ads developer application. See the docs for more information.',
+ title="Client Secret",
+ airbyte_secret=True,
+ order=2,
+ )
+ refresh_token: str = Field(
+ ...,
+ description='Amazon Ads refresh token. See the docs for more information on how to obtain this token.',
+ title="Refresh Token",
+ airbyte_secret=True,
+ order=3,
+ )
+ region: Optional[str] = Field(
+ "NA",
+ description='Region to pull data from (EU/NA/FE). See docs for more details.',
+ title="Region",
+ enum=["NA", "EU", "FE"],
+ order=4,
+ )
+ start_date: Optional[date] = Field(
+ None,
+ description="The Start date for collecting reports, should not be more than 60 days in the past. In YYYY-MM-DD format",
+ examples=["2022-10-10", "2022-10-22"],
+ pattern="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
+ title="Start Date",
+ order=5,
+ )
+ profiles: Optional[List[int]] = Field(
+ None,
+ description='Profile IDs you want to fetch data for. The Amazon Ads source connector supports only profiles with seller and vendor type, profiles with agency type will be ignored. See docs for more details. Note: If Marketplace IDs are also selected, profiles will be selected if they match the Profile ID OR the Marketplace ID.',
+ title="Profile IDs",
+ order=6,
+ )
+ marketplace_ids: Optional[List[str]] = Field(
+ None,
+ description="Marketplace IDs you want to fetch data for. Note: If Profile IDs are also selected, profiles will be selected if they match the Profile ID OR the Marketplace ID.",
+ title="Marketplace IDs",
+ order=7,
+ )
+ state_filter: Optional[List[StateFilterEnum]] = Field(
+ default=[],
+ description="Reflects the state of the Display, Product, and Brand Campaign streams as enabled, paused, or archived. If you do not populate this field, it will be ignored completely.",
+ title="State Filter",
+ unique_items=True,
+ order=8,
+ )
+ look_back_window: Optional[int] = Field(
+ 3,
+ description="The amount of days to go back in time to get the updated data from Amazon Ads",
+ examples=[3, 10],
+ title="Look Back Window",
+ order=9,
+ )
+ report_record_types: Optional[List[ReportRecordTypeEnum]] = Field(
+ [],
+ description='Optional configuration which accepts an array of string of record types. Leave blank for default behaviour to pull all report types. Use this config option only if you want to pull specific report type(s). See docs for more details',
+ title="Report Record Types",
+ unique_items=True,
+ order=10,
+ )
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/attribution_report.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/attribution_report.py
index 4c683846e6d2..aa9a0cb586c3 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/attribution_report.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/attribution_report.py
@@ -8,7 +8,6 @@
import requests
from airbyte_cdk.models import SyncMode
from requests.exceptions import HTTPError
-from source_amazon_ads.schemas import AttributionReportModel
from source_amazon_ads.streams.common import AmazonAdsStream
BRAND_REFERRAL_BONUS = "brb_bonus_amount"
@@ -54,7 +53,6 @@ class AttributionReport(AmazonAdsStream):
https://advertising.amazon.com/API/docs/en-us/amazon-attribution-prod-3p/#/
"""
- model = AttributionReportModel
primary_key = None
data_field = "reports"
page_size = 300
@@ -95,13 +93,13 @@ def stream_slices(
self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None
) -> Iterable[Optional[Mapping[str, Any]]]:
for profile in self._profiles:
- start_date = pendulum.now(tz=profile.timezone).subtract(days=1).date()
- end_date = pendulum.now(tz=profile.timezone).date()
+ start_date = pendulum.now(tz=profile["timezone"]).subtract(days=1).date()
+ end_date = pendulum.now(tz=profile["timezone"]).date()
if self._start_date:
start_date = max(self._start_date, end_date.subtract(days=self.REPORTING_PERIOD))
yield {
- "profileId": profile.profileId,
+ "profileId": profile["profileId"],
"startDate": start_date.format(self.REPORT_DATE_FORMAT),
"endDate": end_date.format(self.REPORT_DATE_FORMAT),
}
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py
index 824b739977b5..4618a0d2fa2b 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py
@@ -1,19 +1,18 @@
#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
-
-from abc import ABC, abstractmethod
+import logging
+from abc import ABC
from http import HTTPStatus
-from typing import Any, Iterable, List, Mapping, MutableMapping, Optional
+from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union
import requests
+from airbyte_cdk.sources.declarative.models import FailureType
from airbyte_cdk.sources.streams.core import Stream
from airbyte_cdk.sources.streams.http import HttpStream
-from airbyte_cdk.sources.utils.schema_helpers import expand_refs
-from pydantic import BaseModel, ValidationError
+from airbyte_cdk.sources.streams.http.error_handlers import ErrorHandler, ErrorResolution, HttpStatusErrorHandler, ResponseAction
+from pydantic.v1 import BaseModel, ValidationError
from source_amazon_ads.constants import URL_MAPPING
-from source_amazon_ads.schemas import CatalogModel
-from source_amazon_ads.schemas.profile import Profile
"""
This class hierarchy may seem overcomplicated so here is a visualization of
@@ -64,6 +63,8 @@ class to provide explanation why it had been done in this way.
"""
+LOGGER = logging.getLogger("airbyte")
+
class ErrorResponse(BaseModel):
code: str
@@ -71,28 +72,41 @@ class ErrorResponse(BaseModel):
requestId: Optional[str]
+class AmazonAdsErrorHandler(HttpStatusErrorHandler):
+ def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]] = None) -> ErrorResolution:
+
+ if response_or_exception.status_code == HTTPStatus.OK:
+ return ErrorResolution(ResponseAction.SUCCESS)
+
+ try:
+ resp = ErrorResponse.parse_raw(response_or_exception.text)
+ except ValidationError:
+ return ErrorResolution(
+ response_action=ResponseAction.FAIL,
+ failure_type=FailureType.system_error,
+ error_message=f"Response status code: {response_or_exception.status_code}. Unexpected error. {response_or_exception.text=}",
+ )
+
+ LOGGER.warning(
+ f"Unexpected error {resp.code} when processing request {response_or_exception.request.url} for "
+ f"{response_or_exception.request.headers['Amazon-Advertising-API-Scope']} profile: {resp.details}"
+ )
+
+ return ErrorResolution(ResponseAction.SUCCESS)
+
+
class BasicAmazonAdsStream(Stream, ABC):
"""
Base class for all Amazon Ads streams.
"""
- def __init__(self, config: Mapping[str, Any], profiles: List[Profile] = None):
+ is_resumable = False
+
+ def __init__(self, config: Mapping[str, Any], profiles: List[dict[str, Any]] = None):
self._profiles = profiles or []
self._client_id = config["client_id"]
self._url = URL_MAPPING[config["region"]]
- @property
- @abstractmethod
- def model(self) -> CatalogModel:
- """
- Pydantic model to represent json schema
- """
-
- def get_json_schema(self):
- schema = self.model.schema()
- expand_refs(schema)
- return schema
-
# Basic full refresh stream
class AmazonAdsStream(HttpStream, BasicAmazonAdsStream):
@@ -102,7 +116,7 @@ class AmazonAdsStream(HttpStream, BasicAmazonAdsStream):
data_field = ""
- def __init__(self, config: Mapping[str, Any], *args, profiles: List[Profile] = None, **kwargs):
+ def __init__(self, config: Mapping[str, Any], *args, profiles: List[dict[str, Any]] = None, **kwargs):
# Each AmazonAdsStream instance are dependant on list of profiles.
BasicAmazonAdsStream.__init__(self, config, profiles=profiles)
HttpStream.__init__(self, *args, **kwargs)
@@ -111,10 +125,6 @@ def __init__(self, config: Mapping[str, Any], *args, profiles: List[Profile] = N
def url_base(self):
return self._url
- @property
- def raise_on_http_errors(self):
- return False
-
def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]:
return None
@@ -164,6 +174,9 @@ def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapp
f"{response.request.headers['Amazon-Advertising-API-Scope']} profile: {resp.details}"
)
+ def get_error_handler(self) -> ErrorHandler:
+ return AmazonAdsErrorHandler(logger=LOGGER)
+
class SubProfilesStream(AmazonAdsStream):
"""
@@ -205,7 +218,7 @@ def read_records(self, *args, **kwargs) -> Iterable[Mapping[str, Any]]:
Iterate through self._profiles list and send read all records for each profile.
"""
for profile in self._profiles:
- self._current_profile_id = profile.profileId
+ self._current_profile_id = profile["profileId"]
yield from super().read_records(*args, **kwargs)
def request_headers(self, *args, **kwargs) -> MutableMapping[str, Any]:
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/portfolios.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/portfolios.py
index 1d253fda57e6..5c698f7020ca 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/portfolios.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/portfolios.py
@@ -4,7 +4,6 @@
from typing import Any, Iterable, Mapping, MutableMapping
-from source_amazon_ads.schemas import Portfolio
from source_amazon_ads.streams.common import AmazonAdsStream
@@ -15,7 +14,6 @@ class Portfolios(AmazonAdsStream):
"""
primary_key = "portfolioId"
- model = Portfolio
def path(self, **kwargs) -> str:
return "v2/portfolios/extended"
@@ -25,7 +23,7 @@ def read_records(self, *args, **kwargs) -> Iterable[Mapping[str, Any]]:
Iterate through self._profiles list and send read all records for each profile.
"""
for profile in self._profiles:
- self._current_profile_id = profile.profileId
+ self._current_profile_id = profile["profileId"]
yield from super().read_records(*args, **kwargs)
def request_headers(self, *args, **kwargs) -> MutableMapping[str, Any]:
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/profiles.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/profiles.py
index c6491c052acf..c0af8f2bd62e 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/profiles.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/profiles.py
@@ -6,7 +6,6 @@
import requests
from airbyte_cdk.models import SyncMode
-from source_amazon_ads.schemas import Profile
from source_amazon_ads.streams.common import AmazonAdsStream
@@ -17,32 +16,30 @@ class Profiles(AmazonAdsStream):
"""
primary_key = "profileId"
- model = Profile
def path(self, **kwargs) -> str:
return "v2/profiles?profileTypeFilter=seller,vendor"
def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]:
for record in super().parse_response(response, **kwargs):
- profile_id_obj = self.model.parse_obj(record)
# Populate self._profiles list with profiles objects to not make
# unnecessary API calls.
- self._profiles.append(profile_id_obj)
+ self._profiles.append(record)
yield record
def read_records(self, *args, **kwargs) -> Iterable[Mapping[str, Any]]:
if self._profiles:
# In case if we have _profiles populated we can use it instead of making API call.
- yield from [profile.dict(exclude_unset=True) for profile in self._profiles]
+ yield from [profile for profile in self._profiles]
else:
# Make API call by the means of basic HttpStream class.
yield from super().read_records(*args, **kwargs)
- def get_all_profiles(self) -> List[Profile]:
+ def get_all_profiles(self) -> List[dict[str, Any]]:
"""
Fetch all profiles and return it as list. We need this to set
dependecies for other streams since all of the Amazon Ads API calls
require profile id to be passed.
:return List of profile object
"""
- return [self.model.parse_obj(profile) for profile in self.read_records(SyncMode.full_refresh)]
+ return [profile for profile in self.read_records(SyncMode.full_refresh)]
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/brands_report.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/brands_report.py
index 2a57ef1c3aba..8b28b64b46b8 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/brands_report.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/brands_report.py
@@ -5,7 +5,6 @@
from http import HTTPStatus
from .products_report import SponsoredProductsReportStream
-from .report_streams import ReportStream
METRICS_MAP_V3 = {
"purchasedAsin": [
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/display_report.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/display_report.py
index f81f4978fd74..fbe3742bc707 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/display_report.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/display_report.py
@@ -7,8 +7,7 @@
import requests
from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator
-from source_amazon_ads.schemas import Profile
-from source_amazon_ads.streams.report_streams.report_stream_models import RecordType, ReportInfo
+from source_amazon_ads.streams.report_streams.report_stream_models import ReportInfo
from source_amazon_ads.streams.report_streams.report_streams import ReportStream
METRICS_MAP_V3 = {
@@ -323,7 +322,7 @@ class SponsoredDisplayReportStream(ReportStream):
metrics_map = METRICS_MAP_V3
metrics_type_to_id_map = METRICS_TYPE_TO_ID_MAP
- def __init__(self, config: Mapping[str, Any], profiles: List[Profile], authenticator: Oauth2Authenticator):
+ def __init__(self, config: Mapping[str, Any], profiles: List[dict[str, Any]], authenticator: Oauth2Authenticator):
super().__init__(config, profiles, authenticator)
# using session without auth as API returns 400 bad request if Authorization header presents in request
# X-Amz-Algorithm and X-Amz-Signature query params already present in the url, that is enough to make proper request
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/products_report.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/products_report.py
index 6d4a8b937525..e616d58573a9 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/products_report.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/products_report.py
@@ -8,7 +8,6 @@
import requests
from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator
-from source_amazon_ads.schemas import Profile
from .report_streams import ReportInfo, ReportStream
@@ -270,7 +269,7 @@ class SponsoredProductsReportStream(ReportStream):
metrics_map = METRICS_MAP
metrics_type_to_id_map = METRICS_TYPE_TO_ID_MAP
- def __init__(self, config: Mapping[str, Any], profiles: List[Profile], authenticator: Oauth2Authenticator):
+ def __init__(self, config: Mapping[str, Any], profiles: List[dict[str, Any]], authenticator: Oauth2Authenticator):
super().__init__(config, profiles, authenticator)
# using session without auth as API returns 400 bad request if Authorization header presents in request
# X-Amz-Algorithm and X-Amz-Signature query params already present in the url, that is enough to make proper request
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_stream_models.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_stream_models.py
index d79bacf08fd5..6b3e3a4b8113 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_stream_models.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_stream_models.py
@@ -4,7 +4,7 @@
from enum import Enum
from typing import List, Optional
-from pydantic import BaseModel
+from pydantic.v1 import BaseModel
class RecordType(str, Enum):
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 a2325ca38aba..f92bd7978223 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
@@ -19,7 +19,6 @@
from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy
from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator
from pendulum import Date
-from source_amazon_ads.schemas import CatalogModel, MetricsReport, Profile
from source_amazon_ads.streams.common import BasicAmazonAdsStream
from source_amazon_ads.utils import get_typed_env, iterate_one_by_one
@@ -80,13 +79,12 @@ class ReportStream(BasicAmazonAdsStream, ABC):
(406, re.compile(r"^Report date is too far in the past\.")),
]
- def __init__(self, config: Mapping[str, Any], profiles: List[Profile], authenticator: Oauth2Authenticator):
+ def __init__(self, config: Mapping[str, Any], profiles: List[dict[str, Any]], authenticator: Oauth2Authenticator):
super().__init__(config, profiles)
self._state = {}
self._session = requests.Session()
self._session.auth = authenticator
self._report_download_session = self._session
- self._model = self._generate_model()
self._start_date: Optional[Date] = config.get("start_date")
self._look_back_window: int = config["look_back_window"]
# Timeout duration in minutes for Reports. Default is 180 minutes.
@@ -95,10 +93,6 @@ def __init__(self, config: Mapping[str, Any], profiles: List[Profile], authentic
self.report_generation_maximum_retries: int = get_typed_env("REPORT_GENERATION_MAX_RETRIES", 5)
self._report_record_types = config.get("report_record_types")
- @property
- def model(self) -> CatalogModel:
- return self._model
-
@property
def availability_strategy(self) -> Optional["AvailabilityStrategy"]:
return None
@@ -133,13 +127,13 @@ def read_records(
for report_info in report_info_list:
for metric_object in report_info.metric_objects:
- yield self._model(
- profileId=report_info.profile_id,
- recordType=report_info.record_type,
- reportDate=report_date,
- recordId=self.get_record_id(metric_object, report_info.record_type),
- metric=metric_object,
- ).dict()
+ yield {
+ "profileId": report_info.profile_id,
+ "recordType": report_info.record_type,
+ "reportDate": report_date,
+ "recordId": self.get_record_id(metric_object, report_info.record_type),
+ "metric": metric_object,
+ }
def get_record_id(self, metric_object: dict, record_type: str) -> str:
return metric_object.get(self.metrics_type_to_id_map[record_type]) or str(uuid.uuid4())
@@ -161,7 +155,7 @@ def wrapped(self, *args, **kwargs):
return wrapped
@backoff_max_tries
- def _init_and_try_read_records(self, profile: Profile, report_date):
+ def _init_and_try_read_records(self, profile: dict[str, Any], report_date: str):
report_info_list = self._init_reports(profile, report_date)
self.logger.info(f"Waiting for {len(report_info_list)} report(s) to be generated")
self._try_read_records(report_info_list)
@@ -192,17 +186,6 @@ def _try_read_records(self, report_info_list):
def _incomplete_report_info(self, report_info_list):
return [r for r in report_info_list if r.status != Status.SUCCESS and r.status != Status.COMPLETED]
- def _generate_model(self):
- """
- Generate pydantic model based on combined list of all the metrics
- attributes for particular stream. This model later will be used for
- discover schema generation.
- """
- metrics = set()
- for metric_list in self.metrics_map.values():
- metrics.update(set(metric_list))
- return MetricsReport.generate_metric_model(metrics)
-
def _get_auth_headers(self, profile_id: int):
return (
{
@@ -277,9 +260,9 @@ def get_date_range(self, start_date: Date, timezone: str) -> Iterable[str]:
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()
- start_date = stream_state.get(str(profile.profileId), {}).get(self.cursor_field)
+ def get_start_date(self, profile: dict[str, Any], stream_state: Mapping[str, Any]) -> Date:
+ today = pendulum.today(tz=profile["timezone"]).date()
+ 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()
# Taking date from state if it's not older than 60 days
@@ -288,9 +271,9 @@ 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]]:
+ def stream_profile_slices(self, profile: dict[str, Any], 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):
+ for report_date in self.get_date_range(start_date, profile["timezone"]):
yield {"profile": profile, self.cursor_field: report_date}
def stream_slices(
@@ -319,16 +302,16 @@ def state(self, value):
def get_updated_state(self, current_stream_state: Dict[str, Any], latest_data: Mapping[str, Any]) -> Mapping[str, Any]:
return self._state
- def _update_state(self, profile: Profile, report_date: str):
+ def _update_state(self, profile: dict[str, Any], report_date: str):
report_date = pendulum.from_format(report_date, self.REPORT_DATE_FORMAT).date()
- look_back_date = pendulum.today(tz=profile.timezone).date().subtract(days=self._look_back_window - 1)
+ look_back_date = pendulum.today(tz=profile["timezone"]).date().subtract(days=self._look_back_window - 1)
start_date = self.get_start_date(profile, self._state)
updated_state = max(min(report_date, look_back_date), start_date).format(self.REPORT_DATE_FORMAT)
- stream_state_value = self._state.get(str(profile.profileId), {}).get(self.cursor_field)
+ stream_state_value = self._state.get(str(profile["profileId"]), {}).get(self.cursor_field)
if stream_state_value:
updated_state = max(updated_state, stream_state_value)
- self._state.setdefault(str(profile.profileId), {})[self.cursor_field] = updated_state
+ self._state.setdefault(str(profile["profileId"]), {})[self.cursor_field] = updated_state
@abstractmethod
def _get_init_report_body(self, report_date: str, record_type: str, profile) -> Dict[str, Any]:
@@ -341,7 +324,7 @@ def _get_init_report_body(self, report_date: str, record_type: str, profile) ->
ReportInitFailure,
max_tries=5,
)
- def _init_reports(self, profile: Profile, report_date: str) -> List[ReportInfo]:
+ def _init_reports(self, profile: dict[str, Any], report_date: str) -> List[ReportInfo]:
"""
Send report generation requests for all profiles and for all record types for specific day.
:report_date - date for generating metric report.
@@ -362,15 +345,15 @@ def _init_reports(self, profile: Profile, report_date: str) -> List[ReportInfo]:
# different metric list for each record.
request_record_type = record_type.split("_")[0]
self.logger.info(
- f"Initiating report generation for {profile.profileId} profile with {record_type} type for {report_date} date"
+ f"Initiating report generation for {profile['profileId']} profile with {record_type} type for {report_date} date"
)
response = self._send_http_request(
urljoin(self._url, self.report_init_endpoint(request_record_type)),
- profile.profileId,
+ profile["profileId"],
report_init_body,
)
if response.status_code != self.report_is_created:
- error_msg = f"Unexpected HTTP status code {response.status_code} when registering {record_type}, {type(self).__name__} for {profile.profileId} profile: {response.text}"
+ error_msg = f"Unexpected HTTP status code {response.status_code} when registering {record_type}, {type(self).__name__} for {profile['profileId']} profile: {response.text}"
if self._skip_known_errors(response):
self.logger.warning(error_msg)
break
@@ -381,7 +364,7 @@ def _init_reports(self, profile: Profile, report_date: str) -> List[ReportInfo]:
ReportInfo(
report_id=response.reportId,
record_type=record_type,
- profile_id=profile.profileId,
+ profile_id=profile["profileId"],
status=Status.IN_PROGRESS,
metric_objects=[],
)
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_brands.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_brands.py
index 030ae17f94e0..daecf40f5e4d 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_brands.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_brands.py
@@ -4,7 +4,6 @@
from typing import Any, Mapping, MutableMapping
from requests import Response
-from source_amazon_ads.schemas import BrandsAdGroup, BrandsCampaign
from source_amazon_ads.streams.common import SubProfilesStream
@@ -61,7 +60,6 @@ def __init__(self, *args, **kwargs):
data_field = "campaigns"
state_filter = None
content_type = "application/vnd.sbcampaignresource.v4+json"
- model = BrandsCampaign
def path(self, **kwargs) -> str:
return "sb/v4/campaigns/list"
@@ -83,7 +81,6 @@ class SponsoredBrandsAdGroups(SponsoredBrandsV4):
primary_key = "adGroupId"
data_field = "adGroups"
- model = BrandsAdGroup
content_type = "application/vnd.sbadgroupresource.v4+json"
def path(self, **kwargs) -> str:
@@ -97,7 +94,6 @@ class SponsoredBrandsKeywords(SubProfilesStream):
"""
primary_key = "adGroupId"
- model = BrandsAdGroup
def path(self, **kwargs) -> str:
return "sb/keywords"
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_display.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_display.py
index 9c2b0f24fb85..aa399bbec121 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_display.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_display.py
@@ -4,14 +4,6 @@
from typing import Any, Mapping
-from source_amazon_ads.schemas import (
- DisplayAdGroup,
- DisplayBudgetRules,
- DisplayCampaign,
- DisplayCreatives,
- DisplayProductAds,
- DisplayTargeting,
-)
from source_amazon_ads.streams.common import SubProfilesStream
@@ -27,7 +19,6 @@ def __init__(self, *args, **kwargs):
primary_key = "campaignId"
state_filter = None
- model = DisplayCampaign
def path(self, **kwargs) -> str:
return "sd/campaigns"
@@ -46,7 +37,6 @@ class SponsoredDisplayAdGroups(SubProfilesStream):
"""
primary_key = "adGroupId"
- model = DisplayAdGroup
def path(self, **kwargs) -> str:
return "sd/adGroups"
@@ -59,7 +49,6 @@ class SponsoredDisplayProductAds(SubProfilesStream):
"""
primary_key = "adId"
- model = DisplayProductAds
def path(self, **kwargs) -> str:
return "sd/productAds"
@@ -72,7 +61,6 @@ class SponsoredDisplayTargetings(SubProfilesStream):
"""
primary_key = "targetId"
- model = DisplayTargeting
def path(self, **kwargs) -> str:
return "sd/targets"
@@ -85,7 +73,6 @@ class SponsoredDisplayCreatives(SubProfilesStream):
"""
primary_key = "creativeId"
- model = DisplayCreatives
def path(self, **kwargs) -> str:
return "/sd/creatives"
@@ -102,7 +89,6 @@ class SponsoredDisplayBudgetRules(SubProfilesStream):
"""
primary_key = "ruleId"
- model = DisplayBudgetRules
data_field = "budgetRulesForAdvertiserResponse"
page_size = 30
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_products.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_products.py
index e90467a49d77..31ab7ee28a4e 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_products.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/sponsored_products.py
@@ -2,26 +2,19 @@
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
-import json
+import logging
from abc import ABC
from http import HTTPStatus
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional
-from airbyte_cdk.models import SyncMode
+from airbyte_cdk.models import FailureType, SyncMode
+from airbyte_cdk.sources.streams.http.error_handlers import ErrorHandler, ErrorResolution, HttpStatusErrorHandler, ResponseAction
+from airbyte_cdk.sources.streams.http.error_handlers.default_error_mapping import DEFAULT_ERROR_MAPPING
from requests import Response
-from source_amazon_ads.schemas import (
- ProductAd,
- ProductAdGroupBidRecommendations,
- ProductAdGroups,
- ProductAdGroupSuggestedKeywords,
- ProductCampaign,
- ProductTargeting,
- SponsoredProductCampaignNegativeKeywordsModel,
- SponsoredProductKeywordsModel,
- SponsoredProductNegativeKeywordsModel,
-)
from source_amazon_ads.streams.common import SubProfilesStream
+LOGGER = logging.getLogger("airbyte")
+
class SponsoredProductsV3(SubProfilesStream):
"""
@@ -75,7 +68,6 @@ def __init__(self, *args, **kwargs):
primary_key = "campaignId"
data_field = "campaigns"
state_filter = None
- model = ProductCampaign
content_type = "application/vnd.spCampaign.v3+json"
def path(self, **kwargs) -> str:
@@ -99,7 +91,6 @@ class SponsoredProductAdGroups(SponsoredProductsV3):
primary_key = "adGroupId"
data_field = "adGroups"
content_type = "application/vnd.spAdGroup.v3+json"
- model = ProductAdGroups
def path(self, **kwargs) -> str:
return "/sp/adGroups/list"
@@ -128,31 +119,25 @@ def parse_response(self, response: Response, **kwargs) -> Iterable[Mapping]:
if response.status_code == HTTPStatus.OK:
yield resp
- if response.status_code == HTTPStatus.BAD_REQUEST:
- # 400 error message for bids recommendation:
- # Bid recommendation for AD group in Manual Targeted Campaign is not supported.
- # 400 error message for keywords recommendation:
- # Getting keyword recommendations for AD Group in Auto Targeted Campaign is not supported
- self.logger.warning(
- f"Skip current AdGroup because it does not support request {response.request.url} for "
- f"{response.request.headers['Amazon-Advertising-API-Scope']} profile: {response.text}"
- )
- elif response.status_code == HTTPStatus.UNPROCESSABLE_ENTITY:
- # 422 error message for bids recommendation:
- # No recommendations can be provided as the input ad group does not have any asins.
- self.logger.warning(
- f"Skip current AdGroup because the ad group {json.loads(response.request.body)['adGroupId']} does not have any asins {response.request.url}"
- )
- elif response.status_code == HTTPStatus.NOT_FOUND:
- # 404 Either the specified ad group identifier was not found,
- # or the specified ad group was found but no associated bid was found.
- self.logger.warning(
- f"Skip current AdGroup because the specified ad group has no associated bid {response.request.url} for "
- f"{response.request.headers['Amazon-Advertising-API-Scope']} profile: {response.text}"
- )
-
- else:
- response.raise_for_status()
+ def get_error_handler(self) -> ErrorHandler:
+ error_mapping = DEFAULT_ERROR_MAPPING | {
+ 400: ErrorResolution(
+ response_action=ResponseAction.IGNORE,
+ failure_type=FailureType.config_error,
+ error_message="Skip current AdGroup because it does not support request {response.request.url} for current profile",
+ ),
+ 422: ErrorResolution(
+ response_action=ResponseAction.IGNORE,
+ failure_type=FailureType.config_error,
+ error_message="Skip current AdGroup because the ad group {json.loads(response.request.body)['adGroupId']} does not have any asins",
+ ),
+ 404: ErrorResolution(
+ response_action=ResponseAction.IGNORE,
+ failure_type=FailureType.config_error,
+ error_message="Skip current AdGroup because the specified ad group has no associated bid",
+ ),
+ }
+ return HttpStatusErrorHandler(logger=LOGGER, error_mapping=error_mapping)
class SponsoredProductAdGroupBidRecommendations(SponsoredProductAdGroupWithSlicesABC):
@@ -164,7 +149,6 @@ class SponsoredProductAdGroupBidRecommendations(SponsoredProductAdGroupWithSlice
primary_key = None
data_field = "bidRecommendations"
content_type = "application/vnd.spthemebasedbidrecommendation.v4+json"
- model = ProductAdGroupBidRecommendations
def path(self, stream_slice: Mapping[str, Any] = None, **kwargs) -> str:
return "/sp/targets/bid/recommendations"
@@ -203,7 +187,6 @@ class SponsoredProductAdGroupSuggestedKeywords(SponsoredProductAdGroupWithSlices
primary_key = None
data_field = ""
- model = ProductAdGroupSuggestedKeywords
@property
def http_method(self, **kwargs) -> str:
@@ -238,7 +221,6 @@ class SponsoredProductKeywords(SponsoredProductsV3):
primary_key = "keywordId"
data_field = "keywords"
content_type = "application/vnd.spKeyword.v3+json"
- model = SponsoredProductKeywordsModel
def path(self, **kwargs) -> str:
return "sp/keywords/list"
@@ -253,7 +235,6 @@ class SponsoredProductNegativeKeywords(SponsoredProductsV3):
primary_key = "keywordId"
data_field = "negativeKeywords"
content_type = "application/vnd.spNegativeKeyword.v3+json"
- model = SponsoredProductNegativeKeywordsModel
def path(self, **kwargs) -> str:
return "sp/negativeKeywords/list"
@@ -268,7 +249,6 @@ class SponsoredProductCampaignNegativeKeywords(SponsoredProductsV3):
primary_key = "keywordId"
data_field = "campaignNegativeKeywords"
content_type = "application/vnd.spCampaignNegativeKeyword.v3+json"
- model = SponsoredProductCampaignNegativeKeywordsModel
def path(self, **kwargs) -> str:
return "sp/campaignNegativeKeywords/list"
@@ -283,7 +263,6 @@ class SponsoredProductAds(SponsoredProductsV3):
primary_key = "adId"
data_field = "productAds"
content_type = "application/vnd.spProductAd.v3+json"
- model = ProductAd
def path(self, **kwargs) -> str:
return "sp/productAds/list"
@@ -297,7 +276,6 @@ class SponsoredProductTargetings(SponsoredProductsV3):
primary_key = "targetId"
data_field = "targetingClauses"
content_type = "application/vnd.spTargetingClause.v3+json"
- model = ProductTargeting
def path(self, **kwargs) -> str:
return "sp/targets/list"
diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/integrations/utils.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/integrations/utils.py
index 2c18d51301b7..e982a6b469dd 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/integrations/utils.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/integrations/utils.py
@@ -9,7 +9,6 @@
from airbyte_cdk.test.catalog_builder import CatalogBuilder
from airbyte_cdk.test.entrypoint_wrapper import EntrypointOutput, read
from source_amazon_ads import SourceAmazonAds
-from source_amazon_ads.declarative_source_adapter import DeclarativeSourceAdapter
def read_stream(
@@ -20,7 +19,7 @@ def read_stream(
expecting_exception: bool = False
) -> EntrypointOutput:
catalog = CatalogBuilder().with_stream(stream_name, sync_mode).build()
- return read(DeclarativeSourceAdapter(source=SourceAmazonAds()), config, catalog, state, expecting_exception)
+ return read(SourceAmazonAds(), config, catalog, state, expecting_exception)
def get_log_messages_by_log_level(logs: List[AirbyteMessage], log_level: LogLevel) -> List[str]:
diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_attribution_report.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_attribution_report.py
index 32203166e150..fed4128be5b9 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_attribution_report.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_attribution_report.py
@@ -12,7 +12,6 @@
from freezegun import freeze_time
from jsonschema import validate
from source_amazon_ads import SourceAmazonAds
-from source_amazon_ads.schemas.profile import AccountInfo, Profile
from source_amazon_ads.streams import AttributionReportProducts
from .utils import read_full_refresh
@@ -130,8 +129,8 @@ def _callback(request: requests.PreparedRequest):
def test_attribution_report_slices(config):
profiles = [
- Profile(profileId=1, timezone="America/Los_Angeles", accountInfo=AccountInfo(id="1", type="seller", marketplaceStringId="")),
- Profile(profileId=2, timezone="America/Los_Angeles", accountInfo=AccountInfo(id="1", type="seller", marketplaceStringId="")),
+ dict(profileId=1, timezone="America/Los_Angeles", accountInfo=dict(id="1", type="seller", marketplaceStringId="")),
+ dict(profileId=2, timezone="America/Los_Angeles", accountInfo=dict(id="1", type="seller", marketplaceStringId="")),
]
stream = AttributionReportProducts(config, profiles=profiles)
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 12f187b73306..a0d9d56f4a5e 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
@@ -18,7 +18,6 @@
from pendulum import Date
from pytest import raises
from requests.exceptions import ConnectionError
-from source_amazon_ads.schemas.profile import AccountInfo, Profile
from source_amazon_ads.source import CONFIG_DATE_FORMAT
from source_amazon_ads.streams import (
SponsoredBrandsCampaigns,
@@ -170,10 +169,10 @@ def setup_responses(init_response=None, init_response_products=None, init_respon
def make_profiles(profile_type="seller"):
return [
- Profile(
+ dict(
profileId=1,
timezone="America/Los_Angeles",
- accountInfo=AccountInfo(marketplaceStringId="", id="", type=profile_type),
+ accountInfo=dict(marketplaceStringId="", id="", type=profile_type),
)
]
@@ -426,7 +425,7 @@ def test_display_report_stream_slices_full_refresh(config):
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": "2021-07-25"}}
+ stream_state = {str(profiles[0]['profileId']): {"reportDate": "2021-07-25"}}
slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state))
assert slices == [
{"profile": profiles[0], "reportDate": "2021-07-25"},
@@ -436,7 +435,7 @@ def test_display_report_stream_slices_incremental(config):
{"profile": profiles[0], "reportDate": "2021-07-29"},
]
- stream_state = {str(profiles[0].profileId): {"reportDate": "2021-07-30"}}
+ stream_state = {str(profiles[0]['profileId']): {"reportDate": "2021-07-30"}}
slices = list(stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state))
assert slices == [None]
@@ -458,7 +457,7 @@ def test_get_start_date(config):
stream = SponsoredProductsReportStream(config, profiles, authenticator=mock.MagicMock())
assert stream.get_start_date(profiles[0], {}) == Date(2021, 6, 1)
- profile_id = str(profiles[0].profileId)
+ profile_id = str(profiles[0]['profileId'])
stream = SponsoredProductsReportStream(config, profiles, authenticator=mock.MagicMock())
assert stream.get_start_date(profiles[0], {profile_id: {"reportDate": "2021-08-10"}}) == Date(2021, 8, 10)
stream = SponsoredProductsReportStream(config, profiles, authenticator=mock.MagicMock())
@@ -471,8 +470,8 @@ def test_get_start_date(config):
@freeze_time("2021-08-01 04:00:00")
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"))
+ profile1 = dict(profileId=1, timezone="America/Los_Angeles", accountInfo=dict(marketplaceStringId="", id="", type="seller"))
+ profile2 = dict(profileId=2, timezone="UTC", accountInfo=dict(marketplaceStringId="", id="", type="seller"))
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": "2021-07-31"}, {"profile": profile2, "reportDate": "2021-08-01"}]
@@ -481,8 +480,8 @@ def test_stream_slices_different_timezones(config):
def test_stream_slices_lazy_evaluation(config):
with freeze_time("2022-06-01T23:50:00+00:00") as frozen_datetime:
config["start_date"] = pendulum.from_format("2021-05-10", CONFIG_DATE_FORMAT).date()
- profile1 = Profile(profileId=1, timezone="UTC", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller"))
- profile2 = Profile(profileId=2, timezone="UTC", accountInfo=AccountInfo(marketplaceStringId="", id="", type="seller"))
+ profile1 = dict(profileId=1, timezone="UTC", accountInfo=dict(marketplaceStringId="", id="", type="seller"))
+ profile2 = dict(profileId=2, timezone="UTC", accountInfo=dict(marketplaceStringId="", id="", type="seller"))
stream = SponsoredProductsReportStream(config, [profile1, profile2], authenticator=mock.MagicMock())
stream.REPORTING_PERIOD = 5
diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py
index 4bc0e636ea59..a48354f15260 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py
@@ -7,8 +7,6 @@
from airbyte_cdk.models import AirbyteConnectionStatus, AirbyteMessage, ConnectorSpecification, Status, Type
from jsonschema import Draft4Validator
from source_amazon_ads import SourceAmazonAds
-from source_amazon_ads.declarative_source_adapter import DeclarativeSourceAdapter
-from source_amazon_ads.schemas import Profile
from .utils import command_check, url_strip_query
@@ -41,17 +39,17 @@ def ensure_additional_property_is_boolean(root):
@responses.activate
def test_discover(config):
setup_responses()
- source = DeclarativeSourceAdapter(source=SourceAmazonAds())
+ source = SourceAmazonAds()
catalog = source.discover(None, config)
- catalog = AirbyteMessage(type=Type.CATALOG, catalog=catalog).dict(exclude_unset=True)
- schemas = [stream["json_schema"] for stream in catalog["catalog"]["streams"]]
+ catalog = AirbyteMessage(type=Type.CATALOG, catalog=catalog)
+ schemas = [stream.json_schema for stream in catalog.catalog.streams]
for schema in schemas:
Draft4Validator.check_schema(schema)
ensure_additional_property_is_boolean(schema)
def test_spec():
- source = DeclarativeSourceAdapter(source=SourceAmazonAds())
+ source = SourceAmazonAds()
spec = source.spec(None)
assert isinstance(spec, ConnectorSpecification)
@@ -59,7 +57,7 @@ def test_spec():
@responses.activate
def test_check(config_gen):
setup_responses()
- source = DeclarativeSourceAdapter(source=SourceAmazonAds())
+ source = SourceAmazonAds()
assert command_check(source, config_gen(start_date=...)) == AirbyteConnectionStatus(status=Status.SUCCEEDED)
assert len(responses.calls) == 2
@@ -90,7 +88,7 @@ def test_check(config_gen):
@responses.activate
def test_source_streams(config):
setup_responses()
- source = DeclarativeSourceAdapter(source=SourceAmazonAds())
+ source = SourceAmazonAds()
streams = source.streams(config)
assert len(streams) == 27
actual_stream_names = {stream.name for stream in streams}
@@ -129,14 +127,14 @@ def test_filter_profiles_exist():
{"profileId": 333, "timezone": "gtm", "accountInfo": {"marketplaceStringId": "mkt_id_3", "id": "333", "type": "vendor"}},
]
- mock_profiles = [Profile.parse_obj(profile) for profile in mock_objs]
+ mock_profiles = [profile for profile in mock_objs]
filtered_profiles = source._choose_profiles({}, mock_profiles)
assert len(filtered_profiles) == 3
filtered_profiles = source._choose_profiles({"profiles": [111]}, mock_profiles)
assert len(filtered_profiles) == 1
- assert filtered_profiles[0].profileId == 111
+ assert filtered_profiles[0]['profileId'] == 111
filtered_profiles = source._choose_profiles({"profiles": [111, 333]}, mock_profiles)
assert len(filtered_profiles) == 2
@@ -149,7 +147,7 @@ def test_filter_profiles_exist():
filtered_profiles = source._choose_profiles({"marketplace_ids": ["mkt_id_1"]}, mock_profiles)
assert len(filtered_profiles) == 1
- assert filtered_profiles[0].accountInfo.marketplaceStringId == "mkt_id_1"
+ assert filtered_profiles[0]['accountInfo']['marketplaceStringId'] == "mkt_id_1"
filtered_profiles = source._choose_profiles({"marketplace_ids": ["mkt_id_1", "mkt_id_3"]}, mock_profiles)
assert len(filtered_profiles) == 2
@@ -159,4 +157,4 @@ def test_filter_profiles_exist():
filtered_profiles = source._choose_profiles({"profiles": [111], "marketplace_ids": ["mkt_id_1"]}, mock_profiles)
assert len(filtered_profiles) == 1
- assert filtered_profiles[0].profileId == 111
+ assert filtered_profiles[0]['profileId'] == 111
diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py
index 31264c021008..5f859e757bf4 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py
@@ -9,6 +9,7 @@
import pytest
import requests
import responses
+from airbyte_cdk import AirbyteTracedException
from airbyte_cdk.models import SyncMode
from jsonschema import validate
from source_amazon_ads import SourceAmazonAds
@@ -204,7 +205,7 @@ def test_streams_campaigns_pagination_403_error(mocker, status_code, config, pro
streams = source.streams(config)
campaigns_stream = get_stream_by_name(streams, "sponsored_display_campaigns")
- with pytest.raises(requests.exceptions.HTTPError):
+ with pytest.raises(AirbyteTracedException):
get_all_stream_records(campaigns_stream)
diff --git a/docs/integrations/sources/amazon-ads.md b/docs/integrations/sources/amazon-ads.md
index d53e52624d98..b2f9ba59a43f 100644
--- a/docs/integrations/sources/amazon-ads.md
+++ b/docs/integrations/sources/amazon-ads.md
@@ -153,6 +153,7 @@ Information about expected report generation waiting time can be found [here](ht
| Version | Date | Pull Request | Subject |
|:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------|
+| 6.1.0 | 2024-10-31 | [47940](https://github.com/airbytehq/airbyte/pull/47940) | Bump CDK to ^5 |
| 6.0.0 | 2024-10-28 | [47366](https://github.com/airbytehq/airbyte/pull/47366) | Migrate stream `SponsoredDisplayReportStream` to Amazon Ads Reports v3 |
| 5.0.20 | 2024-10-29 | [47032](https://github.com/airbytehq/airbyte/pull/47032) | Update dependencies |
| 5.0.19 | 2024-10-12 | [46860](https://github.com/airbytehq/airbyte/pull/46860) | Update dependencies |