From 412a424cfe5028d96fd2f501e1f4f1446ef6024b Mon Sep 17 00:00:00 2001 From: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com> Date: Fri, 1 Nov 2024 11:49:37 +0100 Subject: [PATCH] ref(source-amazon-ads): bump cdk to v5 (#47940) Signed-off-by: Artem Inzhyyants Co-authored-by: maxi297 Co-authored-by: Natalie Kwong <38087517+nataliekwong@users.noreply.github.com> --- .../integration_tests/spec.json | 44 +- .../source-amazon-ads/metadata.yaml | 2 +- .../connectors/source-amazon-ads/poetry.lock | 624 +++++++++++++++--- .../source-amazon-ads/pyproject.toml | 9 +- .../declarative_source_adapter.py | 47 -- .../source_amazon_ads/run.py | 3 +- .../source_amazon_ads/schemas/__init__.py | 56 -- .../schemas/attribution_report.py | 24 - ...ttribution_report_performance_adgroup.json | 118 ++++ ...tribution_report_performance_campaign.json | 44 ++ ...tribution_report_performance_creative.json | 44 ++ .../schemas/attribution_report_products.json | 44 ++ .../source_amazon_ads/schemas/common.py | 102 --- .../source_amazon_ads/schemas/portfolios.json | 24 + .../source_amazon_ads/schemas/profile.py | 25 - .../source_amazon_ads/schemas/profiles.json | 23 + .../schemas/sponsored_brands.py | 53 -- .../schemas/sponsored_brands_ad_groups.json | 12 + .../schemas/sponsored_brands_campaigns.json | 26 + .../schemas/sponsored_brands_keywords.json | 12 + .../sponsored_brands_v3_report_stream.json | 32 + .../schemas/sponsored_display.py | 115 ---- .../schemas/sponsored_display_ad_groups.json | 15 + .../sponsored_display_budget_rules.json | 80 +++ .../schemas/sponsored_display_campaigns.json | 18 + .../schemas/sponsored_display_creatives.json | 12 + .../sponsored_display_product_ads.json | 13 + .../sponsored_display_report_stream.json | 96 +++ .../schemas/sponsored_display_targetings.json | 21 + ..._product_ad_group_bid_recommendations.json | 29 + ...d_product_ad_group_suggested_keywords.json | 18 + .../schemas/sponsored_product_ad_groups.json | 13 + .../schemas/sponsored_product_ads.json | 15 + ...ed_product_campaign_negative_keywords.json | 13 + .../schemas/sponsored_product_campaigns.json | 18 + .../schemas/sponsored_product_keywords.json | 14 + .../sponsored_product_negative_keywords.json | 14 + .../schemas/sponsored_product_targetings.json | 22 + .../schemas/sponsored_products.py | 114 ---- .../sponsored_products_report_stream.json | 70 ++ .../source_amazon_ads/source.py | 51 +- .../source_amazon_ads/spec.py | 103 +++ .../streams/attribution_report.py | 8 +- .../source_amazon_ads/streams/common.py | 65 +- .../source_amazon_ads/streams/portfolios.py | 4 +- .../source_amazon_ads/streams/profiles.py | 11 +- .../streams/report_streams/brands_report.py | 1 - .../streams/report_streams/display_report.py | 5 +- .../streams/report_streams/products_report.py | 3 +- .../report_streams/report_stream_models.py | 2 +- .../streams/report_streams/report_streams.py | 63 +- .../streams/sponsored_brands.py | 4 - .../streams/sponsored_display.py | 14 - .../streams/sponsored_products.py | 72 +- .../unit_tests/integrations/utils.py | 3 +- .../unit_tests/test_attribution_report.py | 5 +- .../unit_tests/test_report_streams.py | 19 +- .../unit_tests/test_source.py | 22 +- .../unit_tests/test_streams.py | 3 +- docs/integrations/sources/amazon-ads.md | 1 + 60 files changed, 1707 insertions(+), 830 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/declarative_source_adapter.py delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/__init__.py delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_adgroup.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_campaign.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_performance_creative.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/attribution_report_products.json delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/common.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/portfolios.json delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profile.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/profiles.json delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_ad_groups.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_campaigns.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_keywords.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_brands_v3_report_stream.json delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_ad_groups.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_budget_rules.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_campaigns.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_creatives.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_product_ads.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_report_stream.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display_targetings.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_bid_recommendations.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_group_suggested_keywords.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ad_groups.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_ads.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaign_negative_keywords.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_campaigns.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_keywords.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_negative_keywords.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_product_targetings.json delete mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products.py create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_products_report_stream.json create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py 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 |